Docker-Compose 是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件 docker-compose.yml,配置好多个容器之间的调用关系,然后只需要一个命令就能同时启动/关闭这些容器。
Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。
Compose允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
核心概念:
●服务(service):一个个应用容器实例
●工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义
Compose使用的三个步骤:
两种最新的docker安装方式
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
若是github访问太慢,可以用daocloud下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- $ docker-compose --version
-
- docker-compose version 1.25.1, build a82fef07
sudo pip install docker-compose
docker-compose up
创建并启动所有服务的容器。指定多个yml
加-f
选项。以守护进程模式运行加-d
选项。
- # 前台启动
- docker-compose up
- # 后台启动
- docker-compose up -d
- # -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml
- docker-compose -f docker-compose.yml up -d
docker-compose logs
查看服务容器的输出日志。默认情况下,docker-compose
将对不同的服务输出使用不同的颜色来区分。可以通过--no-color
来关闭颜色。
- # 输出日志,不同的服务输出使用不同的颜色来区分
- docker-compose logs
- # 跟踪日志输出
- docker-compose logs -f
- # 关闭颜色
- docker-compose logs --no-color
docker-compose ps
列出工程中所有服务的容器。
- # 列出工程中所有服务的容器
- docker-compose ps
- # 列出工程中指定服务的容器
- docker-compose ps nginx
docker-compose run
在指定服务容器上执行一个命令。
- # 在工程中指定服务的容器上执行 echo "helloworld"
- docker-compose run nginx echo "helloworld"
docker-compose exec
进入服务容器。
- # 进入工程中指定服务的容器
- docker-compose exec nginx bash
- # 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
- docker-compose exec --index=1 nginx bash
docker-compose pause
暂停服务容器
- # 暂停工程中所有服务的容器
- docker-compose pause
- # 暂停工程中指定服务的容器
- docker-compose pause nginx
docker-compose unpause
恢复服务容器。
- # 恢复工程中所有服务的容器
- docker-compose unpause
- # 恢复工程中指定服务的容器
- docker-compose unpause nginx
docker-compose restart
重启服务容器。
- # 重启工程中所有服务的容器
- docker-compose restart
- # 重启工程中指定服务的容器
- docker-compose restart nginx
docker-compose start
启动服务容器。
- # 启动工程中所有服务的容器
- docker-compose start
- # 启动工程中指定服务的容器
- docker-compose start nginx
docker-compose kill
通过发送SIGKILL
信号停止指定服务的容器。
- # 通过发送 SIGKILL 信号停止工程中指定服务的容器
- docker-compose kill nginx
docker-compose rm 删除服务(停止状态)容器。
- # 删除所有(停止状态)服务的容器
- docker-compose rm
- # 先停止所有服务的容器,再删除所有服务的容器
- docker-compose rm -s
- # 不询问是否删除,直接删除
- docker-compose rm -f
- # 删除服务容器挂载的数据卷
- docker-compose rm -v
- # 删除工程中指定服务的容器
- docker-compose rm -sv nginx
停止并删除所有服务的容器、网络、镜像、数据卷。
- # 停止并删除工程中所有服务的容器、网络
- docker-compose stop
- # 停止并删除工程中所有服务的容器、网络、镜像
- docker-compose down --rmi all
- # 停止并删除工程中所有服务的容器、网络、数据卷
- docker-compose down -v
docker-compose port
打印指定服务容器的某个端口所映射的宿主机端口。
docker-compose port nginx 80
docker-compose top
显示正在运行的进程。
- # 显示工程中所有服务的容器正在运行的进程
- docker-compose top
- # 显示工程中指定服务的容器正在运行的进程
- docker-compose top nginx
services
,这些服务可以在一个隔离的环境中一起运行,并能相互通信将 web 容器和 redis 容器组织编排起来,使用 docker-compose.yml
进行定义:
这里一定要注意每个服务 build
字段的配置,一定要设置为该服务 Dockerfile 文件所在的文件路径。当前所有文件都准备好了
- version: '3'
- services:
- redis:
- build: ./redis/
- restart: always
- demoapp:
- build: ./app/
- depends_on:
- - redis
- ports:
- - "8080:8080"
- restart: always
- version: "3"
- services:
- dockerlearn-one:
- # docker运行的容器名称
- container_name: dockerlearn-one
- # 指定当前 build 时的 dockerFile的路径("."代表当前路径)
- build: ./dockerlearn
- # 运行 docker 容器的映射端口
- ports:
- - "8088:8088"
- # build 后镜像名称和版本号
- image: dockerlearn-one:1.0.0
- # 在容器退出时总是重启容器
- restart: always
- volumes:
- - /volumesdata/dockerlearn:/dockerlearn
-
-
- dockerlearn-two:
- # docker运行的容器名称
- container_name: dockerlearn-two
- # 指定当前 build 时的 dockerFile的路径("."代表当前路径)
- build: ./dockerlearn-two
- # 运行 docker 容器的映射端口
- ports:
- - "8099:8099"
- # build 后镜像名称和版本号
- image: dockerlearn:1.0.0
- # 在容器退出时总是重启容器
- restart: always
- volumes:
- - /volumesdata/dockerlearn-two:/dockerlearn-two
- version: '3'
- services:
- # 指定服务名称
- db:
- # 指定服务使用的镜像
- image: mysql:5.7
- # 指定容器名称
- container_name: mysql
- # 指定服务运行的端口
- ports:
- - 3306:3306
- # 指定容器中需要挂载的文件
- volumes:
- - /mydata/mysql/log:/var/log/mysql
- - /mydata/mysql/data:/var/lib/mysql
- - /mydata/mysql/conf:/etc/mysql
- # 指定容器的环境变量
- environment:
- - MYSQL_ROOT_PASSWORD=root
- # 指定服务名称
- mall-tiny-docker-compose:
- # 指定服务使用的镜像
- image: mall-tiny/mall-tiny-docker-compose:0.0.1-SNAPSHOT
- # 指定容器名称
- container_name: mall-tiny-docker-compose
- # 指定服务运行的端口
- ports:
- - 8080:8080
- # 指定容器中需要挂载的文件
- volumes:
- - /etc/localtime:/etc/localtime
- - /mydata/app/mall-tiny-docker-compose/logs:/var/logs
- # docker-compose文件版本号
- version: "3"
-
- # 配置各个容器服务
- services:
- microService:
- image: springboot_docker:1.0
- container_name: ms01 # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名
- ports:
- - "6001:6001"
- volumes:
- - /app/microService:/data
- networks:
- - springboot_network
- depends_on: # 配置该容器服务所依赖的容器服务
- - redis
- - mysql
-
- redis:
- image: redis:6.0.8
- ports:
- - "6379:6379"
- volumes:
- - /app/redis/redis.conf:/etc/redis/redis.conf
- - /app/redis/data:data
- networks:
- - springboot_network
- command: redis-server /etc/redis/redis.conf
-
- mysql:
- image: mysql:5.7
- environment:
- MYSQL_ROOT_PASSWORD: '123456'
- MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
- MYSQL_DATABASE: 'db_springboot'
- MYSQL_USER: 'springboot'
- MYSQL_PASSWORD: 'springboot'
- ports:
- - "3306:3306"
- volumes:
- - /app/mysql/db:/var/lib/mysql
- - /app/mysql/conf/my.cnf:/etc/my.cnf
- - /app/mysql/init:/docker-entrypoint-initdb.d
- networks:
- - springboot_network
- command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问
-
- networks:
- # 创建 springboot_network 网桥网络
- springboot_network:
restart=always参数能够使我们在重启docker时,自动启动相关容器。
docker compose up -d
- # 进行语法检查
- docker-compose config -q
depends_on
设置依赖关系。
- version: "3.7"
- services:
- web:
- build: .
- depends_on:
- - db
- - redis
- redis:
- image: redis
- db:
- image: postgres
注意:web 服务不会等待 redis db 完全启动 之后才启动。
每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。
指定为镜像名称或镜像ID。
如果镜像不存在,Compose将尝试从互联网拉取这个镜像
指定服务的镜像名,若本地不存在,则 Compose 会去仓库拉取这个镜像:
指定镜像tag或者ID。示例:
- image: redis
- image: ubuntu:14.04
- image: tutum/influxdb
- image: example-registry.com:4000/postgresql
- image: a4bc65fd
ps:在version 1
里同时使用image和build是不允许的,version 2
则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签
用来指定一个包含Dockerfile
文件的路径。一般是当前目录.
。Fig将build并生成一个随机命名的镜像。
ps:在version 1
里bulid仅支持值为字符串。version 2
里支持对象格式。
- build: ./dir
-
- build:
- context: ./dir
- dockerfile: Dockerfile-alternate
- args:
- buildno: 1
用来覆盖缺省命令。示例:
command: bundle exec thin -p 3000
也支持数组形式:
command: [bundle, exec, thin, -p, 3000]
从文件中获取环境变量,可以为单独的文件路径或列表。 如果通过 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
用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run --link
。示例:
- links:
- - db
- - db:mysql
- - redis
用于暴露端口。同docker run -p
。示例:
- ports:
- - "3000"
- - "8000:8000"
- - "49100:22"
- - "127.0.0.1:8001:8001"
ps:冒号前面是主机上的端口,冒号后面是容器内部的端口。
expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose
。
- expose:
- - "3000"
- - "8000"
挂载数据卷。同docker run -v
。示例:
- volumes:
- - /var/lib/mysql
- - cache/:/tmp/cache
- - ~/configs:/etc/configs/:ro
挂载数据卷容器,挂载是容器。同docker run --volumes-from
。示例:
- volumes_from:
- - service_name
- - service_name:ro
- - container:container_name
- - container:container_name:rw
ps:container:container_name
格式仅支持version 2
。
添加环境变量。同docker run -e
。可以是数组或者字典格式:
- environment:
- RACK_ENV: development
- SESSION_SECRET:
-
- environment:
- - RACK_ENV=development
- - SESSION_SECRET
用于指定服务依赖,一般是mysql、redis等。 指定了依赖,将会优先于服务创建并启动依赖。
links
也可以指定依赖。
链接搭配docker-compose.yml
文件或者Compose
之外定义的服务,通常是提供共享或公共服务。格式与links相似:
- external_links:
- - redis_1
- - project_db_1:mysql
- - project_db_1:postgresql
ps:external_links
链接的服务与当前服务必须是同一个网络环境。
添加主机名映射。
- extra_hosts:
- - "somehost:162.242.195.82"
- - "otherhost:50.31.209.229"
将会在/etc/hosts创建记录:
- 162.242.195.82 somehost
- 50.31.209.229 otherhost
继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。
- extends:
- file: common.yml
- service: webapp
service
必须有,file
可选。service是需要继承的服务,例如web、database。
设置网络模式。同docker的--net参数。
- net: "bridge"
- net: "none"
- net: "container:[name or id]"
- net: "host"
自定义dns服务器。
- dns: 8.8.8.8
- dns:
- - 8.8.8.8
- - 9.9.9.9