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

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

---------------------------------------------------------------------------------------------------------------------------------------------
html

1、docker網絡mysql

    建立一組虛擬網卡web

    一半在虛擬機或容器上,做爲通訊接口sql

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

    要想docker內的某個服務被外網訪問,須要將該docker作dnatshell

    容器之間雖然能夠隔離,不過能夠經過網絡迴環鏈接起來 數據庫

2、docker四種網絡模式json

docker network lsvim

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

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

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

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

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

image.png

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

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

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

進入交互界面兩個能夠互ping通

image.pngimage.png

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

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

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

image.png

在bb1上執行如下指令

image.png

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

四、容器之間共享宿主機的網絡,監聽宿主機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

4、暴露服務

image.png

示例

一、docker port tiny-web1

image.png

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

docker port :查看docker端口

image.png

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

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

三、

image.png

四、映射多個端口

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

3、docker network相關命令

docker network -h

image.png

一、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

二、將容器加入網絡

image.png

將容器上剝離網絡

image.png

三、移除網絡

docker network rm mynet0

image.png

4、docker的存儲卷

一、聯合掛載

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

新增在可寫層新增

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

刪除給該文件加隱藏標籤

所以全部操做不影響底層鏡像

image.png

二、數據卷特定:

容器之間能夠共享數據卷,而且也能夠重複利用

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

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

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

5、存儲卷類型

一個存儲器能夠建立多個存儲卷,即-v多指定幾個

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

image.png

二、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

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

image.png

四、若是創建多個容器,但它們的卷同樣,則這兩個容器共享存儲卷

image.png

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

使用b2容器輸入指令

image.png

新建b4容器啓動後驗證

image.png

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

命令執行效果

image.png

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

6、配置容器化應用

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

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

image.png

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

三、經過環境變量更改配置

docker run -e

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

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

7、Dockerfile注意點

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

一、第一條指令必須有FROM,須要基於基礎鏡像作,所以必須須要基礎鏡像

二、由於輸入一條指令鏡像便會啊向上生成一層,所以指令越少越好,能合成一條指令就不要用兩條三條來完成

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

8、Dockfile格式

一、文件格式

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

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

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

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

二、環境變量

須要用ENV定義

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

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

${variable:+word},若是變量variable有值就返回word,不然就爲返回空

三、dockerignore file

9、Dockerfile介紹

一、FROM IMAGE:VERSION

FROM IMAGE@校驗碼

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

LABEL maintainer="chenux <chenux@chenux.com>"

image.png

三、COPY

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

COPY <src> <dest>

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

示例:

mkdir /docker

vim /docker/Dockerfile

FROM alpine:3.6

LABEL maintainer="chenux <chenux@chenux.com>"

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

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

image.png

五、WORKDIR

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

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

六、VOLUME,不支持綁定掛載

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

VOLUME <mountpoint>

VOLUME ["<mountpoint>"]

image.png

結果查看

image.png

七、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

八、ENV

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

ENV <key> <value>或者

ENV <key>=<value>

image.png

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

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

RUN <command>

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

image.png

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

image.png

結果

image.png

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

CMD <command>

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

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

image.png

十一、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

十二、user

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

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

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

USER UserName

1三、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,不檢測健康狀態

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

1五、STOPIGNAL:中止信號

1六、ARG,參數

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

演示有

image.png

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

image.png

以後創建鏡像trig:2,啓動後有

image.png

9、創建私有鏡像倉庫

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

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

image.png

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

image.png

此時直接推會報錯,由於registry須要https協議的地址

image.png

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

image.png

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

image.png

10、在docker容器安裝wordpress

一、因爲wordpress已經被官方和熱心網友作成了鏡像,所以能夠直接拿來使用

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

二、開啓數據庫

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

image.png

三、進入數據庫容器受權

image.png

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

image.png

四、由於容器每一次的訪問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

相關文章
相關標籤/搜索