当前位置: 首页 > article >正文

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 进阶玩法?欢迎留言讨论! 😃

相关文章:

Docker 学习笔记:从入门到部署,实战演练全流程!

&#x1f4cc; 开篇&#xff1a;为什么要学 Docker&#xff1f; 还在为环境不一致、部署麻烦、依赖冲突头疼吗&#xff1f;Docker 让一切变得简单&#xff01;作为现代开发和运维的神器&#xff0c;Docker 让我们可以用 一句命令 解决 “在我电脑上能跑” 的问题。今天&#x…...

【网络安全工程】任务12:网络安全设备

目录 一、防火墙​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 二、入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09;​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 三、防病毒网关​ ​1、作用​ 2、配置方式​ 3、存在的漏洞​ …...

Linux 进程控制:创建、终止、等待与程序替换全解析

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 1.进程创建 1-1 fork函数初识​ 1-2 fork函数返回值​ 1-3…...

SwiftUI 让视图自适应高度的 6 种方法(四)

概览 在 SwiftUI 的世界里&#xff0c;我们无数次都梦想着视图可以自动根据布局上下文“因势而变”‌。大多数情况下&#xff0c;SwiftUI 会将每个视图尺寸处理的井井有条&#xff0c;不过在某些时候我们还是得亲力亲为。 如上图所示&#xff0c;无论顶部 TabView 容器里子视图…...

机器学习中的梯度下降是什么意思?

梯度下降&#xff08;Gradient Descent&#xff09;是机器学习中一种常用的优化算法&#xff0c;用于最小化损失函数&#xff08;Loss Function&#xff09;。通过迭代调整模型参数&#xff0c;梯度下降帮助模型逐步逼近最优解&#xff0c;从而提升模型的性能。 1.核心思想 梯…...

opencv-显示图片

安装软件 sudo apt install python3 //确保虚拟机只有python3 ln -sf /usr/bin/python3.6 /usr/bin/python sudo apt install python3-pip pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple pip install opencv-contrib-python -i https://pypi.tuna…...

sap关账+策略模式(避免大量if elseif)

旧代码 Transactional(rollbackFor Exception.class)public AjaxResult purchaseOrderReceiptOutSourceAfterSapCloseAccountingPeriod(Long id) {SysPurorderPostingLog sysPurorderPostingLog sysPurorderPostingLogMapper.selectSysPurorderPostingLogById(id);if (Object…...

EverArt MCP 服务器安装调试笔记 -cline

EverArt MCP 服务器安装调试笔记 问题描述 用户在使用 EverArt MCP 服务器时遇到报错&#xff1a;“MCP error -1: Connection closed”。 调试过程 检查配置文件 cline_mcp_settings.json: 确认 everart 服务器的配置信息&#xff0c;包括 command、args 和 env 是否正确。…...

1035.不相交的线

1035.不相交的线 力扣题目链接(opens new window) 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线…...

Django-ORM-select_related

Django-ORM-select_related 作用使用场景示例无 select_related 的查询有 select_related 的查询 如何理解 "只发起一次查询&#xff0c;包含所有相关作者信息"1. select_related 的工作原理2. 具体示例解析3. 为什么只发起一次查询 数据库中的books量巨大&#xff0…...

2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MDA词频统计两种方式)(吴非、赵宸宇、甄红线300+关键词三种方法)

2001-2023年上市公司数字化转型年报词频统计&#xff08;年报词频统计和MD&A词频统计两种方式&#xff09;&#xff08;吴非、赵宸宇、甄红线300关键词三种方法&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、参考文献&#xff1a; …...

IO多路复用实现并发服务器

一.select函数 select 的调用注意事项 在使用 select 函数时&#xff0c;需要注意以下几个关键点&#xff1a; 1. 参数的修改与拷贝 readfds 等参数是结果参数 &#xff1a; select 函数会直接修改传入的 fd_set&#xff08;如 readfds、writefds 和 exceptfds&#xf…...

React 如何实现组件懒加载以及懒加载的底层机制

前言 在现代前端开发中&#xff0c;性能优化始终是一个核心课题。React 作为当下流行的前端库之一&#xff0c;提供了一些非常有用的工具和技术来提升应用的性能&#xff0c;其中懒加载&#xff08;Lazy Loading&#xff09;就是一项不可忽视的重要技术。通过懒加载&#xff0…...

《论语别裁》第01章 学而(22) 种瓜者

下面一节&#xff0c;等于一个结论&#xff1a; 曾子曰&#xff1a;慎终追远&#xff0c;民德归厚矣。 古人对于这一句的解释&#xff0c;我也有点意见。拿孝道来讲&#xff0c;过去讲中国文化的孝道&#xff0c;本来很重要&#xff0c;我们看历史上给皇帝的奏议&#xff0c;常…...

如何设置GET请求的参数?

在使用PHP爬虫时&#xff0c;设置GET请求的参数是与目标网站交互的关键步骤。通过正确设置GET请求的参数&#xff0c;可以向目标网站发送查询请求并获取相应的数据。以下是如何在PHP中设置GET请求参数的详细说明&#xff0c;包括使用cURL和GuzzleHttp库的示例。 一、使用cURL设…...

C++20 模块:告别头文件,迎接现代化的模块系统

文章目录 引言一、C20模块简介1.1 传统头文件的局限性1.2 模块的出现 二、模块的基本概念2.1 模块声明2.2 模块接口单元2.3 模块实现单元 三、模块的优势3.1 编译时间大幅减少3.2 更好的依赖管理3.3 命名空间隔离 四、如何使用C20模块4.1 编译器支持4.2 示例项目4.3 编译和运行…...

SpringBoot集成Swagger指南

在Spring Boot项目中集成Swagger可以帮助你自动生成API文档&#xff0c;并且提供一个交互式的UI界面&#xff0c;方便开发者测试和调试API。以下是集成Swagger的步骤&#xff1a; 1. 添加Swagger依赖 首先&#xff0c;在你的pom.xml文件中添加Swagger的依赖项。通常使用的是s…...

有必要使用 Oracle 向量数据库吗?

向量数据库最主要的特点是让传统的只能基于具体值/关键字的数据检索&#xff0c;进化到了可以直接基于语义的数据检索。这在AI时代至关重要&#xff01; 回到标题问题&#xff1a;是否有必要使用 Oracle 向量数据库&#xff1f; 这实际还要取决于你的具体应用需求。 客观来讲…...

仅仅使用pytorch来手撕transformer架构(3):编码器模块和编码器类的实现和向前传播

仅仅使用pytorch来手撕transformer架构(2)&#xff1a;编码器模块和编码器类的实现和向前传播 往期文章&#xff1a; 仅仅使用pytorch来手撕transformer架构(1)&#xff1a;位置编码的类的实现和向前传播 最适合小白入门的Transformer介绍 仅仅使用pytorch来手撕transformer…...

rust语言match模式匹配涉及转移所有权Error Case

struct S{data:String, }//注意&#xff1a;因为String默认是移动语义&#xff0c;从而决定结构体S也是移动语义&#xff0c;可采用(1)或(2)两种方法解决编译错误&#xff1b;关键思路&#xff1a;放弃获取结构体S的字段data的所有权&#xff0c;改为借用。fn process(s_ref:&a…...

小肥柴慢慢手写数据结构(C篇)(4-3 关于栈和队列的讨论)

小肥柴慢慢学习数据结构笔记&#xff08;C篇&#xff09;&#xff08;4-3 关于栈和队列的讨论&#xff09; 目录1 双端栈/队列2 栈与队列的相互转化2-1 栈转化成队列2-2 队列转化成栈 3 经典工程案例3-1 生产者和消费者模型&#xff08;再次重温环形缓冲区&#xff09;3-2 MapR…...

大模型在甲状腺癌诊疗全流程预测及方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 国内外研究现状 二、大模型预测甲状腺癌的理论基础 2.1 甲状腺癌相关医学知识 2.2 大模型技术原理与特点 2.3 大模型在医疗领域的应用潜力 三、术前预测方案 3.1 预测模型构建 3.1.1 数据收集与预处理 …...

java-单列模式-final-继承-多态

内存存储区域 引用变量和普通变量引用变量放在栈中&#xff0c;基本数据类型的内容是在堆内存中。 对象放在堆内存中&#xff0c;其引用变量放在栈中&#xff0c;指向堆内存存放对象的地址。 静态变量放在静态区中&#xff0c;静态变量在程序的执行始中中分配一次&#xff0c;…...

Python:正则表达式

正则表达式的基础和应用 一、正则表达式核心语法&#xff08;四大基石&#xff09; 1. ​元字符&#xff08;特殊符号&#xff09;​ ​定位符 ^&#xff1a;匹配字符串开始位置 $&#xff1a;匹配字符串结束位置 \b&#xff1a;匹配单词边界​&#xff08;如 \bword\b 匹配…...

网络通信中的带宽(Bandwidth)概念

在计算机网络中&#xff0c;带宽是指单位时间内可以传输的数据量&#xff0c;通常以比特每秒&#xff08;bps&#xff09;或字节每秒&#xff08;Bps&#xff09;为单位。 1. 理论计算 链路带宽&#xff1a;链路带宽是指网络链路的物理传输能力&#xff0c;通常由网络设备的规…...

基于杀伤链的勒索软件控制框架

40s说清楚勒索软件如何工作 基于杀伤链的勒索软件控制框架开发了4种缓解策略(预防、阻止、检测&响应、重建)&#xff0c;覆盖18个控制域90项控制措施&#xff0c;以正确管理与勒索软件攻击杀伤链各阶段相关的风险。 注&#xff1a;本文节选出自《基于杀伤链的勒索软件防御指…...

Windows编程----结束进程

进程有启动就有终止&#xff0c;通过CreateProcess函数可以启动一个新的子进程&#xff0c;但是如何终结子进程呢&#xff1f;主要有四种方法&#xff1a; 通过主线程的入口函数&#xff08;main函数、WinMain函数&#xff09;的return关键字终止进程 一个应用程序只有一个入…...

三、Docker 集群管理与应用

&#xff08;一&#xff09;项目案例 1、准备主机 &#xff08;1&#xff09;关闭防火墙&#xff0c;或者开放TCP端口2377&#xff08;用于集群管理通信&#xff09;、TCP/UPD端口7946&#xff08;用于节点之间的通信&#xff09;、UDP端口4789&#xff08;用于overlay网络流…...

无标签数据增强+高效注意力GAN:基于CARLA的夜间车辆检测精度跃升

目录 一、摘要 二、引言 三、框架 四、方法 生成合成夜间数据 昼夜图像风格转换 针对夜间图像的无标签数据增强技术 五、Coovally AI模型训练与应用平台 六、实验 数据 图像风格转换 夜间车辆检测和分类 结论 论文题目&#xff1a;ENHANCING NIGHTTIME VEHICLE D…...

SqlSugar 进阶之原生Sql操作与存储过程写法 【ORM框架】

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录一、前言 &#x1f343;二、用法介绍三、方法列表四、使用案例五、调用存储过程六、in参数用法七、SqlServer带Go的脚…...