Docker进阶---初识docker-compose

Docker-compose

Docker-compose介绍

什么是docker-compose

Compose是用于定义和运行多容器Docker应用程序的工具。使用compose,可以使用yaml文件配置应用程序的服务。然后,通过一个命令,可以从配置中创建和启动所有服务。

背景

因为dockfile建议的要求是一个镜像只允许一个程序,但是实际项目中,一个项目运行起来可能需要多个模板,多个程序一起运行,所以Docker官方就应社区要求,开发了docker-compose用来管理容器的一项容器编排技术。

编排(Orchestration)功能,是复杂系统是否具有灵活可操作性的关键。特别在Docker应用场景中,编排意味着用户可以灵活地对各种容器资源实现定义和管理。Compose作为Docker官方编排工具,其重要性不言而喻,它可以让用户通过编写一个简单的模板文件,快速地创建和管理基于Docker容器的应用集群。

Compose、Machine和Swarm合成为Docker三大剑客,但是随着发展,Machine和Swarm已经没落了,只保留下了三大剑客之一的Compose

Docker-compose安装

Compose支持三平台Windows、Mac、Linux,安装方式各有不同。我这里使用的是Linux系统,其他系统安装方法可以参考官方文档和开源GitHub链接。安装Compose之前,要先安装Docker引擎.

Docker Compose官方文档链接

Docker Compose GitHub链接

Linux上有两种安装方法,Compose项目是用Python写的,可以使用Python-pip安装,也可以通过GitHub下载二进制文件进行安装。

Compose可以通过Python的pip工具进行安装,可以直接下载编译好的二进制文件使用,甚至直接运行在Docker容器中。前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。

  • Pip安装
# 安装Python-pip
yum install -y epel-release
yum install -y python-pip

# 安装docker-compose
pip install docker-compose

# 验证是否安装
docker-compose version

# 卸载
pip uninstall docker-compose
  • 二进制包安装
  1. 通过GitHub获取下载链接,历史版本地址:
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果在安装的时候出现如图所示错误,可以在指令后加上参数k,关闭证书验证即可
Docker进阶---初识docker-compose_第1张图片

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -k
  1. 给二进制下载文件可执行的权限
chmod +x /usr/local/bin/docker-compose
  1. 可能没有启动程序,设置软连接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  1. 验证是否安装
docker-compose version
  1. 卸载
rm /usr/local/bin/docker-compose

Docker-compose模板文件指令

模板文件是使用Compose的核心,涉及的指令关键字也比较多。但大家不用担心,这里的大部分指令与docker [container] create|run相关参数的含义都是类似的。默认的模板文件名称为docker-compose.yml,格式为YAML格式,目前最新的版本为v3。

模板文件常用指令如下:

Image

指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。例如:

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

Build

指定Dockerfile所在文件夹的路径(可以是绝对路径,或者相对docker-compose.yml文件的路径)。Compose将会利用它自动构建应用镜像,然后使用这个镜像,例如:

version: '3'
services:
    app:
        build: /path/to/build/dir

build指令还可以指定创建镜像的上下文、Dockerfile路径、标签、Shm大小、参数和缓存来源等,例如:

version: '3'
services:
    app:
        build:
            context: /path/to/build/dir
            dockerfile: Dockerfile-app
            labels:
                version: "2.0"
                released: "true"
            shm_size: '2gb'
            args:
                key: value
                name: myApp
            cache_from:
                - myApp:1.0

command

覆盖容器启动后默认执行的命令,可以为字符串格式或JSON数组格式。例如:

command: echo "hello world"

或者:

command: ["bash", "-c", "echo", "hello world"]

links

注意:links命令属于旧的用法,可能在后续版本中被移除。链接到其他服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名(SERVICE:ALIAS)格式都可以。

links:
   - db
   - db:database
   - redis
使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:

172.17.2.186   db
172.17.2.186   database
172.17.2.187   redis

被链接容器中相应的环境变量也将被创建。

ports

暴露端口信息。使用宿主:容器(HOST:CONTAINER)格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

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


或者:

ports:
    - target: 80
      published: 8080
      protocol: tcp
      mode: ingress

注意:

当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60并且没放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为60进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数,如下所示:

expose:
- “3000”
- “8000”

volumes

数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)。支持driver、driver_opts、external、labels、name等子配置。该指令中路径支持相对路径。例如:

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

或者可以使用更详细的语法格式:

volumes:
    - type: volume
        source: mydata
        target: /data
        volume:
            nocopy: true
volumes:
    mydata:

network_mode

设置网络模式。使用和docker client的–net参数一样的值。例如:

network_mode: "none"
network_mode: "bridge"
network_mode: "host"
network_mode: "service:[service name]"
network_mode: "container:[name or id]"

networks

所加入的网络。需要在顶级的networks字段中定义具体的网络信息。例如,指定web服务的网络为web_net,并添加服务在网络中别名为web_app。例如:

services:
    web:
        networks:
            web_net:
                aliases: web_app
                ipv4_address: 172.16.0.10
networks:
    web_net:
        driver: bridge
        enable_ipv6: true
        ipam:
            driver: default
            config:
                subnet: 172.16.0.0/24

environment

设置环境变量,可以使用数组或字典两种格式。只给定名称的变量会自动获取运行Compose主机上对应变量的值,可以用来防止泄露不必要的数据。例如:

environment:
    RACK_ENV: development
    SESSION_SECRET:

或者:

environment:
    - RACK_ENV=development
    - SESSION_SECRET

healthcheck

指定检测应用健康状态的机制,包括检测方法(test)、间隔(interval)、超时(timeout)、重试次数(retries)、启动等待时间(start_period)等。例如,指定检测方法为访问8080端口,间隔为30秒,超时为15秒,重试3次,启动后等待30秒再做检查。

healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:8080"]
    interval: 30s
    timeout: 15s
    retries: 3
    start_period: 30s

restart

指定重启策略,可以为no(不重启)、always(总是)、on-failure(失败时)、unless-stopped(除非停止)。注意Swarm模式下要使用restart_policy。在生产环境中推荐配置为always或者unless-stopped。例如,配置除非停止:

restart: unless-stopped

其它

docker-compose.yml 还有很多其他模板文件命令,可以参考docker-compose.yml文件官方文档

Compose命令

对于Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。执行docker-compose [COMMAND] --help或者docker-compose help [COMMAND]可以查看具体某个命令的使用格式。Compose命令的基本的使用格式是:

docker-compose [-f=…] [options] [COMMAND] [ARGS…]

Build

docker-compose build [options] [SERVICE...]

构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于Web项目中的一个db容器,可能是web_db。可以随时在项目目录下运行docker-compose build来重新构建服务。选项包括:

  • –force-rm:强制删除构建过程中的临时容器;
  • –no-cache:构建镜像过程中不使用cache(这将加长构建过程);
  • –pull:始终尝试通过pull来获取更新版本的镜像;
  • -m, -memory MEM:指定创建服务所使用的内存限制;
  • -build-arg key=val:指定服务创建时的参数。

Config

docker-compose config [options]

校验和查看Compose文件的配置信息。支持选项包括:

  • -resolve-image-digests:为镜像添加对应的摘要信息;
  • -q, -quiet:只检验格式正确与否,不输出内容;
  • -services:打印出Compose中所有的服务信息;
  • -volumes:打印出Compose中所有的挂载卷信息;

Exec

docker-compose exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

在一个运行中的容器内执行给定命令。支持选项包括:

  • -d:在后台运行命令;
  • -privileged:以特权角色运行命令;
  • -u, -user USER:以给定用户身份运行命令;
  • -T:不分配TTY伪终端,默认情况下会打开;
  • -index=index:当服务有多个容器实例时指定容器索引,默认为第一个;
  • -e, -env KEY=VAL:设置环境变量。

Images

docker-compose images [options] [SERVICE...]

列出服务所创建的镜像。支持选项为:

  • -q:仅显示镜像的ID

Logs

docker-compose logs [options] [SERVICE...]

查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。该命令在调试问题的时候十分有用。支持选项为:

  • -no-color:关闭彩色输出;
  • -f, -follow:持续跟踪输出日志消息;
  • -t, -timestamps:显示时间戳信息;
  • -tail=“all”:仅显示指定行数的最新日志消息。

Pause

docker-compose pause [SERVICE...]

暂停一个服务容器。

Port

docker-compose port [options] SERVICE PRIVATE_PORT

打印某个容器端口所映射的公共端口。选项:

  • –protocol=proto:指定端口协议,tcp(默认值)或者udp;
  • –index=index:如果同一服务存在多个容器,指定命令对象容器的序号(默认为1)。

Ps

docker-compose ps [options] [SERVICE...]

列出项目中目前的所有容器。选项包括

  • -q:只打印容器的ID信息。

Pull

docker-compose pull [options] [SERVICE...]

拉取服务依赖的镜像。选项包括

  • –ignore-pull-failures:忽略拉取镜像过程中的错误。

Push

docker-compose push [options] [SERVICE...]

推送服务创建的镜像到镜像仓库。选项包括

  • –ignore-push-failures:忽略推送镜像过程中的错误。

Restart

docker-compose restart [options] [SERVICE...]

重启项目中的服务。选项包括

  • -t, --timeout TIMEOUT:指定重启前停止容器的超时(默认为10秒)

rm

docker-compose rm [options] [SERVICE...]

删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。选项:

  • -f, --force:强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
  • -v:删除容器所挂载的数据卷。

Start

docker-compose start [SERVICE...]

启动已经存在的服务容器。

Stop

docker-compose stop [options] [SERVICE...]

停止已经处于运行状态的容器,但不删除它。通过docker-compose start可以再次启动这些容器。选项包括

  • -t, --timeout TIMEOUT:停止容器时候的超时(默认为10秒)。

Version

docker-compose version

打印版本信息。

Up

docker-compose up [options] [SERVICE...]

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。

可以说,大部分时候都可以直接通过该命令来启动一个项目。默认情况,docker-compose up启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过Ctrl-C停止命令时,所有容器将会停止。

如果使用docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

默认情况,如果服务容器已经存在,docker-compose up将会尝试停止容器,然后重新创建(保持使用volumes-from挂载的卷),以保证新启动的服务匹配docker-compose.yml文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用docker-compose up–no-deps -d 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。选项:

  • -d:在后台运行服务容器;
  • –no-color:不使用颜色来区分不同的服务的控制台输出;
  • –no-deps:不启动服务所链接的容器;
  • –force-recreate:强制重新创建容器,不能与–no-recreate同时使用;
  • –no-recreate:如果容器已经存在了,则不重新创建,不能与–force-recreate同时使用;
  • –no-build:不自动构建缺失的服务镜像;
  • –abort-on-container-exit:当有容器停止时中止整个服务,与-d选项冲突。
  • -t, --timeout TIMEOUT:停止容器时候的超时(默认为10秒),与-d选项冲突;
  • –remove-orphans:删除服务中未定义的孤儿容器;
  • –exit-code-from SERVICE:退出时返回指定服务容器的退出符;
  • –scale SERVICE=NUM:扩展指定服务实例到指定数目。

参考文献

  • 《Docker技术入门与实战(第3版) 》

你可能感兴趣的:(Docker)