Docker5️⃣编排(Compose)
-
docker run
:创建一个容器并运行。 -
微服务项目中的组件非常多,手动逐个创建容器的操作十分繁琐。
1、Docker Compose
Docker Compose:编排多容器分布式部署的工具。
-
基于 Compose 文件,快速部署分布式应用。
-
Compose 文件通过指令,定义集群中的每个容器的创建和运行。
(相当于多个
docker run
操作的合集)version: "版本" services: 容器1: 配置 容器2: 配置 ...
示例:部署一个 web 应用,包括 MySQL 和 web 容器。
-
mysql:基于
mysql:5.7.25
镜像构建的容器,挂载了 data 目录 -
web:基于
docker build
临时构建的镜像容器,映射端口 8090version: "3.8" services: mysql: image: mysql:5.7.25 environment: MYSQL_ROOT_PASSWORD: 123 volumes: - "/tmp/mysql/data:/var/lib/mysql" web: build: . ports: - "8090:8090"
2、安装
-
下载:切换到
/usr/local/bin/
目录下curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
-
文件权限:增加可执行权限
chmod +x /usr/local/bin/docker-compose
-
设置:Base 自动补全命令
# 修改hosts文件 echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts # 补全命令 curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
3、部署微服务集群
创建一个文件夹 cloud-demo 用于部署微服务集群。
-
编写文件
-
修改微服务配置
-
将微服务应用打 jar 包,拷贝到 cloud-demo 对应子目录
-
将 cloud-demo 上传到服务器,部署
3.1、文件
3.1.1、compose 文件
包含5个 service 服务
-
nacos
:作为注册中心和配置中心image: nacos/nacos-server
: 基于nacos/nacos-server镜像构建environment
:环境变量MODE: standalone
:单点模式启动
ports
:端口映射,这里暴露了8848端口
-
mysql
:数据库image: mysql:5.7.25
:镜像版本是mysql:5.7.25environment
:环境变量MYSQL_ROOT_PASSWORD: 123
:设置数据库root账户的密码为123
volumes
:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据
-
userservice
、orderservice
、gateway
:都是基于Dockerfile临时构建的version: "3.2" services: nacos: image: nacos/nacos-server environment: MODE: standalone ports: - "8848:8848" mysql: image: mysql:5.7.25 environment: MYSQL_ROOT_PASSWORD: 123 volumes: - "$PWD/mysql/data:/var/lib/mysql" - "$PWD/mysql/conf:/etc/mysql/conf.d/" userservice: build: ./user-service orderservice: build: ./order-service gateway: build: ./gateway ports: - "10010:10010"
3.1.2、Dockerfile 文件
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
3.2、微服务配置
docker 容器之间通过容器名互联,而不是通过 IP 地址。
将 order-service、user-service、gateway 服务的 mysql、nacos 地址都修改为基于容器名的访问。
spring:
datasource:
url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderservice
cloud:
nacos:
server-addr: nacos:8848 # nacos服务地址
3.3、jar 包
打包
微服务应用名称,需要与 Dockerfile 中的 jar 包名称对应。
-
修改
pom.xml
中的打包名称:<build> <!-- 服务打包的最终名称 --> <finalName>app</finalName> <plugins> ... </plugins> </build>
-
打包:Maven clean,Maven package
-
拷贝:每个微服务的 app.jar 放到与服务名称对应的子目录。
3.4、部署
-
将 cloud-demo 文件夹上传到服务器的任意目录。
-
切换到 cloud-demo 文件夹,部署
docker-compose up -d