Compose简要介绍安装使用,Docker基础资料

一、概念

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

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

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

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

Docker基础资料

Docker-Compose简介安装使用

[TOC]

二、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:查看各个容器内运行的进程

安装docker

1 简介

Github源码
官方文档和示例

Compose is a tool for defining and running multi-container Docker
applications. With Compose, you use a YAML file to configure your
application’s services. Then, with a single command, you create and
start all the services from your configuration.

Compose是定义和运行多容器Docker应用程序的工具,使用Compose,您可以使用YAML文件来配置应用程序的服务,然后,使用单个命令创建并启动配置中的所有服务

Dockerfile 可以让用户管理一个单独的应用容器。使用Docker
Compose,不再需要使用shell脚本来启动容器。在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器

三、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)等来自动构建生成镜像。

$ sudo apt-get install docker.io

2 安装

方法一:

$curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$chmod +x /usr/local/bin/docker-compose
#查看版本
$docker-compose version

方法二:用pip方式安装(备用)

#安装pip
$yum -y install epel-release
$yum -y install python-pip
#确认版本
$pip --version
#更新pip
$pip install --upgrade pip
#安装docker-compose
$pip install docker-compose 
#查看版本
$docker-compose version

    1、build

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

version: '3'
services:

  webapp:
    build: ./dir

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

version: '3'
services:

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

查看本地已有镜像

3 使用

    2、image“

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

version: '3'
services:

  redis:
    image: "redis:alpine"

$ sudo docker images

3.1 docker-comose命令

docker-compose [SUBCOMMAND]完整的命令列表如下—–
官网

SUBCOMMAND 解释
build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器服务(-d:后台启动)

备注:执行以上的命令大多数要在docker-compose.yml文件同级目录中

    3、cap_add, cap_drop

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

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

安装 docker-compose

3.2 docker-compose.yml 文件

示例:参考(Docker Compose
配置文件详解)

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

可以看到一份标准配置文件应该包含 versionservicesnetworks
三大部分,其中最关键的就是 services 和 networks 两个部分,下面先来看
services 的书写规则。

    4、command

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

command: echo "hello world"

$ sudo apt-get install -u docker-compose

1. image

services:
  web:
    image: hello-world

在 services 标签下的第二级标签是
web,这个名字是用户自己自定义,它就是服务名称
image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose
将会尝试拉取这个镜像。
例如下面这些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

    5、depends_on

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

version: '3'
services:

  web:
    build: .
    depends_on:
     - redis

  redis:
    image: "redis:alpine"

查看 docker-compose 信息

2. build

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

build: /path/to/build/dir

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

build: ./dir

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

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

注意 build 都是一个目录,如果你要指定 Dockerfile 文件需要在 build
标签的子级标签中使用 dockerfile 标签指定,如上面的例子。
如果你同时指定了 image 和 build 两个标签,那么 Compose
会构建镜像并且把镜像命名为 image
后面的那个名字。如下:镜像名称会是webapp:tag

build: ./dir
image: webapp:tag

既然可以在 docker-compose.yml 中定义构建任务,那么一定少不了 arg
这个标签,就像 Dockerfile 中的 ARG
指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在
docker-compose.yml 文件中也支持这样的写法:

build:
  context: .
  args:
    buildno: 1
    password: secret

下面这种写法也是支持的,一般来说下面的写法更适合阅读

build:
  context: .
  args:
    - buildno=1
    - password=secret

与 ENV 不同的是,ARG 是允许空值的。例如:

args:
  - buildno
  - password

这样构建过程可以向它们赋值。

注意:YAML 的布尔值(true, false, yes, no, on,
off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。

    6、expose

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

expose:
 - "3000"
 - "8000"

$ docker-compose -h

3. command

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

command: bundle exec thin -p 3000

也可以写成类似 Dockerfile 中的数组格式:

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

    7、ports

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

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

将用户加入docker组

4. container_name

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

container_name: app

这样容器的名字就指定为 app 了。

    8、ulimits

指定容器的 ulimits 限制值。

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

$ sudo groupadd docker

5. depends_on

在使用 Compose
时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。
例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是
depends_on,这个标签解决了容器的依赖、启动先后的问题。
例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:

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

注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web
服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。

     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

$ sudo gpasswd -a {USER} docker

6. dns

和 –dns 参数一样用途,格式如下:

dns: 8.8.8.8

也可以是一个列表:

dns:
  - 8.8.8.8
  - 9.9.9.9

此外 dns_search 的配置也类似:

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

    10、environment

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

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

$ sudo service docker restart

7. tmpfs

挂载临时目录到容器内部,与 run 的参数一样效果:

tmpfs: /run
tmpfs:
  - /run
  - /tmp

    11、extra_hosts

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

extra_hosts:
 - "googledns:8.8.8.8"
 - "dockerhub:52.1.157.61"

— 添加完成重启机器

8. entrypoint

在 Dockerfile 中有一个指令叫做 ENTRYPOINT
指令,用于指定接入点,第四章有对比过与 CMD 的区别。
在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义:

entrypoint: /code/entrypoint.sh

格式和 Docker 类似,不过还可以写成这样:

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

    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"

登录

9. env_file

还记得前面提到的 .env 文件吧,这个文件可以设置 Compose
的变量
。而在 docker-compose.yml 中可以定义一个专门存放变量的文件。
如果通过 docker-compose -f FILE 指定了配置文件,则 env_file
中路径会使用配置文件路径。

如果有变量名称与 environment 指令冲突,则以后者为准。格式如下:

env_file: .env

或者根据 docker-compose.yml 设置多个:

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

注意的是这里所说的环境变量是对宿主机的 Compose
而言的,如果在配置文件中有 build
操作,这些变量并不会进入构建过程中,如果要在构建中使用变量还是首选前面刚讲的
arg 标签。

    13、sysctls

配置容器内核参数。

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

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

$ docker login local-dtr.patsnap.com

10. environment

与上面的 env_file 标签完全不同,反而和 arg
有几分类似,这个标签的作用是设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置,这是与
arg 最大的不同。
一般 arg 标签的变量仅用在构建过程中。而 environment 和 Dockerfile
中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e
的效果。

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

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

    14、volumes

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

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

Username (local): local

11. expose

这个标签与Dockerfile中的EXPOSE指令一样,用于指定暴露的端口,但是只是作为一种参考,实际上docker-compose.yml的端口映射还得ports这样的标签。

expose:
 - "3000"
 - "8000"

    15、network_mode 

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

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

  networks:
     cluster_net:
        ipv4_address: 172.16.238.101

Password: patsnaplocal

12. external_links

在使用Docker过程中,我们会有许多单独使用docker
run启动的容器,为了使Compose能够连接这些不在docker-compose.yml中定义的容器,我们需要一个特殊的标签,就是external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。
格式如下:

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

    16、restart

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

利用 Dockerfile 创建镜像

13. extra_hosts

添加主机名的标签,就是往/etc/hosts文件中添加一些记录,与Docker
client的–add-host类似:

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

启动之后查看容器内部hosts:

162.242.195.82  somehost
50.31.209.229   otherhost

四、寄语

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

 

参考资料:https://yeasy.gitbooks.io/docker\_practice/content/compose/


Dockerfile中每条指令都创建镜像的一层,一般Dockerfile分为四部分:基础镜像信息/维护者信息/镜像操作指令/容器启动时执行的指令。如:

14. 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"

#patsnap-course-project

15. links

还记得上面的depends_on吧,那个标签解决的是启动顺序问题,这个标签解决的是容器连接问题,与Docker
client的–link一样效果,会连接到其它服务中的容器。
格式如下:

links:
 - db
 - db:database
 - redis

使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:

172.12.2.186  db
172.12.2.186  database
172.12.2.187  redis

相应的环境变量也将被创建。

FROM local-dtr.patsnap.com/patsnap/base:php5.5.30nginxnode-v1.4

16. logging

这个标签用于配置日志服务。格式如下:

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

默认的driver是json-file。只有json-file和journald可以通过docker-compose
logs显示日志,其他方式有其他日志查看方式,但目前Compose不支持。对于可选值可以使用options指定。
有关更多这方面的信息可以阅读官方文档:
https://docs.docker.com/engine/admin/logging/overview/

ADD deployment/nginx/conf/conf.d/* /usr/local/nginx/conf/conf.d/

17. pid

pid: "host"

将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间。

ADD deployment/changeenv.sh /config/init/

18. ports

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

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。

RUN mkdir -p /data/patsnap

19. security_opt

为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签。比如设置全部服务的user标签值为USER。

security_opt:
  - label:user:USER
  - label:role:ROLE

VOLUME [/data/patsnap]

20. stop_signal

设置另一个信号来停止容器。在默认情况下使用的是SIGTERM停止容器。设置另一个信号可以使用stop_signal标签。

stop_signal: SIGUSR1

EXPOSE 10050 80

21. volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]
这样的格式,或者使用 [HOST:CONTAINER:ro]
这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。
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

如果你不使用宿主机的路径,你可以指定一个volume_driver。

volume_driver: mydriver

Dockerfile基本语法:

22. volumes_from

从其它容器或者服务挂载数据卷,可选的参数是 :ro或者
:rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的。

volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

— #        ×用来注释

23. cap_add, cap_drop

添加或删除容器的内核功能。详细信息在前面容器章节有讲解,此处不再赘述。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

— FROM   
指令告诉Docker使用那个镜像作为基础,第一条指令必须为FROM指令。

24. cgroup_parent

指定一个容器的父级cgroup。

cgroup_parent: m-executor-abcd

并且,如果在同一个dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)

25. devices

设备映射列表。与Docker client的–device参数类似。

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

— RUN     
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。

26. extends

这个标签可以扩展另一个服务,扩展内容可以是来自在当前文件,也可以是来自其他文件,相同服务的情况下,后来者会有选择地覆盖原有配置。

extends:
  file: common.yml
  service: webapp

用户可以在任何地方使用这个标签,只要标签内容包含file和service两个值就可以了。file的值可以是相对或者绝对路径,如果不指定file的值,那么Compose会读取当前YML文件的信息。
更多的操作细节在后面的12.3.4小节有介绍。

格式RUN 或RUN [“executable”, “param1”, “param2”],

27. network_mode

网络模式,与Docker
client的–net参数类似,只是相对多了一个service:[service name]
的格式。
例如:

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]

可以指定使用服务或者容器的网络。

前者将在shell终端运行命令,即/bin/sh -C;后者则使用exec执行。

28. networks

加入指定网络,格式如下:

services:
  some-service:
    networks:
     - some-network
     - other-network

关于这个标签还有一个特别的子标签aliases,这是一个用来设置服务别名的标签,例如:

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

相同的服务可以在不同的网络有不同的别名。

指定使用其他终端可以通过第二种方式实现,例如:RUN [“/bin/bash”, “-c”,
“echo hello”]。

29. 其它

还有这些标签:cpu_shares, cpu_quota, cpuset, domainname, hostname,
ipc, mac_address, mem_limit, memswap_limit, privileged, read_only,
restart, shm_size, stdin_open, tty, user, working_dir
上面这些都是一个单值的标签,类似于使用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

— CMD     
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如指定多条命令,只有最后一条会被执行。

4 note

— ENV     
指定一个环境变量,会被后续RUN指令使用,并在容器运行时保存。格式:ENV

4.1 docker run和docker-compose up

note:docker run 是创建新的容器 而docker-compose up
是会使用旧容器(如果存在的话)

官网介绍:

Preserve volume data when containers are created

Compose preserves all volumes used by your services. When
docker-compose up runs, if it finds any containers from previous runs,
it copies the volumes from the old container to the new container.
This process ensures that any data you’ve created in volumes isn’t
lost.

docker-compose只会为每个镜像维护一个实例,每次运行docker-compose up的时候,compose会查找之前的容器,把旧容器的volume-data拷贝到容器中。除非手动用docker rm命令删除容器,否则CONTAINER
ID
不会发生改变。

这和docker run [images name]不一样,这个命令每次运行会新生成一个镜像的实例,即新容器,它们对应的CONTAINER
ID
也各不相同

— ADD     
该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径;

4.2 容器命名

docker-compose up -d
创建的容器的名字:是由docker-compose.yml的文件目录名加文件中指定的名字作为前缀,使用数字作为后缀
ex:
cluster/docker-compose.yml

docker-compose.yml中指定两个服务:

web:
   image:
   command:
   ....
redis:
    image:
    command:
   ....

则创建的服务容器名为:cluster_web_1和cluster_redis_1

也可以是一个URL;还可以是一个tar文件(自动解压为目录)。

参考

1 Get started with Docker
Compose

2
开始使用Docker-compose

3
快速入门:Compose和Django

4 快速入门:Compose
Rails

5 快速入门:Compose
WordPress

6
常见问题

7
Compose命令行参考

8
Compose文件版本3参考

9 Docker Compose 配置文件详解


                           2017-12-8-Boy

格式:ADD

— EXPOSE  告诉Docker服务段容器暴露的端口号,供互联系统使用。

在启动容器时需要通过-P,Docker主机会自动分配一个短裤转发到指定的端口。

格式:EXPOSE […]

— VOLUME 
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保存的数据等。

格式:VOLUME [“/data”]。

创建镜像

编写完成Dockerfile之后,可以通过docker build
命令来创建镜像。格式:docker build [选项] 路径;
该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所以内容发送给Docker服务器,由服务器端来创建镜像。
因此一般建议放置Dockerfile的目录为空目录。也可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过-t选项,如:

如果在docker run
后面追加-d=true或者-d,则containter将会运行在后台模式(Detached
mode)。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为container不再监听你执行docker
run的这个终端命令行窗口。但你可以通过执行docker attach
来重新挂载这个container里面。需要注意的时,如果你选择执行-d使container进入后台模式,那么将无法配合”–rm”参数。

$ docker build -t basedocker .

$ docker run -d -p [PORT]:[PORT] –name [DockerName]
[IMAGE][:TAG]

部署应用

Docker Compose是Docker官方编排项目之一,负责快速在集群中部署分布式应用。
Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个project,即项目)。docker-compose.yml是Compose使用的主模板文件
默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image
指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。
其它大部分指令都跟 docker run 中的类似。 如果使用 build 指令,在
Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等)
将会自动被获取,无需在 docker-compose.yml 中再次设置。

docker-compose.yml语法说明:

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

build      指定 Dockerfile 所在文件夹的路径。 Compose
将会利用它自动构建这个镜像,然后使用这个镜像。

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

links      链接到其它服务中的容器。使用服务名称或服务名称:服务别名
(SERVICE:ALIAS) 格式都可以。

ports      暴露端口信息。使用宿主:容器
(HOST:CONTAINER)格式或者仅仅指定容器的端口都可以。

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

volumes    卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER)
或加上访问模式 (HOST:CONTAINER:ro)。

environment
设置环境变量。你可以使用数组或字典两种格式。只给定名称的变量会自动获取它在
Compose 主机上的值,

可以用来防止泄露不必要的数据。

env_file    从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过 docker-compose -f FILE 指定了模板文件,则 env_file
中路径会基于模板文件路径。

如果有变量名称与 environment 指令冲突,则以后者为准。

Compose 命令说明:

基本格式:docker-compose [options] [COMMAND] [ARGS…]

选项:

–verbose 输出更多调试信息。

–version 打印版本并退出。

-f, –file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml。

-p, –project-name NAME 指定项目名称,默认使用目录名称。

docker-compose命令:

build  构建或重新构建服务。服务一旦构建后,将会带上一个标记名,例如
web_db。

可以随时在项目目录下运行 docker-compose build 来重新构建服务。

kill    通过发送 SIGKILL
信号来强制停止服务容器。支持通过参数来指定发送的信号,

例如:$ docker-compose kill -s SIGINT

logs    查看服务的输出。

port    打印绑定的公共端口。

ps      列出所有容器。

pull    拉取服务镜像。

rm      删除停止的服务容器。

run    在一个服务上执行一个命令。

start  启动一个已经存在的服务容器。

stop    停止一个已经运行的容器,但不删除它。

up     
构建,(重新)创建,启动,链接一个服务相关的容器。链接的服务都将会启动,除非他们已经运行。

默认情况, docker-compose up
将会整合所有容器的输出,并且退出时,所有容器将会停止。

如果使用 docker-compose up -d ,将会在后台启动并运行所有的容器。

默认情况,如果该服务的容器已经存在, docker-compose up
将会停止并尝试重新创建他们,

以保证 docker-compose.yml 的修改生效。

如果你不想容器被停止并重新创建,可以使用 docker-compose up
–no-recreate。

如果需要的话,这样将会启动已经停止的容器。

docker 命令帮助

$ sudo docker

attach    # 当前 shell 下 attach 连接指定运行镜像

build    # 通过 Dockerfile 定制镜像

commit    # 提交当前容器为新的镜像

cp        # 从容器中拷贝指定文件或者目录到宿主机中

create    # 创建一个新的容器,同 run,但不启动容器

diff      # 查看 docker 容器变化

events    # 从 docker 服务获取容器实时事件

exec      # 在已存在的容器上运行命令

export    # 导出容器的内容流作为一个 tar 归档文件[对应 import ]

history  # 展示一个镜像形成历史

images    # 列出系统当前镜像

import    # 从tar包中的内容创建一个新的文件系统映像[对应 export]

info      # 显示系统相关信息

inspect  # 查看容器详细信息

kill      # kill 指定 docker 容器

load      # 从一个 tar 包中加载一个镜像[对应 save]

login    # 注册或者登陆一个 docker 源服务器

logout    # 从当前 Docker registry 退出

logs      # 输出当前容器日志信息

port      # 查看映射端口对应的容器内部源端口

pause    # 暂停容器

ps        # 列出容器列表

pull      # 从docker镜像源服务器拉取指定镜像或者库镜像

push      # 推送指定镜像或者库镜像至docker源服务器

restart  # 重启运行的容器

rm        # 移除一个或者多个容器

rmi      #
移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或
-f 强制删除]

run      # 创建一个新的容器并运行一个命令

save      # 保存一个镜像为一个 tar 包[对应 load]

search    # 在 docker hub 中搜索镜像

start    # 启动容器

stop      # 停止容器

tag      # 给源中镜像打标签

top      # 查看容器中运行的进程信息

unpause  # 取消暂停容器

version  # 查看 docker 版本号

wait      # 截取容器停止时的退出状态值

运行’docker COMMAND –help’查看更多帮助

进入Docker容器

$ docker ps

$ docker exec -it 775c7c9ee1e1 /bin/bash

查看nignx配置

$ cd /usr/local/nginx/conf/conf.d/

$ vi course.conf

停止进程,配置环境

$ docker exec -it 9d bash

$ supervisorctl stop webpack

$ npm start

This entry was posted in ca88会员登录入口 and tagged . Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用*标注