美文网首页Docker容器Awesome Docker
docker入门(三)docker-compose

docker入门(三)docker-compose

作者: 胡木木OvO | 来源:发表于2019-05-21 16:36 被阅读1次

    什么是docker-compose

    docker-compose 是一个用户定义和运行多个容器的 Docker 应用程序。在 Compose 中你可以使用 YAML 文件来配置你的应用服务。然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务。

    使用流程

    • 在 Dockfile 中定义你的应用环境,使其可以在任何地方复制。
    • 在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
    • 最后,运行dcoker-compose up,Compose 将启动并运行整个应用程序。

    案例

    准备工作

    创建几个文件

       project-directory
              +data #数据库存放文件
              +docker-compose.yml #compose文件
              +ghost #ghost博客
                  +config.js #ghost配置文件
                  +Dockerfile #ghost容器配置文件
              +nginx
                  +Dockerfile #nginx容器配置文件
                  +nginx.conf #nginx服务配置文件
    

    编辑配置文件

    ghost-config.js

    var path = require('path'),
    config;
    config = {
      production:{
        url: 'http://mytestblog.com',
        mail: {},
        database:{
            client: 'mysql',
            connection: {
               host: 'db',
               user: 'ghost',
               password: 'ghost',
               database: 'ghost',
               port: '3306',
               charset: 'utf8'
            },
            debug: false
         },
        paths {
            contentPath: path.join(process.env.GHOST_CONTENT,'/')
        },
     
        server:{
          host: '0.0.0.0',
          port: '2368'
        }
      }
    };
    

    ghost-Dockerfile

    FROM ghost
    COPY ./config.js /var/lib/ghost/config.js
    EXPOSE 2368
    CMD ["npm","start","--production"]
    

    nginx-Dockerfile

    FROM nginx
    COPY nginx.conf /etc/nginx/nginx.conf
    EXPOSE 80
    

    nginx-nginx.conf

    worker_processes 4;
    events {worker_connections 1024;}
    http {
      server {
        listen 80;
        location / {
           proxy_pass http://ghost-app:2368;
      }
     }
    

    docker-compose.yml

    version: '2' #版本声明
    networks: #网络声明
       ghost: #网络名称
    services: #服务声明
       ghost-app: #服务名称
         build: ghost # 来源路径用来指定一个包含Dockerfile文件的路径。一般是当前目录.
         networks: #网络声明
           - ghost #网络名称
         depends_on: #指定服务依赖
           - db #指定服务依赖
         ports: #用于暴露端口
           - "2368:2368" 
     
       nginx:
         build: nginx
         networks:
           - ghost
         depends_on:
           - ghost-app
         ports:
           - "80:80"
     
       db:
         image: "mysql:5.7.15" #指定镜像tag或者ID
         networks:
           - ghost
         environment: #添加环境变量
           MYSQL_ROOT_PASSWORD: mysqlroot
           MYSQL_USER: ghost
           MYSQL_PASSWORD: ghost
         volumes: #挂载数据卷
           - $PWD/data:/var/lib/mysql
         ports:
           - "3306:3306"
    

    运行案例

    docker-compose up -d

    docker-compose.yml配置详解

    每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。

    image

    指定镜像tag或者ID。示例:

    image: ubuntu:14.04
    image: tutum/influxdb
    image: example-registry.com:4000/postgresql
    image: a4bc65fd
    

    ps:在version 1里同时使用image和build是不允许的,version 2则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签

    build

    用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像。
    ps:在version 1里bulid仅支持值为字符串。version 2里支持对象格式。

    build: ./dir
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
    
    • context:路径
    • dockerfile:需要替换默认docker-compose的文件名
    • args:为构建(build)过程中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用。

    command

    用来覆盖缺省命令。示例:
    command: bundle exec thin -p 3000
    也支持数组形式:
    command: [bundle, exec, thin, -p, 3000]

    env_file

    从文件中获取环境变量,可以为单独的文件路径或列表。
    如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。
    如果有变量名称与 environment 指令冲突,则以后者为准。

    env_file: .env
    env_file:
     - ./common.env
     - ./apps/web.env
     - /opt/secrets.env
    

    环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

    # common.env: Set Rails/Rack environment
    RACK_ENV=development
    

    links

    用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run --link。示例:

    links:
     - db
     - db:mysql
     - redis
    

    ports

    用于暴露端口。同docker run -p。示例:

    ports:
     - "3000"
     - "8000:8000"
     - "49100:22"
     - "127.0.0.1:8001:8001"
    

    ps:冒号前面是主机上的端口,冒号后面是容器内部的端口。

    expose

    expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose。

    expose:
     - "3000"
     - "8000"
    

    volumes

    挂载数据卷。同docker run -v。示例:

    volumes:
     - /var/lib/mysql
     - cache/:/tmp/cache
     - ~/configs:/etc/configs/:ro
    

    volumes_from

    挂载数据卷容器,挂载是容器。同docker run --volumes-from。示例:

    volumes_from:
     - service_name
     - service_name:ro
     - container:container_name
     - container:container_name:rw
    

    ps:container:container_name格式仅支持version 2

    environment

    添加环境变量。同docker run -e。可以是数组或者字典格式:

    environment:
      RACK_ENV: development
      SESSION_SECRET:
    
    environment:
      - RACK_ENV=development
      - SESSION_SECRET
    

    depends_on

    用于指定服务依赖,一般是mysql、redis等。
    指定了依赖,将会优先于服务创建并启动依赖。
    links也可以指定依赖。

    external_links

    链接搭配docker-compose.yml文件或者Compose之外定义的服务,通常是提供共享或公共服务。格式与links相似:

    external_links:
     - redis_1
     - project_db_1:mysql
     - project_db_1:postgresql
    

    ps:external_links链接的服务与当前服务必须是同一个网络环境。

    extra_hosts

    添加主机名映射。

    extra_hosts:
     - "somehost:162.242.195.82"
     - "otherhost:50.31.209.229"
    

    将会在/etc/hosts创建记录:

    162.242.195.82  somehost
    50.31.209.229   otherhost
    

    extends

    继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。

    extends:
      file: common.yml
      service: webapp
    

    service必须有,file可选。service是需要继承的服务,例如web、database。

    net

    设置网络模式。同docker的--net参数。

    net: "bridge"
    net: "none"
    net: "container:[name or id]"
    net: "host"
    

    dns

    自定义dns服务器。

    dns: 8.8.8.8
    dns:
      - 8.8.8.8
      - 9.9.9.9
    

    相关文章

      网友评论

        本文标题:docker入门(三)docker-compose

        本文链接:https://www.haomeiwen.com/subject/sgsjzqtx.html