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.mzph.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回…