📌 開篇:為什么要學 Docker?
還在為環境不一致、部署麻煩、依賴沖突頭疼嗎?Docker 讓一切變得簡單!作為現代開發和運維的神器,Docker 讓我們可以用 一句命令 解決 “在我電腦上能跑” 的問題。今天,我們就來系統整理一下 Docker 的學習筆記,讓你輕松上手,并能在實際項目中用得上!
Docker 常用命令
鏡像命令
docker images
docker images 查看所有本地的主機上的鏡像
[root@VM-16-5-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
執行解釋
KEY | 結果解釋 |
---|---|
REPOSITORY | 鏡像的倉庫源 |
TAG | 鏡像的標簽 |
IMAGE ID | 鏡像的ID |
CREATED | 鏡像的創建時間 |
SIZE | 鏡像的大小 |
命令參數可選項 -a -q
[root@VM-16-5-centos ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
[root@VM-16-5-centos ~]# docker images -q
feb5d9fea6a5
docker search
docker search 搜索鏡像
[root@VM-16-5-centos ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12393 [OK]
mariadb MariaDB Server is a high performing open sou… 4770 [OK]
docker pull
docker pull 拉取鏡像
# 下載鏡像 docker pull 鏡像名[:tag]
[root@VM-16-5-centos ~]# docker pull mysql
Using default tag: latest # 如果不寫tag,默認就是latest
latest: Pulling from library/mysql
f003217c5aae: Pull complete # 分層下載,docker image的核心 聯合文件系統
65d94f01a09f: Pull complete
43d78aaa6078: Pull complete
a0f91ffbdf69: Pull complete
59ee9e07e12f: Pull complete
04d82978082c: Pull complete
70f46ebb971a: Pull complete
db6ea71d471d: Pull complete
c2920c795b25: Pull complete
26c3bdf75ff5: Pull complete
9ec1f1f78b0e: Pull complete
4607fa685ac6: Pull complete
Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195 # 簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真實地址
# docker pull mysql命令等價于 docker pull docker.io/library/mysql:latest# 指定版本下載 前提官網倉庫需要有
[root@VM-16-5-centos ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
f003217c5aae: Already exists
65d94f01a09f: Already exists
43d78aaa6078: Already exists
a0f91ffbdf69: Already exists
59ee9e07e12f: Already exists
04d82978082c: Already exists
70f46ebb971a: Already exists # 有依賴已經有的就不會再次下載
ba61822c65c2: Pull complete
dec59acdf78a: Pull complete
0a05235a6981: Pull complete
c87d621d6916: Pull complete
Digest: sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi
docker rmi -f 鏡像ID刪除鏡像
[root@VM-16-5-centos ~]# docker rmi -f f26e21ddd20d
Untagged: mysql:5.7
Untagged: mysql@sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc
Deleted: sha256:f26e21ddd20df245d88410116241f3eef1ec49ce888856c95b85081a7250183d
Deleted: sha256:c607cd1716e1e3f52d37b391b9e48207c15b9de687c49539c42b7c7411b8a845
Deleted: sha256:18d0239fa88c234ffcde52288f532ac4f69d052964d6605df32fb2e3a197bbf9
Deleted: sha256:8d1d80a87e029e4729a56a87e38d54b9ef2ca1af404e13af1feadeba53745529
Deleted: sha256:1ac7c17dadb8b439a4034925f290a2f9288068b4192669bed1a614c4057c0c1b
# 刪除所有鏡像 (其中docker images -aq查詢所有鏡像ID)
[root@VM-16-5-centos ~]# docker rmi -f $(docker images -aq)
# 刪除多個容器
[root@VM-16-5-centos ~]# docker rmi -f 容器ID1 容器ID2 容器ID3
容器命令
說明:我們有了鏡像才可以創建容器,下載一個centos鏡像來測試
docker pull centos
新建容器并且啟動
docker run [可選參數] image
# 參數說明
--name="Name" 容器名稱 用來區分容器
-d 后臺方式運行
-it 使用交互方式運行,進入容器查看內容
-p 指定容器的端口 eg. -p 8080:8080-p ip:主機端口:容器端口-p 主機端口:容器端口 (常用)-p 容器端口-p 隨機指定端口
# 測試
docker run -it centos /bin/bash # 啟動并且進入容器
exit # 退出容器
列出所有運行的容器
docker ps # 列出當前正在運行的容器
docker ps -a # 列出當前正在運行的容器 + 列出歷史已經運行的容器
docker ps -n=? # 顯示最近創建的容器
docker ps -q # 只顯示正在運行容器的編號
退出容器
exit # 直接容器停止并退出
Ctrl + P + Q # 容器不停止退出
刪除容器
docker rm 容器id # 刪除指定容器,不能刪除正在運行的容器,如果強制刪除,需要rm -f
docker rm -f $(docker ps -aq) # 刪除所有容器
啟動和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
進入容器
進入容器命令
# 我們通常容器都是使用后臺方式運行的,需要進入容器,修改一些配置以實現# 進入容器命令命令
# 方式一 docker exec -it 容器id bashShell
docker exec -it 容器id /bin/bash
[root@VM-16-5-centos ~]# docker exec -it 8b0d2f432376 /bin/bash# 方式二 docker attach 容器id
[root@VM-16-5-centos ~]# docker attach 03d21bad4539
[root@03d21bad4539 /]# #正在執行的代碼# 區別# docker exec # 進入容器后開啟一個新的終端,可以在里面操作 【常用】
# docker attach # 進入容器正在執行的終端,不會啟動新的進程
常用命令
后臺啟動容器命令
# 命令 docker run -d 鏡像# 執行完成之后出現問題 docker ps 發現centos 停止# 原因:docker 容器使用后臺運行,就必須要有一個前臺進程,docker發現沒有應用,就會自動停止# 測試
docker run -it centos /bin/bash # 啟動并且進入容器
Ctrl + P + Q # 容器不停止退出
docker ps # 此方式存在進程# 測試過程
[root@VM-16-5-centos ~]# docker run -it centos /bin/bash
[root@265fad67c23c /]# [root@VM-16-5-centos ~]#
[root@VM-16-5-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
265fad67c23c centos "/bin/bash" 56 seconds ago Up 55 seconds naughty_dhawan
[root@VM-16-5-centos ~]# docker logs -f -t --tail 10 265fad67c23c
查看日志
docker logs -f -t --tail [行數] [容器id]
# eg.
[root@VM-16-5-centos ~]# docker logs -f -t --tail 10 265fad67c23c
2022-04-11T16:28:25.267052701Z bash: hostory: command not found
2022-04-11T16:28:29.301653166Z [root@265fad67c23c /]# history
2022-04-11T16:28:29.301684360Z 1 ls
2022-04-11T16:28:29.301713366Z 2 ll
2022-04-11T16:28:29.301717403Z 3 hostory
2022-04-11T16:28:29.301721227Z 4 history
2022-04-11T16:28:32.148697734Z [root@265fad67c23c /]# pwd
2022-04-11T16:28:32.148726863Z /
2022-04-11T16:28:32.354371895Z [root@265fad67c23c /]#
2022-04-11T16:28:32.557457658Z [root@265fad67c23c /]#
測試過程
[root@VM-16-5-centos ~]# docker run -d centos /bin/sh -c "while true;do echo kamila; sleep 1; done"
9f4e032553ee5bdebcc3f7db594276a4317a5ee96e7f035dff14fbb7c8f9d7d8
[root@VM-16-5-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f4e032553ee centos "/bin/sh -c 'while t…" 8 seconds ago Up 7 seconds xenodochial_elion
[root@VM-16-5-centos ~]# docker logs -f -t --tail 5 9f4e032553ee
2022-04-11T16:39:19.477204322Z kamila
2022-04-11T16:39:20.479143262Z kamila
2022-04-11T16:39:21.481326571Z kamila
關于 /bin/sh 直接執行 shell 腳本
[root@57e9286eec0d /]# /bin/sh -c "echo kamila8"
kamila8
[root@57e9286eec0d /]# /bin/bash -c "echo kamila8"
kamila8
查看容器中進程信息
[root@VM-16-5-centos ~]# docker top 57e9286eec0d
查看鏡像源數據
[root@VM-16-5-centos ~]# docker inspect 57e9286eec0d
進入當前正在運行的容器
進入容器命令命令
# 我們通常容器都是使用后臺方式運行的,需要進入容器,修改一些配置以實現# 進入容器命令命令
# 方式一 docker exec -it 容器id bashShell
docker exec -it 容器id /bin/bash# 方式二 docker attach 容器id
[root@VM-16-5-centos ~]# docker attach 03d21bad4539
[root@03d21bad4539 /]# #正在執行的代碼# 區別# docker exec # 進入容器后開啟一個新的終端,可以在里面操作 【常用】
# docker attach # 進入容器正在執行的終端,不會啟動新的進程
從容器拷貝文件到外部主機上
docker cp 容器id:容器內的路徑 當前主機目的目錄
[root@VM-16-5-centos tmp0403]# docker cp 03d21bad4539:/tmp0412/readme /tmp/tmp0403/# 拷貝是一個手動過程,后續使用 -v 卷技術,可以實現自動同步 eg. 容器內/home 與 主機 /home 對應同步
Docker 部署實踐
部署 Nginx
# 拉取鏡像
docker pull nginx
# 啟動鏡像
docker run -d --name nginx01 -p 80:80 nginx
# 運行測試
[root@VM-16-5-centos ~]# docker run -d --name nginx01 -p 8080:80 nginx
479af478aa8eabfa6d980924b9c40c9b44c6a6e1d542d38b0b03e4c7e0e8325f
[root@VM-16-5-centos ~]# curl localhost:8080
# -d 后臺運行
# --name 給容器取名
# -p 宿主機端口:容器內部端口# 進入nginx 進入容器
[root@VM-16-5-centos ~]# docker exec -it nginx01 /bin/bash
root@0a44ad83dfe5:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginxexit # 退出容器
我們每次改動 nginx 配置文件,都需要進入容器內部?十分麻煩,我要是可以在容器外部提供一個映射路徑,達到在容器修改文件名,容器內部就可以自動修改?使用 -v 數據卷技術進行處理。run -v /user/share/nginx /nginx/conf 這樣可以在主機上修改文件并且容器內保持同步。
部署 Tomcat
下載指定 Tomcat 版本需要先看下官網是否有對應版本,查詢地址:https://hub.docker.com/
# 官網使用示例 官網方法用完即刪除 -it --rm
docker run -it --rm tomcat:9.0
# 拉取鏡像
[root@VM-16-5-centos ~]# docker pull tomcat:9.0
# 啟動鏡像 -d 后臺運行
docker run -d --name tomcatv9 -p 81:8080 tomcat# 進入容器
[root@VM-16-5-centos ~]# docker exec -it tomcatv9 /bin/bash# 由于下載鏡像閹割版
root@a4e43d29503d:/usr/local/tomcat# cp -r webapps.dist/* webapps/# 拷貝完目錄之后再次訪問81可以正常進入tomcat
💡🤔 思考問題:以后部署項目,如果每次都要進入容器是不是十分麻煩?我要是可以在容器外部提供一個映射路徑,webapps,我們在外部放置項目,就自動同步到內部就好了。
Docker 鏡像
如何自己打包鏡像
docker commit 提交容器成為一個新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目標鏡像名:[TAG]
官網 Tomcat 修改為例
# 啟動一個默認的tomcat# 發現tomcat是沒有webapps應用 # 自己拷貝自定義的目錄至webapps目錄下面
root@b3e1c2ff8af0:/usr/local/tomcat# cp -r webapps.dist/* webapps
# 修改完成之后將我們操作過的容器通過commit提交鏡像
docker commit -a="ljs" -m="add weapps..." b3e1c2ff8af0 tomcat02:1.0
Docker 鏡像加速
使用騰訊云 Docker 鏡像源加速鏡像下載
執行以下命令,打開 /etc/docker/daemon.json 配置文件。
vim /etc/docker/daemon.json
按 i切換至編輯模式,添加以下內容,并保存。
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
執行以下命令,重啟 Docker 即可。示例命令以 CentOS 7 為例。
sudo systemctl restart docker
Docker 容器數據卷
什么是容器數據卷?
🤔 docker 理念回顧
📌 如果數據都存在容器中,那我們刪除容器,數據就會丟失!
📌 解決方案:數據可以持久化。例如MySQL,需要將數據存儲下來。容器之間可以有一個數據共享的技術!Docker 中產生的數據,同步到本地!這就是數據卷的技術!
? 我們可以通過目錄的掛載,將我們的容器內的目錄,掛載到Linux上面!將容器中MySQL文件系統掛載出來,/usr/mysql掛載到Linux主機的/home/mysql下,即容器的持久化和同步操作!容器間的數據可以進行共享!
使用數據卷
# 方式一:使用命令直接掛載 -v
docker run -it -v 主機目錄:/容器目錄 centos /bin/bash[root@VM-16-5-centos ~]# docker run -it -v /home/ceshi:/home centos /bin/bash# 主機/home目錄新建文件會同步至容器/home/ceshi 同樣容器內新建也會同步至主機的對應目錄下# 容器信息查看
[root@VM-16-5-centos ceshi]# docker inspect 60bb7ebd0884 ..."Mounts": [{"Type": "bind","Source": "/home/ceshi", # docker容器內地址"Destination": "/home", # 主機地址"Mode": "","RW": true,"Propagation": "rprivate"}],...# 即使容器停止,主機上目錄更改的文件在容器啟動時會出現一樣的效果
實戰:安裝MySQL
思考:MySQL數據持久化
# 獲取鏡像
docker pull mysql:5.7
# 運行容器
# -v 映射配置文件和數據目錄
# -e 配置MySQL密碼
# -p 端口映射
# -d 后臺運行
docker run -d -p 3310:3306 -v /hmoe/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql01 mysql:5.7# 刪除容器
docker rm -f mysql01
# 掛載到本地的數據卷依舊沒有丟失,這就實現容器的數據持久化功能
具名和匿名掛載
# 匿名掛載 -v 容器內路徑; -P 隨機映射端口; -p 3306:3360 指定映射端口
docker run -d -P -name -v /etc/nginx nginx
# 查看所有卷的情況 docker volume --help
[root@VM-16-5-centos home]# docker volume ls
DRIVER VOLUME NAME
local 0a419b7ad1d86e8e4d9710a694fc396382a9b214e2a1cdffbb10af3ff6f27752
[root@VM-16-5-centos home]#
# 具名掛載
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看卷情況
[root@VM-16-5-centos home]# docker volume ls
DRIVER VOLUME NAME
local 0a419b7ad1d86e8e4d9710a694fc396382a9b214e2a1cdffbb10af3ff6f27752
local juming-nginx
# 通過 -v 卷名:容器內路徑# 查看卷詳情具體位置
[root@VM-16-5-centos home]# docker volume juming-nginx
[{"CreatedAt": "2022-04-16T16:21:45+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"}
]
# 沒有指定目錄的情況下容器的卷都在/var/lib/docker/volumes目錄下面
docker所有容器內的卷,沒有指定目錄的情況下都在/var/lib/docker/volumes目錄下面,我們可以通過具名掛載的方式方便找到我們的卷,大多數情況在使用具名掛載的方式。
# 掛載
-v 容器內路徑 # 匿名掛載
-v 卷名:容器內路徑 # 具名掛載
-v /宿主機路徑::容器內路徑 # 指定路徑掛載
數據卷容器
數據卷容器間同步,即多個容器mysql容器間同步。
# 啟動3個容器# 啟動 docker01
[root@VM-16-5-centos ~]# docker run -it --name docker01 kamila/centos
[root@6e4374ed8b07 /]# # 啟動 docker02
[root@VM-16-5-centos ~]# docker run -it --name docker02 --volumes-from docker01 kamila/centos
[root@6de1e5911994 /]# # 此時volume01 volume02 目錄同步# 啟動 docker03
[root@VM-16-5-centos ~]# docker run -it --name docker03 --volumes-from docker01 kamila/centos# 容器間數據完全同步
[root@9a1c6a43bb81 volume01]# touch docker03
[root@9a1c6a43bb81 volume01]# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr 18 14:24 docker01
-rw-r--r-- 1 root root 0 Apr 18 14:24 docker02
-rw-r--r-- 1 root root 0 Apr 18 14:27 docker03# 刪除容器docker01
[root@VM-16-5-centos ~]# docker rm -f 6e4374ed8b07
6e4374ed8b07# docker03 docke02 數據仍然存在
MySQL數據同步
多個MySQL數據同步實現
# 第一個MySQL
docker run -d -p 3312:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql02 mysql:5.7# 第二個MySQL
docker run -d -p 3313:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql03 --volumes-from mysql02 mysql:5.7# 數據庫數據同步
結論:
容器之間配置信息的傳遞,數據卷容器的生命周期一直持續到沒有容器使用為止。但是一旦父容器持久化到本地,這個時候容器刪除,本地數據不會刪除。
DockerFile
DockerFile 介紹
Dockerfile 就是用來構建 docker 鏡像的構建文件!命令腳本!通過腳本生成鏡像,鏡像是一層一層的,每個命令就是一層。
DockerFile 構建過程
# docker 測試掛載目錄
[root@VM-16-5-centos ~]# cd /home/
[root@VM-16-5-centos home]# mkdir docker-test-volume# 進入目錄
[root@VM-16-5-centos home]# cd docker-test-volume/
# 創建腳本文件
[root@VM-16-5-centos docker-test-volume]# vi dockerfile1
腳本文件內容
# 文件中內容 指令大寫 每一個指令就是一層鏡像 VOLUME掛載
FROM centosVOLUME ["volume01","volume02"]CMD echo "- - - - end - - - -"CMD /bin/bash
構建命令
# 構建命令 .代表當前目錄
docker build -f dockerfile1 -t kamila/centos .[root@VM-16-5-centos docker-test-volume]# docker build -f dockerfile1 -t kamila/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]---> Running in 8b129a37455e
Removing intermediate container 8b129a37455e---> 010771923d9b
Step 3/4 : CMD echo "- - - - end - - - -"---> Running in e47388cba239
Removing intermediate container e47388cba239---> 557e5b6304dd
Step 4/4 : CMD /bin/bash---> Running in b8368c5e839f
Removing intermediate container b8368c5e839f---> adb3afd6cf9b
Successfully built adb3afd6cf9b
Successfully tagged kamila/centos:latest# 查看構建結果
[root@VM-16-5-centos docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kamila/centos latest adb3afd6cf9b 39 seconds ago 231MB# 運行鏡像
[root@VM-16-5-centos docker-test-volume]# docker run -it adb3afd6cf9b /bin/bash
[root@0ef312830664 /]# # 掛載目錄 volume01 volume02 該方式為匿名掛載
[root@0ef312830664 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Apr 18 13:31 dev
drwxr-xr-x 1 root root 4096 Apr 18 13:31 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 134 root root 0 Apr 18 13:31 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Apr 3 14:06 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
drwxr-xr-x 2 root root 4096 Apr 18 13:31 volume01
drwxr-xr-x 2 root root 4096 Apr 18 13:31 volume02# 容器內與容器外掛載目錄共享情況查看
[root@VM-16-5-centos ~]# docker inspect 容器id
...
dockerfile 方式構建鏡像通常經常使用,假設構建鏡像的時候沒有掛載卷,要手動鏡像掛載 -v 卷名:容器內路徑!
Docker 使用流程總結
1?? 編寫 Dockerfile 📝 —— 定義容器環境和應用運行方式。
2?? 構建鏡像 (docker build) 🔨 —— 將 Dockerfile 生成可復用的鏡像。
3?? 運行容器 (docker run) 🚀 —— 基于鏡像啟動應用。
4?? 發布鏡像 (docker push) 🌍 —— 將鏡像上傳到遠程倉庫,便于共享與部署。
DockerFile指令
FROM # 基礎鏡像
MAINTAINER # 鏡像是誰寫的,姓名+郵箱
RUN # 鏡像構建的時候需要運行的命令
ADD # 步驟:tomcat鏡像,tomcat的壓縮包(添加內容)
WORKDIR # 鏡像工作目錄
VOLUME # 容器卷 掛載目錄位置
EXPOSE # 指定暴露端口
CMD # 指定容器啟動時要運行的命令 eg. cmd echo "start." 只有最后一個會生效
ENTRYPOINT # 指定容器啟動時要運行的命令,可以追加命令
ONBUILD # 當構建一個被繼承 Dockerfile 時就會運行 ONBUILD 的指令
COPY # 將文件拷貝到目錄中
ENV # 構建時設置環境變量
實戰
編寫構建自己的 dockerfile 文件!
# 編寫自己的dockerfile文件
[root@VM-16-5-centos home]# cd dockerfile/
/home/dockerfile[root@VM-16-5-centos dockerfile]# vim mydockerfile-centosFROM centosMAINTAINER kamila<pitt1997@foxmail.com>ENV MYPATH /usr/localWORKDIR $MYPATH# RUN yum -y install vim# RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo "- - - end - - - "CMD /bin/bash# 開始構建
[root@VM-16-5-centos dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .# docker history構建歷史查看
[root@VM-16-5-centos dockerfile]# docker history 12766a6745ee
IMAGE CREATED CREATED BY SIZE COMMENT
12766a6745ee 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 2 weeks ago /bin/sh -c set -x && addgroup --system -… 61.1MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.2 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.6 0B
<missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:966d3669b40f5fbae… 80.4MB
Docker 實戰
Docker 實戰 Redis 集群
[root@VM-16-5-centos ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 52:54:00:ff:ad:5e brd ff:ff:ff:ff:ff:ffinet 10.0.16.5/22 brd 10.0.19.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::5054:ff:feff:ad5e/64 scope link valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:af:7f:9c:8e brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:afff:fe7f:9c8e/64 scope link valid_lft forever preferred_lft forever
# 創建一個網卡
[root@VM-16-5-centos ~]# docker network create redis --subnet 172.18.0.0/16
4c7bfbe5589e7189f3d266760aaeb4b377a62e24d83a64cc8bbfd90d59af0341# 查看網絡狀況
[root@VM-16-5-centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
72ced6575972 bridge bridge local
d3878b871e93 host host local
f35cc32d849d none null local
4c7bfbe5589e redis bridge local# redis網卡網絡情況
[root@VM-16-5-centos ~]# docker network inspect redis
[{"Name": "redis","Id": "4c7bfbe5589e7189f3d266760aaeb4b377a62e24d83a64cc8bbfd90d59af0341","Created": "2022-04-24T21:19:08.514356554+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.18.0.0/16"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]
[root@VM-16-5-centos ~]# # 創建6個redis服務# 腳本創建 (可直接后臺執行)
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.18.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done# 已創建完6個節點
# 172.18.0.11
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.12
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.13
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.14
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.15
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.16
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 刪除所有容器
[root@VM-16-5-centos conf]# docker rm -f $(docker ps -aq)# 進入容器
[root@VM-16-5-centos conf]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof nodes.conf# 創建集群
/data # redis-cli --cluster create 172.18.0.11:6379 172.18.0.12:6379 172.18.0.13:6379 172.18.0.14:6379 172.18.0.15:6379 172.18.0.16:6379 --cluster-
replicas 1# 創建成功查看集群詳情/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:168
cluster_stats_messages_pong_sent:177
cluster_stats_messages_sent:345
cluster_stats_messages_ping_received:172
cluster_stats_messages_pong_received:168
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:345127.0.0.1:6379> cluster nodes
4d06ba47c680ae2b306f58978592f5c8aa7a2a85 172.18.0.16:6379@16379 slave 1fbdbfddc999de27b73418dff637a2191a13658d 0 1650896979000 6 connected
9ad5eea3c3f2959070d72ba84372b6a79b925ff8 172.18.0.13:6379@16379 master - 0 1650896980471 3 connected 10923-16383
29cc13afdb5c8213e5c3bf8814177bba0ef7ff98 172.18.0.14:6379@16379 slave 9ad5eea3c3f2959070d72ba84372b6a79b925ff8 0 1650896980570 4 connected
98c09c14c4f12d6184d7ff5e11cd911b3ee6e0a4 172.18.0.11:6379@16379 myself,master - 0 1650896978000 1 connected 0-5460
eded85ab704ebcc66ffc1ba2f41d3f77e8f8335a 172.18.0.15:6379@16379 slave 98c09c14c4f12d6184d7ff5e11cd911b3ee6e0a4 0 1650896979000 5 connected
1fbdbfddc999de27b73418dff637a2191a13658d 172.18.0.12:6379@16379 master - 0 1650896980000 2 connected 5461-10922
127.0.0.1:6379>
🎯 總結:學會 Docker,你就贏了一半!
Docker 不僅讓開發部署更簡單,還讓運維管理更高效。如果你想真正掌握它,就從 動手實踐 開始!希望這篇學習筆記能幫到你,如果有用記得點贊 + 收藏 + 分享,讓更多人受益!
👀 你還想了解哪些 Docker 進階玩法?歡迎留言討論! 😃