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 exec -it 容器id /bin/bash
cp -r webapps.dist/* webapps
docker commit -m="描述資訊" -a="作者" 容器id 目标鏡像名:[TAG]
docker commit -a="pengpeng" -m="add webapps app" 84a61bab7659 tomcat02:1.0
4.1容器資料卷
容器的持久化和同步操作,容器間也是可以共享資料的
4.2.1 使用 -v 指令挂載
docker run -it -v 主機目錄:容器内目錄 -p 主機端口:容器内端口
docker run -it -v /home/ceshi:/home centos /bin/bash
使用 docker inspect 807be22b4072 檢視
測試
5.1docker pull mysql
docker pull mysql:5.7
#參考官網 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
5.3 安裝後用工具連一下
docker rm -f mysql01
docker ps
docker ps -a
docker run -d -P --name nginx01 -v /etc/nginx nginx
這裡隻寫了容器内的路徑 沒有寫主控端的路徑
docker volume ls
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume inspect juming-nginx
是以docker容器内的卷 沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxxx/_data
如果指定了目錄,docker volume ls 是檢視不到的
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 .
7.1.4 檢視
docker images
docker run -it 7beb069f53c9 /bin/bash
docker inspect 7beb069f53c9
容器之間的配置資訊的傳遞 資料卷容器的生命周期一直持續到沒有容器使用為止
但是一旦持久化到了本地,本地的資料不會删除
多個mysql實作資料共享
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
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
(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
(3)運作
docker build -t cmd-test:0.1 .
docker run cmd-test:0.1
7.3.5.2 ENTRYPOINT
(1)home下建立docker-test-entrypoint/Dockerfile
mkdir docker-test-entrypoint
(2)vim docker-test-entrypoint
(3)測試
docker run entrypoint-test:0.1
docker run entrypoint-test:0.1 -l
docker login
docker build -t pengpeng/mytomcat:0.1 .
docker tag 容器id pengpeng/mytomcat:1.0
docker run -d --name tomcat01 tomcat
ip addr
docker exec -it tomcat01 ip addr
再次啟動一個tomcat02
docker run -d -P --name tomcat02 tomcat
我們每啟動一個docker容器,docker就會給docker容器配置設定一個ip,我們隻要安裝了docker就會有
一個docker0橋接模式,使用的是veth-pair
veth-pair就是一對的虛拟裝置接口,他們都是成對出現的,一端連着協定,一端彼此相連,
veth-pair充當一個橋梁,連接配接各種虛拟網絡裝置
docker exec -it tomcat02 ip addr
docker exec -it tomcat02 ping 172.17.0.2
docker中所有的網絡接口都是虛拟的,虛拟的轉發效率高(内網傳遞檔案)
docker exec -it tomcat02 ping tomcat01
tomcat01和02無法ping通
docker run -d -P --name tomcat03 --link tomcat02 tomcat #--link運作一個tomcat03
docker exec -it tomcat03 ping tomcat02 #tomcat03 ping tomcat02 可以ping通
docker inspect tomcat03
docker exec -it tomcat03 cat /etc/hosts
--link本質就是在hosts配置中添加映射
現在Docker已經不建議使用--link了
自定義網絡不适用docker0
docker0不支援容器名連接配接通路
docker network
docker network ls
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 network inspect mynet
啟動倆個tomcat
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
在自定義網絡下,服務可以互相ping通,不再使用-link
docker exec tomcat-net-02 ping tomcat-net-01
docker exec tomcat-net-01 ping tomcat-net-02
啟動倆個tomcat 使用預設的docker0
docker run -d -P --name tomcat01 tomcat
tomcat01 connect後 tomcat01 和 tomcat-01-net ping通了
docker network connect mynet tomcat01
docker exec tomcat-net-01 ping tomcat01