大家好,在上篇文章中博主演示了Dockerfile常用的命令,以及如何利用Dockerfile构建镜像,生成容器服务,但是在实际应用环境中,特别是在微服务架构中,一个应用系统可能包含多个微服务,每个微服务可能需要部署多个实例。手动操作每个微服务不仅低效,还需要大量维护工作。此外,多个容器之间可能存在依赖关系,需要按照指定顺序启动。手动维护这些容器变得复杂、繁琐且容易出错。
为解决这些问题,Docker Compose应运而生。它是一个强大的工具,用于管理和编排多个容器。通过Docker Compose,我们可以轻松部署和管理复杂的应用系统,提高效率并降低出错的风险,下面为大家演示一下如何使用Docker Compose部署多个服务吧。
一:Docker Compose简介、安装
1.1 简介
Docker Compose 是 Docker 公司推出的一个工具,用于简化多容器应用程序的定义、运行和管理。通过一个 YAML 配置文件(通常是 docker-compose.yml
),用户可以定义应用程序的各种服务、网络和卷,并通过一条命令就可以启动、停止一组相关联的多个容器。
1.2 安装
在 Docker 旧版本中,Docker Compose 要另外安装,现在的Docker中已经默认集成了Docker Compose。
使用 docker compse version
命令可以查看到版本信息:
旧版本安装:
# 下载最新版本的 Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#给与可执行权限
sudo chmod +x /usr/local/bin/docker-compose
#验证安装
docker-compose --version
二:使用Docker Compose构建,部署多镜像、服务
2.1 编写项目的Dockerfile
kingoffice-auth项目:Dockerfile文件、注意部署的jar和对应的Dockerfile文件需要在一个目录下,博主安装在/kim/project/auth
目录下。
# 使用官方Java运行环境作为基础镜像
FROM openjdk:8-jre
# 设置容器内jar工作目录
WORKDIR /kim
# 暴露9200端口
EXPOSE 9200
# 设置时区
ENV TZ=Asia/Shanghai
# 将你的jar包添加到容器中
ADD kingoffice-auth.jar /kim/kingoffice-auth.jar
# 声明日志卷,容器内应用生成的日志将被存储在这个位置
VOLUME /kim/logs
# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/kim/kingoffice-auth.jar"]
kingoffice-system:Dockerfile文件、注意部署的jar和对应的Dockerfile文件需要在一个目录下,博主安装在/kim/project/system
目录下。
# 使用官方Java运行环境作为基础镜像
FROM openjdk:8-jre
# 设置容器内jar工作目录
WORKDIR /kim
# 暴露9201端口
EXPOSE 9201
# 设置环境变量来指定时区
ENV TZ=Asia/Shanghai
# 将你的jar包添加到容器中
ADD kingoffice-modules-system.jar /kim/kingoffice-modules-system.jar
# 声明日志卷,容器内应用生成的日志将被存储在这个位置
VOLUME /kim/logs
# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/kim/kingoffice-modules-system.jar"]
2.2 编写docker-compose.yaml
此配置 部署了三个项目服务,还有一个gateway博主未贴出,Dockerfile文件和auth服务的差别不大.
另外博主system服务的启动依赖于auth、gateway服务的启动,如果同学有用到此配置,请将关于gateway服务的配置补齐或者删除。
version: '3.8'
services:
kingoffice-auth:
build:
context: /kim/project/auth
dockerfile: Dockerfile
image: kim-auth
container_name: kingoffice-auth
ports:
- "9200:9200"
volumes:
- /kim/logs/auth:/kim/logs
environment:
- TZ=Asia/Shanghai
restart: always
kingoffice-gateway:
build:
context: /kim/project/gateway
dockerfile: Dockerfile
image: kim-gateway
container_name: kingoffice-gateway
ports:
- "9100:9100"
volumes:
- /kim/logs/gateway:/kim/logs
environment:
- TZ=Asia/Shanghai
restart: always
kingoffice-system:
build:
context: /kim/project/system
dockerfile: Dockerfile
image: kim-system
container_name: kingoffice-modules-system
ports:
- "9201:9201"
volumes:
- /kim/logs/system:/kim/logs
environment:
- TZ=Asia/Shanghai
restart: always
depends_on:
- kingoffice-auth
- kingoffice-gateway
注意:context: /kim/project/system 这里指向对应jar的Dockerfile文件的所在目录。
2.3 运行docker-compose 访问项目
docker-compose.yaml
文件编写好了,把文件上传到宿主机上,然后在终端进入到 docker-compose.yaml
文件所在目录,然后执行如下命令,检查一下配置有没有问题:
# 检查docker-compose.yaml有没有问题
docker compose config
# 或者,检查docker-compose.yaml有没有问题,有问题才会输出内容
docker compose config -q
如果没有问题,就可以运行命令启动容器了:
docker compose up -d
- up:表示启动。
- -d:表示后台运行。
启动后,会自动下载镜像和通过 Dockerfile 自动构建镜像,并启动服务:
启动服务后,可以使用如下命令,查看启动的服务:
# 显示docker compose 编排的所有正在运行的容器
docker compose ps
运行容器完成,就可以访问到项目的接口了,开发同学可自行使用api工具调用接口测试。
三:Docker Compose常用命令
Docker 的基本使用上面已经讲解了,下面介绍一下其他的常用命令,需要的直接查询即可:
下面除了帮助命令,其他命令都需要在 docker-compose.yaml 所在目录下执行。
3.1 查看帮助
docker compose -h
- 会列出 docker compose 所有的命令。
3.2 启动
# 启动
docker compose up
# 后台启动
docker compose up -d
- 启动并运行 Compose 文件中定义的所有服务。
- 使用
-d
参数在后台运行服务。 - 如果服务容器不存在,
docker compose up
会创建它们。如果容器已经存在,但配置或镜像已更改,它会停止并重新创建容器,所以这个命令多次运行也不会存在问题,每次都会删除重新创建。
3.3 检查Compose文件
# 检查docker-compose.yaml有没有问题
docker compose config
# 检查docker-compose.yaml有没有问题,有问题才会输出内容
docker compose config -q
- 验证 Compose 文件的配置是否正确。
3.4 停止并删除
# 停止
docker compose down
- 停止并删除 Compose 文件中定义的所有服务。
- 注意,会同时删除相关的容器、网络和卷。
3.5 停止
# 停止服务
docker compose stop
# 停止docker-compose文件中定义的某一个容器服务
docker compose stop 容器服务名
- 停止正在运行的服务。
- 注意和
docker compose down
的区别,stop
只是停止,不会删除。
3.6 启动服务
# 启动已停止的容器
docker compose start
# 启动docker-compose文件中定义的某一个容器服务
docker compose start 容器服务名 # 容器服务名指的是docker-compose.yaml中定义的容器服务名称
- 启动已经存在但已停止的容器。它不会创建新的容器,也不会重新构建服务。
3.7 重启
# 重启
docker compose restart
# 重启docker-compose文件中定义的某一个容器服务
docker compose restart 容器服务名 # 容器服务名指的是docker-compose.yaml中定义的容器服务名称
- 重启服务。
3.8 显示compose所有容器
# 显示docker compose 编排的所有正在运行的容器
docker compose ps
# 显示docker compose 编排的所有容器
docker compose ps -a
- 显示当前 docker compose 编排的容器。
3.9 MySQL容器服务编写
这里示例一下 MySQL 容器的服务编写,需要的可以参考一下,启动之前需要准备 MySQL 的配置文件,和基础教程中 Docker 部署 MySQL。
docker-compose.yaml
的编写:
# 定义服务
services:
mysql:
image: mysql:5.7
volumes:
- /kim/mysql/conf:/etc/mysql/conf.d
- /kim/mysql/log:/var/log/mysql
- /kim/mysql/data:/var/lib/mysql
- /etc/localtime:/etc/localtime
environment:
MYSQL_ROOT_PASSWORD: 123456
TZ: Asia/Shanghai
ports:
- 3306:3306
restart: always
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password # 解决外部无法访问
四:Docker拓展
4.1 限制容器资源
为了确保容器不会过度占用宿主机资源,限制CPU和内存的使用量是非常重要的。下面是关于限制CPU和内存资源的方法:
4.1.1 限制CPU资源
-
限制CPU核心数: 使用
--cpus
参数来限制容器可以使用的CPU核心数。docker run --cpus 2 my-image
-
限制使用指定的CPU: 使用
--cpuset-cpus
参数来指定容器可以使用的具体CPU核心。docker run -it --cpuset-cpus="0,2" my-image
-
设置控制相对的权重: 使用
--cpu-shares
参数来设置容器的CPU份额,这是一个相对值,默认为1024。docker run -it --cpu-shares=512 my-image
-
设置CPU周期和配额: 使用
--cpu-period
和--cpu-quota
参数来设置CPU周期和配额。docker run --cpu-period 100000 --cpu-quota 50000 my-image
4.1.2 限制内存使用
-
设置内存限制: 使用
-m
或--memory
标志来限制容器可以使用的内存量。docker run -it -m 512m my-image
-
设置内存和交换空间限制: 使用
--memory-swap
参数来限制容器的内存加交换空间总量。docker run -it -m 512m --memory-swap=1g my-image
-
组合使用: 可以组合以上限制方式,例如同时限制CPU、内存和交换空间:
docker run -it --cpus="1.5" --memory="512m" --memory-swap="1g" my-image
通过以上方法,你可以有效地限制容器对宿主机资源的使用,确保系统稳定性。
4.2 docker可视化工具
Portainer是一个轻量级的容器管理器,它提供了一个直观和用户友好的图形界面,用于管理和监视Docker容器集群。通过Portainer的图形界面,用户可以快速地创建、启动、停止和重启容器,以及进行其他管理操作,从而提高了容器管理的效率。
Portainer 官网:https://www.portainer.io/ ,Portainer 分为商业版和社区版,我们用社区版就可以了。
安装的话可以直接查看官方的文档,Portainer 也是容器安装,所以很简单,直接执行命令。
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data \ portainer/portainer-ce:latest
通过这条命令,你可以在宿主机上运行Portainer容器,并通过端口8000和9443访问Portainer的Web界面。同时,容器会自动重启,并且会将Docker守护进程的socket文件和Portainer数据持久化存储。
安装完成后,你可以通过访问 http://<宿主机IP>:8000
或 https://<宿主机IP>:9443
来访问Portainer的Web界面,并开始管理Docker容器。
4.3 Kubernetes
在探索容器技术和容器编排工具的旅程中,我们已经学习了 Docker 和 Docker Compose 的基本概念和使用方法。现在,是时候转向更高级、更强大的容器管理技术——Kubernetes (K8s) 了。
🔹 Docker 是容器技术的核心和基础,提供了一个轻量级、可移植的环境来运行、分发和管理容器。 🔹 Docker Compose 则是建立在 Docker 之上的单主机容器编排工具。它允许用户通过一个简单的 YAML 文件定义一组相关联的应用容器作为一个项目,并通过一个命令(docker-compose up
)启动整个应用。 🔹 而 Docker Swarm 是 Docker 公司提出的原生容器集群管理工具,用于将多个 Docker 主机组织成一个集群,实现容器的高可用性和负载均衡。这是 Docker Compose 无法实现的功能,因为 Docker Compose 只能管理当前主机上的 Docker 容器。
接下来谈谈 Kubernetes (K8s):
- Kubernetes 和 Docker Swarm 定位相似,都是跨主机的容器管理平台。
- Kubernetes 由谷歌根据多年运维经验研发,而 Docker Swarm 是由 Docker 公司推出。
- Kubernetes 提供了更丰富的特性和强大的社区支持,已成为许多大公司默认使用的容器管理技术。
🚀 选择 Kubernetes 的理由:
- 广泛采用: Kubernetes 已经成为业界标准,许多大型企业都在使用。
- 社区支持: 拥有活跃的开源社区,提供大量资源和插件。
- 强大功能: 提供服务发现、负载均衡、自动部署、滚动更新等高级功能。
🎯 结论:
虽然 Docker 和 Docker Compose 提供了强大的单主机容器管理能力,但在面对需要跨主机管理和高度可扩展性的场景时,Kubernetes 显然是更优选。鉴于其广泛的应用和社区支持,学习 Kubernetes 是一个明智的选择。
五:总结
docker的学习到这里就告一段落了,接下来博主将带着大家完成jenkins相关的教程,以实现自动化的构建与部署项目,教程制作不易,如果对你有帮助,可以一键三连,多多分享哦。