Docker Compose 入门与实践

Docker系列文章
第二章 Docker Compose


文章目录

  • 前言
  • 一、什么是 Docker Compose?
  • 二、Docker Compose 基本实现原理
  • 三、配置文件解析
    • 3.1.配置案例
    • 3.2.配置指令
      • 3.2.1.image
      • 3.2.2.container_name
      • 3.2.3.build
      • 3.2.4.commond
      • 3.2.5.depends_on
      • 3.2.6.ports
      • 3.2.7.extra_hosts
      • 3.2.8.dns
      • 3.2.9.dns_search
      • 3.2.10.entrypoint
      • 3.2.11.tmpfs
      • 3.2.12.env_file
      • 3.2.13.environment
      • 3.2.14.expose
      • 3.2.15.external_links
      • 3.2.16.labels
      • 3.2.17.links
      • 3.2.18.logging
      • 3.2.19.security_opt
      • 3.2.20.stop_signal
      • 3.2.21.stop_grace_period
      • 3.2.22.volumes
      • 3.2.22.pid
      • 3.2.23.deploy
      • 3.2.24.其它
  • 四、Docker Compose 常用命令
    • 4.1.命令概览
    • 4.2.命令解析
      • 4.2.1.docker-compose up
      • 4.2.2.docker-compose down
      • 4.2.3.docker-compose bulid
      • 4.2.4.docker-compose pull
      • 4.2.5.docker-compose push
      • 4.2.6.docker-compose rm
      • 4.2.7.docker-compose run
      • 4.2.8.docker-compose config
      • 4.2.9.docker-compose create
      • 4.2.10.docker-compose start
      • 4.2.11.docker-compose restart
      • 4.2.12.docker-compose stop
      • 4.2.13.docker-compose scale
      • 4.2.14.docker-compose events
      • 4.2.15.docker-compose exec
      • 4.2.16.docker-compose kill
      • 4.2.17.docker-compose logs
      • 4.2.18.docker-compose pause
      • 4.2.19.docker-compose unpause
      • 4.2.20.docker-compose port
      • 4.2.20.docker-compose ps
  • 五、Docker Compose 安装
  • 六、Docker Compose 实践


前言

上一章为 docker 的认识与使用,还未了解其基础使用的可以先去翻阅,这章在此基础上对 docker-compose 容器编排工具进行简单的介绍和使用。


一、什么是 Docker Compose?

  docker-compose 是 docker 容器的一种单机编排工具。当项目涉及较多容器且容器之间又有先后依赖关系时候,手动启动就显得异常麻烦,而且容易出错。这时我们就需要一个容器管理工具来按照依赖关系对容器进行创建和启动,而 compose 就是这样一种用于定义和运行多容器 docker 应用程序的工具。简单的理解,如果将 docker 命令看作 linux 命令的话,那 docker-compse 就像 shell 脚本,可以自动的执行容器批量操作,从而实现自动化的容器管理。

二、Docker Compose 基本实现原理

  docker-compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。docker-compose 命令运行的目录下的所有文件(.yml、.yaml 环境变量文件、Dockerfile等扩展文件)构成一个工程,默认工程名称为目录名。一个工程中可包含一个或多个服务,每个服务中又定义相关镜像,参数,依赖关系,以及一个或者多个容器实例(副本)。

   docker-compose 工程通过一个 docker-compose.yml 配置文件来描述整个工程涉及的所有容器与容器之间的依赖关系,然后可以用一条指令来启动或停止整个工程。通过 yml 文件来配置应用程序所需要的所有服务,compose 就可以通过命令根据 .yml(.yaml) 配置文件中服务的顺序依赖关系来创建并启动所有服务。
Docker Compose 入门与实践_第1张图片

三、配置文件解析

3.1.配置案例

  配置文件的默认名称为 docker-compose.yml,也可以用其他名称,但需要修改环境变量 COMPOSE_FILE 或者启动时通过 -f 参数指定配置文件 。

docker-compose.yml 的配置案例如下(配置参数参考下文):

version: '3'                   # 配置版本号
services: 
  database:                    # 服务名称,自行命名             
    image: mysql:5.7           # 使用的镜像
    container_name: mysql57    # 容器名称
    ports:                     # 端口映射配置,可配置多个
      - 3307:3306			   # 容器端口 3306 映射到 3307 端口
    restart: always            # 重启方式,等同于 --restart=always
    networks:   # 服务连接到的指定网络,等同于--network deploy-net
      - deploy-net
    environment:                           # 配置环境变量 -e
      MYSQL_DATABASE: alone_db
      MYSQL_ROOT_PASSWORD: 1234 # -e MYSQL_ROOT_PASSWORD=1234
    volumes:                  # 配置容器内文件或目录挂载到宿主机,等同于-v
	  - /usr/local/docker/data/mysql57/logs:/logs
	  - /usr/local/docker/data/mysql57/data:/var/lib/mysql
	  - /usr/local/docker/data/mysql57/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
  web:
    depends_on:              # 配置当前服务依赖的服务
      - database
    build: ./                # 配置构建image的Dockerfile文件位置
    image: test-web
#    container_name: test-web            # 容器名必须唯一,所以如果服务包两个以上容器,则不能指定容器名
    restart: always
    volumes:
      - /home/logs/test/web/test_web/service:/home/logs/test/web/test_web/service
    ports:
      - 8082:8082
    deploy:                              # 布署配置
      replicas: 2                        # 创建两个副本
    networks:
      - test-net
networks:                                # 网络配置
  test-net:
    driver: bridge                       # 指定网络驱动器为bridge

  从以上的配置文件格式中可以看到,文件包括 version、services、network 三个部分,其中较为关键的是 services 与 network。 一个 service 中的服务代表一个 容器,容器可以通过远程仓库或本地仓库中甚至是本地 DockerFile 构建出的镜像来创建的。service 的启动类似于 docker run ,我们可以通过配置文件来配置相关参数,如指定 network 和挂载 volume 等。

3.2.配置指令

3.2.1.image

image::
用来指定服务镜像,如果镜像不存在 compose 会尝试拉取镜像。

services:
  database:
    image: mysql:5.7

3.2.2.container_name

container_name: mysql57    # 容器名称

3.2.3.build

除了通过image指定镜像外,还可以基于 DockerFile 在 docker-compose 启动时执行构建任务构建镜像。可以设定上下文根目录指定 DockerFile 文件所在路径、文件名。

services:
  web:
  	# 方式一:指定路径,会在该路径下读取 DockerFile,可以是以下全路径,也可以是相对路径如:build: ./di
    build: /path/to/build/dir

	# 方式二:设定上下文目录,指定读取文件名称 DockerFile 
	build:
		context: ./dir #可以是DockerFile文件路径,也可以为连接到git仓库的url
		dockerfile: Dockerfile-alternate # 可指定路径
		args: # 构建参数,可在构建过程中指定环境变量,但只能在构建构成访问。如DockerFile ARG 指令允许空值
			buildno: 1
			gitcommithash: fdashfue

在 Dockerfile 中指定参数

# syntax=docker/dockerfile:1

ARG buildno
ARG gitcommithash

RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"

然后指定 bulid 下的参数,可以传递映射,同样支持列表形式

build:
  context: .
  args:
    - buildno=1
    - gitcommithash=fdashfue

注意:YAML 布尔值 ( “true”, “false”, “yes”, “no”, “on”, “off”) 必须用引号括起来,以便解析器将它们解释为字符串。

3.2.4.commond

使用时可以覆盖容器启动后默认执行的命令。

# 简单格式
command: bundle exec thin -p 3000
# 列表
command: ["bundle", "exec", "thin", "-p", "3000"]

3.2.5.depends_on

用于解决容器的依赖,启动先后问题。

services:
  web:			# web 服务
    build: .
    depends_on: # 容器会先启动 redis 和 db 两个服务,最后才启动 web 服务
      - db
      - redis
  redis:		# redis 服务
    image: redis
  db:			# 数据库服务
    image: mysql:5.7

3.2.6.ports

指定端口映射。

services:
  nginx: 
    image: nginx:1.9.7
    container_name: nginx197
    ports: # 端口映射配置,可配置多个
    # 当使用如 80:81 格式来映射端口时,如果使用的容器端口小于60可能会因为YAML将会解析这种数字格式为60进制从而得到错误结果。所以建议采用字符串格式
      - "80" # 只是指定容器端口,宿主机会随机映射端口
      - "80:81"
      - "443:443"
      - "127.0.0.1:8001:8001"

3.2.7.extra_hosts

添加主机名映射,会在 /etc/hosts 下创建记录。

services:
  nginx: 
	extra_hosts: # 这里配置的是宿主机的ip,不是容器ip,容器ip重启会改变,除非容器设置了固定ip
		- "www.test1.com:192.168.61.129"
		- "www.test2.com:192.168.61.130"
# 设置成功,启动后查看容器内部 hosts 如下:
#192.168.61.129  www.test1.com
#192.168.61.130   www.test2.com

3.2.8.dns

自定义 DNS 服务器,与 --dns 具有一样的用途,可以单个值或列表。

# 配置一个
dns: 8.8.8.8

# 配置列表
dns: 
	- 8.8.8.8
	- 114.114.114.114

3.2.9.dns_search

配置 DNS 搜索域,可以是单个值或列表

dns_search: example.com

dns_search:
  - dc1.example.com
  - dc2.example.com

3.2.10.entrypoint

Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点,docker-compose.yml 配置文件可覆盖 Dockerfile 中的定义。

# 单条指令
entrypoint: /code/entrypoint.sh
# 列表方式
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]

3.2.11.tmpfs

在容器内挂载一个临时文件系统。可以是单个值或列表。
注意:当以集群模式 version版本为3-3.5的 compose file 部署时,该选项将被忽略。

# 单个值
tmpfs: /run
# 列表
tmpfs:
  - /run
  - /tmp

3.2.12.env_file

从文件添加环境变量。可以是单个值或列表,如果您使用 指定了 Compose 文件docker-compose -f FILE,则其中的路径 env_file相对于该文件所在的目录。在environment部分中 声明的环境变量会覆盖这些值,即使这些值是空的或未定义的。

# 单个
env_file: .env
# 多个
env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/runtime_opts.env

3.2.13.environment

设置环境变量,支持数组或字典格式,任何布尔值(true、false、yes、no)都需要用引号括起来,以确保它们不会被 YML 解析器转换为 True 或 False。与env_file不同,改标签为设置镜像变量,可以保存变量到镜像中,即启动容器也会包含这些变量设置。与arg不同的是,arg标签的变量仅仅作用于构建过程中,而enviroment 和 DockerFile 中的ENV 指令都会包变量浜村至镜像,容器中,与docker run -e 一样的效果。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

3.2.14.expose

指定暴露端口。与DockerFile中的EXPOSE指令一致,只是作为标注,提醒,说明,实际的端口映射还是需要在 标签ports中配置。

expose:
  - "3000"
  - "8000"

3.2.15.external_links

为了使Compose能够连接不在docker-compose.yml中定义的容器如对于提供共享或公共服务的容器,我们需要一个特殊的标签 external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络中)。
注意:当以 swarm 集群模式部署时,该选项将被忽略。

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

3.2.16.labels

给容器添加元数据,与DockerFile中的LABEL指令一致,支持数组或字典。

labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""

labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

3.2.17.links

服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务。链接服务的容器可以通过与别名相同的主机名访问,如果未指定别名,则可以使用服务名称。
注意:当以集群模式部署时,该选项将被忽略。

services:
    web:
        links:
        	- "reids" # 没有指定别名,则使用的是服务名称,会找到对应的服务名称为redis 的服务
            - "db:database" # 使用别名,web服务中可以使用 database 访问db服务
    
    db: # 数据库服务
        image: mysql:5.7
        
    redis: # 缓存服务
    	image: redis:5.0

3.2.18.logging

服务日志记录配置。driver 名称指定服务容器的日志记录驱动程序(“json-file”、“syslog”、“none”),与 docker run --log-driver 一致,默认值为 json-file。

# syslog 驱动
logging:
  driver: "syslog"
  options:
    syslog-address: "tcp://192.168.0.42:123"

# json-file 驱动
services:
  some-service:
    image: some-service
    logging:
      driver: "json-file"
      options:  # 默认驱动程序json-file具有限制存储日志数量的选项,也仅限于该驱动,其它驱动不可用
        max-size: "200k" # 存储日志文件,直到它们达到max-size200kB,然后旋转
        max-file: "10"  #存储的单个日志文件的数量由该值指定

3.2.19.security_opt

覆盖每个容器的默认标签方案。

security_opt: # 如覆盖每个容器中的 user,role标签的值
  - label:user:USER
  - label:role:ROLE

3.2.20.stop_signal

设置一个替代信号来停止容器。默认情况下stop使用 SIGTERM。使用stop_signal原因 设置替代信号来stop代替发送该信号。
注意:当以集群模式部署时,该选项将被忽略。

stop_signal: SIGUSR1

3.2.21.stop_grace_period

指定在尝试停止容器时等待多长时间,如果它不处理 SIGTERM(或任何用 指定的停止信号 stop_signal),然后发送 SIGKILL。指定为持续时间。

# 格式1
stop_grace_period: 1s
# 格式2
stop_grace_period: 1m30s

3.2.22.volumes

挂载主机路径或者数据卷容器。

# 案例
version: "3.9"
services:
  web:
    image: nginx:alpine
    volumes:
      - type: volume
        source: mydata # web服务使用数据卷 mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

  db:
    image: postgres:latest
    volumes: # 指定挂载路径
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
      - "dbdata:/var/lib/postgresql/data" # 已经存在的命名的数据卷挂载

# 顶级卷键定义了一个命名卷并从每个服务的volumes列表中引用它。
#多个服务中共用一个卷。这取代volumes_from了早期版本的 Compose 文件格式
#(顶级卷指的是节点和 services 为同等级)
volumes: 
  mydata:
  dbdata:

简短的语法
简短语法使用通用 [SUORCE:]TARGET[:MODE] 格式,其中 SOURCE可以是主机路径或卷名。TARGET是安装卷的容器路径。MODE 标准模式ro用于只读和rw读写(默认)。可以在主机上挂载一个相对路径,该路径相对于正在使用的 Compose 配置文件的目录展开。相对路径应始终以.或开头…

volumes:
  # 只需指定一个路径,让docker 创建一个卷
  - /var/lib/mysql

  # 指定一个绝对路径映射
  - /opt/data:/var/lib/mysql

  # 主机上的路径, 以Compose配置文件为中心的相对路径作为数据卷挂载到容器
  - ./cache:/tmp/cache

  # 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)
  - ~/configs:/etc/configs/:ro

  # 已经存在的命名的数据卷
  - datavolume:/var/lib/mysql

长语法。长格式语法允许配置不能用短格式表达的附加字段

version: "3.9"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - type: volume 	# 挂载类型volume, bind,tmpfs或npipe
        source: mydata 	# 挂载源、主机上用于绑定安装的路径或在顶级volumeskey 中定义的卷的名称 。不适用于 tmpfs 挂载
        target: /data 	# 挂载卷的容器中的路径
     #  read_only: true # 将卷设置为只读的标志
        volume: # 配置额外的数据卷项
          nocopy: true 	# 创建卷时禁用从容器复制数据的标志
      - type: bind
        source: ./static
        target: /opt/app/static

networks:
  webnet:

volumes:
  mydata:

在没有指定来源的数据卷的情况下,Docker 会为支持服务的每个任务创建一个匿名卷。删除关联的容器后,匿名卷不会持续存在。

3.2.22.pid

将 PID 模式设置为主机 PID 模式。这会在容器和主机操作系统之间共享 PID 地址空间。使用此标志启动的容器可以访问和操作宿主机命名空间中的其他容器。

pid: "host"

3.2.23.deploy

指定与服务部署和运行相关的配置。只在部署到集群时生效,当使用docker-compose up和docker-compose run会被忽略。

version: "3.9"
services:
  redis:
    image: redis:alpine
    deploy:
    	mode: rellicated #global:每个集节点只有一个容器;replicated:指定容器数量(默认)
      	replicas: 6
      	placement:
        	max_replicas_per_node: 1
      	update_config:
        	parallelism: 2
        	delay: 10s
      	restart_policy: #容器重启配置,用于替代restart
        	condition: on-failure
      	resources:      #资源限制
        	limits:
          		cpus: '0.50'
          		memory: 50M

3.2.24.其它

以下都是一些单值标签,与docker run 中使用的参数一致。

cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true

restart: always

read_only: true
shm_size: 64M
stdin_open: true
tty: true

附:官方文档: https://docs.docker.com/compose/compose-file/compose-file-v3/
这是3版本的文档,有更多细节的指令参数可以参考文档,version 的值也可以参考该文档匹配相应版本号。

四、Docker Compose 常用命令

4.1.命令概览

# 命令格式
docker-compose [-f ...] [--profile ...] [options] [COMMAND] [ARGS...]

Options:
  -f, --file FILE             指定一个替代的compose文件(默认值:docker-compose.yml)
  -p, --project-name NAME     指定一个项目名称(默认目录名称)
  --profile NAME              指定要启用的配置文件
  --verbose                   显示更多输出
  --log-level LEVEL           设置日志级别(DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   不打印ANSI控制字符
  -v, --version               打印版本并退出
  -H, --host HOST             要连接到的主机守护程序套接字

  --tls                       使用TLS
  --tlscacert CA_PATH         仅由此CA签名的信任证书
  --tlscert CLIENT_CERT_PATH  TLS证书文件路径
  --tlskey TLS_KEY_PATH       TLS密钥文件路径
  --tlsverify                 使用TLS协议进行远程验证
  --skip-hostname-check       不检查守护进程的主机名,客户端证书中指定的名称
  --project-directory PATH    指定一个备用的工作目录(默认值:Compose文件的路径)
  --compatibility             如果设置,Compose将尝试转换部署密钥在v3文件到他们的非swarm等效

Commands:
  build              构建或者重新构建服务
  bundle             从compose配置文件生成一个 Docker bundle
  config             验证并查看Compose文件
  create             为服务创建容器
  down               停止并删除容器、网络、映像和数据卷
  events             从容器接收实时事件
  exec               在正在运行的容器中执行命令
  help               命令帮助
  images             列出所有镜像
  kill               强制停止服务容器
  logs               查看服务日志输出
  pause              暂停服务
  port               显示某个容器端口所映射的公共端口
  ps                 列出所有运行容器
  pull               拉取服务依赖的镜像
  push               推送服务镜像
  restart            重启服务
  rm                 移除停止容器
  run                在指定服务上执行一个命令
  scale              设置服务的容器数量
  start              启动服务
  stop               停止服务
  top                显示正在运行的进程
  unpause            取消暂停服务
  up                 创建并启动容器
  version            显示Docker-Compose版本信息

4.2.命令解析

4.2.1.docker-compose up

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...] #构建,(重新)创建,启动,链接一个服务相关的容器。链接的服务都将会启动,除非他们已经运行
	-d 							#在后台运行服务容器
	--no-color					#不使用颜色来区分不同的服务的控制输出
	--no-deps 					#不启动服务所链接(link)的容器
	--force-recreate 			#强制重新创建容器,不能与-no-recreate同时使用
	--no-recreate 				#如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
	--no-build 					#不自动构建缺失的服务镜像
	--build 						#在启动容器前构建服务镜像
	--abort-on-container-exit 	#停止所有容器,如果任何一个容器被停止,不能与-d同时使用
	-t, --timeout TIMEOUT 		#停止容器时候的超时(默认为10秒)
	--remove-orphans 			#删除服务中没有在compose文件中定义的容器

4.2.2.docker-compose down

docker-compose down [options] #停止和删除容器、网络、卷、镜像。
	--rmi type		#删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
	-v, --volumes	#删除已经在compose文件中定义的和匿名的附在容器上的数据卷
	--remove-orphans	#删除服务中没有在compose中定义的容器

4.2.3.docker-compose bulid

docker-compose build [options] [--build-arg key=val...] [SERVICE...] #构建(重新构建)项目中的服务容器。
	--compress 			#通过gzip压缩构建上下环境
	--force-rm 			#删除构建过程中的临时容器
	--no-cache 			#构建镜像过程中不使用缓存
	--pull 				#始终尝试通过拉取操作来获取更新版本的镜像
	-m, --memory 		#MEM为构建的容器设置内存大小
	--build-arg key=val	#为服务设置build-time变量

4.2.4.docker-compose pull

docker-compose pull [options] [SERVICE...] #拉取服务依赖的镜像。
	--ignore-pull-failures	#忽略pull失败的镜像,继续pull其他镜像
	--parallel				#多个镜像同时拉取
	--quiet					#拉取镜像过程中不打印进度信息

4.2.5.docker-compose push

docker-compose push [options] [SERVICE...] #推送compose文件中所指明的镜像
	--ignore-push-failures  #忽略错误

4.2.6.docker-compose rm

docker-compose rm [options] [SERVICE...] #删除所有(停止状态的)服务容器。
	-f, --force	#强制直接删除,包括非停止状态的容器
	-v			#删除容器所挂载的数据卷
	-a, --all   #同时删除由 docker-compose run 创建的所有容器

4.2.7.docker-compose run

docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] #在指定服务上执行一个命令。
	-d                    #后台运行,输出容器名.
	-e KEY=VAL            #设置环境变量参数,可以使用多次
	-u, --user=""         #指定运行的用户
	--no-deps             #不启动link服务,只启动run的服务.
	--rm                  #运行后删除容器,后台运行模式除外(-d).
	-p, --publish=[]      #开放端口
	--service-ports       #compose文件中配置什么端口,就映射什么端口.
	-T                    #禁用TTY.
	-w, --workdir=""      #设置工作目录
# 例:执行一个 ping 命令
docker-compose run centos ping www.baidu.com

4.2.8.docker-compose config

docker-compose config [options] #验证并查看compose文件配置。
	--resolve-image-digests #将镜像标签标记为摘要
	-q, --quiet 	#只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
	--services 	#打印服务名,一行一个
	--volumes 	#打印数据卷名,一行一个

4.2.9.docker-compose create

docker-compose create [options] [SERVICE...] # 为服务创建容器.只是单纯的create,还需要使用start启动compose
    --force-recreate   #重新创建容器,即使他的配置和镜像没有改变,不兼容--no-recreate参数
    --no-recreate      #如果容器已经存在,不需要重新创建. 不兼容--force-recreate参数
    --no-build         #不创建镜像,即使缺失.
    --build            #创建容器前,生成镜像.

4.2.10.docker-compose start

docker-compose start [SERVICE...] #启动服务

4.2.11.docker-compose restart

docker-compose restart [options] [SERVICE...] #重启项目中的服务。
	-t, --timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)

4.2.12.docker-compose stop

docker-compose stop [options] [SERVICE...] #停止服务
	-t, --timeout TIMEOUT     #关闭超时时间 (default: 10s)

4.2.13.docker-compose scale

docker-compose scale [SERVICE=NUM...] #设置同一个服务运行的容器个数
# 例如:
docker-compose scale web=3 db=2

4.2.14.docker-compose events

docker-compose events [options] [SERVICE...] #输出docker-compose 事件的日志
    --json      #输出事件日志,json格式

4.2.15.docker-compose exec

docker-compose exec [options] SERVICE COMMAND [ARGS...] #在容器中执行命令
	-d             #分离模式,后台运行命令.
	--privileged   #获取特权.
	--user USER    #指定运行的用户.
	-T             #禁用分配TTY. By default `docker-compose exec`分配 a TTY.
	--index=index  #当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec --index=1 web /bin/bash ,web服务中包含多个容器

4.2.16.docker-compose kill

docker-compose kill [options] [SERVICE...] #通过发送 SIGKILL 信号来强制停止服务容器
	-s SIGNAL    #向容器发送信号. 默认是SIGKILL.

4.2.17.docker-compose logs

docker-compose [options] [SERVICE...] #显示日志输出
	--no-color          #单色输出,不显示其他颜色
	-f, --follow        #跟踪日志输出,实时查看日志
	-t, --timestamps    #显示时间戳
	--tail  			#从日志的结尾显示,--tail=500

4.2.18.docker-compose pause

docker-compose pause [SERVICE...] #暂定容器服务

4.2.19.docker-compose unpause

docker-compose unpause [SERVICE...] #取消暂定容器服务

4.2.20.docker-compose port

docker-compose port [options] [SERVICE] [PRIVATE_PORT] #输出绑定的公共端口
# 例如:
docker-compose port web 8080

4.2.20.docker-compose ps

docker-compose ps [options] [SERVICE...] #显示所有容器信息,默认显示name、command、state、ports
	-q    #只显示ID

五、Docker Compose 安装

方式一:

# 1.安装指定版本 docker compose,要安装其他版本的 Compose,自行替换1.26.2
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 2.增加可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 3.创建软连接
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 4.测试是否安装成功
docker-compose --version

方式二:

# 1.安装python-pip
yum -y install epel-release
yum -y install python-pip

# 2.安装docker-compose
pip install docker-compose

# 3.测试是否安装成功
docker-compose --version

如果有旧版本需要卸载

# 如果是二进制包方式安装的,删除二进制文件即可
sudo rm /usr/local/bin/docker-compose

# pip安装,则通过以下命令卸载
pip uninstall docker-compose

六、Docker Compose 实践

(1)提前创建好工程目录并进入,路径自己随意

mkdir -p /workspace/compose/alone-compose
cd /workspace/compose/alone-compose/

(2)在工程目录下创建 docker-compose.yml 配置文件

vi docker-compose.yml

文件内容

version: "3"
services:
  nginx: #nginx服务
    container_name: nginx-stable
    image: nginx:stable
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes: #挂载
      - /usr/local/docker/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /usr/local/docker/data/nginx/conf.d:/etc/nginx/conf.d
      - /usr/local/docker/data/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/data/nginx/logs:/var/log/nginx

  web: #web服务,这个用的的上一张中的 springboot web 项目直接拿来用
    build: ./alone-springboot-server #DockerFile是在该web项目路径下
    image: alone-boot-web
    restart: always
    ports:
      #- "8088:8082" #由于web我们选择启动两个实例,所以这里不应显式指定映射端口,不然会导致端口占用冲突提示:8088 port is already allocated
      - "8082" #这是服务内部端口
    deploy: #由于没有使用 swarm, 所以不支持该指令,就是写着玩
      replicas: 2 #这里启动了两个实例,所以就不要在指定 container_name,会报错
    depends_on:
      - database #依赖数据库服务,即要先启动数据库服务后再启动 web服务

  database: #数据库服务
    image: mysql:5.7
    container_name: mysql57
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 1234
    volumes:
      - "docker-data:/var/lib/mysql" #挂载在数据卷容器 docker-data

  redis:
    image: redis:5.0 #这里我本地没有该镜像,启动后会自动去拉取
    container_name: redis5
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - /usr/local/docker/data/redis/data:/data
      - /usr/local/docker/data/redis/conf/redis.conf:/etc/redis/redis.conf:rw #这里的 .conf 文件要提前创建
      - /usr/local/docker/data/redis/logs:/logs:rw #默认其实就是rw这里只是多此一举别介意
    command:
      redis-server /etc/redis/redis.conf --appendonly yes # 执行的命令

volumes: # 声明数据卷容器,否则会报错
  docker-data:

(3)准备好项目需要的配置文件,包等
我这里用的是上一章中的 springboot-web 项目,所以我把编译后的源码包拷贝到当前工程目录下。
Docker Compose 入门与实践_第2张图片

(4)启动服务
方式一(有报警,且无法启动多实例):

# 在配置文件所在路径下执行该命令
docker-compose up -d

注意:这里由于没有使用 swarm, 所以不支持 deploy 命令,执行会有警告提示,且无法启动多个实例,你可以使用以下命令来执行。
Docker Compose 入门与实践_第3张图片
构建成功。执行中的警告(WARNING)是由于没有使用 swarm, 所以不支持一部分指令,要加上–compatibility参数,即启动时加上 docker-compose --compatibility up -d 不然会报错,这里可以忽略吧。

方式二:

# 由于没有使用 swarm 不支持一部分命令,为了防止警告提示,启动选择以下命令
docker-compose --compatibility up -d

在这里插入图片描述
docker 会为你的两个实例映射端口,如以下使用 32769或32768可以分别取访问web实例。
在这里插入图片描述


下一章 Docker Swarm

你可能感兴趣的:(docker,linux,运维)