溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

在測(cè)試中如何使用Docker

發(fā)布時(shí)間:2021-11-12 10:10:20 來(lái)源:億速云 閱讀:149 作者:小新 欄目:云計(jì)算

這篇文章給大家分享的是有關(guān)在測(cè)試中如何使用Docker的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

5.1 使用Docker測(cè)試靜態(tài)網(wǎng)站(Nginx)

將項(xiàng)目命名為Sample

首先建立構(gòu)建環(huán)境

mkdir sample
cd sample
touch Dockerfile

在構(gòu)建環(huán)境中下載作者配置好的兩個(gè)nginx配置文件:

mkdir nginx && cd nginx
wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/global.conf
 wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/nginx.conf

寫(xiě)Dockerfile

FROM ubuntu:14.04
MAINTAINER Ivan Jiangzhi "ivanjz93@163.com"
ENV REFRESHED_AT 2016-07-09
RUN apt-get update
RUN apt-get -y -q install nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

在nginx.conf配置文件中daemon off;選項(xiàng)阻止Nginx進(jìn)入后臺(tái),強(qiáng)制其在前臺(tái)運(yùn)行。這是因?yàn)橄胍3諨ocker容器的活躍狀態(tài),需要其中運(yùn)行的進(jìn)程不能中斷。默認(rèn)情況下,Nginx會(huì)以守護(hù)進(jìn)程的方式啟動(dòng),這會(huì)導(dǎo)致容器只是短暫運(yùn)行,在守護(hù)進(jìn)程被fork啟動(dòng)后,發(fā)起守護(hù)進(jìn)程的原始進(jìn)程就會(huì)退出,這時(shí)容器就停止了。

構(gòu)建Sample

docker build -t ivan/nginx .

構(gòu)建完成后可使用docker history查看構(gòu)建步驟:

docker history ivan/nginx

下載作者寫(xiě)好的html(或者自己寫(xiě)一個(gè)也可以)

mkdir website && cd website
wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/website/index.html

創(chuàng)建容器并運(yùn)行

docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website ivan/nginx nginx

-v 選項(xiàng)將宿主機(jī)的目錄作為卷掛載到容器里。

卷是在一個(gè)或者多個(gè)容器內(nèi)被選定的目錄,可以繞過(guò)分層的聯(lián)合文件系統(tǒng),為Docker提供持久數(shù)據(jù)或者共享數(shù)據(jù)。這意味著對(duì)卷的修改會(huì)直接生效并繞過(guò)鏡像。當(dāng)提交或者創(chuàng)建鏡像時(shí),卷不被包含在鏡像里。

在下面的時(shí)候可以考慮使用卷:

  • 希望同時(shí)對(duì)代碼作開(kāi)發(fā)和測(cè)試;

  • 代碼改動(dòng)很頻繁,不想在開(kāi)發(fā)過(guò)程中重構(gòu)鏡像;

  • 希望在多個(gè)容器間共享代碼。

-v 指定了卷的源目錄(宿主機(jī)目錄)和容器里的目錄,這兩個(gè)目錄用:分割。如果目的目錄不存在,Docker會(huì)自動(dòng)創(chuàng)建一個(gè)。

也可以通過(guò)在目的目錄后面加上rw或者ro來(lái)指定目的目錄的讀寫(xiě)狀態(tài):

docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website:ro ivan/nginx nginx

上例使目的目錄變成只讀狀態(tài)。

docker run成功后在瀏覽器中訪問(wèn) 宿主機(jī)IP:映射端口即可看到頁(yè)面,修改$PWD/website/index.html保存后刷新瀏覽器即時(shí)生效。

5.2 構(gòu)建并測(cè)試Web應(yīng)用程序(Sinatra + Redis

1、構(gòu)建Sinatra應(yīng)用程序

創(chuàng)建sinatra構(gòu)建環(huán)境:

mkdir sinatra
cd sinatra
touch Dockerfile

編寫(xiě)Dockerfile,書(shū)上的例子:

FROM ubuntu:14.04
MAINTAINER James Turnbull james@example.com
ENV REFRESHED_AT 2014-6-1

RUN apt-get update
RUN apt-get -y install ruby ruby-dev build-essential redis-tools
RUN gem install --no-rdoc --no-ri sinatra json redis

RUN mkdir -p /opt/webapp

EXPOSE 4567

CMD ["/opt/webapp/bin/webapp"]

構(gòu)建鏡像

docker build -t ivan/sinatra .

2、創(chuàng)建Sinatra容器

下載作者編寫(xiě)的Sinatra Web應(yīng)用程序的源碼:

wget --cut-dirs=3 -nH --no-parent --no-check-certificate http://dockerbook.com/code/5/sinatra/webapp/

使用書(shū)中的命令下載時(shí)會(huì)報(bào)錯(cuò),按報(bào)錯(cuò)的提示加入--no-check-certificate參數(shù)后成功下載。

為webapp/bin/webapp添加執(zhí)行權(quán)限:

chmod +x $PWD/webapp/bin/webapp

啟動(dòng)容器并把$PWD/webapp按卷掛在到容器中:

docker run -d -p 4567 --name webapp -v $PWD/webapp:/opt/webapp ivan/sinatra

我在操作時(shí)遇到的問(wèn)題和解決方法

構(gòu)建時(shí)會(huì)報(bào)錯(cuò),說(shuō)安裝的ruby是1.9版本,而gem install json需要2.0以上的版本。

我直接從ruby鏡像構(gòu)建,去掉apt-get ruby的安裝,容器可以正常構(gòu)建。但是啟動(dòng)時(shí)會(huì)包找不到/opt/webapp/bin/webapp的錯(cuò)誤,執(zhí)行的權(quán)限已經(jīng)添加,/bin/bash命令啟動(dòng)容器發(fā)現(xiàn)webapp用/usr/bin/ruby啟動(dòng),但是容器里的ruby在/usr/local/bin/ruby,所以在構(gòu)建時(shí)添加cp命令。我的Dockerfile如下:

FROM ruby
MAINTAINER James Turnbull james@example.com
ENV REFRESHED_AT 2014-6-1

RUN apt-get update
RUN apt-get -y install ruby-dev build-essential redis-tools
RUN gem install --no-rdoc --no-ri sinatra json redis

RUN mkdir -p /opt/webapp
RUN cp /usr/local/bin/ruby /usr/bin/ruby

EXPOSE 4567

CMD ["/opt/webapp/bin/webapp"]

啟動(dòng)成功后查看執(zhí)行命令的輸出:

docker logs webapp

查看容器運(yùn)行的進(jìn)程:

docker top webapp

查看容器的4567端口映射到宿主機(jī)的端口:

docker port webapp 4567

測(cè)試Sinatra應(yīng)用的運(yùn)行情況,假設(shè)映射到宿主機(jī)的端口為49160(它接收輸入?yún)?shù),并將其轉(zhuǎn)化為Json返回):

curl -l -H 'Accept:application/json' -d 'name=Foo&status=Bar' http://localhost:49160/json

3、構(gòu)建Redis鏡像和容器

創(chuàng)建redis構(gòu)建環(huán)境:

mkdir redis
cd redis
touch Dockerfile

redis Dockerfile的內(nèi)容:

FROM ubuntu:14.04
MAINTAINER James Turnbull james@example.com
ENV REFRESHED_AT 2016-07-11

RUN apt-get update
RUN apt-get -y install redis-server redis-tools
EXPOSE 6379
ENTRYPOINT ["/user/bin/redis-server"]
CMD []

構(gòu)建redis鏡像:

docker build -t ivan/redis .

創(chuàng)建并啟動(dòng)redis容器:

docker run -d -p 6379 --name redis ivan/redis

查看容器 6379端口映射到宿主機(jī)上的哪個(gè)端口:

docker port redis 6379

然后在宿主機(jī)上使用redis-cli測(cè)試redis-server在容器中的運(yùn)行情況:

sudo apt-get -y install redis-tools
redis-cli -h 127.0.0.1 -p 49161

(假設(shè)容器的6379端口映射到了宿主機(jī)的49161端口上)。

我在宿主機(jī)的ubuntu上使用apt-get -y install redis-tools報(bào)無(wú)法定位redis-tools packages的錯(cuò)誤,直接apt-get -y install redis-server 后可以使用redis-cli。

4、連接到Redis容器

一般有兩種方法實(shí)現(xiàn)容器間的網(wǎng)絡(luò)連接:

第一,Docker容器公開(kāi)端口并綁定到本地網(wǎng)絡(luò)接口,這樣可以把容器里的服務(wù)在本地Docker宿主機(jī)所在的外部網(wǎng)絡(luò)上公開(kāi)(比如,把容器里的80端口綁到本地宿主機(jī)的高端口上)。

第二,內(nèi)部網(wǎng)路。在安裝Docker時(shí),會(huì)創(chuàng)建一個(gè)新的網(wǎng)絡(luò)接口,名字是docker0。docker0接口有符合RFC1918的私有IP地址,范圍是172.16~172.30。docker0接口本身的地址是這個(gè)Docker網(wǎng)絡(luò)的網(wǎng)關(guān)地址,也是所有Docker容器的網(wǎng)關(guān)地址。Docker默認(rèn)會(huì)使用172.17.x.x作為子網(wǎng)地址,如果這個(gè)子網(wǎng)被占用,會(huì)在172.16~172.30這個(gè)范圍內(nèi)嘗試創(chuàng)建子網(wǎng)。接口docker0是一個(gè)虛擬的以太網(wǎng)橋,用于連接容器和本地宿主網(wǎng)絡(luò)。Docker宿主機(jī)的會(huì)有一系列名字以veth開(kāi)頭的接口,Docker每創(chuàng)建一個(gè)容器就會(huì)創(chuàng)建一組互聯(lián)的網(wǎng)絡(luò)接口。這組接口就像管道的兩端,其中一端作為容器里的eth0接口,而另一端統(tǒng)一命名為以veth開(kāi)頭的名字,作為宿主機(jī)的一個(gè)端口。通過(guò)把每個(gè)veth*接口綁定到docker0網(wǎng)橋,Docker創(chuàng)建了一個(gè)虛擬子網(wǎng),這個(gè)子網(wǎng)由宿主機(jī)和所有的Docker容器共享。

在運(yùn)行的容器內(nèi)部查看一下對(duì)望通信的路由信息,發(fā)現(xiàn)容器地址后的下一跳就是宿主網(wǎng)絡(luò)上docker0的地址:

apt-get -yqq update && apt-get install -yqq traceroute
traceroute google.com

(3)Docker網(wǎng)絡(luò)還有另外一個(gè)部分的配置才能允許建立連接:防火墻規(guī)則和NAT配置。這些配置允許Docker在宿主網(wǎng)絡(luò)和容器間路由。在宿主機(jī)上查看IPTables NAT配置:

sudo iptables -t nat -L -n

容器默認(rèn)是無(wú)法訪問(wèn)的。從宿主網(wǎng)絡(luò)與容器通信時(shí),必須明確指定打開(kāi)的端口。

5、連接Redis

用docker inspect查看Redis容器的網(wǎng)絡(luò)配置:

docker inspect redis

該命令展示了Docker容器的細(xì)節(jié),包括配置信息和網(wǎng)絡(luò)狀況??梢允褂?f標(biāo)志只獲取IP地址:

docker inspect -f '{{.NetworkSettings.IPAddress}}' redis

如果Docker宿主機(jī)運(yùn)行在本地,可以直接使用Redis服務(wù)器的IP地址與Redis服務(wù)器通信。

這個(gè)方法有兩個(gè)問(wèn)題:第一,要在應(yīng)用程序里對(duì)Redis容器的IP地址做硬編碼;第二,如果重啟容器,Docker可能會(huì)改變?nèi)萜鞯腎P地址。

6、讓Docker容器互連

刪除之前運(yùn)行的redis容器和webapp容器:

docker rm -f webapp
docker rm -f redis

新建一個(gè)redis容器,與之前不同的是并不公開(kāi)任何端口:

docker run -d --name redis ivan/redis

啟動(dòng)Web應(yīng)用程序容器,并把它連接到新的Redis容器上去:

docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp:/opt/webapp ivan/sinatra /bin/bash

--link編制創(chuàng)建了兩個(gè)容器間的父子連接。這個(gè)標(biāo)志需要兩個(gè)參數(shù):一個(gè)是要連接的容器名字,另一個(gè)是連接后容器的別名。這個(gè)例子中,把新容器連接到redis容器,并使用db作為別名。連接讓父容器有能力訪問(wèn)子容器,并把子容器的一些連接細(xì)節(jié)分享給父容器,這些細(xì)節(jié)有助于配置應(yīng)用程序并使用這個(gè)連接。(新創(chuàng)建的容器時(shí)父容器,連接到的容器時(shí)子容器)

連接也能得到一些安全上的好處。容器的端口不需要對(duì)本地宿主機(jī)公開(kāi)。

出于安全原因,可以強(qiáng)制Docker只允許有連接的容器之間相互通信,需要在啟動(dòng)Docker守護(hù)進(jìn)程時(shí)加上--icc=false標(biāo)志,關(guān)閉所有沒(méi)有連接的容器間的通信。

也可以把多個(gè)容器連接在一起。比如,如果想讓這個(gè)Redis實(shí)例服務(wù)于多個(gè)Web應(yīng)用程序,可以把每個(gè)Web應(yīng)用程序的容器和同一個(gè)redis容器連接在一起。

被連接的容器必須運(yùn)行在同一個(gè)Docker宿主機(jī)上。不同Docker宿主機(jī)上運(yùn)行的容器無(wú)法連接。

Docker在父容器里的以下兩個(gè)地方寫(xiě)入了連接信息:

  • /etc/hosts文件中;

  • 包含連接信息的環(huán)境變量中。

/etc/hosts文件中有連接指令創(chuàng)建的項(xiàng),是redis容器的IP地址和該連接的對(duì)應(yīng)的子容器別名。

如果重啟了容器,容器的IP地址可能會(huì)發(fā)生變化。從Docker1.3開(kāi)始,如果被連接的容器重啟了,/etc/host文件中的IP地址會(huì)被新的IP地址更新。

在bash環(huán)境中運(yùn)行env查看環(huán)境變量,可以看到一些以DB開(kāi)頭的環(huán)境變量。Docker在連接webapp和redis容器時(shí),自動(dòng)創(chuàng)建了以DB開(kāi)頭的環(huán)境變量。DB是創(chuàng)建連接時(shí)的子容器別名。這些環(huán)境變量主要包含以下信息:

  • 子容器的名字;

  • 子容器里運(yùn)行服務(wù)使用的協(xié)議、IP和端口號(hào);

  • 子容器里由Docker設(shè)置的環(huán)境變量的值。

這些環(huán)境變量會(huì)隨容器不同而變化,取決于子容器是如何配置的。

7、測(cè)試容器連接情況

需要下載作者代碼/code/5/sinatra/webapp_redis中的內(nèi)容替換原sinatra/webapp的內(nèi)容,然后后臺(tái)啟動(dòng)webapp容器的/opt/webapp/bin/webapp。向web服務(wù)提交數(shù)據(jù)(假設(shè)映射到宿主機(jī)的端口是49160):

curl -l -H 'Accept:application/json' -d 'name=Foo&status=Bar' http://localhost:49160/json

用get方法測(cè)試提交情況:

cuil -i http://localhost:49160/json

5.3 Docker用于持續(xù)集成(Jenkins)

1、構(gòu)建Jenkins和Docker容器

書(shū)中代碼的Dockerfile無(wú)法構(gòu)建成功,可能是由于版本升級(jí)造成的。去Github上下載更新過(guò)的代碼把 5/jenkins/Dockerfile和dockerjenkins.sh放入構(gòu)建環(huán)境的文件夾中。

Dockerfile中使用了VOLUME指令。從容器運(yùn)行的宿主機(jī)上掛載一個(gè)卷。

構(gòu)建成功后啟動(dòng)容器:

docker run -p 8080:8080 --name jenkins --privileged -d ivan/dockerjenkins

這里使用了一個(gè)新標(biāo)志--privileged,它可以啟動(dòng)Docker的特權(quán)模式,允許我們以其宿主機(jī)具有的所有能力來(lái)運(yùn)行容器,包括一些內(nèi)核特性和設(shè)備訪問(wèn)。這是可以在Docker中運(yùn)行Docker的必要能力。

讓Docker在特權(quán)模式運(yùn)行會(huì)有一些安全隱患。在這種模式下運(yùn)行容器對(duì)Docker宿主機(jī)有root訪問(wèn)權(quán)限。

感謝各位的閱讀!關(guān)于“在測(cè)試中如何使用Docker”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI