docker系列五docker-compose编排服务

什么是docker-compose

之前我们都是直接一条docker 命令行启动一个容器当做服务,这在我们应用或者中间件服务比较少的
情况下,就几条命令行,还是比较方便简单的。然而,在现实使用的时候我们往往服务是蛮多的,所以这
时候就需要docker-compose上场了。docker-compose是一个用户定义和运行多个容器的docker应用程序。
只需要一个简单的命令,就可以进行根据配置文件进行创建并启动你配置的所有服务。

使用流程

  1. 在docker-compose.yaml中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行
  2. 运行docker-compose up -d 就可以启动并运行所有服务

yaml配置详解

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '2' #版本生命
networks: #网络声明
ghost: #网络名称
services: #服务声明
db: #服务名称
container_name: 'mysql'
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"
app:
image: nginx
networks:
- ghost
depends_on: #指定服务依赖
- db #依赖的服务名
ports: #暴露端口
- 80:80 #宿机端口:容器内端口

运行

1
docker-compose up -d

container_name

给服务的容器的别名

1
container_name: 'mysql'

服务指定镜像

每个docker-compose.yaml 必须定义image或者build中的一个,也就是需要定义一个服务并指定镜像,其他的都是可选的。

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

image

指定镜像tag或者id

1
2
3
4
image: ubuntu:14.04
image: someone/influxdb
image: registry-url/namespace/image-name
image: adcwe1342dw

build

用来指定包含dockerfile文件的路径,一般是当前目录,然后会进行build并tag一个随机命名的镜像。

ps: 在version 1里build仅支持值为字符串,version 2 里面支持对象格式

1
2
3
4
5
6
build: ./dir
build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1

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

command

用来覆盖缺省命令,有两种形式

1
2
command: echo 'hello world'
command: [echo, 'hello world']

environment

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

1
2
3
4
5
6
7
environment:
MYSQL_PWD: 123456
MYSQL_USER_NAME: aitensor

environment:
- MYSQL_PWD=123456
- MYSQL_USER_NAME=aitensor

env_file

除了上面的直接在配置文件里面进行配置环境变量外,我们在环境变量比较多的情况下还可以从文件中获取
环境变量。如果通过docker-compose -f FILE 指定了模板文件,那么env_file中路径会基于模板文件路径,
如果环境变量文件中的变量名称跟上面的environment指令冲突了,那么以environment为准。

1
2
3
4
5
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

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

1
2
#mysql 数据库密码
MYSQL_PWD=123456

用于链接到另一个容器服务,如果需要使用到另一个容器的mysql服务。可以给出服务名和别名,也
可以仅仅给出服务名,这样别名将和服务名相同.该作用同docker run –link

1
2
3
4
links:
- db
- db:mysql
- redis

depends_on

用于指定服务依赖,指定了依赖,将优先于服务创建并启动依赖,links也可以指定依赖

1
2
3
depends_on:
- db
- redis

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

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

1
2
3
4
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql

ports

用于暴露端口。作用同docker run -p

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

1
2
3
4
5
ports:
- 3000
- 8000:8000
- 49100:22
- 127.0.0.1:8001:8001

expose

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

1
2
3
expose:
- 3000
- 8001

volumes

挂载数据卷,同docker run -v

1
2
3
4
volumes:
- /var/lib/mysq
- cache/:/tmp/cache
- ~/config:/etc/configs/:ro

volumes_from

挂载数据卷容器,挂载的是容器。作用同 docker run –volumes-from

ps:container:container_name仅支持version 2

1
2
3
4
5
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw

extra_hosts

添加主机名映射

1
2
3
extra_hosts:
- "somehost:167.234.23.12"
- "otherhost:23.245.21.123"

会在/etc/hosts创建记录

1
2
167.234.23.12 somehost
23.245.21.123 otherhost

extends

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

1
2
3
extends:
file: common.yaml
service: webapp

ps: service必须有,filek可选。service是要继承的服务,比如: web mysql

net

设置网络模式 作用同 docker run –net

1
2
net: "host"
net: "bridge"

dns

自定义dns服务器

1
2
3
4
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114

命令详解

验证配置文件 config -q

用来验证docker-compose.yaml文件配置,当验证正确时不输出内容,验证失败时,会输出错误信息

查看服务状态 ps

在docker-compose.yaml所在的文件夹下执行docker-compose ps 可用来查看当前有哪些容器,以及他们的状态

更新启动服务 up -d

可以创建并启动配置中的所有服务

停止服务 stop

停止某个服务,当没有带service_name的时候,是停止配置文件里面的所有服务

1
docker-compose stop service_name

删除容器 rm

在停止服务后,才能删除服务。当没有带service_name的时候,是移除配置文件所有服务的容器
注意:将容器移除掉,如果容器没有跟主机进行数据卷映射,进行外部持久化,那么数据会全部丢失。

1
2
3
4
#需要输入y 进行确认
docker-compose rm servcie_name
#强制删除 无须输入y确认
docker-compose rm -f service_name

查看日志 logs

可以查看某个服务的日志

1
2
3
4
# 查看日志
docker-compose logs service_name
# 查看实时日志
docker-compose logs -f service_name

执行命令 exec

docker-compose exec service_name bash 进入某个服务下的容器
docker-compose exec service_name command 在某个服务的容器中执行command命令

拉取镜像 pull

拉取某个服务的镜像,如果没有加service_name 就是重新拉取所有服务镜像。

1
docker-compose pull service_name

创建容器 create

除了docker-compose up -d 创建并启动所有服务容器外,我们也可以手动进行创建服务的容器。

1
docker-compose create service_name

启动服务 start

在上一步create,我们进行创建好容器之后,可以手动启动该服务容器了

1
docker-compose start service_name

重启服务 restart

当我们执行exec进入容器,可能修改了某个配置文件,需要重启容器,那么我们可以使用restart 命令重启服务。

1
docker-compose restart service_name

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 337455685@qq.com

文章标题:docker系列五docker-compose编排服务

文章字数:1.8k

本文作者:wjy

发布时间:2020-02-17, 17:11:09

最后更新:2020-02-18, 11:40:08

原始链接:https://chengnj.github.io/docker/2020/docker5/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏