docker容器二探—docker網絡、存儲卷和Dockerfile
php
---------------------------------------------------------------------------------------------------------------------------------------------
html
一半在虛擬機或容器上,做爲通訊接口sql
另外一半在宿主機上,而且被關聯到一個選定的橋設備docker
要想docker內的某個服務被外網訪問,須要將該docker作dnatshell
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
二、docker容器內的80映射到宿主機的80,宿主機的80不能被佔用
docker run –name tiny-web11 –rm -p 80:80 tiny-httpd:v0.0.5
三、
docker run --name tiny-web1 --rm -p 80 -p 445 -p 22 -p 139 httpd:2.4
一、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容器,則其修改的數據所有丟失
二、docker管理卷,非固定的動態卷,docker自行決定
docker run --name v1 -it -v /data busybox
宿主機docker volume ls可看到有宿主機,看到VOLUMENAME
docker volume inspect VOLUMENAME,能夠看到對應的路徑
docker container inspect bb1,查看該容器卷目錄
刪除容器後,存儲卷內容依然存在,此時若是用一個一樣的指令創造容器,將不會顯示存儲卷內容
三、刪除容器後再創建一個同位於卷目錄的容器,容器內容依然存在,
四、若是創建多個容器,但它們的卷同樣,則這兩個容器共享存儲卷
或者複製使用其它容器的卷,使用命令--volumes-from
六、查看container inspect信息中,引用Mounts中的內容,.表明根
注:一個存儲器能夠用多個存儲卷,不過就是命令選項中多加幾回-v
一、docker run 時經過自定義要運行的命令,並向傳遞命令行參數,從而達到配置它的目的
docker run --name ap1 -it httpd:latest /bin/bash
五、容器應該對本身進行週期性健康狀態監測,並在不健康時經過restart自愈,或者其它操做來實現自愈的目的
一、第一條指令必須有FROM,須要基於基礎鏡像作,所以必須須要基礎鏡像
二、由於輸入一條指令鏡像便會啊向上生成一層,所以指令越少越好,能合成一條指令就不要用兩條三條來完成
定量表示:$variable_name或者${variarble_name}
${variable:-word},若是變量未聲明或爲空,則返回word的字符串值,即variable有值就返回它,沒值就返回word
${variable:+word},若是變量variable有值就返回word,不然就爲返回空
二、LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL maintainer="chenux <chenux@chenux.com>"
LABEL maintainer="chenux <chenux@chenux.com>"
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作出配置的鏡像
四、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>"]
十、CMD,運行在docker container run階段中,RUN指令運行於映像文件構建過程當中,而CMD指令運行於基於Dockerfile構建出的新映像文件啓動一個容器時
CMD ["<executable>","<param1>","<param2>"]
十一、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
1四、SHELL,改變系統要調用的默認的shell程序,Linux默認["/bin/sh","-c"],windows默認["cmd","/S","/C"]
1七、ONBUILD,用於在Dockerfile中定義一個觸發器,鑲嵌在第二層中
將此做爲鏡像trig:1後,在此目錄內繼續創建一個目錄,進入目錄並再寫一個Dockerfile,
一、yum -y install docker-registry,但包名叫作docker-distribution,查詢相關安裝路徑rpm -ql docker-distribution,默認5000端口
二、vim /etc/docker-distribution/registry/config.yml,配置docker-distrubution服務
三、配置好後systemctl start docker-distribution,修改標籤
此時直接推會報錯,由於registry須要https協議的地址
四、關閉本地registry倉庫的https安全要求,vim /etc/docker/daemon.json
保存退出後systemctl restart docker,再推送就成功了
一、因爲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
四、由於容器每一次的訪問ip都會改變,所以這裏最好指定容器的主機名
docker container run --name wordpress -d \
> -e WODPRESS_DB_HOST=localhost \
> -e WORDPRESS_DB_USER=wpuser \
> -e WORDPRESS_DB_PASSWORD=wppass \
> wordpress:4.9-php7.2-fpm-alpine