zoukankan      html  css  js  c++  java
  • 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 就是属于指令

  • 相关阅读:
    BZOJ1217: [HNOI2003]消防局的设立
    BZOJ3925: [Zjoi2015]地震后的幻想乡
    BZOJ2328: [HNOI2011]赛车游戏
    BZOJ1011: [HNOI2008]遥远的行星
    BZOJ2007: [Noi2010]海拔
    BZOJ1833: [ZJOI2010]count 数字计数
    BZOJ1026: [SCOI2009]windy数
    BZOJ1196: [HNOI2006]公路修建问题
    BZOJ1076: [SCOI2008]奖励关
    BZOJ2752: [HAOI2012]高速公路(road)
  • 原文地址:https://www.cnblogs.com/Young-shi/p/15008299.html
Copyright © 2011-2022 走看看