Docker 學習筆記:從入門到部署,實戰演練全流程!

📌 開篇:為什么要學 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 進階玩法?歡迎留言討論! 😃

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72992.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ThinkPhp 5 安裝阿里云內容安全(綠化)

composer require alibabacloud/green-20220302 首先要把php5(不支持php7)的執行文件設置到PATH環境變量 此外還要先執行composer update php5.5和php5.6的區別 5.5認為 <? 開頭的也是php文件&#xff0c;包括 <?php 5.6認為 <? 開頭的不是php文件&#xff0c;只…

使用NVM工具管理Node版本

Date: 2025.03.10 14:53:55 author: lijianzhan NVM&#xff08;Node Version Manager&#xff09;用于在同一個系統上管理多個 Node.js 版本,NVM 允許你安裝、使用和切換不同的 Node.js 版本。這對于前端工作人員來說可以更方便的管理和維護不同nodejs版本的項目。 &#xff0…

Vue主流的狀態保存框架對比

一、Vuex 4&#xff08;官方傳統方案&#xff09; 優點&#xff1a; 官方背書&#xff1a;Vue 官方長期維護&#xff0c;成熟穩定。結構化清晰&#xff1a;通過 state/mutations/actions/getters 強制約定代碼結構&#xff0c;適合大型團隊協作。插件生態&#xff1a;支持中間…

AIGC視頻生成模型:慕尼黑大學、NVIDIA等的Video LDMs模型

大家好&#xff0c;這里是好評筆記&#xff0c;公主號&#xff1a;Goodnote&#xff0c;專欄文章私信限時Free。本文詳細介紹慕尼黑大學攜手 NVIDIA 等共同推出視頻生成模型 Video LDMs。NVIDIA 在 AI 領域的卓越成就家喻戶曉&#xff0c;而慕尼黑大學同樣不容小覷&#xff0c;…

NVIDIA k8s-device-plugin源碼分析與安裝部署

在《kubernetes Device Plugin原理與源碼分析》一文中&#xff0c;我們從源碼層面了解了kubelet側關于device plugin邏輯的實現邏輯&#xff0c;本文以nvidia管理GPU的開源github項目k8s-device-plugin為例&#xff0c;來看看設備插件側的實現示例。 一、Kubernetes Device Pl…

C++ 數據結構詳解及學習規劃

C++數據結構詳解及學習規劃 一、C++常用數據結構詳解與示例 以下是C++中核心數據結構的分類及具體實現示例: 1. 線性數據結構 a. 數組(Array) ? 定義:存儲固定大小、同類型元素的連續內存結構。 ? 特點:快速隨機訪問(O(1)),但插入/刪除效率低(O(n))。 ? 應用場…

如何使用Postman,通過Mock的方式測試我們的API

這篇文章將教會大家如何利用 postman&#xff0c;通過 Mock 的方式測試我們的 API。 什么是 Mock Mock 是一項特殊的測試技巧&#xff0c;可以在沒有依賴項的情況下進行單元測試。通常情況下&#xff0c;Mock 與其他方法的主要區別就是&#xff0c;用于取代代碼依賴項的模擬對…

如何檢查電腦的硬盤健康狀況?

檢查硬盤健康狀況可以使用多種工具和方法。以下是一些常用的工具和步驟&#xff1a; Windows系統&#xff1a; 使用Windows內置工具&#xff1a; 磁盤檢查&#xff1a;可以通過命令提示符&#xff08;cmd&#xff09;使用chkdsk命令來檢查硬盤錯誤。例如&#xff0c;輸入chkd…

JavaWeb中提供的對cookie的操作

JavaWeb中提供的對cookie的操作 簡介服務端創建Cookie對象&#xff0c;然后將Cookie添加到HTTP響應結果中讀取請求端瀏覽器的Cookie設置/讀取Cookie在客戶端的有效期URL編碼/解碼 簡介 Servlet API為Servlet訪問Cookie提供了簡單易用的接口。javax.servlet.http.Cookie類用來表…

Android中AIDL和HIDL的區別

在Android中&#xff0c;AIDL&#xff08;Android Interface Definition Language&#xff09; 和 HIDL&#xff08;HAL Interface Definition Language&#xff09; 是兩種用于定義跨進程通信接口的語言。AIDL 是 Android 系統最早支持的 IPC&#xff08;進程間通信&#xff0…

學習計劃:第四階段(第十周)

目錄 第四階段&#xff1a;特殊方法與高級特性 第 10 周&#xff1a;綜合復習與實踐 周一 周二 周三 周四 周五 總結 一、項目設計與實現 二、問題與解決 三、學習成果 四、后續展望 第四階段&#xff1a;特殊方法與高級特性 第 10 周&#xff1a;綜合復習與實踐 …

ROS2學習筆記2

前言 本篇文章屬于ROS2humble的學習筆記&#xff0c;來源于B站魚香ROSup主。下面是這位up主的視頻鏈接。本文為個人學習筆記&#xff0c;只能做參考&#xff0c;細節方面建議觀看視頻&#xff0c;肯定受益匪淺。 《ROS 2機器人開發從入門到實踐》課程介紹_嗶哩嗶哩_bilibili …

vue3中接收props的兩種寫法

在 Vue 3 中&#xff0c;接收 props 有兩種主要的寫法&#xff0c;分別是運行時聲明和基于類型的聲明。下面為你詳細介紹這兩種寫法。 1. 運行時聲明 運行時聲明是 Vue 2 中就已經存在的方式&#xff0c;在 Vue 3 中依然可以使用。這種方式通過在組件中使用 defineProps 宏來…

用android studio模擬器,模擬安卓手機訪問網頁,使用Chrome 開發者工具查看控制臺信息

web 網頁項目在安卓手機打開時出現問題&#xff0c;想要查看控制臺調試信息。記錄一下使用android studio 模擬器訪問的方式。 步驟如下&#xff1a; 1.安裝android studio&#xff0c;新增虛擬設備&#xff08;VDM- virtual device manager) 點擊Virtual Device Manager后會…

《打造視頻同步字幕播放網頁:從0到1的技術指南》

《打造視頻同步字幕播放網頁&#xff1a;從0到1的技術指南》 為什么要制作視頻同步字幕播放網頁 在數字化信息飛速傳播的當下&#xff0c;視頻已然成為內容輸出與獲取的核心載體&#xff0c;其在教育、娛樂、宣傳推廣等諸多領域發揮著舉足輕重的作用 。制作一個視頻同步字幕播…

spring-boot-starter和spring-boot-starter-web的關聯

maven的作用是方便jar包的管理&#xff0c;所以每一個依賴都是對應著相應的一個或者一些jar包&#xff0c;從網上看到很多對spring-boot-starter的描述就是“這是Spring Boot的核心啟動器&#xff0c;包含了自動配置、日志和YAML。”沒看太明白&#xff0c;所參與的項目上也一直…

數智讀書筆記系列015 探索思維黑箱:《心智社會:從細胞到人工智能,人類思維的優雅解讀》讀書筆記

引言 《The Society of Mind》&#xff08;《心智社會》&#xff09;的作者馬文?明斯基&#xff08;Marvin Minsky&#xff09;&#xff0c;是人工智能領域的先驅和奠基者之一 &#xff0c;1969 年獲得圖靈獎&#xff0c;被廣泛認為是對人工智能領域影響最大的科學家之一。他…

Vue 項目中,.env文件怎么用?

在 Vue 項目中&#xff0c;.env 文件用于存儲環境變量&#xff0c;不同的環境&#xff08;如開發環境、測試環境、生產環境&#xff09;可以使用不同的 .env 文件來管理對應的配置信息。以下是關于 Vue 項目中 .env 文件的詳細使用方法&#xff1a; 1. 項目創建 確保你已經使…

【網絡編程】WSAAsyncSelect 模型

十、基于I/O模型的網絡開發 接著上次的博客繼續分享&#xff1a;select模型 10.8 異步選擇模型WSAAsyncSelect 10.8.1 基本概念 WSAAsyncSelect模型是Windows socket的一個異步I/O 模型&#xff0c;利用這個模型&#xff0c;應用程序 可在一個套接字上接收以Windows 消息為基…

論文閱讀方法

文章目錄 步驟一&#xff1a;對論文進行自我判斷閱讀題目和關鍵詞。閱讀摘要閱讀總結要點 步驟二&#xff1a;閱讀文章閱讀圖表和圖表的注釋閱讀引言閱讀實驗部分閱讀結果和作者對結果的討論&#xff08;創新點&#xff09;要點 步驟三&#xff1a;精度論文回答問題1回答問題2回…