docker容器二探—docker網絡、存儲卷和Dockerfile
---------------------------------------------------------------------------------------------------------------------------------------------
一半在虛擬機或容器上,作爲通信接口
另一半在宿主機上,並且被關聯到一個選定的橋設備
要想docker內的某個服務被外網訪問,需要將該docker做dnat
bridge:橋接網絡,docker0橋默認172.17.0.0/16網段,網關是172.17.0.1,NAT模式
注意:作爲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 run --name bbox1 -it --network none busybox
進入ifconfig -a只有lo網卡,是個完全式的隔離容器
docker run --name bbox -it --network bridge --rm busybox
docker run --name bbox2 -it --network bridge --rm busybox
還是剛纔的網絡,退出bb2,此時bb2會自動被刪除,繼續建立bb2,不過更換--net選項
docker run --namebb2 -it --net container:bb2
注:wget -O - -q:此命令可以將wget當做瀏覽器使用,-O - 表示輸入到當前終端,-q 表示靜默輸出
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
2、docker容器內的80映射到宿主機的80,宿主機的80不能被佔用
docker run –name tiny-web11 –rm -p 80:80 tiny-httpd:v0.0.5
3、
docker run --name tiny-web1 --rm -p 80 -p 445 -p 22 -p 139 httpd:2.4
1、docker network create -d bridge --gateway 10.0.0.1 --subnet 10.0.0.0/16 mynet0
ip link set br.... name docker1
docker run --name c1 --network mynet0 -it busybox,此時該容器就在mynet0網段
不過目前爲止,更改名稱後無法建立docker,系統報錯找不到br-xxxxxxxx,但未改名稱就可以建立容器,之後有結果
關閉並重啓容器,其數據不受影響,但刪除Docker容器,則其修改的數據全部丟失
2、docker管理卷,非固定的動態卷,docker自行決定
docker run --name v1 -it -v /data busybox
宿主機docker volume ls可看到有宿主機,看到VOLUMENAME
docker volume inspect VOLUMENAME,可以看到對應的路徑
docker container inspect bb1,查看該容器卷目錄
刪除容器後,存儲卷內容依然存在,此時如果用一個同樣的指令創造容器,將不會顯示存儲卷內容
3、刪除容器後再建立一個同位於卷目錄的容器,容器內容依然存在,
4、如果建立多個容器,但它們的卷一樣,則這兩個容器共享存儲卷
或者複製使用其它容器的卷,使用命令--volumes-from
6、查看container inspect信息中,引用Mounts中的內容,.代表根
注:一個存儲器可以用多個存儲卷,不過就是命令選項中多加幾次-v
1、docker run 時通過自定義要運行的命令,並向傳遞命令行參數,從而達到配置它的目的
docker run --name ap1 -it httpd:latest /bin/bash
5、容器應該對自己進行週期性健康狀態監測,並在不健康時通過restart自愈,或者其它操作來實現自愈的目的
1、第一條指令必須有FROM,需要基於基礎鏡像做,因此必須需要基礎鏡像
2、因爲輸入一條指令鏡像便會啊向上生成一層,因此指令越少越好,能合成一條指令就不要用兩條三條來完成
定量表示:$variable_name或者${variarble_name}
${variable:-word},如果變量未聲明或爲空,則返回word的字符串值,即variable有值就返回它,沒值就返回word
${variable:+word},如果變量variable有值就返回word,否則就爲返回空
2、LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL maintainer="chenux <[email protected]>"
LABEL maintainer="chenux <[email protected]>"
COPY virt.repo /etc/yum.repos.d/ ------->拷貝workdir內的文件到容器內目錄下
COPY httpd /etc/httpd/ -------->複製目錄
cp /etc/yum.repos.d/virt.repo /docker
vim /docker/.dockerignore,排除複製時候拷貝的目錄
docker image build -t testapp:v0.0.1 /docker ------>構建根據Dockerfile做出配置的鏡像
4、ADD類似於COPY指令,ADD支持使用TAR文件和URL路徑,ADD自動將.tar文件展開到容器目標目錄,將URL鏈接指向的文件自動下載到容器目錄
(1)當容器內目錄太長時可用此選項,之後目標目錄的可以用相對路徑表示,爲Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定設定工作目錄
(2)WORKDIR可使用多次,每次路徑的表示都以最近的WORKDIR爲參考
用於在image中傳建一個掛載點目錄,以掛載Docker host上的卷或者其它容器上的卷
docker container run --name bmw -it -P --rm bbi
-P,暴露對應的容器鏡像當中,暴露所有使用EXPOSE命令鏡像的端口
用於指定docker build過程中運行的程序,這個程序可以是任何命令
RUN ["<executable>","<param1>","<param2>"]
10、CMD,運行在docker container run階段中,RUN指令運行於映像文件構建過程中,而CMD指令運行於基於Dockerfile構建出的新映像文件啓動一個容器時
CMD ["<executable>","<param1>","<param2>"]
11、ENTRYPOINT,運行在docker container run階段中,用於爲容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序
ENTRYPOINT ["<executable>","<param1>","<param2>"]
既有CMD,又有ENTRYPOINT的話,CMD的參數將會傳遞給ENTRYPOINT,如果ENTRYPOINT和CMD都有很多條,將以最後一條爲準。二者同時有命令,會先執行ENTRYPOINT的,之後將CMD指令傳給ENTRYPOINT的結果
如果默認使用一個命令或者鏡像或者一個應用程序自身是不支持加載環境變量的,我們也能通過ENTRYPOINT腳本環境變量來獲取新配置
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指令後的參數覆蓋
如果想覆蓋ENTRYPOINT,加入--entrypoint
用於指定運行image時的或運行Dockerfile中任何RUN、CMD、ENTryPOINT指令指定的程序時的用戶名或UID
USER UID,UID必須爲/etc/passwd中某用戶的有效UID
HEALTHCHECK [OPTIONS] CMD commad
--interval=30,默認30秒,間隔時長,每多長時間檢測一次
--start-period=0,默認0秒,容器啓動多久後開始檢測
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
14、SHELL,改變系統要調用的默認的shell程序,Linux默認["/bin/sh","-c"],windows默認["cmd","/S","/C"]
17、ONBUILD,用於在Dockerfile中定義一個觸發器,鑲嵌在第二層中
將此作爲鏡像trig:1後,在此目錄內繼續建立一個目錄,進入目錄並再寫一個Dockerfile,
1、yum -y install docker-registry,但包名叫做docker-distribution,查詢相關安裝路徑rpm -ql docker-distribution,默認5000端口
2、vim /etc/docker-distribution/registry/config.yml,配置docker-distrubution服務
3、配置好後systemctl start docker-distribution,修改標籤
此時直接推會報錯,因爲registry需要https協議的地址
4、關閉本地registry倉庫的https安全要求,vim /etc/docker/daemon.json
保存退出後systemctl restart docker,再推送就成功了
1、由於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
4、因爲容器每一次的訪問ip都會改變,因此這裏最好指定容器的主機名
docker container run --name wordpress -d \
> -e WODPRESS_DB_HOST=localhost \
> -e WORDPRESS_DB_USER=wpuser \