Docker容器Awesome Docker

docker入门(三)docker-compose

2019-05-21  本文已影响1人  胡木木OvO

什么是docker-compose

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

使用流程

案例

准备工作

创建几个文件

   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

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
上一篇 下一篇

猜你喜欢

热点阅读