1. 是什么

docker-comppse是docker官方的开源项目,负责实现对docker容器集群的快速编排。

Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器

docker容器 字符集 docker容器编排_docker容器 字符集

2. 安装

# 安装
[root@yhx ~]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   664  100   664    0     0    898      0 --:--:-- --:--:-- --:--:--   898
100 12.1M  100 12.1M    0     0  11279      0  0:18:49  0:18:49 --:--:-- 18567
# 设置权限
[root@yhx ~]# chmod +x /usr/local/bin/docker-compose
[root@yhx ~]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c
[root@yhx ~]#

3. compose核心概念

一文件、两要素

3.1 一文件:

docker-compose文件

3.2 两要素

  1. 服务:一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
  2. 工程:由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义

4. compose使用的三个步骤

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  2. 使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务
  3. 最后,执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线

docker容器 字符集 docker容器编排_java_02

5. 常用命令

docker容器 字符集 docker容器编排_docker容器 字符集_03

6. 实战

这里以我的项目使用为例:

6.1 编写Dockerfile

FROM openjdk:8u212-jre
COPY crea-suytest-1.0.0.jar /home/project/crea-suytest-1.0.0.jar
#设置系统编码
ENV LANG C.UTF-8
ENTRYPOINT ["java", "-Xmx256m", "-jar", "/home/project/crea-suytest-1.0.0.jar"]

6.2 build镜像

这里我是用的maven的docker插件,在pom文件中配置:

<docker.baseImage>openjdk:8u212-jre</docker.baseImage>
<docker.volumes>/tmp</docker.volumes>
<docker.image.prefix>crea_cloud</docker.image.prefix>
<docker.host>http://192.168.0.61:2375</docker.host>
<docker.java.security.egd>-Djava.security.egd=file:/dev/./urandom</docker.java.security.egd>
<docker.java.opts>-Xms128m -Xmx128m</docker.java.opts>

<!--docker 插件-->
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>${docker-maven-plugin.version}</version>
    <configuration>
        <!--指定远程 docker api地址-->
        <dockerHost>${docker.host}</dockerHost>

        <!--指定生成的镜像名-->
        <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
        <!--指定标签-->
        <imageTags>
            <imageTag>latest</imageTag>
        </imageTags>
        <!-- 表示项目根目录,即包含pom.xml文件的目录-->
        <!-- 指定 Dockerfile 路径  ${project.basedir}:项目根路径下-->
        <dockerDirectory>${pom.basedir}</dockerDirectory>
<!--                        <dockerCertPath>C:\ca-card\docker-ca-zwy</dockerCertPath>-->
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

docker容器 字符集 docker容器编排_docker容器 字符集_04

6.3 编写docker-compose文件

解析第一个服务的编写,等同于我们单独启动的命令:

docker run -d -p 9700:9700 -v /home/common-business/crea-suytest-project/logs:/log 
--network host --name crea-suytest crea_cloud/crea-suytest:latest
# docker-compose 版本,现在我们基本上都用3
version: '3'

services: #本工程的服务配置列表
  crea-suytest: #spring boot的服务名,服务名自定义
    image: crea_cloud/crea-suytest:latest #指定基于crea_cloud/integrity-admin:latest镜像为基础镜像来构建镜像
    # build:         #基于Dockerfile文件构建镜像时使用的属性
	# context: .     #代表当前目录,也可以指定绝对路径[/path/test/Dockerfile]或相对路径[../test/Dockerfile],尽量放在当前目录,便于管理
	# dockerfile: Dockerfile    #指定Dockerfile文件名。如果context指定了文件名,这里就不用本属性了
    container_name: crea-suytest  #spring boot服务启动后实例的名称
    volumes: 	#挂载属性
      - "/home/common-business/crea-suytest-project/logs:/log"
    
    # command: # 容器启动后默认执行的命令 主要目的是在执行容器时提供默认值。这些将在入口点之后被附加到入口的参数。
      # - "--crea-monitor-admin=192.168.0.61"
      #- "--crea-gateway=192.168.0.61"
      #-  "--nacos.url=192.168.0.61:8001"
      #- "--mysql.url=192.168.0.63"
      #- "--redis.url=192.168.0.63"
      #- "--redis.password=qwer123!@#."
      #- "--mysql.username=db_manager"
      #- "--mysql.password=db_manager_crea"
      #- "--mysql.port=3306"
      #- "--fastdfs.url=192.168.0.243"
      #- "--rabbitmq.url=192.168.0.63"
      #- "--storage.url=192.168.0.243"
      #- "--server.url=192.168.0.61"
      #- "--seata.url=192.168.0.61"
    environment:#设置容器的环境变量
      - "TZ=Asia/Shanghai" #这里设置容器的时区为亚洲上海 解决了容器的时区问题
      - "encryption=false"
    env_file: #这个文件可以设置 Compose 的变量,在 docker-compose.yml 中可以定义一个专门存放变量的文件 运行容器时,Compose 文件中定义的环境变量优先
      - suytest.env
	#类似于CMD指令的功能,用于为容器指定默认的运行程序,从而使得容器像是一个单独的可执行文件
    entrypoint: java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/heap-dunp/crea-suytest.hprof -XX:-OmitStackTraceInFastThrow -jar /home/project/crea-suytest-1.0.0.jar
    ports:#映射端口属性
      - 9700:9700 #建议使用字符串格式,指定宿主机端口映射到本容器的端口
    restart: on-failure #是否随docker服务启动重启 
    network_mode: "host" #设置网络模式 默认 bridge ,host 主机模式 
    # depends_on: # 取决于下面的镜像,也就是先启动下一个镜像,再启动这个镜像
  	#  - crea-suytest-mobile
  crea-suytest-mobile: # 第二个微服务
    image: crea_cloud/crea-suytest-mobile:latest
    container_name: crea-suytest-mobile
    volumes:
      - "/home/common-business/crea-suytest-project/logs:/log"
    environment:
      - "TZ=Asia/Shanghai"
      - "encryption=false"
    env_file:
      - suytest.env
    entrypoint: java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/heap-dunp/crea-suytest-mobile.hprof -XX:-OmitStackTraceInFastThrow -jar /home/project/crea-suytest-mobile-1.0.0.jar
    ports:
      - 9701:9701
    restart: on-failure
    network_mode: "host"
  crea-lottery: # 第三个微服务
    image: crea_cloud/crea-lottery:latest
    container_name: crea-lottery
    volumes:
      - "/home/common-business/crea-suytest-project/logs:/log"
    environment:
      - "TZ=Asia/Shanghai"
      - "encryption=false"
    env_file:
      - suytest.env
    entrypoint: java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/heap-dunp/crea-lottery.hprof -XX:-OmitStackTraceInFastThrow -jar /home/project/crea-lottery-1.0.0.jar
    ports:
      - 9702:9702
    restart: on-failure
    network_mode: "host"

其中的suytest.env文件是相关连接配置:

[root@localhost crea-suytest-project]# cat suytest.env 
crea-monitor-admin=192.168.0.61
crea-gateway=192.168.0.61
nacos.url=192.168.0.61:8001
mysql.url=192.168.0.63
redis.url=192.168.0.63
redis.password=123
mysql.username=123
mysql.password=123
mysql.port=3306
fastdfs.url=192.168.0.243
rabbitmq.url=192.168.0.63
storage.url=192.168.0.243