Docker 系列五(Docker Compose 项目).

一、概念

    Docker Compose 是官方编排项目之一,负责快速的部署分布式应用。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一种相关联的应用容器为一个项目。

    Docker  Compose 中有两个重要的概念:

服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

    Docker Compose 的安装可以参考上一篇文章内容

二、Compose 命令说明

    对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

    以下常用命令在 docker-compose.yml 同级目录下执行,否则需要 docker-compose -f [docker-compose.yml 路径] [命令]:

docker-compose [命令] -help查看某个命令的帮助(神器,授人以鱼不如授人以渔)。

docker-compose config验证 Compose 文件(docker-compose.yml)格式是否正确,若正确则显示配置。若格式错误显示原因。

docker-compose up:尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。

-d 在后台运行服务容器。
--no-color 不使用颜色来区分不同的服务的控制台输出
--no-deps 不启动服务所链接的容器。
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
--no-build 不自动构建缺失的服务镜像。
-t,--timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

docker-compose down:此命令会停止 up 命令所启动的容器,并移除网络。

docker-compose images :列出 Compose 文件中包含的镜像。

docker-compose ps:列出项目中目前的所有容器。

docker-compose ps --service:列出项目中目前的所有服务(重要,很多命令都是基于服务来操作的)。

docker-compose logs [options] [SERVICE...]:查看服务容器的日志输出

docker-compose exec [SERVICE] bash : 进入指定的容器。

docker-compose stop [options] [SERVICE...] :停止已经处于运行中的容器,但不删除它。

docker-compose kill -s SIGINT [SERVICE...] :通过发送 SIGINT 信号来强制停止服务容器(类似于stop)

docker-compose start [SERVICE...] :启动已经存在的服务容器。

docker-compose restart [options] [SERVICE...]:重启项目中的服务

docker-compose rm [options] [SERVICE...]删除所有(停止状态的)服务容器,-f 强制删除包括非停止状态 -v 删除容器所挂载的数据卷。

docker-compose pause [SERVICE...]:暂停一个服务容器。

docker-compose unpause [SERVICE...]:恢复处于暂停状态中的服务。

docker-compose scale [options] [SERVICE=NUM...]:设置指定服务运行的容器个数。(神器,照这样岂不是很简单就实现了分布式?

docker-compose top:查看各个容器内运行的进程

三、Compose 模板文件

    模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。下面笔主筛选出一些常见的命令,不推荐使用和不常用的就不介绍了~~

    默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式:

version: '3'
#服务列表
services:
  服务1,服务名叫web
  web:
    build: .
    ports:
     - "5000:5000"
    command: echo hello world
    depends_on:
     - redis
    ulimits:
      最大进程数
      nproc: 64435
      nofile:
       文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制)
       soft: 20000
       文件句柄数为 40000(系统硬限制,只能 root 用户提高)
       hard: 40000
  服务2,服务名叫redis
  redis:
    image: redis:alpine"

    注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。

    1、build

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。

version: '
services:

  webapp:
    build: ./dir

也可以使用 context 指令指定 Dockerfile 所在文件夹的路径;使用 dockerfile 指令指定 Dockerfile 文件名;使用 arg 指令指定构建镜像时的变量。

version: 
services:

  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

    2、image

指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。

version: 
services:
  
  redis:
    image: "

    3、cap_add,cap_drop

指定容器的内核能力(capacity)分配。

让容器拥有所有能力可以指定为:
cap_add:
  - ALL
去掉 NET_ADMIN 能力可以指定为:
cap_drop:
  - NET_ADMIN

    4、command

覆盖容器启动后默认执行的命令。

command: echo "

    5、depends_on

解决容器的依赖、启动先后的问题。

version: 
services:
  
  web:
    build: .
    depends_on:
     - redis
     
  redis:
    image: "

    6、expose

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

expose:
 - "3000"
 - "8000"

    7、ports

暴露端口信息;使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以;建议数字串都采用引号包括起来的字符串格式。

ports:
 - 3000"
 - 8000:800049100:22127.0.0.1:8001:8001"

    8、ulimits

指定容器的 ulimits 限制值。

ulimits:
  最大进程数
  nproc: 64435
  nofile:
   文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制)
   soft: 20000
   文件句柄数为 40000(系统硬限制,只能 root 用户提高)
   hard: 40000

     9、env_file

 从文件获取环境变量,可以为单独的文件路径或列表;则 env_file 中变量的路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

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

 common.env: Set development environment
PROG_ENV=development

    10、environment

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

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

    11、extra_hosts

指定额外的 host 名称映射信息。

extra_hosts:
 - googledns:8.8.8.8dockerhub:52.1.157.61"

    12、labels

为容器添加 Docker 元数据(Metadata)信息。例如可以为容器添加辅助说明信息。

labels:
  com.startupteam.description: webapp for a startup team
  com.startupteam.department: devops department
  com.startupteam.release: rc3 for v1.0"

    13、sysctls

配置容器内核参数。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

    14、volumes

数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro);该指令中路径支持相对路径。

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

    15、network_mode 

    配置网络模式。Docker 的默认网络配置是 "bridge",当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。

network_mode: bridge
network_mode: host"     --备注:没有自己的网络模式,跟宿主机共用一套ip地址,相当于在宿主机上安装了应用一样none"     --备注:没有网络,将网络创建的任务完全交给用户,可以通过 links 实现两个容器的单机互连service:[service name]"  --备注:跟某个服务复用网络container:[container name/id]--备注:跟某个容器复用网络
#自定义IP地址

  networks:
     cluster_net:
        ipv4_address: 172.16.238.101

    16、restart

指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。

四、寄语

    学习 Docker Compose 过程中,突然想起以前老师的教导:学习一样技能,心一定要放宽,没必要钻牛角尖,毕竟学习不是冲着要成为百科全书而去的,要不然要百科全书干嘛呢?学习应该是一件很开心快乐的事情,没必要吹毛求疵,比如说:一个用法有一堆命令可以达到目的,那我都要记下那一堆命令吗?比如说,一些罕见的用法,我也要过于追究吗?

 

参考资料:https://yeasy.gitbooks.io/docker_practice/content/compose/

相关文章

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Li...
1、什么是docker?答:docker是开源的应用容器引擎;开发人员把他们的应用及依赖包打包发布到容器当中。...
1、什么是namespace? 答:名称空间,作用隔离容器 2、namespace隔离有那些? 答:ipc:共享内存、消息队...
1、Docker能在非Linux平台(Windows+MacOS)上运行吗? 答:可以 2 、如何将一台宿主机的docker环境...
环境要求: IP hostname 192.168.1.1 node1 项目规划: 容器网段:172.16.10.0/24 NGINX:172.16.10.10...
文档上传地址:https://files.cnblogs.com/files/lin-strive/07-docker%E8%B7%A8%E4%B8%BB%E6%9C%BA%E7...