docker容器二探—docker網絡、存儲卷和Dockerfile

               docker容器二探—docker網絡、存儲卷和Dockerfile

---------------------------------------------------------------------------------------------------------------------------------------------

一、docker網絡

    創建一組虛擬網卡

    一半在虛擬機或容器上,作爲通信接口

    另一半在宿主機上,並且被關聯到一個選定的橋設備

    要想docker內的某個服務被外網訪問,需要將該docker做dnat

    容器之間雖然可以隔離,不過可以通過網絡迴環連接起來 

二、docker四種網絡模式

docker network ls

image.png

bridge:橋接網絡,docker0橋默認172.17.0.0/16網段,網關是172.17.0.1,NAT模式

host:共享宿主機的網絡

none:迴環網絡

注意:作爲vmware宿主機的windows應該可以ping通docker0,如果ping不通,windows以管理員身份運行cmd,添加路由:route add -p 172.17.0.0 mask 255.255.255.0 192.168.239.1

其中172.17.0.0是我docker0的網段,192.168.239.1是我windows連接vmware的ip

三、docker容器可加入的4種網絡演示:

1、封閉式容器,迴環網絡,--net none

docker run --name bbox1 -it --network none busybox

進入ifconfig -a只有lo網卡,是個完全式的隔離容器

image.png

2、橋接式網絡,--net bridge

docker run --name bbox -it --network bridge  --rm busybox

docker run --name bbox2 -it --network bridge  --rm busybox

進入交互界面兩個可以互ping通

image.pngimage.png

3、聯盟式容器:獨立的運行空間,但底層網絡共享

還是剛纔的網絡,退出bb2,此時bb2會自動被刪除,繼續建立bb2,不過更換--net選項

docker run --namebb2 -it --net container:bb2

image.png

在bb1上執行以下指令

image.png

注:wget -O - -q:此命令可以將wget當做瀏覽器使用,-O - 表示輸入到當前終端,-q 表示靜默輸出

4、容器之間共享宿主機的網絡,監聽宿主機IP地址

docker run --name bb2 -it --network host --rm busybox

在bb2上mkdir /data,vi /data/index.html,輸入內容,之後httpd -h /data,完成後在windows瀏覽器輸入dokcer0的ip可以打開看到bb2編寫的index.html

四、暴露服務

image.png

示例

1、docker port tiny-web1

image.png

然後,32768是系統隨機選擇的一個端口

docker port :查看docker端口

image.png

2、docker容器內的80映射到宿主機的80,宿主機的80不能被佔用

docker run –name tiny-web11 –rm -p 80:80 tiny-httpd:v0.0.5

3、

image.png

4、映射多個端口

docker run --name tiny-web1 --rm -p 80 -p 445 -p 22 -p 139 httpd:2.4

三、docker network相關命令

docker network -h

image.png

1、docker network create -d bridge --gateway 10.0.0.1 --subnet 10.0.0.0/16 mynet0

image.png

改名 ifconfig br......down

ip link set br.... name docker1

image.png

docker run --name c1 --network mynet0 -it busybox,此時該容器就在mynet0網段

image.png

不過目前爲止,更改名稱後無法建立docker,系統報錯找不到br-xxxxxxxx,但未改名稱就可以建立容器,之後有結果

image.png

2、將容器加入網絡

image.png

將容器上剝離網絡

image.png

3、移除網絡

docker network rm mynet0

image.png

四、docker的存儲卷

1、聯合掛載

關閉並重啓容器,其數據不受影響,但刪除Docker容器,則其修改的數據全部丟失

新增在可寫層新增

修改複製上一層到本層進行修改

刪除給該文件加隱藏標籤

因此所有操作不影響底層鏡像

image.png

2、數據卷特定:

容器之間可以共享數據卷,並且也可以重複利用

對於存儲卷的改變是直接保存在數據捲上

當更新一個鏡像不會影響更改存儲卷

刪除容器時並不會刪除存儲卷

五、存儲卷類型

一個存儲器可以創建多個存儲卷,即-v多指定幾個

1、綁定掛載卷:手工建立容器的目錄與宿主機目錄的對應關係

image.png

2、docker管理卷,非固定的動態卷,docker自行決定

docker run --name v1 -it -v /data busybox

-v指明容器內的路徑,不存在則自動創建

image.png

宿主機docker volume ls可看到有宿主機,看到VOLUMENAME

docker volume inspect VOLUMENAME,可以看到對應的路徑

docker container inspect bb1,查看該容器卷目錄

image.png

刪除容器後,存儲卷內容依然存在,此時如果用一個同樣的指令創造容器,將不會顯示存儲卷內容

image.png

3、刪除容器後再建立一個同位於卷目錄的容器,容器內容依然存在,

image.png

4、如果建立多個容器,但它們的卷一樣,則這兩個容器共享存儲卷

image.png

或者複製使用其它容器的卷,使用命令--volumes-from

使用b2容器輸入指令

image.png

新建b4容器啓動後驗證

image.png

6、查看container inspect信息中,引用Mounts中的內容,.代表根

命令執行效果

image.png

注:一個存儲器可以用多個存儲卷,不過就是命令選項中多加幾次-v

六、配置容器化應用

1、docker run 時通過自定義要運行的命令,並向傳遞命令行參數,從而達到配置它的目的

docker run --name ap1 -it httpd:latest /bin/bash

image.png

2、自定義鏡像,將修改好的配置文件直接寫進鏡像層,做成鏡像

3、通過環境變量更改配置

docker run -e

4、存儲卷,將/etc/目錄做成存儲卷,容器使用存儲卷啓動

5、容器應該對自己進行週期性健康狀態監測,並在不健康時通過restart自愈,或者其它操作來實現自愈的目的

七、Dockerfile注意點

Dockerfile是用來建立docker鏡像的源碼

1、第一條指令必須有FROM,需要基於基礎鏡像做,因此必須需要基礎鏡像

2、因爲輸入一條指令鏡像便會啊向上生成一層,因此指令越少越好,能合成一條指令就不要用兩條三條來完成

3、容器中的命令只基於基礎鏡像,和宿主機操作系統無關

八、Dockfile格式

1、文件格式

#後是註釋,否則就會認爲是指令+參數的格式

指令使用全大寫,用來區別指令和參數

執行順序:自上而下依次執行,不支持判斷和循環

第一條指令必須用FROM 跟隨基礎鏡像

2、環境變量

需要用ENV定義

定量表示:$variable_name或者${variarble_name}

${variable:-word},如果變量未聲明或爲空,則返回word的字符串值,即variable有值就返回它,沒值就返回word

${variable:+word},如果變量variable有值就返回word,否則就爲返回空

3、dockerignore file

九、Dockerfile介紹

1、FROM IMAGE:VERSION

FROM IMAGE@校驗碼

2、LABEL <key>=<value> <key>=<value> <key>=<value> ...

LABEL maintainer="chenux <[email protected]>"

image.png

3、COPY

用戶從Docker主機複製文件至創建的新映像文件

COPY <src> <dest>

COPY ["<src>",... "<dest>"]

示例:

mkdir /docker

vim /docker/Dockerfile

FROM alpine:3.6

LABEL maintainer="chenux <[email protected]>"

COPY virt.repo /etc/yum.repos.d/  ------->拷貝workdir內的文件到容器內目錄下

COPY httpd /etc/httpd/  -------->複製目錄

image.png

cp /etc/yum.repos.d/virt.repo /docker

cp -r /etc/httpd /docker/

vim /docker/.dockerignore,排除複製時候拷貝的目錄

image.png

docker image build -t testapp:v0.0.1 /docker ------>構建根據Dockerfile做出配置的鏡像

image.png

啓動容器查看

image.png

4、ADD類似於COPY指令,ADD支持使用TAR文件和URL路徑,ADD自動將.tar文件展開到容器目標目錄,將URL鏈接指向的文件自動下載到容器目錄

image.png

5、WORKDIR

(1)當容器內目錄太長時可用此選項,之後目標目錄的可以用相對路徑表示,爲Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定設定工作目錄

(2)WORKDIR可使用多次,每次路徑的表示都以最近的WORKDIR爲參考

6、VOLUME,不支持綁定掛載

用於在image中傳建一個掛載點目錄,以掛載Docker host上的卷或者其它容器上的卷

VOLUME <mountpoint>

VOLUME ["<mountpoint>"]

image.png

結果查看

image.png

7、EXPOSE

用於指定要暴露的端口

EXPOSE 80/tcp 8080/tcp

image.png

docker build -t bbi .

docker container run --name bmw -it -P --rm bbi

-P,暴露對應的容器鏡像當中,暴露所有使用EXPOSE命令鏡像的端口

image.png

8、ENV

用於爲鏡像定義所需的環境變量,-e選項用來傳遞環境變量

ENV <key> <value>或者

ENV <key>=<value>

image.png

9、RUN,位於docker build的階段中

用於指定docker build過程中運行的程序,這個程序可以是任何命令

RUN <command>

RUN ["<executable>","<param1>","<param2>"]

image.png

本着能執行一條命令,就不執行兩條命令的原則,可改成

image.png

結果

image.png

10、CMD,運行在docker container run階段中,RUN指令運行於映像文件構建過程中,而CMD指令運行於基於Dockerfile構建出的新映像文件啓動一個容器時

CMD <command>

CMD ["<executable>","<param1>","<param2>"]

CMD ["<param1>","<param2>"]

image.png

11、ENTRYPOINT,運行在docker container run階段中,用於爲容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序

ENTRYPOINT <command>

ENTRYPOINT ["<executable>","<param1>","<param2>"]

image.png

既有CMD,又有ENTRYPOINT的話,CMD的參數將會傳遞給ENTRYPOINT,如果ENTRYPOINT和CMD都有很多條,將以最後一條爲準。二者同時有命令,會先執行ENTRYPOINT的,之後將CMD指令傳給ENTRYPOINT的結果

如果默認使用一個命令或者鏡像或者一個應用程序自身是不支持加載環境變量的,我們也能通過ENTRYPOINT腳本環境變量來獲取新配置

簡單舉例

image.png

結果

image.png

Dockerfile中RUN、CMD、ENTRYPOINT區別:

1、RUN指令通常用於安裝應用和軟件包,在構建鏡像時就已經執行了命令

2、CMD指令允許用戶指定容器的默認執行的命令,此命令在容器啓動且開啓容器docker run沒有指定其它命令時運行,如果鏡像中寫入的是CMD httpd -f /data,而在啓動鏡像時用命令docker run --name xxx -it xx:xx /bin/bash,此時進入鏡像後/bin/bash便會覆蓋掉CMD的指令httpd -f /data

3、ENTRYPOINT指令與CMD類似,只不過它的指令不會被docker run指令後的參數覆蓋

第2條說明演示:

image.png

CMD結果

image.png

第3條說明演示:

image.png

結果

image.pngimage.png

如果想覆蓋ENTRYPOINT,加入--entrypoint

image.png

12、user

用於指定運行image時的或運行Dockerfile中任何RUN、CMD、ENTryPOINT指令指定的程序時的用戶名或UID

默認情況下,container的運行身份爲root用戶

USER UID,UID必須爲/etc/passwd中某用戶的有效UID

USER UserName

13、HEALTHCHECK

健康狀態監測

HEALTHCHECK [OPTIONS] CMD commad

--interval=30,默認30秒,間隔時長,每多長時間檢測一次

--timeout=30,超時時長

--start-period=0,默認0秒,容器啓動多久後開始檢測

--retries=3,默認3此,重新嘗試次數

退出碼

0:success,容器健康

1:unhealthy,容器工作異常

2:reserved,不使用退出碼

舉例:

HEALTHCHECK --interval=5m --timeout=3s \

CMD curl -f http://localhost/ || exit 1

HEALTHCHECK NONE,不檢測健康狀態

14、SHELL,改變系統要調用的默認的shell程序,Linux默認["/bin/sh","-c"],windows默認["cmd","/S","/C"]

15、STOPIGNAL:停止信號

16、ARG,參數

17、ONBUILD,用於在Dockerfile中定義一個觸發器,鑲嵌在第二層中

演示有

image.png

將此作爲鏡像trig:1後,在此目錄內繼續建立一個目錄,進入目錄並再寫一個Dockerfile,

image.png

之後建立鏡像trig:2,啓動後有

image.png

九、建立私有鏡像倉庫

1、yum -y install docker-registry,但包名叫做docker-distribution,查詢相關安裝路徑rpm -ql docker-distribution,默認5000端口

2、vim /etc/docker-distribution/registry/config.yml,配置docker-distrubution服務

image.png

3、配置好後systemctl start docker-distribution,修改標籤

image.png

此時直接推會報錯,因爲registry需要https協議的地址

image.png

4、關閉本地registry倉庫的https安全要求,vim /etc/docker/daemon.json

image.png

保存退出後systemctl restart docker,再推送就成功了

image.png

十、在docker容器安裝wordpress

1、由於wordpress已經被官方和熱心網友做成了鏡像,因此可以直接拿來使用

docker pull wordpress:4.9-php7.2-fpm-alpine,完成之後按照數據庫

2、開啓數據庫

docker run --name wpdb -d -v /data/mydata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=chenux mysql:5.5.62

image.png

3、進入數據庫容器授權

image.png

新建wpuser用戶,對本機和網橋的設備進行授權

image.png

4、因爲容器每一次的訪問ip都會改變,因此這裏最好指定容器的主機名

docker container run --name wordpress -d \

> -e WODPRESS_DB_HOST=localhost \

> -e WORDPRESS_DB_USER=wpuser \

> -e WORDPRESS_DB_PASSWORD=wppass \

> -e WORDPRESS_DB_NAME=wpdb \

> --network container:wpdb \

> wordpress:4.9-php7.2-fpm-alpine

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章