docker Compose

Docker Compose

之前打造镜像都是用docker build run手动创建镜像并运行容器的.但是没办法批量多个运行.
所以Docker Compose就是用来高效管理容器,定义运行多个容器的.
Compose是Docker 开源项目,需要安装.

Compost编排好后用docker-compose up启动服务

这里compose的概念:

  • 服务 service 就是指容器 应用的概念
  • 项目project 多个服务运行起来组成的就是一个完整的项目

Docker Compose安装

  1. curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    但是官方给的下载很慢 我们下载国内的镜像

curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

  1. 下载完后给文件夹权限sudo chmod +x /usr/local/bin/docker-compose如果docker-compose --version可以跳出版本号,说明安装成功
  2. 按照官网的geting started开始部署配置 https://docs.docker.com/compose/gettingstarted/
  • 先随意找个文件夹比如/home/young下创建一个composetest文件夹
    mkdir composetest
  • 创建一个app.py应用,具体代码看官网
  • 创建一个requirements.txt,导入app.py需要的包
  • 创建一个Dockerfile 具体代码看官网
  • 创建一个docker-compose.yml 具体代码看官网
  • 使用命令启动docker compose docker-compose up
    正常跑起来就是下面2个web和redis的服务应用

Docker Compose yml文件编写语法

  • build
    用来指定dockerfiel打包成对应镜像,然后运行镜像
  • image
  • network
  • port 按推荐的来 - "80:8080"
  • volume
  • container_name
  • depends_on
  • enviroment
  • env_file env_file和enviroment选一个即可,用来代替enviroment,可以避免yml文件暴露敏感信息,把环境变量以key=value形式写到.env后缀的文件中去
  • healthcheck #用来检查这个容器运行是否正常.如果多个应用容器都要检查,则每个容器都要分别加healthcheck,那个localhost 如果是需要检查远程容器则需要填写ip.可以在docker-compose ps中查看健康状态
  • sysctls和ulimits 分别是修改容器的内核参数和进程限制数,不是所有容器都需要用的.知道语法和意义即可

练习截图和代码如下.

version: "3.2"
#自己下载了tomcat 9.0.37,然后把webapp.dist里的文件复制到了webapp,自己commit了一个镜像mytom:1.0
#docker-compose.yml路径为 /home/young/ ,这里的young会被视作项目名称
services:
    tomcat01: # 自定义服务名
        container_name: mytom01 #自定义容器名字
        image: mytom:1.0
        ports: #等于docker -p 参数,但是映射关系建议用"端口1:端口2"这种字符串形式书写
            - "8000:8080"
        volumes:
            #- /home/young/tomcat_data:/usr/local/tomcat/webapps #使用绝对路径映射自定义
            - myvolumes:/usr/local/tomcat/webapps
        networks:
            - mynet
        depends_on: #容器启动编排,会先启动denpend_on里面的应用作为依赖.
            - myredis
            - mysql01
        healthcheck:
            test: ["CMD","curl","-f","http://localhost"]
            interval: 1m30s
            timeout: 10s
            retries: 3

    mysql01: # 自定义服务名
        container_name: sql01 #自定义容器名字
        image: mysql:5.7
        ports: #等于docker -p 参数,但是映射关系建议用"端口1:端口2"这种字符串形式书写
            - "8001:3306"
        volumes:
            #- /home/young/mysql:/var/lib/mysql #使用绝对路径映射自定义
            - mysqlconf:/etc/mysql
        networks:
            - mynet
        environment: #2中写法 - key=value 或者key: value
            - MYSQL_ROOT_PASSWORD=root
        env_file: # 用来代替enviroment,可以避免yml文件暴露敏感信息,把环境变量以key=value形式写到.env后缀的文件中去
                    # env_file和enviroment选一个即可
            - ./mysql.env


    myredis:
        container_name: redis01
        image: redis:5.0.10
        ports:
            - "8002:6379"
        volumes:
            - redisdata:/data
        networks:
            - mynet
        command: "redis-server --appendonly yes" #run 镜像后用来覆盖容器内容默认命令

volumes:
    myvolumes:
        external: #使用自定义卷名,填布尔值
            false #如果为假,卷名自动创建,创建规则为项目名+卷名,比如young_myvolumes
            #如果为真,就使用外部自定义卷名,首先要自己先创建一个volume(docker volume create myvolumes),才能运行
    mysqlconf: #默认external为假,自动创建
    redisdata:

networks:
    mynet:
        external:
            true #如果为假,网络名自动创建,创建规则为项目名+卷名,比如young_mynet
            #如果为真,就使用外部自定义的网络名,首先要自己先创建一个volume(docker volume create mynet),才能运行

build是在docker里是根据dockerfile去创建镜像,但是用在compose.yml里是构建镜像并且运行.

version: "3.2"
services:
  mycentos:
    build: #启动服务时先在build指定dockerfile打包成镜像
      context:  demo #指定上下文目录dockerfile所在的目录,例子中就是在同个路径下,也可以写绝对路径 /home/young,这里因为do_file和docker-compose.yml在同一目录中,可以不写
      dockerfile: do_file # 定义dockerfile的名字
    container_name: mycentos01
    networks:
      - mynet
    command: "-it /bin/bash"
#    depends_on:
#      - tomcat01  这里下面没写tomcat01服务,所以注释
networks:
  mynet:
    external: true

docker-compose 指令

模板指令 用来书写在docker -compose.yml文件中的, 称为模板指令,用来为服务而服务的.
指令 用来对整个docker-compose.yml对应的这个项目操作, 是写在docker-compose.yml命令之后来命令的
比如 docker-compose up 这个up 就是属于指令

原文地址:https://www.cnblogs.com/Young-shi/p/15008299.html