docker-Compose入门

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

Compose的使用步骤:

  1. 使用Dockerfile定义应用程序的环境
  2. 使用docker-compose.yml定义构成应用程序的服务
  3. 执行docker-compose up命令启动并运行整个应用程序。

Compose离线安装

去这里(https://github.com/docker/compose/releases)下载,当前latest release是1.27.4,我下载的是docker-compose-Linux-x86_64。

cd /usr/local/bin
sudo mv /mnt/shared/docker-compose-Linux-x86_64 docker-compose # 把我放在共享文件夹里的文件拖过来
sudo chmod +x docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 制作软连接
pxy@pxy-pc:~/Desktop$ docker-compose --version # 验证
docker-compose version 1.27.4, build 40524192

Compose使用

准备:alpine镜像和相关包

alpine是一个极简os镜像,当成ubuntu那么用就行,装包的时候用

apk add --no-cache [包名]

这里需要 py-pip, libffi-dev, openssl-dev, libc-dev, make, gcc 直接套上面的语句即可。记得commit

docker commit -m="new alpine" -a="pxy" 1091ed6e7827 pxy7896/python-alpine:385

准备:创建测试目录并加入一个app.py文件

目录结构:

pxy@pxy-pc:~/Desktop/composetest$ ll
total 144
drwxrwxr-x 2 pxy pxy   4096 12月 15 17:19 ./
drwxrwxrwx 9 pxy pxy 135168 12月 15 17:17 ../
-rw-rw-r-- 1 pxy pxy    514 12月 15 17:19 app.py
-rw-rw-r-- 1 pxy pxy     12 12月 15 17:19 requirements.txt

app.py内容为

import time
import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379) # 主机叫redis

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

requirements.txt的内容为:

flask
redis

创建Dockerfile文件

在当前目录下创建一个名为Dockerfile的文件,内容为:

FROM pxy7896/python-alpine:385
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

创建docker-compose.yml

内容为:

# yaml configuration
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

说明:该Compose文件定义了两个服务。
1.build指使用Dockerfile从当前目录中构建镜像。ports指:Flask Web服务器的默认端口是5000,这里是把容器和主机的5000端口绑定了。
2.redis服务使用DockerHub的公共Redis镜像。

使用Compose命令构建和运行应用

pxy@pxy-pc:~/Desktop/composetest$ docker-compose up
# 如果 docker-compose up -d 则是在后台运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

yml配置指令

version

指定本yml依照哪个compose版本制定。

build

指定构建镜像的上下文路径。也可以带参数。

version: "3.7"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod
标签说明
context上下文路径
dockerfile构建镜像的Dockerfile文件名
args这是只能在构建过程中访问的环境变量
labels标签
target多层构建,可以指定构建哪一层

cap_add cap_drop

添加或删除容器拥有的宿主机的内核功能。

cap_add:
  - ALL # 开启全部权限

cap_drop:
  - SYS_PTRACE # 关闭 ptrace权限(系统级进程监控相关服务)

cgroup_parent

容器将继承某组的资源限制。

cgroup_parent: m-executor-abcd

command

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

command: ["bundle", "exec", "thin", "-p", "3000"]

container_name

自定义容器名称,取代默认名称

container_name: my_name

depends_on

version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

在上例中,

命令说明
docker-compose up以依赖性顺序启动服务。上例中先启动db和redis,然后启动web。
docker-compose up SERVICE启动指定服务。自动包含service的依赖项。也就是说,docker-compose up web 表示还要创建并启动db和redis。
docker-compose stop按依赖关系顺序停止服务,比如web会在db和redis之前停止。

另外,web服务不会等redis和db完全启动后才启动。

deploy

只在swarm模式下起效。

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      mode:replicated
      replicas: 6
      endpoint_mode: dnsrr
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
参数说明
endpoint_modevip:所有的请求会通过一个虚拟ip到达集群服务内部的机器;dnsrr:所有请求会自动轮询获取到集群ip列表中的一个ip地址。
labels可以用与deploy同级的labels覆盖这里的labels
modereplicated:复制服务,复制指定服务到集群的机器上;global:全局服务,服务将部署到集群的每个节点
replicas上面mode=replicated时,这里指具体运行的节点数量
resources资源限制。上例表示cpu百分比和内存大小
restart_policy配置重启容器的方式

在这里插入图片描述
restart_policy:配置如何在退出容器时重新启动容器。

  • condition:可选 none,on-failure 或者 any(默认值:any)。
  • delay:设置多久之后重启(默认值:0)。
  • max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
  • window:设置容器重启超时时间(默认值:0)。

rollback_config:配置在更新失败的情况下应如何回滚服务。

  • parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
  • delay:每个容器组回滚之间等待的时间(默认为0s)。
  • failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
  • max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
  • update_config:配置应如何更新服务,对于配置滚动更新很有用。

parallelism:一次更新的容器数。

  • delay:在更新一组容器之间等待的时间。
  • failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
  • max_failure_ratio:在更新过程中可以容忍的故障率。
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。
    注:仅支持 V3.4 及更高版本。

devices

指定设备映射列表。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

dns

自定义dns服务器,可以是列表。

dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search

dns的搜索域,单个值或列表都可以。

dns_search: example.com

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

entrypoint

覆盖容器默认的entrypoint。

entrypoint: /code/entrypoint.sh
# 直接出命令也行
entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

env_file

从文件添加环境变量,可以单个值或者列表。

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

environment

布尔值需要加引号。

environment:
  RACK_ENV: development
  SHOW: 'true'

expose

暴露端口。参数是内部端口。

expose:
 - "3000"
 - "8000"

extra_hosts

添加主机名映射。类似docker client --add-host

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

以上会在此服务的内部容器中/etc/hosts创建一个ip地址和主机名的对应关系。

healthcheck

用于检测docker服务是否健康运行。

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
  interval: 1m30s # 设置检测间隔
  timeout: 10s # 设置检测超时时间
  retries: 3 # 设置重试次数
  start_period: 40s # 启动后,多少秒开始启动检测程序

image

值用名字、ID都可以。

logging

服务的日志记录配置。driver可以指定日志记录的驱动程序,默认是json-file。可选的是json-file syslog none。
1.达到文件限制上限时,自动删除旧文件。

logging:
  driver: json-file
  options:
    max-size: "200k" # 单个文件大小为200k
    max-file: "10" # 最多10个文件

2.指定日志接收地址

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

network_mode

在这里插入图片描述

restart

如果是swarm模式,需要使用restart_policy。

restart: "no" # 默认
restart: always
restart: on-failure # 非正常退出时重启
restart: unless-stopped # 容器退出时总是重启容器,但不重启在Docker守护进程启动时已经停止的容器

secrets

存储敏感数据,例如密码

version: "3.1"
services:

mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret

secrets:
  my_secret:
    file: ./my_secret.txt

security_opt

修改容器默认的schema标签。

security-opt:
  - label:user:USER   # 设置容器的用户标签
  - label:role:ROLE   # 设置容器的角色标签
  - label:type:TYPE   # 设置容器的安全策略标签
  - label:level:LEVEL  # 设置容器的安全等级标签

stop_signal

设置停止容器的替代信号,默认是使用SIGTERM的。

stop_signal: SIGUSR1

stop_grace_period

指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒。

stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒 

sysctls

设置容器中的内核参数。

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

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

tmpfs

在容器内安装一个临时文件系统。

tmpfs: /run

tmpfs:
  - /run
  - /tmp

ulimits

覆盖容器默认的ulimit

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

volumes

将主机的数据卷或文件挂载到容器里。

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值