阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

容器编排 Docker Compose

167次阅读
没有评论

共计 6338 个字符,预计需要花费 16 分钟才能阅读完成。

在我们启动容器的时候经常要使用 docker run 指定很多参数,当我们需要管理很多容器时,使用这样的方式会给我们的运维人员带来很大的负担,docker compose 容器编排工具无疑是解决这个一问题的利器。
Docker Compose 是用来管理多容器应用的工具,我们可以使用 compose file 文件来配置容器的应用和服务,编写好 compose file 文件以后,我们只需要使用一条简单的命令就可以创建并启动我们需要的应用。
使用 compose 一般有三个步骤:
1、编写 Dockerfile,定义镜像的构建参数。
2、编写 docker-compose.yml 文件,定义应用的挂载,环境变量,启动参数等。
3、执行 docker-compose up 命令,自动执行构建镜像并启动容器和应用。

安装 Compose
这里只介绍 Linux 环境下的安装。
执行如下命令:
curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

可以根据的自己的需求安装不同的版本,修改链接中的版本号即可。也可以直接去 https://github.com/docker/compose/releases 上下载需要的版本。
对文件添加执行权限:

chmod +x /usr/local/bin/docker-compose

安装完成后,执行 compose 命令验证是否安装成功:

# docker-compose –version
 
docker-compose version 1.14.0, build c7bdf9e

Compose file 常用语法介绍
compose 使用的是 YAML 格式的文件, 我们可以使用它来定义服务、网络和卷。compose file 的固定命名为 docker-compose.yml。
这里只列出常用的信息,具体用法参考:https://docs.docker.com/compose/compose-file/

build: 构建镜像,指定构建的路径,文件,源镜像等信息。
build:
  context: .            # 指定 Dockerfile 的构建路径,或者是一个 url 的 git 仓库地址
  dockerfile: Dockerfile-abcd  #可以指定 Dockerfile 的名称,如果不是默认名称时。
  args:    #添加构建参数,环境变量参数只能在构建过程中访问,使用时需要先在 Dockerfile 中定义。
    – buildno=1  #yaml 语法,‘=’两边不能有空格
    – password=secret #也可以使用列表的方式  ‘password: secret’

 command: 用于重新覆盖 Dockerfile 中的 COMMAND 命令。
command: COMMAND args

也可以使用列表的形式:
command: [“comand1”, “command2”]

devices: 映射宿主机的设备到容器中。

devices:
  – “/dev/ttyUSB0:/dev/ttyUSB0”

depends_on: 执行此模块的行为时,所依赖的其他模块必须已经完成。
services:
  web:
    build: .
    depends_on:
      – db
      – Redis
  redis:
    image: redis
  db:
    image: postgres

dns: 指定 dns.
12345 dns: 8.8.8.8
 
dns:
  – 8.8.8.8
  – 9.9.9.9

env_file: 从文件中添加环境变量参数。如果您使用 docker-compose -f FILE 指定了一个 Compose 文件,则 env_file 中的路径与文件所在的目录相关。
env_file: .env
 
env_file:
  – ./common.env
  – ./apps/web.env
  – /opt/secrets.env

expose: 暴露端口而不将它们发布到主机 – 它们只能被链接服务访问。只能指定内部端口。
expose:
 – “3000”
 – “8000”

image: 指定要从中启动容器的镜像,可以是存储库 / 标签或部分映像 ID, 如果有指定 build 行为,会自动为新构建的镜像打上此标签和命名(默认的 v1 版本中 build 和 image 关键字不能同时存在,需要指定 v2 或 v3 版本)。
image: redis
image: Ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

links: 链接到另一个服务中的容器。请同时指定服务名称和链接别名(SERVICE:ALIAS),或仅指定服务名称。
logging: 日志服务。支持三种日志驱动,json-file, syslog, none. 默认的为 json-file.
logging:
  driver: syslog
  options:
    syslog-address: “tcp://192.168.0.42:123”

services:
  some-service:
    image: some-service
    logging:
      driver: “json-file”
      options:
        max-size: “200k”    # 日志文件最大不超过 200K
        max-file: “10”      # 日志文件最多不超过 10 个

network_mode: 指定网络模式。与使用 docker 命令的 -net 参数一样。
network_mode: “bridge”
network_mode: “host”
network_mode: “none”

networks: 指定所要加入的网络。
IPV4_ADDRESS:指定加入这个网络的 IP 地址。
12345 services:
  some-service:
    networks:
    – some-network
    – other-network

services:
  app:
    image: busybox
    command: ifconfig
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10
networks:
  app_net:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
      –
        subnet: 172.16.238.0/24
      –
        subnet: 2001:3984:3989::/64

ports: 对外开放的端口。
短语法模式:

ports:
 – “3000”
 – “3000-3005”
 – “8000:8000”
 – “9090-9091:8080-8081”
 – “49100:22”
 – “127.0.0.1:8001:8001”
 – “127.0.0.1:5000-5010:5000-5010”
 – “6060:6060/udp”

长语法模式(版本 v3.2):
target:容器内部端口
published:对外暴露的端口
protocol:协议类型
mode:  host 用于在每个节点上发布主机端口的主机,或将要进行负载均衡的群模式端口的入口。
 ports:
  – target: 80
    published: 8080
    protocol: tcp
    mode: host

vlumes: 挂载宿主机目录,或命名卷。
短语法:
volumes:
  # Just specify a path and let the Engine create a volume
  – /var/lib/MySQL
  # Specify an absolute path mapping
  – /opt/data:/var/lib/mysql
  # Path on the host, relative to the Compose file
  – ./cache:/tmp/cache
  # User-relative path
  – ~/configs:/etc/configs/:ro
  # Named volume
  – datavolume:/var/lib/mysql

长语法(v3.2):

 volumes:
  – type: volume
    source: mydata
    target: /data
    volume:
      nocopy: true
  – type: bind
    source: ./static
    target: /opt/app/static

restart: 定义自启动。
restart: “no”
restart: always
restart: on-failure
restart: unless-stopped

domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir:指定属性。与使用 docker run 指定参数功能一样。
1234567891011 user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
privileged: true
read_only: true
shm_size: 64M
stdin_open: true
tty: true

使用 compose 制作 nginx-web 容器
这里用一个简单的示例说明 docker-compose file 的用法。
安装好 docker 以及 docker-compose, 从官方下载 CentOS 镜像:
docker pull centos

1、选择一个构建目录,创建 Dockerfile:
mkdir web
cd web
mkdir log      # 用于挂载容器的日志目录
vim Dockerfile

Dockerfile 内容:
FROM centos
MAINTAINER trying tryingstuff@163.com
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install nginx -y
RUN sed -i ‘N;6adaemon off;’ /etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD [“nginx”]

修改默认的 nginx.conf 配置为 daemon off,具体的原因可参考之前的 Docker 构建镜像
添加 index.html 文件:
echo “this is Compose test!” > index.html

2、创建 docker-compose.yml
vim docker-compose.yml

version: ‘2’
services:
  web-nginx:
    build: .
    image: trying/nginx-com:v1 
    ports:
    – “80:80”
    volumes:
    – ./log:/var/log/nginx
    container_name: web-compose
    command: [“nginx”]

文件说明:
a. 指定 compose 版本为 v2, 建议使用 v2 或 v3 版本,如果不指定,默认会使用 v1 版本,语法会不兼容。
b. web-nginx 定义了服务的名称,如果没有后面 image 参数指定,镜像名称会默认以 当前路径_服务名 命名如(web_web-nginx)。
c. build: . 表示构建路径为当前路径。
d. image 指定了构建之后的镜像名称,如果没有 build 行为,则表示当前镜像库中已有的镜像。
e. ports 表示映射端口 宿主机端口:容器端口
f. volumes 表示容器挂载的宿主机目录。

3、在当前目录运行 docker-compose 命令, 如果不使用 -d 选项,compose 运行之后会一直驻留在前台,终止 compose 后容器也会停止。

docker-compose up -d

4、构建完成后,查看镜像:

# docker images
REPOSITORY          TAG                IMAGE ID            CREATED            SIZE
trying/nginx-com    v1                  ec2f0106598a        21 minutes ago      401 MB
centos              latest              36540f359ca3        13 days ago        193 MB

查看容器:
# docker ps
CONTAINER ID        IMAGE                COMMAND            CREATED            STATUS              PORTS                NAMES
eac73ff1bbef        trying/nginx-com:v1  “nginx”            22 minutes ago      Up 22 minutes      0.0.0.0:80->80/tcp  web-compose

查看服务状态(另一台主机上使用 curl):
# curl 192.168.60.18
this is Compose test!

查看宿主机日志:
# cat log/access.log 
192.168.60.19 – – [19/Jul/2017:05:16:38 +0000] “GET / HTTP/1.1” 200 29 “-” “curl/7.29.0” “-“

Dockerfile 和 docer compose 支持的参数远不止这些。

更多 Docker 相关教程见以下内容

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

Ubuntu 16.04 服务器上配置使用 Docker  http://www.linuxidc.com/Linux/2017-06/145176.htm

Ubuntu 15.04 下安装 Docker  http://www.linuxidc.com/Linux/2015-07/120444.htm

Docker 安装实例 http://www.linuxidc.com/Linux/2017-04/142666.htm

Docker 创建基础镜像  http://www.linuxidc.com/Linux/2017-05/144112.htm

在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm

Ubuntu 16.04 上 Docker 使用手记 http://www.linuxidc.com/Linux/2016-12/138490.htm

使用 Docker 分分钟启动常用应用  http://www.linuxidc.com/Linux/2017-04/142649.htm

Ubuntu 16.04 下 Docker 修改配置文件不生效解决办法  http://www.linuxidc.com/Linux/2017-05/143862.htm 

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-08/146131.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计6338字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中