深信服技术认证之Docker-Compose的使用

Docker-Compose简介

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层,分别是项目(project),服务(service)以及容器(container)。

Docker-Compose运行目录下的所有文件组成一个项目,若无特殊指定项目名即为当前目录名。

一个项目当中可包含多个服务(service),每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例。

Docker-Compose的项目配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Docker-Compose常用命令

docker-compose命令格式

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

命令选项如下

-f --file FILE指定Compose模板文件,默认为docker-compose.yml -p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名 --verbose 输出更多调试信息 -v,-version 打印版本并退出 --log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)

docker-compose up

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

Docker-compose模板文件

Docker-compose模板文件简介

Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。 Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。

version: '2' services: web: image: dockercloud/hello-world ports: - 8080 networks: - front-tier - back-tier redis: image: redis links: - web networks: - back-tier lb: image: dockercloud/haproxy ports: - 80:80 links: - web networks: - front-tier - back-tier volumes: - /var/run/docker.sock:/var/run/docker.sock networks: front-tier: driver: bridge back-tier: driver: bridge

version

Compose目前有三个版本分别为Version 1,Version 2,Version 3。

Version 2支持更多的指令。Version 1将来会被弃用。

image

image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

services: web: image: hello-world

build

服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。

build: /path/to/build/dir

也可以是相对路径,只要上下文确定就可以读取到Dockerfile。

build: ./dir

设定上下文根目录,然后以该目录为准指定Dockerfile。

build: context: ../ dockerfile: path/of/Dockerfile

build都是一个目录,如果要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定。如果同时指定image和build两个标签,那么Compose会构建镜像并且把镜像命名为image值指定的名字。

commond

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

command: bundle exec thin -p 3000

container_name

Compose的容器名称格式是:<项目名称><服务名称><序号> 可以自定义项目名称、服务名称,但如果想完全控制容器的命名,可以使用标签指定:

container_name: app

volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。 Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。

volumes: - ./www:/var/www/html/

depends_on

在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题

version: '2' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres

上述YAML文件定义的容器会先启动redis和db两个服务,最后才启动web 服务。

ports

ports用于映射端口的标签。 使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

ports: - "8000:8000" - "49100:22"

links

链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”(如 SERVICE:ALIAS),例如:

links: - db - db:database - redis

networks

设置网络模式。

Docker-Compose实例

docker-compose.yml

version: '2' services: php7.2-apache-mysql: build: ./ volumes: - ./www:/var/www/html/ ports: - "8888:80" links: - mysql mysql: build: ./mysql/ environment: - MYSQL_ROOT_PASSWORD=root

Dockerfile

FROM php:7.2-apache RUN set -xe \ && apt-get update \ && apt-get install -y vim && apt-get install -y wget RUN set -xe \ && docker-php-ext-install pcntl \ && docker-php-ext-install posix \ && docker-php-ext-install pdo pdo_mysql \ && docker-php-ext-install mysql mysqli

Dockerfile

FROM mysql:5.7 COPY ./db.sql /docker-entrypoint-initdb.d/

Docker-Compose使用过程中的一些问题

docker network id

在使用docker-compose up -d构建容器时,会生成一条自定义bridge网络。

Docker 默认支持 30 个不同的自定义 bridge 网络,如果超过这个限制,就会出现如下错误。

Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network tmpfs

需要在一个主机环境下使用docker-compose构建多个项目时,可通过将所有项目存放入一个自定义网络来解决资源问题。

docker network create --subnet 172.18.0.1/16 compose_network

在docker-compose.yml中添加networks

version: '2' networks: compose_network: external: true services: php-apache-mysql: build: ./ volumes: - ./www:/var/www/html/ ports: - "3027:80" links: - mysql networks: - compose_network mysql: build: ./mysql/ environment: - MYSQL_ROOT_PASSWORD=root networks: - compose_network

MySQL

MySQL 默认是启用 innodb_use_native_aio,使用异步 IO 操作,MySQL 启动时所需 aio slot 若超过系统当前 fs.aio-max-nr 设置,则无法启动。通过docker logs 可以查看到报错

InnoDB: io_setup() failed with EAGAIN after 5 attempts.

使用cat /proc/sys/fs/aio-max-nr,能够查看到当前的aio-max-nr的值一般为65536(64k个)

上述文件无法直接编辑,需修改

sudo vim /etc/sysctl.conf

增添一行

fs.aio-max-nr=524288

运行命令改动

sysctl -p

Docker常用命令

启动所有的容器命令

docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

关闭所有的容器命令

docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

所有容器开机自启动

docker update --restart=always $(docker ps -a | awk '{ print $1}' | tail -n +2)

自定义网络

docker network create --subnet=172.20.0.0/16 extnetwork

查询并删除所有容器

docker stop $(docker ps -q) & docker rm $(docker ps -aq)

查询并删除所有images

docker rmi `docker images -q`

docker执行脚本

docker run -it --privileged=true id /bin/bash -c 'sh ./init.sh'

docker挂载目录

docker run -d -v /opt/docker/webapps:/www/webapp

进入容器池

docker exec -it id /bin/bash

向容器中拷贝文件

docker cp 目录 id:目录

重构镜像

docker commit 容器id 镜像名

作者:李忻蔚,深信服安全服务认证专家,产业教育中心资深讲师,曾担任国内知名网络安全公司的威胁情报工程师、渗透测试工程师、安全讲师。多年来为政府部门进行安全培训,安全服务;多次参与国家级、省级攻防比武出题、保障任务,擅长Web安全,渗透测试与内网渗透方向。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值