Docker-Compose
docker-compose是基于docker的编排工具,使容器的操作能够批量的,可视的执行,是一个管理多个容器的工具
为什么使用dockers?
比如部署一套用户微服务user-service,我们需要用到mysql、redis、nginx,注册中心nacos等等,这些相互配合才能保证服务的正常运行
如果我们不使用docker-compose,就需要使用一条条docker 命令去buil,run,那有10个服务,就要重复执行10多次,并且,mysql这些中间件,是需要先启动,才能保证部署的user-service能正常运行
所以,我们可以定义一个docker-compose.yml模板文件,来定义一组相关联的应用为一个项目,然后使用一条指安装这些应用的所有依赖来完成构建。
docker-compose就解决了容器与容器之间如何管理编排的问题
安装Docker-Compose
- 官网:https://docs.docker.com/compose/compose-file/compose-file-v3/
- GitHub:https://github.com/docker/compose/releases/
- 下载最新版docker-compose
[root@cdh5 ~]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 添加可执行权限
[root@cdh5 ~]# chmod +x /usr/local/bin/docker-compose
- 测试安装结果
[root@cdh5 ~]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c
Compose 核心概念
Docker-Compose有两个核心概念
- 服务(service):一个应用容器,即 docker 容器,比如之前所说的mysql 容器、nginx 容器
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,比如上面所讲的由 mysql、redis、nginx 容器组成的网站,docker-compose 面向项目进行管理。
Compose 和Docker 兼容性
Docker Engine 与docker-compose version 之间的有以下关系
compose文件格式版本 | docker版本 |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3 | 1.13.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2 | 1.10.0+ |
1 | 1.9.1.+ |
Compose基本使用
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
- 执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
Compose编排微服务
- user-service微服务
- 修改yml
server:
port: 8801
spring:
datasource:
#未使用compose
#url: jdbc:mysql://192.168.4.15:3306/dwyys?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://mysql:3306/dwyys?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
initial-size: 3
min-idle: 3
max-active: 10
max-wait: 60000
keep-alive: true
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x' FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
redis:
database: 0
#未使用compose
#host: 192.168.4.15
host: redis
port: 6379
timeout: 3s
password:
- maven package编译,打包,上传至服务器
/opt/docker
目录下 - 在
/opt/docker
下编写Dockerfile
#基础镜像使用java
FROM java:8
#作者
MAINTAINER dwyys
#VOLUME 指定临时文件目录为tmp,在主机/varlibldocker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
#将jar包添加到容器中并更名为user-service_docker.jar
ADD user-service-1.0.0.jar user-service_docker.jar
#运行jar包
RUN bash -c 'touch /user-service_docker.jar'
ENTRYPOINT ["java","-jar","/user-service_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 8801
- 编写docker-compose.yml
version: "3"
services:
microService:
image: user-service_docker:1.0
container_name: user-service
ports:
- "8801:8801"
volumes:
- /app/microService:/data
networks:
- dwyys_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "16379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- dwyys_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'dwyys'
# MYSQL_USER: 'root'
# MYSQL_PASSWORD: '123456'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- dwyys_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
dwyys_net:
- 构建镜像
[root@cdh5 docker]# docker build -t user-service_docker:1.0.0 .
[+] Building 224.6s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 566B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/java:8 16.6s
=> [internal] load build context 0.3s
=> => transferring context: 34.79MB 0.3s
=> [1/3] FROM docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d 206.9s
=> => resolve docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d 0.0s
=> => sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d 2.00kB / 2.00kB 0.0s
=> => sha256:76610ec20bf5892e24cebd4153c7668284aa1d1151b7c3b0c7d50c579aa5ce75 42.50MB / 42.50MB 59.0s
=> => sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8 4.73kB / 4.73kB 0.0s
=> => sha256:5040bd2983909aa8896b9932438c3f1479d25ae837a5f6220242a264d0221f2d 51.36MB / 51.36MB 68.4s
=> => sha256:fce5728aad85a763fe3c419db16885eb6f7a670a42824ea618414b8fb309ccde 18.54MB / 18.54MB 23.9s
=> => sha256:60170fec2151d2108ed1420625c51138434ba4e0223d3023353d3f32ffe3cfc2 593.15kB / 593.15kB 25.9s
=> => sha256:e98f73de8f0d2ef292f58b004d67bc6e9ee779dcfaff7ebb3964649d4787b872 214B / 214B 26.2s
=> => sha256:11f7af24ed9cf47597dd6cf9963bb3e9109c963f0135e869a9e9b4999fdc12a3 242B / 242B 26.5s
=> => sha256:49e2d6393f32abb1de7c9395c04c822ceb2287383d5a90998f7bd8dbfd43d48c 130.10MB / 130.10MB 201.1s
=> => sha256:bb9cdec9c7f337940f7d872274353b66e118412cbfd433c711361bcf7922aea4 289.05kB / 289.05kB 59.6s
=> => extracting sha256:5040bd2983909aa8896b9932438c3f1479d25ae837a5f6220242a264d0221f2d 2.4s
=> => extracting sha256:fce5728aad85a763fe3c419db16885eb6f7a670a42824ea618414b8fb309ccde 0.6s
=> => extracting sha256:76610ec20bf5892e24cebd4153c7668284aa1d1151b7c3b0c7d50c579aa5ce75 2.2s
=> => extracting sha256:60170fec2151d2108ed1420625c51138434ba4e0223d3023353d3f32ffe3cfc2 0.1s
=> => extracting sha256:e98f73de8f0d2ef292f58b004d67bc6e9ee779dcfaff7ebb3964649d4787b872 0.0s
=> => extracting sha256:11f7af24ed9cf47597dd6cf9963bb3e9109c963f0135e869a9e9b4999fdc12a3 0.0s
=> => extracting sha256:49e2d6393f32abb1de7c9395c04c822ceb2287383d5a90998f7bd8dbfd43d48c 5.4s
=> => extracting sha256:bb9cdec9c7f337940f7d872274353b66e118412cbfd433c711361bcf7922aea4 0.1s
=> [2/3] ADD user-service-1.0.0.jar user-service_docker.jar 0.6s
=> [3/3] RUN bash -c 'touch /user-service_docker.jarr' 0.3s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:3488a8ad429dc47d5a83a7b8bf2f7129ef945ab0c29abb2536dc756dc5a82c6b 0.0s
=> => naming to docker.io/library/user-service_docker:1.0.0 0.0s
[root@cdh5 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
user-service_docker 1.0.0 3488a8ad429d 30 seconds ago 678MB
- 执行docker-compose up
[root@cdh5 docker]# docker-compose up -d
Starting docker_redis_1 ... done
Starting docker_mysql_1 ... done
Starting user-service ... done