docker入门,看这一篇就够了

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 listAdd a custom host-to-IP mapping (host:ip)添加自定义的 host 与 IP 映射
--annotation mapAdd an annotation to the container给容器添加注解(传递到 OCI 运行时)
-a, --attach listAttach to STDIN, STDOUT or STDERR绑定容器的标准输入/输出/错误
--blkio-weight uint16Block IO (relative weight), 10–1000设置块 IO 权重(磁盘 IO 优先级)
--cap-add listAdd Linux capabilities添加 Linux 权限
--cap-drop listDrop Linux capabilities删除 Linux 权限
--cgroup-parent stringOptional parent cgroup for the container设置容器的 cgroup 父组
--cgroupns stringCgroup namespace (host/private)设置 cgroup 命名空间
--cidfile stringWrite container ID to file把容器 ID 写入文件
--cpu-period intLimit CPU CFS period限制 CPU 调度周期
--cpu-quota intLimit CPU CFS quota限制 CPU 使用配额
-c, --cpu-shares intCPU shares (relative weight)CPU 权重(调度优先级)
--cpus decimalNumber of CPUs分配 CPU 数量
--cpuset-cpus stringCPUs to allow (e.g. 0-3)指定容器运行的 CPU 核
--device listAdd a host device to the container向容器添加宿主机设备
--disable-content-trustSkip image verification跳过镜像验证
--dns listSet custom DNS servers设置容器的 DNS 服务器
--dns-option listSet DNS options设置 DNS 选项
--domainname stringContainer NIS domain name设置容器域名
--entrypoint stringOverwrite image ENTRYPOINT覆盖镜像的入口点
-e, --env listSet environment variables设置环境变量
--env-file listRead environment variables from file从文件读取环境变量
--expose listExpose a port or range暴露端口(给其他容器用)
--gpusGPU devices to add分配 GPU(如 --gpus all
--health-cmd stringCommand to check health健康检查命令
--health-interval durationTime between health checks健康检查间隔
--hostname, -hContainer host name设置容器主机名
--initRun an init inside container在容器里运行 init(清理僵尸进程)
-i, --interactiveKeep STDIN open保持标准输入打开
--ip stringIPv4 address指定容器 IPv4
--ip6 stringIPv6 address指定容器 IPv6
--ipc stringIPC mode设置 IPC 模式
-l, --label listSet meta data添加标签
-m, --memory bytesMemory limit设置内存限制
--mount mountAttach a filesystem mount挂载文件系统
--name stringAssign a name to container给容器命名
--network networkConnect container to network指定网络
-p, --publish listPublish container port(s)端口映射(宿主机:容器)
-P, --publish-allPublish all exposed ports暴露所有端口
--privilegedGive extended privileges提升容器权限(root 权限)
--restart stringRestart policy设置重启策略(如 always)
--rmRemove container when it exits容器退出后自动删除
-t, --ttyAllocate a pseudo-TTY分配终端
-u, --user stringUsername or UID指定用户
-v, --volume listBind mount a volume挂载卷
-w, --workdir stringWorking 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即登录成功,如果显示登录超时,那必然就是要开一波代理

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 -fdocker 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指令构建镜像就像盖房子:

指令示例通俗易懂
FROMFROM openjdk:17打一个17年流行款式的地基
WORKDIRWORKDIR /app房子的地址,门牌号
COPYCOPY target/app.jar /app/app.jar把你自己做好的装修搬进新屋子
CMDCMD ["java", "-jar", "app.jar"]按照17年流行款式的地址做好的装修
EXPOSEEXPOSE 8080告诉别人你家的门牌号
LABELLABEL author = chenpengwei在门口贴一个牌子,写着这是我chenpengwei的房子!

"打地基"之前要看看dockerHub上有没有这个款式:

openjdk镜像版本说明:

标签基础镜像大小特点适用场景
openjdk:17Debian(完整版)~400–600 MB含完整 JDK + 常见 Linux 工具开发/调试/构建
openjdk:17-slim / openjdk:17-jdk-slimDebian slim~200 MB精简版 Debian,仅保留必要依赖生产环境,运行 JAR
openjdk:17-busterDebian 10 (buster)~400–600 MB指定旧版 Debian 作为基础兼容性要求高的老项目
openjdk:17-bullseyeDebian 11 (bullseye)~400–600 MB较新的 Debian 版本默认推荐
openjdk:17-alpineAlpine Linux~100 MB极小体积,但不含 glibc,兼容性差高度精简,但需适配
openjdk:17-windowsservercoreWindows Server Core>1 GBWindows 运行环境在 Windows 容器中运行 Java
openjdk:17-nanoserverWindows Nano Server~200–300 MB极简 Windows 容器环境Windows 微服务部署
openjdk:17-eaDebian/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

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

17、docker 与 Kubernetes(k8s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值