记一下Docker的最后一个 docker-compose,之前省略了几节,比如安装mysql、nginx等都没写,其实直接依赖docker-compose的yml文件就可以实现自动编排了,没必要一个个启动,所以就忽略了。

1、docker-compose的概念:

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

开源代码地址:https://github.com/docker/compose

Compose的定位是定义和运行多个 Docker 容器的应用,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

1.PNG

比较抽象,简言之一个服务就是一个容器,一个项目就多个容器组成。

docker-compose可以实现容器间的快速编排,但是没法做资源调度,所以接下来要去学k8s。(天天听天天听,知道他很火,可以从来没用过)

2、安装docker-compose

在linux上很简单,就下文件到指定目录,加权限就行:

$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose    #下载
$ sudo chmod +x /usr/local/bin/docker-compose     #给权限
$ docker-compose --version                        #测试是否安装成功
$ sudo rm /usr/local/bin/docker-compose           #卸载
3、docker-compose的使用

我们搞开发时肯定不止启动一个web项目,附带还有一堆的中间件。所以需要在一个空文件中建立一个docker-compose.yml文件,这个文件名就是这个容器编排的项目名,然后yml文件中写容器的编排内容。例:

version: "3.2"

services:
  tomcat01: #服务名称
    container_name: tomcat01  #相当于run 的 --name
    image: tomcat:8.0-jre8 #使用哪个镜像  相当于run image
    ports: #用来完成host与容器端口映射关系  相当于run -p
     - "8088:8080"
    volumes: #完成宿主机与容器中目录数据卷共享  相当于run -v
#     - /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
      - tomcatwebapps01:/usr/local/tomcat/webapps
    networks:  #代表当前服务使用哪个网络桥  相当于 run --network
      - hello

  tomcat02: #服务名称
    container_name: tomcat02
    image: tomcat:8.0-jre8 #使用哪个镜像
    ports: #用来完成host与容器端口映射关系
      - "8089:8080"
    volumes: #完成宿主机与容器中目录数据卷共享
      #     - /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
      - tomcatwebapps02:/usr/local/tomcat/webapps
    networks:  #代表当前服务使用哪个网络桥
      - hello

  mysql:
    container_name: mysql
    image: mysql:5.7.32
    ports:
      - "3307:3306"
    volumes:
      - mysqldata:/var/lib/mysql
      - mysqlconf:/etc/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
    networks:
      - hello
  redis:
    container_name: redis
    image: redis:5.0.10
    ports:
      - "6379:6379"
    volumes:
      - redisdata:/data
    command: "redis-server --appendonly yes" # run 镜像之后覆盖容器内默认命令
    networks:
      - hello


volumes:    #声明上面服务所使用的自动创建的卷名
  tomcatwebapps01: #声明指定的卷名   compose自动创建该卷名但是会在之前加入项目名
    external: #使用自定义卷名,指定为true的话,这样必须先docker volume create 卷名
      false    #true确定使用指定卷名
  tomcatwebapps02: #声明指定的卷名   compose自动创建该卷名但是会在之前加入项目名
    external: #使用自定义卷名,指定为true的话,这样必须先docker volume create 卷名
      false    #true确定使用指定卷名
  mysqldata:
  mysqlconf:
  redisdata:

networks:  #定义服务用到桥
  hello:   #定义上面的服务用到的网桥名称 默认创建的就是 bridge
    external: #使用自定义网桥名,指定为true的话,这样必须先docker network create 网桥名
      false  #使用外部指定网桥   #true确定使用指定网桥名 注意:网桥必须存在,就是和volume自定义卷用法一样

其实yml文件service中的指令使用方式都和docker run差不多,比如我上面注释写的"networks: 就相当于docker run --network"。

我很懒就不重新写了,上面yml的内容就是在某项目中,定义docker-compose的版本为3.2,然后使用相同网桥,启动4个容器,2个tomcat容器、1个mysql、1个redis;4个容器分别挂载目录不同,还有端口、依赖镜像、自定义名称,还有environment和command参数分别代表设置环境变量和覆盖容器启动后默认执行的命令。

然后如图就都启动成功了

2.PNG

启动:

docker-compose up    #启动
docker-compose up -d #后台启动

docker-compose模板参考文档:https://vuepress.mirror.docker-practice.com/compose/compose_file/


标题:Docker(5)
作者:jyl
地址:http://jinyunlong.xyz/articles/2021/08/12/1628758037799.html