Docker从入门到精通(八)——Docker Compose
恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具。
1、为什么需要 Docker Compose?
官网镇楼:https://www.runoob.com/docker/docker-compose.html
一句话概括:
帮助我们批量有规则的管理容器。
前面基础教程,我们介绍了 Dockerfile ,启动服务都是通过 Dockerfile 构建镜像,启动容器,对于几个服务,我们一个一个的build,run 还能接收,但是实际生产环境是有几百上千个的,这个时候难道我们还有手动一个一个启动吗?
另外,服务与服务之间是有依赖关系的,比如一个 Tomcat 部署的服务依赖MySQL,依赖Redis,我们启动 Tomcat 服务时,需要先启动MySQL和Redis,这个顺序也是很重要的。
有了 Docker Compose ,那我们就可以告别手动繁琐的步骤,提前定义好规则,统一管理即可。
2、Docker Compose 局限性
首先说明,Docker Compose 虽然是官方提供的容器编排工具,但是实际生产环境是不用的(用什么?比如Swarm、K8S,后面会介绍),因为其局限性很大,这里介绍大家了解即可。
只支持单机多容器,不支持集群环境管理。
3、安装
参考官方文档即可:https://docs.docker.com/compose/install/
Mac/Windows 安装docker默认提供了 Docker Compose,所以不需要我们安装,但是Linux环境需要手动安装。
3.1 下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
上面是官方提供的,但是下载会比较慢,可以使用国内的下载地址:
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
3.2 授权
sudo chmod +x /usr/local/bin/docker-compose
3.3 验证安装
docker-compose version
3.4 卸载
sudo rm /usr/local/bin/docker-compose
4、用法
根据官方提示,使用 Docker Compose 分为三个步骤:
- 第一步:使用 Dockerfile 定义应用程序的环境。
- 第二步:使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 第三步:执行 docker-compose up 命令来启动并运行整个应用程序。
具体如何用,下面我通过两个小例子来演示说明。
5、部署WP博客
这也是官方提供的实例:https://docs.docker.com/samples/wordpress/
WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。
5.1 创建项目目录
名称任意,用来存放 docker-compose.yml 文件
mkdir my_wordpress
我们按照官方创建一个名为 my_wordpress 目录。
5.2 创建 docker-compose.yml
新建一个 docker-compose.yml 文件,内容如下:
version: "3.9" services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - wordpress_data:/var/www/html ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {} wordpress_data: {}
5.3 构建项目
docker-compose up -d
注意要切换到my_wordpress 目录,否则要增加 -f 参数指定 docker-compose.yml 文件。
看到上面截图即表示启动成功。
5.4 访问页面
另外,我们通过 docker ps 命令,也能看到启动了两个容器。
6、docker-compose.yml 规则
上面的例子很简单,但是里面有一个核心就是 docker-compsoe.yml 文件的编写,下面我们就来详细介绍这个文件的编写规则。
官方规则介绍:
# 第一层:版本 version: "3.9" # 第二层:服务 services: # 服务名称 db: # 镜像名称 image: mysql:5.7 # 挂载的容器卷 volumes: - db_data:/var/lib/mysql # 服务挂掉是否自动重启 restart: always # 环境变量设置 environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress # 服务名称 wordpress: # 依赖的服务 depends_on: - db image: wordpress:latest volumes: - wordpress_data:/var/www/html ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress # 第三层:其他配置,包括网络,容器卷等等 volumes: db_data: {} wordpress_data: {}
其实主要就是三层配置,具体的每个配置项,大家可以看名知意,然后不懂的官网其实也有很详细的说明。
7、Docker Comopose 部署自定义服务
下面我们自己写一个服务,不用官方服务,带着大家手动玩一遍。
每次访问 Tomcat的服务,Redis计数器加1
7.1 编写 Tomcat服务
新建一个springboot项目,然后新建一个controller类:
package com.itcoke.counter.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController public class CounterController { @Autowired StringRedisTemplate redisTemplate; @GetMapping("/visit") public String count(HttpServletRequest request){ String remoteHost = request.getRemoteHost(); Long increment = redisTemplate.opsForValue().increment(remoteHost); return remoteHost +"访问次数"+increment.toString(); } }
Springboot 服务的配置文件 application.yml:
server: port: 8080 servlet: context-path: /counter spring: redis: host: counterRedis
7.2 Dockerfile
FROM openjdk:8-jdk COPY *.jar /counter.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/counter.jar"]
7.3 docker-compose.yml
version: "3.8" services: itcokecounter: build: . image: itcokecounter depends_on: - counterRedis ports: - "8080:8080" counterRedis: image: "redis:6.0-alpine"
7.4 测试
在Linux服务器新建 counter 文件夹,把下面三个文件拷贝到其中。
然后执行如下命令构建:
docker-compose up
执行完成便会出现如下启动成功界面:

然后,我们在浏览器输入网址:
http://{ip}:8080/counter/visit
每刷新一次,还会增加一次。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?