天天看點

Docker進階:容器卷、DockerFile、Docker網絡原理

1.Docker鏡像

1.1鏡像是什麼

1.2Docker鏡像加載原理

2.docker分層

3.commit鏡像

3.1 啟動一個預設tomcat

3.2 進入容器

3.3 拷貝檔案

3.4 送出

4.容器資料卷

4.1什麼是容器卷

4.2 使用容器卷

5.安裝mysql

5.1 docker pull mysql

5.2 啟動容器

5.3 安裝後用工具連接配接

5.4 删除容器

6.具名和匿名挂載

6.1匿名挂載

6.2 檢視所有volume的情況

6.3 具名挂載

6.4拓展

7.DockerFile

7.1 初始DockerFile

7.2 資料容器卷

7.3DockerFile介紹

7.4 釋出自己的鏡像

8.Docker網絡

8.1 了解Docker 0

8.2 三個網絡

8.3 -link

9.自定義網絡

9.1 docker network

9.2 網絡模式

9.3 測試

10 網絡連通

鏡像是一種輕量級、可執行的獨立軟體包,用來打包軟體運作環境和機遇運作環境開發的軟體。

包含一個軟體的所有内容。蔣所有的應用和環境,直接打包為docker鏡像,直接運作

1.2.1UnionFs(聯合檔案系統)

Union是一種分層、輕量級并且高性能的檔案系統,支援對檔案系統的修改作為一次送出

一層層的疊加,同時可以将不同目錄挂載到同一個虛拟檔案系統

Union檔案系統是Docker鏡像的基礎

1.2.3Docker鏡像加載原理

docker的鏡像實際上由一層一層的檔案系統組成(UnionFs)

boots(boot file system):主要包含bootloader和Kernel bootloader主要是引導加kernal,linux剛啟動

                                        時會加bootfs檔案系統,在Docker鏡像的最底層是boots

rootfs(root file system):在bootfs之上。包含linux的/dev /proc /bin /etc 等标準目錄和檔案

相同的鏡像可以共享

docker run -d -p 8080:8080 tomcat

Docker進階:容器卷、DockerFile、Docker網絡原理

docker exec -it 容器id /bin/bash

cp -r webapps.dist/* webapps

Docker進階:容器卷、DockerFile、Docker網絡原理

docker commit -m="描述資訊" -a="作者" 容器id 目标鏡像名:[TAG]

docker commit -a="pengpeng" -m="add webapps app" 84a61bab7659 tomcat02:1.0

Docker進階:容器卷、DockerFile、Docker網絡原理

4.1容器資料卷

容器的持久化和同步操作,容器間也是可以共享資料的

4.2.1 使用 -v 指令挂載

docker run -it -v 主機目錄:容器内目錄 -p 主機端口:容器内端口

docker run -it -v /home/ceshi:/home centos /bin/bash

Docker進階:容器卷、DockerFile、Docker網絡原理

使用 docker inspect 807be22b4072 檢視

Docker進階:容器卷、DockerFile、Docker網絡原理

 測試

Docker進階:容器卷、DockerFile、Docker網絡原理

5.1docker pull mysql

docker pull mysql:5.7

Docker進階:容器卷、DockerFile、Docker網絡原理

#參考官網 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# -d 背景運作

# -p 端口映射

# -v 卷挂載

# -e 環境配置

# -- name 容器名字

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

Docker進階:容器卷、DockerFile、Docker網絡原理

5.3 安裝後用工具連一下

Docker進階:容器卷、DockerFile、Docker網絡原理

docker rm -f mysql01

Docker進階:容器卷、DockerFile、Docker網絡原理

docker ps  

docker ps -a

Docker進階:容器卷、DockerFile、Docker網絡原理

docker run -d -P --name nginx01 -v /etc/nginx nginx

這裡隻寫了容器内的路徑 沒有寫主控端的路徑

Docker進階:容器卷、DockerFile、Docker網絡原理

docker volume ls

Docker進階:容器卷、DockerFile、Docker網絡原理

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

Docker進階:容器卷、DockerFile、Docker網絡原理
Docker進階:容器卷、DockerFile、Docker網絡原理

docker volume inspect juming-nginx

是以docker容器内的卷 沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxxx/_data

如果指定了目錄,docker volume ls 是檢視不到的

Docker進階:容器卷、DockerFile、Docker網絡原理

ro #readonly 隻讀 這個路徑隻能通過主控端來操作 容器内部無法操作

rw #readwrite 可讀可寫

docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx

docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx

7.1.1 home 建立 Docker-test-volume/Dockerfile

[root@localhost ~]# cd /

[root@localhost /]# cd home

[root@localhost home]# mkdir docker-test-volume

[root@localhost home]# cd docker-test-volume/

[root@localhost docker-test-volume]# touch Dockerfile

7.1.2 vim Dockerfile

編輯如下

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash

7.1.3 docker build

docker build -f /home/docker-test-volume/Dockerfile -t pengpeng/centos:1.0 .

Docker進階:容器卷、DockerFile、Docker網絡原理

7.1.4  檢視

docker images

Docker進階:容器卷、DockerFile、Docker網絡原理

docker run -it 7beb069f53c9 /bin/bash

docker inspect 7beb069f53c9

容器之間的配置資訊的傳遞 資料卷容器的生命周期一直持續到沒有容器使用為止

但是一旦持久化到了本地,本地的資料不會删除

多個mysql實作資料共享

Docker進階:容器卷、DockerFile、Docker網絡原理

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

Docker進階:容器卷、DockerFile、Docker網絡原理

7.3.1 dockerfile是用來建構docker鏡像的檔案

步驟

(1)編寫一個dockerfile檔案

(2)docker build建構稱為一個鏡像

(3)docker run運作鏡像

(4)docker push釋出鏡像(DockerHub、阿裡雲倉庫)

7.3.2 DockerFile建構過程

(1)關鍵字(指令)必須大寫

(2)執行從上到下順序

(3)#表示注釋

(5)每個指令都會建立送出一個新的鏡像 并送出 

7.3.3 DockerFile常用指令

  FROM # 基礎鏡像,一切從這裡開始建構

  MAINTAINER # 鏡像是誰寫的, 姓名+郵箱 RUN # 鏡像建構的時候需要運作的指令

  ADD                   # 步驟

  WORKDIR         # 鏡像的工作目錄

  VOLUME            # 挂載的目錄

  EXPOSE            # 保留端口配置

  CMD                   # 指定這個容器啟動的時候要運作的指令,可被替代。

  ENTRYPOINT    # 指定這個容器啟動的時候要運作的指令,可以追加指令

  ONBUILD           # 當建構一個被繼承 DockerFile 這個時候就會運作ONBUILD的指令

  COPY                 # 類似ADD,将我們檔案拷貝到鏡像中 ENV # 建構的時候設定環境變量!

7.3.4 建立一個自己的centos

(1)home下建立 docker-test-centos/Dockerfile

   cd /

   cd home

   mkdir docker-test-centos

   vim Dockerfile

Docker進階:容器卷、DockerFile、Docker網絡原理

 (2)docker build

   docker build -t mycentos:0.1 .

7.3.5 CMD和ENTRYPOINT

 CMD                  #容器啟動的時候要運作的指令 可被替代

 ENTRYPOINT   #容器啟動的時候要運作的指令 可以追加

7.3.5.1 CMD

(1)home下建立docker-test-cmd/Dockerfile

 mkdir docker-test-cmd

(2)vim Dockerfile

Docker進階:容器卷、DockerFile、Docker網絡原理

(3)運作

docker build -t cmd-test:0.1 .

Docker進階:容器卷、DockerFile、Docker網絡原理

docker run cmd-test:0.1

Docker進階:容器卷、DockerFile、Docker網絡原理

7.3.5.2 ENTRYPOINT  

(1)home下建立docker-test-entrypoint/Dockerfile

mkdir docker-test-entrypoint

(2)vim docker-test-entrypoint

Docker進階:容器卷、DockerFile、Docker網絡原理

(3)測試

docker run entrypoint-test:0.1

Docker進階:容器卷、DockerFile、Docker網絡原理

docker run entrypoint-test:0.1 -l

Docker進階:容器卷、DockerFile、Docker網絡原理

docker login

docker build -t pengpeng/mytomcat:0.1 .

docker tag 容器id pengpeng/mytomcat:1.0 

Docker進階:容器卷、DockerFile、Docker網絡原理

docker run -d --name tomcat01 tomcat

ip addr

Docker進階:容器卷、DockerFile、Docker網絡原理

docker exec -it tomcat01 ip addr

Docker進階:容器卷、DockerFile、Docker網絡原理

再次啟動一個tomcat02

docker run -d -P --name tomcat02 tomcat

Docker進階:容器卷、DockerFile、Docker網絡原理
Docker進階:容器卷、DockerFile、Docker網絡原理

我們每啟動一個docker容器,docker就會給docker容器配置設定一個ip,我們隻要安裝了docker就會有

一個docker0橋接模式,使用的是veth-pair

veth-pair就是一對的虛拟裝置接口,他們都是成對出現的,一端連着協定,一端彼此相連,

veth-pair充當一個橋梁,連接配接各種虛拟網絡裝置

Docker進階:容器卷、DockerFile、Docker網絡原理

docker exec -it tomcat02 ip addr

Docker進階:容器卷、DockerFile、Docker網絡原理

docker exec -it tomcat02 ping 172.17.0.2

Docker進階:容器卷、DockerFile、Docker網絡原理

docker中所有的網絡接口都是虛拟的,虛拟的轉發效率高(内網傳遞檔案)

docker exec -it tomcat02 ping tomcat01

tomcat01和02無法ping通

Docker進階:容器卷、DockerFile、Docker網絡原理

docker run -d -P --name tomcat03 --link tomcat02 tomcat  #--link運作一個tomcat03

Docker進階:容器卷、DockerFile、Docker網絡原理

docker exec -it tomcat03 ping tomcat02 #tomcat03 ping tomcat02 可以ping通

Docker進階:容器卷、DockerFile、Docker網絡原理

docker inspect tomcat03

Docker進階:容器卷、DockerFile、Docker網絡原理

docker exec -it tomcat03 cat /etc/hosts

Docker進階:容器卷、DockerFile、Docker網絡原理

--link本質就是在hosts配置中添加映射

現在Docker已經不建議使用--link了

自定義網絡不适用docker0

docker0不支援容器名連接配接通路

docker network

docker network ls

Docker進階:容器卷、DockerFile、Docker網絡原理

bridge:橋接docker(預設,自己建立也是bridge模式)

none:不配置網絡

host:和所主機共享網絡

container:容器網絡連通

docker run -d -P --name tomcat01  tomcat

’等價于

docker run -d -P --name tomcat01 --net bridge tomcat

#docker0 特點:預設 域名不能通路

#自定義網絡

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

Docker進階:容器卷、DockerFile、Docker網絡原理
Docker進階:容器卷、DockerFile、Docker網絡原理

docker network inspect mynet

Docker進階:容器卷、DockerFile、Docker網絡原理

啟動倆個tomcat

docker run -d -P --name tomcat-net-01 --net mynet tomcat

docker run -d -P --name tomcat-net-02 --net mynet tomcat

Docker進階:容器卷、DockerFile、Docker網絡原理
Docker進階:容器卷、DockerFile、Docker網絡原理

在自定義網絡下,服務可以互相ping通,不再使用-link

docker exec tomcat-net-02 ping tomcat-net-01

docker exec tomcat-net-01 ping tomcat-net-02

Docker進階:容器卷、DockerFile、Docker網絡原理

啟動倆個tomcat 使用預設的docker0

docker run -d -P --name tomcat01 tomcat

Docker進階:容器卷、DockerFile、Docker網絡原理

tomcat01 connect後 tomcat01 和 tomcat-01-net ping通了

docker network connect mynet tomcat01

docker exec tomcat-net-01 ping tomcat01

Docker進階:容器卷、DockerFile、Docker網絡原理