1、docker官方文档

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官网:

https://hub.docker.com/

8.1 官网注册账号

8.2 官网登录

8.3 docker 登录(login)

#登录docker

docker login

显示Login Succeeded即登录成功,如果显示登录超时,那必然就是要开一波代理。

登录超时启动方法:

1、打开代理-设置,启用局域网连接

2、进入docker的代理配置文件

vim /etc/systemd/system/docker.service.d/http-proxy.conf

输入你的ip地址+你代理的端口号,我的是7890。保存退出

[Service]
Environment="HTTP_PROXY=http://192.168.0.54:7890/"
Environment="HTTPS_PROXY=http://192.168.0.54:7890/"

3、重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

4、查看代理是否成功配置

docker info | grep -i proxy

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 默认有 bridgehostnone
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

#执行过程:

#执行效果:

15、docker一键安装部署Ruoyi-Vue

实践:

https://blog.csdn.net/TinpeaV/article/details/151855973?spm=1001.2014.3001.5501

16、docker结合jenkins实现自动化部署

17、docker 与 Kubernetes(k8s)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐