
1、docker官方文档
2、docker简介
Docker是一种开源的容器化平台,用于开发、部署和运行应用程序。它通过容器技术将应用程序及其依赖项打包在一起,确保在不同环境中运行的一致性。
我就主要讲一下docker主要需要理解的三个概念:镜像、容器、仓库
镜像(image)
镜像是只读的,可复用的文件系统模版,用java编程思想来说,就是:类
容器(container)
容器是镜像运行时的实例,一个镜像可被多个容器重复使用,容器可基于不同镜像创建、配置与管理,用java编程思想来说,就是new一个对象来用,也可以理解成是一个进程
仓库(hub)
仓库跟git一样,进行pull,push操作,不过git拉下来的是代码,而docker拉下来的是镜像。
3、docker安装
Linux上(离线)安装Java开发环境【CentOS7】_linux 安装java-CSDN博客
4、docker命令
老规矩,先docker --help,查看docker所有的命令

翻译:
4.1 常用命令 (Common Commands)
| 命令 | 说明 |
|---|---|
run | 从镜像创建并运行一个新容器 |
exec | 在运行中的容器里执行命令 |
ps | 列出容器 |
build | 根据 Dockerfile 构建镜像 |
pull | 从镜像仓库下载镜像 |
push | 上传镜像到仓库 |
images | 列出本地镜像 |
login | 登录到镜像仓库 |
logout | 退出镜像仓库 |
search | 在 Docker Hub 上搜索镜像 |
version | 显示 Docker 版本信息 |
info | 显示系统范围的信息 (Docker 环境状态) |
4.2 管理类命令 (Management Commands)
| 命令 | 说明 |
|---|---|
builder | 管理构建相关功能 |
buildx* | Docker Buildx 构建工具 (支持多架构构建) |
compose* | Docker Compose 工具 (管理多容器应用) |
container | 管理容器 |
context | 管理上下文 (不同 Docker 环境) |
image | 管理镜像 |
manifest | 管理镜像清单 (manifest list) |
network | 管理网络 |
plugin | 管理插件 |
system | 管理 Docker 系统整体 (如清理资源) |
trust | 管理镜像的签名和信任 |
volume | 管理数据卷 |
4.3 相关命令(Swarm)
| 命令 | 说明 |
|---|---|
swarm | 管理 Docker Swarm 集群 |
4.4 其他命令 (Commands)
| 命令 | 说明 |
|---|---|
attach | 连接到正在运行容器的标准输入/输出/错误流 |
commit | 将容器的更改保存为新镜像 |
cp | 在容器和本地文件系统之间复制文件/目录 |
create | 创建一个新容器 (不启动) |
diff | 检查容器文件系统的更改 |
events | 实时获取 Docker 事件 |
export | 导出容器文件系统为 tar 包 |
history | 显示镜像的历史层 |
import | 从 tar 包导入文件系统为镜像 |
inspect | 查看 Docker 对象的底层详细信息 |
kill | 强制杀死一个或多个容器 |
load | 从 tar 包或 STDIN 加载镜像 |
logs | 获取容器日志 |
pause | 暂停容器中的所有进程 |
port | 列出容器端口映射 |
rename | 重命名容器 |
restart | 重启容器 |
rm | 删除容器 |
rmi | 删除镜像 |
save | 将镜像保存为 tar 包 (可通过 STDOUT 输出) |
start | 启动已停止的容器 |
stats | 实时显示容器资源使用情况 |
stop | 停止运行中的容器 |
tag | 给镜像打标签 |
top | 显示容器中运行的进程 |
unpause | 恢复容器中的所有进程 |
update | 更新容器配置 (如资源限制) |
wait | 阻塞直到容器停止,然后返回退出码 |
4.5 全局选项 (Global Options)
| 选项 | 说明 |
|---|---|
--config | 客户端配置文件位置 (默认 /root/.docker) |
-c, --context | 指定使用的上下文 |
-D, --debug | 开启调试模式 |
-H, --host | 指定要连接的 Docker 守护进程 socket |
-l, --log-level | 设置日志级别 (debug, info, warn, error, fatal) |
--tls | 使用 TLS (启用安全连接) |
--tlscacert | 指定 CA 证书路径 |
--tlscert | 指定客户端证书路径 |
--tlskey | 指定客户端私钥路径 |
--tlsverify | 使用 TLS 并验证远程端 |
-v, --version | 打印版本信息并退出 |
5、docker镜像常用命令
5.1 搜索镜像(search)
搜索一下docker下是否有nginx的镜像
docker search nginx
结果:
如果出现搜索超时的情况,请使用以下方法:
docker search 国内镜像源/资源名称
docker search docker.1ms.run/nginx
结果:
5.2 下载/拉取镜像(pull)
下载/拉取最新版本镜像
docker pull nginx
下载/拉取指定版本镜像
docker pull nginx:1.26.0
如果不知道有哪些镜像可以下载的,可以访问docker的镜像仓库:
https://hub.dockermirror.com/search?badges=official
搜索你想要下载的版本号:

5.3 查看所有镜像(images)
docker images
5.4 删除镜像(rmi)
docker rmi 镜像ID
我们甚至可以只输入镜像ID的前三位即可删除
docker rmi 镜像ID的前三位

批量删除所有镜像
docker rmi -f $(docker images -aq)

6、docker容器常用命令
6.1 创建容器(create)
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
| 参数 | 说明(英文原文) | 中文解释 |
|---|---|---|
--add-host list | Add a custom host-to-IP mapping (host:ip) | 添加自定义的 host 与 IP 映射 |
--annotation map | Add an annotation to the container | 给容器添加注解(传递到 OCI 运行时) |
-a, --attach list | Attach to STDIN, STDOUT or STDERR | 绑定容器的标准输入/输出/错误 |
--blkio-weight uint16 | Block IO (relative weight), 10–1000 | 设置块 IO 权重(磁盘 IO 优先级) |
--cap-add list | Add Linux capabilities | 添加 Linux 权限 |
--cap-drop list | Drop Linux capabilities | 删除 Linux 权限 |
--cgroup-parent string | Optional parent cgroup for the container | 设置容器的 cgroup 父组 |
--cgroupns string | Cgroup namespace (host/private) | 设置 cgroup 命名空间 |
--cidfile string | Write container ID to file | 把容器 ID 写入文件 |
--cpu-period int | Limit CPU CFS period | 限制 CPU 调度周期 |
--cpu-quota int | Limit CPU CFS quota | 限制 CPU 使用配额 |
-c, --cpu-shares int | CPU shares (relative weight) | CPU 权重(调度优先级) |
--cpus decimal | Number of CPUs | 分配 CPU 数量 |
--cpuset-cpus string | CPUs to allow (e.g. 0-3) | 指定容器运行的 CPU 核 |
--device list | Add a host device to the container | 向容器添加宿主机设备 |
--disable-content-trust | Skip image verification | 跳过镜像验证 |
--dns list | Set custom DNS servers | 设置容器的 DNS 服务器 |
--dns-option list | Set DNS options | 设置 DNS 选项 |
--domainname string | Container NIS domain name | 设置容器域名 |
--entrypoint string | Overwrite image ENTRYPOINT | 覆盖镜像的入口点 |
-e, --env list | Set environment variables | 设置环境变量 |
--env-file list | Read environment variables from file | 从文件读取环境变量 |
--expose list | Expose a port or range | 暴露端口(给其他容器用) |
--gpus | GPU devices to add | 分配 GPU(如 --gpus all) |
--health-cmd string | Command to check health | 健康检查命令 |
--health-interval duration | Time between health checks | 健康检查间隔 |
--hostname, -h | Container host name | 设置容器主机名 |
--init | Run an init inside container | 在容器里运行 init(清理僵尸进程) |
-i, --interactive | Keep STDIN open | 保持标准输入打开 |
--ip string | IPv4 address | 指定容器 IPv4 |
--ip6 string | IPv6 address | 指定容器 IPv6 |
--ipc string | IPC mode | 设置 IPC 模式 |
-l, --label list | Set meta data | 添加标签 |
-m, --memory bytes | Memory limit | 设置内存限制 |
--mount mount | Attach a filesystem mount | 挂载文件系统 |
--name string | Assign a name to container | 给容器命名 |
--network network | Connect container to network | 指定网络 |
-p, --publish list | Publish container port(s) | 端口映射(宿主机:容器) |
-P, --publish-all | Publish all exposed ports | 暴露所有端口 |
--privileged | Give extended privileges | 提升容器权限(root 权限) |
--restart string | Restart policy | 设置重启策略(如 always) |
--rm | Remove container when it exits | 容器退出后自动删除 |
-t, --tty | Allocate a pseudo-TTY | 分配终端 |
-u, --user string | Username or UID | 指定用户 |
-v, --volume list | Bind mount a volume | 挂载卷 |
-w, --workdir string | Working directory | 设置容器工作目录 |
docker create nginx
创建容器之后会获得对应的docker容器ID
6.2 启动/停止/重启 容器 (start/stop/restart)
启动容器:
docker start c074a5173189eb8a9918c707bdfdbbcac5f9f43b43cc77305e22f81be0f5688c

停止容器:
docker stop c074a5173189eb8a9918c707bdfdbbcac5f9f43b43cc77305e22f81be0f5688c
重启容器:
docker restart c074a5173189eb8a9918c707bdfdbbcac5f9f43b43cc77305e22f81be0f5688c
tips:跟镜像一样,输入容器的前三位字符串即可使用,即 docker start c07
6.3 后台启动容器并暴露端口(run)
docker run
docker run 是 docker create + docker start的结合用法,意思就是创建并启动容器
最佳实践用法:给容器命名为mynginx,后台启动nginx镜像,并暴露端口给外界访问
docker run -d --name mynginx -p 80:80 nginx
访问你的docker的ip地址:

6.4 查看运行中的容器(ps)
docker ps
tips:同样可以在docker ps 附带--help,可以看到docker ps命令下的可用参数,如下:

6.5 查看所有容器(ps -a)
docker ps -a
6.6 查看容器资源占用情况(stats)
docker stats 容器ID

6.7 查看容器的日志(logs)
docker logs 容器ID
6.8 进入容器内部(exec)
docker exec -it 容器名或者容器的ID /bin/bash
-
docker exec:在运行中的容器里执行命令 -
-i:保持标准输入(interactive,交互模式) -
-t:分配一个伪终端(tty),让你像登录服务器一样操作 -
mynginx:容器的名字(也可以写容器 ID) -
/bin/bash:进入容器后运行的命令,这里是bash终端
6.9 退出容器内部(exit)

6.10 删除容器(rm)
删除指定容器:
docker rm 容器ID
强制删除指定容器:(即在运行中也可以删除)
docker rm -f 容器ID
强制批量删除所有容器:
docker rm -f $(docker ps -aq)
tips: $为使用命令 ,docker ps -aq 可以查询到所有容器的ID
结果:

7、docker容器与镜像的保存/载入,导入导出
我们先启动一个nginx容器,并修改里面index页的内容。
#后台启动容器名为mynginx,暴露外部端口80指向容器端口80,使用的镜像是nginx
docker run -d --name mynginx -p 80:80 nginx
#进入mynginx容器的内部
docker exec -it mynginx /bin/bash
#修改nginx中的index页面的内容,“echo > ”为覆盖,“echo >> ”为新增
echo "Study Docker,Read this one is enough!" > /usr/share/nginx/html/index.html

7.1 提交容器变化,将容器打包成一个新的镜像(commit)
docker commit -m "update index.html" mynginx mynginx:v1.0
![]()
使用docker images查看新镜像

由此也可以知道,docker images列出的IMAGE ID只是整个镜像ID的一部分。
7.2 保存镜像(save)
作用:把一个或多个镜像保存成一个归档文件(.tar),包含镜像的所有层(layer)+ 元数据(包括标签 tag、版本、历史信息等)。
docker save -o mynginx_image.tar mynginx:v1.0
7.3 加载镜像(load)
加载镜像之前为了方便分辨结果,先删除原来的镜像。
docker load -i mynginx_image.tar
7.4 导出容器(export)
#运行7.2中保存的镜像
docker run -d --name mynginx_image -p 88:80 mynginx:v1.0
#导出容器
docker export -o mynginx_container.tar mynginx_image

7.5 导入容器(import)
导入容器的镜像
docker import mynginx_container.tar mynginx_container

7.6 对比镜像(image)保存 和 容器(container)保存
1、使用save命令保存的镜像,会保存镜像原有的tag,历史信息,元数据等,而使用export命令导出的镜像是一个全新的镜像,什么都不包含。

镜像保存的元数据:

容器保存的元数据:
2、启动方式

save保存的镜像
会连启动命令也一并保存,使用的时候只需要像平时一样run就可以。
export保存的镜像
只保存了镜像,没有启动命令,nginx的启动还需要加上nginx官方默认的启动命令
“nginx -g 'daemon off;'”

8、docker仓库(docker Hub)的使用
docker Hub官网:
8.1 官网注册账号

8.2 官网登录

8.3 docker 登录(login)
#登录docker
docker login

显示Login Succeeded即登录成功,如果显示登录超时,那必然就是要开一波代理。
8.4 重新给镜像打标签(tag)
docker tag mynginx_container chenpengwei/mynginx_container:v1.0

tag命令打完标签后,使用docker images可以看到会"多了一个镜像"实则不然,只是建立多了一个额外的引用,他们的IMAGE ID是相同的,指向的都是同一个镜像数据
8.5 推送镜像(push)
docker push chenpengwei/mynginx_container:v1.0

显示Pushed即推送完成,可以到docker Hub查看
My Hub:

Explore:

8.6 拉取镜像(pull)
在8.5节中找到,我们在docker Hub推送的镜像,打开详情

直接复制pull命令就能进行拉取:
docker pull chenpengwei/mynginx_container:v1.0

运行拉取下来的容器:


9、docker 数据持久化
为什么需要数据持久化?
容器的存储层(Container Layer)是临时的:
-
容器删除 → 数据丢失
-
重建容器 → 数据清空
所以 Docker 提供了 数据持久化机制,保证数据不会随着容器的生命周期消失。
9.1 Volume(卷存储,卷映射)
-
数据卷存储在宿主机的
/var/lib/docker/volumes/目录下(默认位置,可以修改)。 -
由 Docker 自己管理生命周期,和容器解耦。
-
可以在多个容器之间共享和复用数据卷。
-
删除容器时不会删除数据卷(除非显式指定)。
操作:
将nginx的目录,存储到卷(nginxconf)中,nginxconf默认放在/var/lib/docker/volumes/ 目录下
docker run -d -p 88:80 -v nginxconf:/etc/nginx --name mynginx_volume chenpengwei/mynginx_image:v1.0
可以使用inspect来查看,容器的相关信息,找到Mounts能看到持久化的信息

进入相应目录:

修改宿主机nginx.conf文件:

保存退出后,前往对应的容器查看:

优点
✅ 跨容器共享数据
✅ 容器删除不会影响数据
✅ Docker 自己管理卷,适合生产环境
✅ 性能最好(直接存储在宿主机文件系统中)
缺点
❌ 数据位置不直观(存储在 Docker 管理目录下)
❌ 不方便宿主机直接访问(但可以通过 inspect 查路径)
9.2 Bind Mount(路径存储,绑定挂载)
-
直接使用宿主机上的路径。
-
容器对挂载目录的读写会直接反映到宿主机上。
-
灵活性高,适合开发环境。
操作:
将nginx的html文件夹存储到宿主机的 /app/nginxhtml 目录下。
docker run -d -p 89:80 -v /app/nginxhtml:/usr/share/nginx/html --name mynginx_volume_bind chenpengwei/mynginx_image:v1.0
这时候我们输入我们的访问地址会发现,403。

因为路径挂载之后,新的文件夹是空的,原因是改挂载的目录下没有index.html文件,导致nginx找不到初始页面所以显示的403。

那么我们就要新建一个index.html并写入内容。
echo "Study Docker,Read this one is enough,Bind Mount~" > index.html

效果:

优点
✅ 数据存储位置直观,可控
✅ 宿主机和容器之间实时同步
✅ 适合开发环境(比如挂载代码目录)
缺点
❌ 容易受宿主机权限、路径影响
❌ 不同宿主机路径可能不一致,迁移性差
❌ 安全性稍差,容器可以影响宿主机文件
9.3 tmpfs Mount(内存存储,内存挂载)
-
数据存放在宿主机内存,而不是磁盘。
-
容器停止后数据丢失。
-
适合存放敏感数据(例如密码文件)或需要高速读写的临时数据。
这种方式了解即可,实际开发环境不推荐使用~
9.4 三种存储方式总结(推荐:卷存储)
| 特性 | Volume(数据卷) | Bind Mount(绑定挂载) | tmpfs(内存挂载) |
|---|---|---|---|
| 存储位置 | /var/lib/docker/volumes/...(由 Docker 管理) | 宿主机任意目录(用户指定) | 宿主机内存(RAM) |
| 数据持久化 | ✅ 持久化,容器删除数据仍保留 | ✅ 持久化,容器删除数据仍保留 | ❌ 非持久化,容器停止数据消失 |
| 性能 | 高(推荐生产使用) | 中等(依赖宿主机文件系统性能) | 最高(纯内存读写) |
| 共享性 | ✅ 支持多个容器共享 | ✅ 支持多个容器共享 | ❌ 仅当前容器使用 |
| 可移植性 | ✅ 高,Docker 自动管理路径 | ❌ 低,宿主机路径不同可能无法运行 | ✅ 高,但无数据需要迁移 |
| 安全性 | 高(Docker 管理,隔离性好) | 较低(容器可直接修改宿主机目录文件) | 高(数据不落盘,容器停止即销毁) |
| 适用场景 | 数据库、日志、配置等需要长期保存的数据 | 开发环境挂载代码、配置文件,便于调试 | 缓存、临时文件、敏感数据(如密钥) |
总结:开发环境中推荐使用卷存储,实际应用中卷存储通用用来存储数据库文件、应用生成的数据(如上传图片、视频、附件、日志文件等)、SSL证书以及上面例子中的配置文件。
9.5 Volume存储常用命令
| 命令 | 作用 |
|---|---|
docker volume create [NAME] | 创建卷 |
docker volume ls | 查看所有卷 |
docker volume inspect NAME | 查看卷详情 |
docker volume rm NAME | 删除指定卷 |
docker volume prune | 删除未使用的卷 |
docker run -v VOLUME:PATH | 在容器中挂载卷 |

10、docker网络
简介:Docker 网络是容器间通信的基础,支持多种网络模式,允许容器与宿主机、其他容器或外部网络交互。Docker 默认提供以下核心网络驱动:
一句话,推荐使用第三种方式(自定义网络)
10.1 容器间通过宿主机IP地址访问
操作:
- 先启动了两个docker容器,分别为app1(暴露外部端口:88)和app2(暴露外部端口:99)。
- 进入容器app1内部,访问app2。

内部流程:
容器 → NAT(出去走物理网卡) → 宿主机网卡(192.168.0.138) → iptables DNAT 端口映射 → 容器服务。
这种情况就相当于你和你隔壁的同事,本来想讲一句话,明明当面讲就可以,你偏偏根据他的所在地址,跑出公司,再跑进来,然后来到他工位上,才开始讲一句。
特点:
-
多了一次NAT回环(Hairpin NAT),性能略低。
-
依赖宿主机 iptables 端口映射规则(
docker run -p时自动生成)。 -
如果容器过多、端口映射复杂,调试可能困难。
-
如果宿主机防火墙(iptables/firewalld)拦截了,可能访问失败。
10.2 通过docker网络桥接(brige)
docker在安装的时候,服务器会自动创建一个网桥:docker0,网关默认是:172.17.0.1
ip a

在我们不配置网络的情况下创建容器,容器会自动加入到 docker0 的这个网关下获取到分配的地址。
#查看容器的详情
ip inspect 容器名/容器ID


可以看到,根据容器的创建顺序,app1分配到的ip地址是172.17.0.3,app2分配到的ip地址是172.17.0.2。
操作:
进入容器app1(172.17.0.3)内部,访问app2(172.17.0.2)
#进入容器app1内部
docker exec -it app1 /bin/bash
#访问app2的99端口
curl http://172.17.0.2:99
#访问app2的80端口
curl http://172.17.0.2:80
#返回宿主机,通过书主机访问app2的80端口
exit
curl http://172.17.0.2:80

可以看到,访问app2的99端口,显示:Couldn't connect to server,访问80端口就成功了。说明这是容器内部间的通信,之前启动命令使用-p 99:80 是暴露给外部的端口,内部通信直接使用服务的端口,宿主机也可以通过网络桥接来访问容器的内容。
内部流程:
容器 → veth pair → docker0 bridge → 目标容器 → 服务
特点:
-
单机内通信,性能高,不需要 NAT 转换。
-
不依赖
-p端口映射,容器 IP 必须固定或通过 DNS/inspect 获取。 -
如果容器重启,IP 可能发生变化。
-
宿主机可以直接访问容器 IP(例如
curl 172.16.0.2:80也能通)。
10.3 自定义网络
前面提到的:
- 启动容器不配置网络,容器重启后IP会发生变化,导致写死的地址失效。
- docker0 是默认的bridge网络,不能自动做DNS解析,
- 直接通过宿主机IP,走的是物理网卡/宿主机路由,绕了一圈性能差,也不优雅。
现在我们来实现自定义网络。
操作:
创建网络,删除之前没有配置网络的容器,重新启动容器并配置网络,进入app1容器内部,访问app2。
#删除所有未配置网络的容器
docker rm -f $(docker ps -aq)
#重新启动容器app1、app2并配置网络
docker run -d --name app1 --network mynet chenpengwei/mynginx_image:v1.0
docker run -d --name app2 --network mynet chenpengwei/mynginx_image:v1.0#进入app1容器内部
docker exec -it app1 /bin/bash
#访问app2
curl http://app2:80

内部流程:
容器 -> docker内置DNS服务器注册 -> 目标容器
特点:
- 内置DNS解析
- 隔离性更强
- 多网络支持
- 拓展性强
- 更灵活的别名
10.4 三种网络方式总结(推荐:自定义网络)
| 方式 | 工作原理 | 是否需要写死 IP | 是否支持容器名访问 | 隔离性 | 性能 | 场景适用 |
|---|---|---|---|---|---|---|
| 宿主机地址 (192.168.x.x) | 容器通过宿主机的物理网卡 IP + 宿主机端口映射访问服务 | ❌ 不需要写容器 IP,但需要写死宿主机 IP + 映射端口 | ❌ 不支持(只能写宿主机 IP) | ❌ 差(所有容器都能访问宿主机端口,缺少隔离) | ⬇️ 较低(多了一层 NAT/路由) | 容器访问宿主机服务,或需要对外暴露端口 |
| docker0 默认网络 (172.17.x.x) | 每个容器通过 docker0 网桥分配 IP,容器间可用该 IP 通信 | ✅ 需要写死容器 IP(IP 容器重启后可能变) | ❌ 不支持(没有内置 DNS) | ⚠️ 一般(所有容器在同一网络可互通,隔离差) | ⬆️ 高(容器直连虚拟网桥,少一层路由) | 临时测试、单机部署,不推荐生产使用 |
| 自定义网络 (docker network create) | Docker 创建独立的虚拟网桥(br-xxxxxx),并提供 DNS 服务 | ❌ 不需要写死 IP(可直接用容器名/服务名) | ✅ 支持(自动 DNS 解析) | ✅ 强(不同自定义网络隔离,需手动连接才通) | ⬆️ 高(同样直连虚拟网桥) | 推荐生产使用:微服务、数据库、Nginx 代理等 |
10.5 docker网络的常用命令
| 命令 | 作用 | 示例 | 说明 |
|---|---|---|---|
docker network ls | 查看所有网络 | docker network ls | 默认有 bridge、host、none |
docker network inspect <网络名> | 查看网络详情 | docker network inspect bridge | 可查看网络 ID、子网、已连接容器等信息 |
docker network create <网络名> | 创建用户自定义网络 | docker network create mynet | 默认是 bridge 驱动,也可用 --driver overlay |
docker network rm <网络名> | 删除网络 | docker network rm mynet | 删除前需确保没有容器在使用 |
docker network prune | 清理未使用的网络 | docker network prune | 会删除所有没有被容器使用的网络 |
docker run --network <网络名> | 启动容器并加入网络 | docker run -d --name app --network mynet nginx | 容器启动时直接指定网络 |
docker network connect <网络名> <容器名> | 将已运行容器加入某网络 | docker network connect mynet app | 一个容器可以加入多个网络 |
docker network disconnect <网络名> <容器名> | 将容器从网络中移除 | docker network disconnect mynet app | 容器移出后将无法访问该网络内的其他容器 |
11、docker 配置中间件同步集群(例子:redis)
docker Hub上的Redis镜像地址:https://hub.docker.com/search?q=redis
由于Redis官方的Redis镜像,配置Redis需要修改配置文件,比较麻烦。所以选择 bitnami制作的redis镜像,只需要启动的时候加上配置的命令即可完成配置。


操作:
首先在app目录下创建redis的数据文件并授权777,一会启动容器的时候挂载使用,启动时暴露6379和6380端口给外部访问,为了方便查看,可以使用RedisDesktopManager查看是否集群成功。
#app目录下创建redis的数据文件并授权777
cd /app
mkdir rd1
mkdir rd2
sudo chmod 777 rd1
sudo chmod 777 rd2
#启动两个redis容器,分别暴露6379和6380端口,并挂载数据文件
# 主节点docker run -d -p 6379:6379 \-v /app/rd1:/bitnami/redis/data \-e REDIS_REPLICATION_MODE=master \-e REDIS_PASSWORD=123456 \--network mynet --name redis01 \bitnami/redis# 从节点docker run -d -p 6380:6379 \-v /app/rd2:/bitnami/redis/data \-e REDIS_REPLICATION_MODE=slave \-e REDIS_MASTER_HOST=redis01 \-e REDIS_MASTER_PORT_NUMBER=6379 \-e REDIS_MASTER_PASSWORD=123456 \-e REDIS_PASSWORD=123456 \--network mynet --name redis02 \bitnami/redis
使用RedisDesktopManager进行测试:


12、docker 数据库
用MySQL举例子:
docker Hub的MySQL镜像地址:https://hub.docker.com/_/mysql
部署数据库的配置属性主要关注三大点:网络、存储、环境变量


操作:
部署一个Mysql版本为8.0.37-debian,暴露外部端口3306映射内部的3306,路径存储mysql的配置文件和数据文件,MYSQL的root用户密码为123456
docker run -d -p 3306:3306 \
-v /app/myconf:/etc/mysql/conf.d \
-v /app/mydata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.37-debian

13、docker Compose
13.1 介绍
Docker Compose官方文档:
https://docs.docker.com/reference/compose-file/
什么是Docker Compose?
Docker Compose 是 Docker 官方提供的一个工具,用来 定义和管理多个容器应用。
你可以把它理解成一个 编排器 —— 你写一个 docker-compose.yaml 文件,把项目里需要的所有容器(服务)描述清楚,Compose 就能一键帮你启动和管理它们。
为什么需要Docker Compose?
学了上面内容后,已经掌握了docker启动你所需要的容器,比如部署一个wordpress,只需要提前启动一个mysql即可使用,按照我们以前的方式,我们应该先启动一个mysql容器,然后再启动wordpress。
手动执行,启动两个容器
docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=wordpress \
-v mysql-data:/var/lib/mysql \
mysql:8.0
docker run -d --name wordpress \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=123456 \
-e WORDPRESS_DB_NAME=wordpress \
-p 8080:80 \
wordpress
使用docker compose
只需要写一个compose.yaml文件。
13.2 compose.yaml文件
新建一个compose.yaml文件,内容如下:
name: myblog
services:
mysql:
container_name: mysql
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=wordpress
volumes:
- mysql-data:/var/lib/mysql
- /app/myconf:/etc/mysql/conf.d
restart: always
networks:
- blog
wordpress:
image: wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
restart: always
networks:
- blog
depends_on:
- mysql
volumes:
mysql-data:
wordpress:
networks:
blog:
要注意层级关系,配置为什么这样写,在13.1贴出来的官网能查看,compose文件的配置写法。

如果你想查找关于 卷映射的配置内容,就找 volume。

同理,如果你想找网络的内容,那就要找network。
13.3 compose的使用命令
| 命令 | 功能 | 示例 |
|---|---|---|
docker compose up | 启动服务并创建容器(前台运行) | docker compose up |
docker compose up -d | 启动服务并后台运行 | docker compose up -d |
docker compose down | 停止并删除容器、网络、卷等资源 | docker compose down |
docker compose start | 启动已存在但停止的容器 | docker compose start |
docker compose stop | 停止运行中的容器,但不删除 | docker compose stop |
docker compose restart | 重启服务 | docker compose restart |
docker compose pause | 暂停容器 | docker compose pause |
docker compose unpause | 恢复暂停的容器 | docker compose unpause |
docker compose ps | 查看服务容器的状态 | docker compose ps |
docker compose logs | 查看容器日志 | docker compose logs |
docker compose logs -f | 实时查看日志(类似 tail -f) | docker compose logs -f |
docker compose exec | 在运行中的容器里执行命令 | docker compose exec mysql bash |
docker compose run | 启动一个一次性容器并运行命令 | docker compose run --rm web sh |
docker compose config | 检查、合并并验证 Compose 文件配置 | docker compose config |
docker compose build | 构建或重新构建服务镜像 | docker compose build |
docker compose build --no-cache | 不使用缓存重新构建 | docker compose build --no-cache |
docker compose pull | 拉取服务依赖的镜像 | docker compose pull |
docker compose push | 推送服务镜像到仓库 | docker compose push |
docker compose top | 显示容器中正在运行的进程 | docker compose top |
docker compose events | 查看容器事件日志流 | docker compose events |
docker compose images | 查看服务使用的镜像 | docker compose images |
docker compose version | 查看 Compose 版本 | docker compose version |
13.4 常见用法
# -f 可以在存在多个compose文件时,指定文件启动,up -d 则是通过后台方式启动
docker compose -f compose.yaml up -d

这时候我们访问暴露的8080端口即可使用wordpress。

# 只启动compose文件里的,mysql服务
docker compose up -d mysql
使用docker compose down时,会删除到对应的容器和网络,但是数据卷一般都还会在。

所以如果想关掉容器,容器的时候连同数据卷和镜像一起删除的话可以使用:
--rmi 后面跟的是镜像名称,如果要删除所有,可以使用all
docker compose -f compose.yaml down --rmi all -v
14、dockerFile
14.1 官方文档
dockerFile官方文档:https://docs.docker.com/reference/dockerfile/

14.2 讲解
简单来说dockerFile是一个文本文件,里面写了一系列的指令,用来告诉Docker如何构建镜像。
常见指令
| 指令 | 作用 | 示例 |
|---|---|---|
FROM | 指定基础镜像 | FROM openjdk:17 |
WORKDIR | 设置容器中的工作目录 | WORKDIR /app |
COPY | 复制文件到镜像 | COPY target/app.jar /app/app.jar |
CMD | 容器启动时默认执行的命令 | CMD ["java", "-jar", "app.jar"] |
EXPOSE | 声明容器要监听的端口 | EXPOSE 8080 |
LABEL | 标签 | LABEL author = chenpengwei |
通俗易懂的来说,使用dockerfile指令构建镜像就像盖房子:
| 指令 | 示例 | 通俗易懂 |
|---|---|---|
FROM | FROM openjdk:17 | 打一个17年流行款式的地基 |
WORKDIR | WORKDIR /app | 房子的地址,门牌号 |
COPY | COPY target/app.jar /app/app.jar | 把你自己做好的装修搬进新屋子 |
CMD | CMD ["java", "-jar", "app.jar"] | 按照17年流行款式的地址做好的装修 |
EXPOSE | EXPOSE 8080 | 告诉别人你家的门牌号 |
LABEL | LABEL author = chenpengwei | 在门口贴一个牌子,写着这是我chenpengwei的房子! |
"打地基"之前要看看dockerHub上有没有这个款式:

openjdk镜像版本说明:
| 标签 | 基础镜像 | 大小 | 特点 | 适用场景 |
|---|---|---|---|---|
openjdk:17 | Debian(完整版) | ~400–600 MB | 含完整 JDK + 常见 Linux 工具 | 开发/调试/构建 |
openjdk:17-slim / openjdk:17-jdk-slim | Debian slim | ~200 MB | 精简版 Debian,仅保留必要依赖 | 生产环境,运行 JAR |
openjdk:17-buster | Debian 10 (buster) | ~400–600 MB | 指定旧版 Debian 作为基础 | 兼容性要求高的老项目 |
openjdk:17-bullseye | Debian 11 (bullseye) | ~400–600 MB | 较新的 Debian 版本 | 默认推荐 |
openjdk:17-alpine | Alpine Linux | ~100 MB | 极小体积,但不含 glibc,兼容性差 | 高度精简,但需适配 |
openjdk:17-windowsservercore | Windows Server Core | >1 GB | Windows 运行环境 | 在 Windows 容器中运行 Java |
openjdk:17-nanoserver | Windows Nano Server | ~200–300 MB | 极简 Windows 容器环境 | Windows 微服务部署 |
openjdk:17-ea | Debian/Alpine | 不固定 | Early Access 版本,预览 JDK | 测试 JDK 新特性,不建议生产用 |
最简单的使用:
FROM openjdk:17-jdk-slim
COPY app.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
14.3 创建Jar包
tips:我使用的是IDEA2024版
新建Springboot项目:

Springboot项目初始化配置:
配置一:

配置二:

创建Controller层:

controller层代码:
@RestController
public class HelloDockerController {
@GetMapping("/")
public String hello() {
return "Hello Docker!";
}
}
本地跑一遍,确定jar包可用:

maven打包:

打包完成,领取你的Jar包:


拿出来将名字改成app.jar,导入到服务器即可。
14.4 创建Dockerfile文件
vim Dockerfile
填写dockerfile指令信息,保存退出:
FROM openjdk:17-jdk-slim
COPY app.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

14.5 通过Dockerfile构建镜像
#使用docker build构建镜像
docker build -f Dockerfile -t myjavaapp:v1.0 .
#命令说明:

#结果:

14.6 启动一个由Dockerfile构建的镜像的容器
#启动命令:
docker run -d -p 9999:8080 myjavaapp:v1.0
#执行过程:

#执行效果:






25万+

被折叠的 条评论
为什么被折叠?



