Docker容器之鏡像管理、端口映射、容器互聯

docker鏡像的分層

 Dockerfile 中的每個指令都會創建一個新的鏡像層;
 鏡像層將會被緩存和複用;
 當 Dockerfile 的指令修改了,複製的文件變化了,或者構建鏡像時指定的變量不同了,對應的鏡像層緩存就會失效;
 某一層的鏡像緩存失效之後,它之後的鏡像層緩存都會失效;
 鏡像層是不變的,如果在某一層中添加一個文件,然後在下一層中刪除它,則鏡像中依然包含該文件

docker鏡像

是應用發佈的標準格式
可支撐一個docker容器的運行

docker鏡像的創建方法

基於已有鏡像創建
基於本地模板創建
基於dockerfile創建

基於已有鏡像創建

將容器裏面運行的程序及運行環境打包生成新的鏡像

docker commit [選項] 容器ID/名稱 倉庫名稱:[標籤]
-m:說明信息
-a:作者信息
-p:生成過程中停止容器的運行

基於本地模板創建

通過導入操作系統模板文件生成新的鏡像
使用wget命令導入爲本地鏡像
導入成功後可查看本地鏡像信息

基於 Dockerfile 創建

Dockerfile 是由一組指令組成的文件

Dockerfile 結構的四部分:

基礎鏡像信息;
維護者信息;
鏡像操作指令;
容器啓動時執行指令;

使用 Dockerfile 創建鏡像並在容器中運行

dockerfile操作指令

指令 含義
FROM 鏡像 指定新鏡像所基於的鏡像,第一條指令必須爲FROM指令,每創建一個鏡像就需要一條FROM指令
MAINTAINER 名字 說明新鏡像的維護人信息
RUN 命令 在所基於的鏡像上執行命令,並提交到新的鏡像中
CMD [“要運行的程序”,”參數1”,”參數2”] 指令啓動容器時要運行的命令或者腳本,Dockerfile只能有一條CMD命令,如果指定多條則只能最後一條被執行
EXPOSE 端口號 指定新鏡像加載到Docker時要開啓的端口
ENV 環境變量 變量值 設置一個環境變量的值,會被後面的RUN使用
ADD 源文件/目錄 目標文件/目錄 將源文件複製到目標文件,源文件要與Dockerfile位於相同目錄中, 或者是一個URL
COPY 源文件/目錄 目標文件/目錄 將本地主機上的文件/目錄複製到目標地點,源文件/目錄要與Dockerfile在相同的目錄中
VOLUME [“目錄”] 在容器中創建一個掛載點
USER 用戶名/UID 指定運行容器時的用戶
WORKDIR 路徑 爲後續的RUN、CMD、ENTRYPOINT指定 工作目錄
ONBUILD 命令 指定所生成的鏡像作爲一個基礎鏡像時所要運行的命令
HEALTHCHECK 健康檢查

1、基於已有鏡像創建

[root@localhost ~]# docker pull centos   ##下載鏡像
[root@localhost ~]# docker create -it centos /bin/bash ##基於centos鏡像創建容器
30d395e63fc32b9dcf96029869f40a8002990f689410cca2660af4056ed2614f
[root@localhost ~]# docker ps -a  ##查看容器信息
CONTAINER ID    IMAGE   COMMAND     CREATED     STATUS      PORTS               NAMES
30d395e63fc3        centos              "/bin/bash"         7 seconds ago       Created                                 inspiring_germain
[root@localhost ~]# docker commit -m "new" -a "daoke" 30d395e63fc3 daoke:centos
##將容器裏面運行的程序及運行環境打包生成新的鏡像
sha256:66d76f9225b94ce6156db953bd16c384f74067f981d45bee99340f3a965506d3
[root@localhost ~]# docker images  ##查看鏡像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daoke               centos              66d76f9225b9        10 seconds ago      220MB
centos              latest              0f3e07c0138f        3 months ago        220MB

2、基於本地模板創建

[root@localhost ~]# mount.cifs //192.168.100.3/LNMP-C7 /mnt/  ##將本地模板掛載到Linux上
Password for root@//192.168.100.3/LNMP-C7:  
[root@localhost ~]# cd /mnt     ##切換目錄到/mnt  
[root@localhost docker]# ls
debian-7.0-x86-minimal.tar.gz
[root@localhost mnt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
##基於本地模板創建一個鏡像
sha256:487145d2411f0440c50fd93d0e8a9e27610d2de745a25d06955f21c80e65753a
[root@localhost mnt]# docker images   ##查看鏡像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daoke               new                 487145d2411f        8 seconds ago       215MB
centos              latest              0f3e07c0138f        3 months ago        220MB

3、基於dockefile文件創建

[root@localhost ~]# mkdir apache  ##創建一個目錄
[root@localhost ~]# cd apache/
[root@localhost apache]# vim Dockerfile   ##編寫一個dockerfile文件
FROM centos                                 ##基於的基礎鏡像
MAINTAINER The porject <xu>       ##維護鏡像的用戶信息
RUN yum -y update                           ##鏡像操作指令安裝Apache軟件
RUN yum -y install httpd                    ##安裝Apache服務               
EXPOSE 80        ##開啓80端口
ADD index.html /var/www/html/index.html     ##複製網址首頁文件
ADD run.sh /run.sh           ##將執行腳本複製到鏡像中
RUN chmod 755 /run.sh
CMD ["/run.sh"]             ##啓動容器時執行腳本
[root@localhost apache]# vim run.sh   ##編輯run.sh腳本
#!/bin/bash
rm -rf /run/httpd/*   ##清除緩存
exec /usr/sbin/apachectl -D FOREGROUND  ##執行apache
[root@localhost apache]# echo "this is test web" > index.html   ##創建頁面信息
[root@localhost apache]# ls
Dockerfile  index.html  run.sh
[root@localhost apache]# docker build -t httpd:centos .  ##執行創建鏡像
[root@localhost apache]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               centos              b267aaf2c395        22 seconds ago      401MB
[root@localhost apache]# docker ps -a   ##此時沒有容器生成
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost apache]# docker run -d -p 1234:80 httpd:centos   ##創建映射,創建容器
34c424efdab9e381116de697c4971200b1564b1e38644407cc58d5ba8923a0ea
[root@localhost apache]# docker ps -a  ##容器開啓,1234是外部端口,80是內部端口
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
34c424efdab9        httpd:centos        "/run.sh"           9 seconds ago       Up 7 seconds        0.0.0.0:1234->80/tcp   great_williamson

利用瀏覽器進行訪問

Docker容器之鏡像管理、端口映射、容器互聯

公有倉庫與私有倉庫

隨着創建的鏡像日誌增多,就需要有一個保存鏡像的地方,這就是倉庫。目前主要有兩種倉庫:公共倉庫、私有倉庫。最方便的就是使用公共倉庫上傳和下載鏡像,下載公共倉庫中的鏡像不需要註冊,但是上傳是需要註冊的:公共倉庫網址

1、公有倉庫

##需要註冊docker賬號
##將創建好的 httpd:centos 鏡像。上傳到剛申請的公共倉庫中:
docker tag httpd:centos xu/httpd:centos
docker push xu/httpd:centos

2、私有倉庫

[root@localhost ~]# docker pull registry   ##下載 registry鏡像
[root@localhost ~]# vim /etc/docker/daemon.json
{
    "insecure-registries": ["192.168.13.128:5000"],   ##指定倉庫地址和端口號
    "registry-mirrors": ["https://3a8s9zx5.mirror.aliyuncs.com"]  ##鏡像加速
}
[root@localhost ~]# systemctl stop docker   ##停止docker,開啓docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker create -it registry /bin/bash  ##創建registry鏡像容器
209dadd90f5c555ba328fae5763a61ae5fe4489acc4bfb945a99bb2307a9f139
[root@localhost ~]# docker ps -a  ##查看容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
209dadd90f5c        registry            "/entrypoint.sh /bin…"   4 seconds ago       Created                                           admiring_dewdney
34c424efdab9        httpd:centos        "/run.sh"                13 minutes ago      Exited (137) 35 seconds ago                       great_williamson
[root@localhost ~]# docker start 209dadd90f5c   ##開啓容器
209dadd90f5c
[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
##創建映射端口和數據卷,宿主局的/data自動掛載容器重點的/tmp
fd4185499dfa29f1a1133f59b706a5524572ae3f22140137214ab4c8212ea8a4
[root@localhost ~]# docker images  ##查看一下當前的鏡像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               centos              b267aaf2c395        17 minutes ago      401MB
centos              latest              0f3e07c0138f        3 months ago        220MB
registry            latest              f32a97de94e1        10 months ago       25.8MB
[root@localhost ~]# docker tag httpd:centos 192.168.13.128:5000/httpd  ##修改標籤
[root@localhost ~]# docker push 192.168.13.128:5000/httpd  ##上傳鏡像
[root@localhost ~]# curl -XGET http://192.168.13.128:5000/v2/_catalog ##獲取私有倉庫列表
{"repositories":["httpd"]}
[root@localhost ~]# docker pull 192.168.13.128:5000/httpd  ##通過私有倉庫下載

Docker 網絡通信

docker 提供了映射容器端口到宿主機和容器互聯機制來爲容器提供網絡服務。

端口映射

Docker 提供端口映射機制來將容器內的服務提供給外部網絡訪問,實質上就是將宿主機的端口映射到容器中,使得外部網絡訪問宿主機的端口便可訪問容器內的服務。

1、端口映射

[root@localhost ~]# docker run -d -P nginx  ##隨機指定端口
[root@localhost ~]# docker ps -a  ##查看容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                    NAMES
bcd11c99804e        nginx               "nginx -g 'daemon of…"   13 seconds ago      Up 13 seconds                 0.0.0.0:32768->80/tcp

利用瀏覽器訪問32768端口

Docker容器之鏡像管理、端口映射、容器互聯

[root@localhost ~]# docker run -d -p 32000:80 nginx  ##指定端口

利用瀏覽器訪問32000端口

Docker容器之鏡像管理、端口映射、容器互聯

2、容器互聯(使用centos鏡像)

[root@localhost ~]# docker run -itd -P --name web1 centos /bin/bash   ##創建web1容器
87c58af3100fbc112bf344a421942dd53451c0c663b697a55a8d410868f314bf
[root@localhost ~]# docker run -itd -P --name web2 --link web1:web1 centos /bin/bash
##創建web2連接web1容器
7a84075802b5689912c323196b5af398fb5912316efda014921c0e23d3e9cdd2
[root@localhost ~]# docker ps -a   ##查看容器信息
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                    NAMES
7a84075802b5        centos              "/bin/bash"              6 seconds ago       Up 5 seconds                                           web2
87c58af3100f        centos              "/bin/bash"              42 seconds ago      Up 41 seconds                                          web1
[root@localhost ~]# docker exec -it 7a84075802b5 /bin/bash  ##進入web2容器
[root@7a84075802b5 /]# ping web1  ##pingweb1看是否互聯互通
PING web1 (172.17.0.5) 56(84) bytes of data.
64 bytes from web1 (172.17.0.5): icmp_seq=1 ttl=64 time=0.090 ms
64 bytes from web1 (172.17.0.5): icmp_seq=2 ttl=64 time=0.089 ms
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章