亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在測試中如何使用Docker

發布時間:2021-11-12 10:10:20 來源:億速云 閱讀:150 作者:小新 欄目:云計算

這篇文章給大家分享的是有關在測試中如何使用Docker的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

5.1 使用Docker測試靜態網站(Nginx)

將項目命名為Sample

首先建立構建環境

mkdir sample
cd sample
touch Dockerfile

在構建環境中下載作者配置好的兩個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

寫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;選項阻止Nginx進入后臺,強制其在前臺運行。這是因為想要保持Docker容器的活躍狀態,需要其中運行的進程不能中斷。默認情況下,Nginx會以守護進程的方式啟動,這會導致容器只是短暫運行,在守護進程被fork啟動后,發起守護進程的原始進程就會退出,這時容器就停止了。

構建Sample

docker build -t ivan/nginx .

構建完成后可使用docker history查看構建步驟:

docker history ivan/nginx

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

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

創建容器并運行

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

-v 選項將宿主機的目錄作為卷掛載到容器里。

卷是在一個或者多個容器內被選定的目錄,可以繞過分層的聯合文件系統,為Docker提供持久數據或者共享數據。這意味著對卷的修改會直接生效并繞過鏡像。當提交或者創建鏡像時,卷不被包含在鏡像里。

在下面的時候可以考慮使用卷:

  • 希望同時對代碼作開發和測試;

  • 代碼改動很頻繁,不想在開發過程中重構鏡像;

  • 希望在多個容器間共享代碼。

-v 指定了卷的源目錄(宿主機目錄)和容器里的目錄,這兩個目錄用:分割。如果目的目錄不存在,Docker會自動創建一個。

也可以通過在目的目錄后面加上rw或者ro來指定目的目錄的讀寫狀態:

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

上例使目的目錄變成只讀狀態。

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

5.2 構建并測試Web應用程序(Sinatra + Redis

1、構建Sinatra應用程序

創建sinatra構建環境:

mkdir sinatra
cd sinatra
touch Dockerfile

編寫Dockerfile,書上的例子:

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"]

構建鏡像

docker build -t ivan/sinatra .

2、創建Sinatra容器

下載作者編寫的Sinatra Web應用程序的源碼:

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

使用書中的命令下載時會報錯,按報錯的提示加入--no-check-certificate參數后成功下載。

為webapp/bin/webapp添加執行權限:

chmod +x $PWD/webapp/bin/webapp

啟動容器并把$PWD/webapp按卷掛在到容器中:

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

我在操作時遇到的問題和解決方法

構建時會報錯,說安裝的ruby是1.9版本,而gem install json需要2.0以上的版本。

我直接從ruby鏡像構建,去掉apt-get ruby的安裝,容器可以正常構建。但是啟動時會包找不到/opt/webapp/bin/webapp的錯誤,執行的權限已經添加,/bin/bash命令啟動容器發現webapp用/usr/bin/ruby啟動,但是容器里的ruby在/usr/local/bin/ruby,所以在構建時添加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"]

啟動成功后查看執行命令的輸出:

docker logs webapp

查看容器運行的進程:

docker top webapp

查看容器的4567端口映射到宿主機的端口:

docker port webapp 4567

測試Sinatra應用的運行情況,假設映射到宿主機的端口為49160(它接收輸入參數,并將其轉化為Json返回):

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

3、構建Redis鏡像和容器

創建redis構建環境:

mkdir redis
cd redis
touch Dockerfile

redis Dockerfile的內容:

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 []

構建redis鏡像:

docker build -t ivan/redis .

創建并啟動redis容器:

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

查看容器 6379端口映射到宿主機上的哪個端口:

docker port redis 6379

然后在宿主機上使用redis-cli測試redis-server在容器中的運行情況:

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

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

我在宿主機的ubuntu上使用apt-get -y install redis-tools報無法定位redis-tools packages的錯誤,直接apt-get -y install redis-server 后可以使用redis-cli。

4、連接到Redis容器

一般有兩種方法實現容器間的網絡連接:

第一,Docker容器公開端口并綁定到本地網絡接口,這樣可以把容器里的服務在本地Docker宿主機所在的外部網絡上公開(比如,把容器里的80端口綁到本地宿主機的高端口上)。

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

在運行的容器內部查看一下對望通信的路由信息,發現容器地址后的下一跳就是宿主網絡上docker0的地址:

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

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

sudo iptables -t nat -L -n

容器默認是無法訪問的。從宿主網絡與容器通信時,必須明確指定打開的端口。

5、連接Redis

用docker inspect查看Redis容器的網絡配置:

docker inspect redis

該命令展示了Docker容器的細節,包括配置信息和網絡狀況。可以使用-f標志只獲取IP地址:

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

如果Docker宿主機運行在本地,可以直接使用Redis服務器的IP地址與Redis服務器通信。

這個方法有兩個問題:第一,要在應用程序里對Redis容器的IP地址做硬編碼;第二,如果重啟容器,Docker可能會改變容器的IP地址。

6、讓Docker容器互連

刪除之前運行的redis容器和webapp容器:

docker rm -f webapp
docker rm -f redis

新建一個redis容器,與之前不同的是并不公開任何端口:

docker run -d --name redis ivan/redis

啟動Web應用程序容器,并把它連接到新的Redis容器上去:

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

--link編制創建了兩個容器間的父子連接。這個標志需要兩個參數:一個是要連接的容器名字,另一個是連接后容器的別名。這個例子中,把新容器連接到redis容器,并使用db作為別名。連接讓父容器有能力訪問子容器,并把子容器的一些連接細節分享給父容器,這些細節有助于配置應用程序并使用這個連接。(新創建的容器時父容器,連接到的容器時子容器)

連接也能得到一些安全上的好處。容器的端口不需要對本地宿主機公開。

出于安全原因,可以強制Docker只允許有連接的容器之間相互通信,需要在啟動Docker守護進程時加上--icc=false標志,關閉所有沒有連接的容器間的通信。

也可以把多個容器連接在一起。比如,如果想讓這個Redis實例服務于多個Web應用程序,可以把每個Web應用程序的容器和同一個redis容器連接在一起。

被連接的容器必須運行在同一個Docker宿主機上。不同Docker宿主機上運行的容器無法連接。

Docker在父容器里的以下兩個地方寫入了連接信息:

  • /etc/hosts文件中;

  • 包含連接信息的環境變量中。

/etc/hosts文件中有連接指令創建的項,是redis容器的IP地址和該連接的對應的子容器別名。

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

在bash環境中運行env查看環境變量,可以看到一些以DB開頭的環境變量。Docker在連接webapp和redis容器時,自動創建了以DB開頭的環境變量。DB是創建連接時的子容器別名。這些環境變量主要包含以下信息:

  • 子容器的名字;

  • 子容器里運行服務使用的協議、IP和端口號;

  • 子容器里由Docker設置的環境變量的值。

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

7、測試容器連接情況

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

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

用get方法測試提交情況:

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

5.3 Docker用于持續集成(Jenkins)

1、構建Jenkins和Docker容器

書中代碼的Dockerfile無法構建成功,可能是由于版本升級造成的。去Github上下載更新過的代碼把 5/jenkins/Dockerfile和dockerjenkins.sh放入構建環境的文件夾中。

Dockerfile中使用了VOLUME指令。從容器運行的宿主機上掛載一個卷。

構建成功后啟動容器:

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

這里使用了一個新標志--privileged,它可以啟動Docker的特權模式,允許我們以其宿主機具有的所有能力來運行容器,包括一些內核特性和設備訪問。這是可以在Docker中運行Docker的必要能力。

讓Docker在特權模式運行會有一些安全隱患。在這種模式下運行容器對Docker宿主機有root訪問權限。

感謝各位的閱讀!關于“在測試中如何使用Docker”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

于田县| 浮梁县| 吉安县| 万州区| 乐都县| 双流县| 兴山县| 徐州市| 军事| 古蔺县| 嫩江县| 福泉市| 临城县| 三穗县| 穆棱市| 德江县| 孙吴县| 新蔡县| 墨脱县| 阿合奇县| 合川市| 鹤庆县| 庆阳市| 康乐县| 朝阳区| 西城区| 石林| 银川市| 子长县| 涪陵区| 桂阳县| 于都县| 三都| 永平县| 鱼台县| 随州市| 青田县| 米易县| 玛纳斯县| 崇仁县| 重庆市|