目錄
1.1 docker鏡像
1. 什么是docker鏡像?
docker鏡像不包含Linux內核而有精簡的Linux操作系統
-
-
-
我么安裝操作系統ISO就可以理解為用C語言寫的安裝包(例如,微信安裝包)
-
我們安裝操作系統就好像我們安裝微信一樣
-
docker鏡像也像ISO安裝包,但是因為操作系統已將安裝Linux內核,所以安裝包可以直接使用
( 這個安裝包只有Linux文件系統,而內核直接使用Linux系統本身就行)
-
docker 鏡像是docker容器的靜態視角,docker容器是docker鏡像的運行狀態
-
-
-
docker鏡像--->程序(存儲在硬盤里的代碼)
-
進程-----> 把我們硬盤里的代碼加載到內存運行
-
容器是docker鏡像的引用,如何docker鏡像刪除,次鏡像創建的容器也會失效
2.容器讀寫層(本質)
1. 容器其實是在鏡像的最上面加了一層讀寫層,在運行容器里文件改動時,會先從鏡像里要寫的文件復制到容器自己的文件系統中(讀寫層)。
2. 如果容器刪除了,最上面的讀寫層也就刪除了,改動也就丟失了。
3. 所以無論多少個容器共享一個鏡像,所做的寫操作都是從鏡像的文件系統中復制過來操作的,並不會修改鏡像的源文件
4. 若想持久化這些改動,可以通過docker commit 將容器保存成一個新鏡像
3.查看docker容器的工作目錄

1 [root@linux-node4 diff]# docker run -itd --name=web1 -p 192.168.56.14:81:80 nginx:latest 2 [root@linux-node4 diff]# docker inspect web1 3 [ 4 { 5 # 存儲驅動 6 "GraphDriver": { 7 "Data": { 8 "LowerDir": "/var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13-init/diff:/var/lib/docker/overlay2/09fa1314e484781dfc1fb25a6cf5df2502fe35dea9025a373a3cb0202732ccce/diff:/var/lib/docker/overlay2/162ec5c9be56e5d718011c09ed087eda04b755e1a68bd1953c60f175e6635e68/diff:/var/lib/docker/overlay2/7c1b27ff59a397ae7d6bd106db579e90476f57bb1ecef9fcb1a6f1ad5ce43b7c/diff", 9 "MergedDir": "/var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13/merged", 10 "UpperDir": "/var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13/diff", 11 "WorkDir": "/var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13/work" 12 }, 13 "Name": "overlay2" 14 }, 15 "NetworkSettings": { 16 "Ports": { 17 "80/tcp": [ 18 { 19 "HostIp": "192.168.56.14", 20 "HostPort": "81" 21 } 22 ] 23 }, 24 "MacAddress": "02:42:ac:11:00:02", 25 "Networks": { 26 "bridge": { 27 "Gateway": "172.17.0.1", 28 "IPAddress": "172.17.0.2", 29 "IPPrefixLen": 16, 30 } 31 } 32 } 33 } 34 ] 35 [root@linux-node4 diff]# cd /var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13 36 [root@linux-node4 51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13]# ll # 查看docker工作目錄都哪些內容 37 diff link lower merged work 38 diff # 讀寫層的差異(在讀寫層做的操作由這個容器單獨管理) 39 merged # 引用docker進行中的文件系統 40 work # 項目工作目錄
1.2 常用命令
1. docker 普通命令
1 docker ps # 僅列出當前運行的容器 2 docker ps -l # 列出最新創建得容器 3 docker ps -a # 列出素有容器(包括 未運行的) 4 docker inspect web4 # 列出指定容器的詳細信息 5 6 #### 持久化容器 7 8 docker exec -it web4 bash # 進入容器web4中 9 touch 1.txt 2.txt # 對容器進行修改 10 docker commit web4 nginx:web4 # 將修改后的web4容器提交為一個新鏡像 nginx:web4 11 docker images # 可以看到 多了一個 TAG標記為 web4 的鏡像 12 docker run -d --name web4-1 nginx:web4 # 使用剛剛提交的鏡像web4創建一個容器web4-1 13 docker exec -it web4-1 bash # 進入web4-1的bash環境 14 15 #### 從宿主機復制文件到docker容器 16 docker cp nginx.tar web4-1:/home # 將宿主機nginx.tar文件拷貝到容器web4-1的/home目錄中 17 docker exec -it web4-1 ls /home # 在容器web4-1中執行 "ls /home" 命令 18 19 #### 容器常用查詢命令 20 docker logs web4-1 # 查看web4-1中控制台日志 21 docker port 55f870061ed9 # 查看指定容器端口映射 22 docker top 00f7ddc96622 # 查看容器中有哪些進程 23 docker stats 00f7ddc96622 # 查看容器資源使用情況 24 25 ##### 啟動、停止、刪除 容器 26 docker ps -a # 列出素有容器(包括 未運行的) 27 docker start web # 啟動容器web 28 docker stop web # 停止容器web 29 docker rm web # 刪除容器web
2. 鏡像常用命令
1 [root@linux-node4 diff]# docker help # 查看docker幫助 2 [root@linux-node4 diff]# docker image --help # 查看 docker中 鏡像相關幫助 3 [root@linux-node4 diff]# docker image ls # 查看當前所有鏡像 4 [root@linux-node4 diff]# docker image inspect nginx # 查看指定鏡像(nginx鏡像)詳細信息 5 [root@linux-node4 diff]# docker pull nginx:1.14 # 下載指定版本鏡像 nginx 6 [root@linux-node4 diff]# docker image rm nginx:1.14 # 刪除nginx 1.14版本 7 [root@linux-node4 diff]# docker image save nginx > nginx.tar # 導出niginx鏡像

1 -d # 后台運行容器,並返回容器ID; 2 -i # 以交互模式運行容器,通常與 -t 同時使用; 3 -t # 為容器重新分配一個偽輸入終端,通常與 -i 同時使用; 4 -P # 隨機端口映射,容器內部端口隨機映射到主機的高端口 5 -p # 指定端口映射,格式為:主機(宿主)端口:容器端口 6 --name="nginx-lb" # 為容器指定一個名稱; 7 --dns 8.8.8.8 # 指定容器使用的DNS服務器,默認和宿主一致; 8 9 docker run 常用參數

1 --dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致; 2 3 -h "mars": 指定容器的hostname; 4 5 -e username="ritchie": 設置環境變量; 6 7 --env-file=[]: 從指定文件讀入環境變量; 8 9 --cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運行; 10 11 -m :設置容器使用內存最大值; 12 13 --net="bridge": 指定容器的網絡連接類型,支持 bridge/host/none/container: 四種類型; 14 15 --link=[]: 添加鏈接到另一個容器; 16 17 --expose=[]: 開放一個端口或一組端口; 18 19 --volume , -v: 綁定一個卷 20 21 -a stdin: 指定標准輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項; 22 23 docker run其他參數
3. 運行容器常用命令
[root@linux-node4 ]# docker run --help # 查看創建容器幫助 [root@linux-node4 ]# docker run -it centos # 創建centos鏡像並進入終端 [root@linux-node4 ]# docker run -d nginx # 后台啟動nginx容器 [root@linux-node4 ]# docker stop 6bb09dce461f # 關閉一個容器 [root@linux-node4 ]# docker ps -l # 查看最近運行的容器 [root@linux-node4 ]# docker run -itd centos # 啟用一個偽終端守護centos容器 [root@linux-node4 ]# docker container run -d --name web3 -e test=123456 -p 8800:80 -h webhostname --restart always nginx -d # 后台啟動nginx容器 --name web3 # 自定義容器名字(默認會是一段隨機字符串) -e test=123456 # 啟動容器添加變量 test=123456 (echo $test) -p 8800:80 # 宿主機的8800端口映射到docker容器的80端口中 -h webhostname # docker容器主機名 (a300f394af88) --restart always # 宿主機重啟自動拉起這個docker容器 nginx # 使用這個nginx鏡像啟動容器 注:http://192.168.56.12:8800/ 訪問這個docker nginx [root@linux-node4 ]# docker logs web # 查看上面啟動的web容器的日志 [root@linux-node4 ]# docker exec -it web bash # 進入容器web
1 [root@linux-node1 /]# docker run -itd nginx # 在后台啟動一個docker容器 2 [root@linux-node1 /]# docker inspect 5a3ad030a621 # 查看docker運行容器的詳細信息 3 [root@linux-node1 /]# curl http://172.17.0.2 # 4 [root@linux-node1 /]# docker run -itd --name=web2 -p 192.168.56.11:8800:80 nginx 5 使用--itd參數(指定后台啟動這個容器),--name=web2(指定這個web容器的名字叫web2) 6 7 8 -d: 后台運行容器,並返回容器ID; 9 -i: 以交互模式運行容器,通常與 -t 同時使用; 10 -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用; 11 -P: 隨機端口映射,容器內部端口隨機映射到主機的高端口 12 -p: 指定端口映射,格式為:主機(宿主)端口:容器端口 13 --name="nginx-lb": 為容器指定一個名稱 14 --dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致; 15 [root@linux-node1 /]# docker exec -it c9b7a480ee68 bash # 進入docker環境
停止運行容器,刪除運行容器,刪除鏡像
# 停止容器運行(CONTAINER ID) docker stop 容器ID # 刪除 容器(CONTAINER ID) docker rm 容器ID # 刪除 鏡像(IMAGE ID) docker images 鏡像ID