docker-compose

https://www.cnblogs.com/embedded-linux/p/10714179.html

需要学习使用一下. 

改天自己再改改用过的yaml文件. 
 

docker-compose用于定义和运行多个docker容器。采用YAML文件配置应用服务,可从配置文件启动相关服务,一条命令可以启动多个容器。

docker-compose应用

compose将所管理的容器分为三层:工程(project)、服务(service)、容器(container)。compose运行目录下的所有文件组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包含多个容器实例。

应用compose一般分为3步:

  1. 用Dockerfile定义app环境,使app可以在任何地方reproduced。

  2. 用docker-compose.yml定义services,使相关services在隔离环境下一起运行。

  3. docker-compose up,启动compose和整个apps。

一个docker-compose.yml示例如下:

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

compose特性:

  1. 单主机上隔离环境,compose工程间相互独立。用命令行选项-p或COMPOSE_PROJECT环境变量定义工程名。

  2. 容器创建时保留volume上数据。

  3. 仅仅在容器改变时再创建容器。compose缓存了配置,restart时compose re-use存在的未改变的容器。

  4. compose file支持变量,可以通过变量为不同环境定制composition。

docker-compose安装

目前docker-compose可以安装到macOS,Windows和64-bit Linux系统下。

linux下镜像位于 Compose repository release page on GitHub,安装方法如下:

sudo curl -L"https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)"-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose version 1.24.0, build 1110ad01

若要安装其他版本可以修改版本号1.24.0。

或pip安装:

pip install docker-compose

卸载compose:

sudo rm /usr/local/bin/docker-compose

或pip卸载(加入compose用pip安装的话):

pip uninstall docker-compose

docker-compse命令行

Define and run multi-container applications with Docker.

Usage:

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

docker-compose -h|--help

Options:

-f, --file FILE Specify an alternate compose file (default: docker-compose.yml),env:COMPOSE_FILE

-p, --project-name NAME Specify an alternate project name (default: directory name),env:COMPOSE_PROJECT_NAME

--verbose Show more output

--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)

--no-ansi Do not print ANSI control characters

-v, --version Print version and exit

-H, --host HOST Daemon socket to connect to

--tls Use TLS; implied by --tlsverify

--tlscacert CA_PATH Trust certs signed only by this CA

--tlscert CLIENT_CERT_PATH Path to TLS certificate file

--tlskey TLS_KEY_PATH Path to TLS key file

--tlsverify Use TLS and verify the remote

--skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate

--project-directory PATH Specify an alternate working directory (default: the path of the Compose file)

--compatibility If set, Compose will attempt to convert deploy keys in v3 files to their non-Swarm equivalent

Commands:

build Build or rebuild services

bundle Generate a Docker bundle from the Compose file

config Validate and view the Compose file

create Create services

down Stop and remove containers, networks, images, and volumes

events Receive real time events from containers

exec Execute a command in a running container

help Get help on a command

images List images

kill Kill containers

logs View output from containers

pause Pause services

port Print the public port for a port binding

ps List containers

pull Pull service images

push Push service images

restart Restart services

rm Remove stopped containers

run Run a one-off command

scale Set number of containers for a service

start Start services

stop Stop services

top Display the running processes

unpause Unpause services

up Create and start containers

version Show the Docker-Compose version information

最常用的命令是docker-compose updocker-compose up -d(后台运行)。

docker-compose -f docker-compose.yaml up -d
docker-compose -f docker-compose.yaml up -d consul

up/run/start区别:

docker-compose up用于start或restart所有定义在docker-compose.yml内的服务。

docker-compose run用于一次性或临时的任务,类似docker run -it(打开交互终端执行命令后退出并返回容器的退出状态)。

docker-compose start用于restart原来创建但停止的容器,绝不会创建新容器。

logs:日志输出信息

--no-color 单色输出,不显示其他颜.
-f, --follow 跟踪日志输出,就是可以实时查看日志
-t, --timestamps 显示时间戳
--tail 从日志的结尾显示,--tail=200

更新容器

当服务的配置发生更改时,可使用docker-compose up命令更新配置。此时,compose会删除旧容器并创建新容器,新容器会以不同的IP地址加入网络,名称保持不变,任何指向旧容器的连接都会被关闭,重新找到新容器并连接上去。

compose file

compose配置文件的格式有多个版本:1,2,2.x和3.x,不同docker版本对应不同版本compose file。Compose file是YAML文件,用于定义services、networks和volumes,默认为./docker-compose.yml。详细语法介绍可参考:Compose file version 3 reference

YAML(Yet Another Markup Language),是一个JSON的超集,意味着任何有效JSON文件也都是一个YAML文件。它规则如下:

1)大小写敏感

2)使用缩进表示层级关系,但不支持tab缩进,只支持空格

3)缩进的数量不重要但至少一个空格,只要相同层级使用相同数量的空格即可

4)“#”表示注释,从这个字符开始,直到行末,都会被解析器无视

compose的YAML只使用两种类型:Maps和Lists,Maps的子项可以是Lists,Lists的子项也可以是Maps。

Maps:就是一个字典,即key:value的键值对。

image: postgres

Lists:就是一个列表。

ports:
  - "8000"
  - "8080"
  - "8090"

我们可以看到,可以有任何数量的项在列表中,项的定义以破折号(-)开头,并且和父元素之间存在缩进。

版本3的compose file示例如下:

version: "3"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:

一个标准配置文件应该包含versionservicesnetworksvolumes四大部分,处于top层。其他包含的子项(sub-options)要相应缩进。

docker-compose.yml定义的每个服务都必须通过image指定指定镜像或build指令(需要Dockerfile)来自动构建。Dockerfile指定的选项,默认情况下会被compose自动获取不需要在compose文件中指定。

》version:指定docker-compose.yml文件的写法格式(版本)

》services:多个容器的集合

》image:指定服务的镜像名称或镜像ID。如果镜像在本地不存在,compose会尝试拉取这个镜像。

services:
  web:
    image: nginx

在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。

》build:配置构建时,compose会利用它来自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定Dockfile参数。

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

depends_on:容器依赖,解决启动先后顺序问题。

command:覆盖容器启动后默认执行的命令,可以是一个列表

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

dns:配置 dns 服务器,可以是一个值或列表

dns: 8.8.8.8
------------
dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search:配置 DNS 搜索域,可以是一个值或列表

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

environment:环境变量配置,可以用数组或字典两种方式

environment:
  RACK_ENV: development
  SHOW: 'ture'
-------------------------
environment:
  - RACK_ENV=development
  - SHOW=ture

env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量

env_file: .env
---------------
env_file:
  - ./common.env

expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机

expose:
  - "3000"
  - "8000"

network:分为两部分Top-level networks keyService-level networks key。Service-level:Networks to join, referencing entries under the top-level networks key.

By default Compose sets up a single network for your app. Each container for a service joins the default network and

is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.

在容器创建时会创建相应的网络,容器创建后加入相应的网络,即此网络下可访问到该容器。

Here’s an example Compose file defining two custom networks. The proxy service is isolated from the db service,

because they do not share a network in common - only app can talk to both.

version: "3"
services:

  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

参考:https://docs.docker.com/compose/networking/

network_mode:设置网络模式

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

ports:对外暴露的端口定义,和 expose 对应,使用host:container格式或者只指定容器端口,宿主机会随机映射端口。建议使用字符串格式,数字有时会解析错误。

ports: # 暴露端口信息 - "宿主机端口:容器暴露端口"
  - "8763:8763"
  - "8763:8763"

links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况

links: # 指定服务名称:别名

- docker-compose-eureka-server:compose-eureka

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

You can mount a host path as part of a definition for a single service, and there is no need to define it in the top level volumes key.单个容器使用没必要定义顶层volume。

But, if you want to reuse a volume across multiple services, then define a named volume in the top-level volumes key. 多个服务要共用volume时需要定义顶层volumes。

Note: The top-level volumes key defines a named volume and references it from each service’s volumes list.

参考:

  1. https://docs.docker.com/compose/ docker-compose官网文档

  2. https://github.com/docker/compose

  3. https://docs.docker.com/compose/gettingstarted/ flask和redis示例

  4. https://docs.docker.com/get-started/part3/#your-first-docker-composeyml-file

  5. Compose file version 3 reference

  6. Docker:Docker Compose 详解 简书

  7. Docker(四)----Docker-Compose 详解

[转帖]docker-compose的更多相关文章

  1. Docker compose学习笔记

    一.compose compose 作用 你的应用可能需要很多个服务,比如web服务,数据库服务,缓存服务等等.我们可以把这些服务放到单独的容器里面,如果手工去配置这些服务会有些麻烦,docker c ...

  2. docker compose 笔记

    https://www.youtube.com/watch?v=Uez88TWOECg 是基于这个视频做的笔记. Docker Compose: Compose is a tool for defin ...

  3. 利用docker compose启动gitlab及runner

    添加docker compose配置文件 新建文件docker-compose.yml,输入如下内容: gitlab: image: 'gitlab/gitlab-ce:latest' contain ...

  4. Docker Compose to CoreOS

    taken from https://docs.docker.com/compose/install/ the only thing is that /usr is read only, but /o ...

  5. Docker Compose—简化复杂容器应用的利器

    Compose是用于定义和运行复杂Docker应用的工具.你可以在一个文件中定义一个多容器的应用,然后使用一条命令来启动你的应用,然后所有相关的操作都会被自动完成. 1. 安装Docker和Compo ...

  6. .NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行

    本文工具准备: Docker for Windows Visual Studio 2015 与 Visual Studio Tools for Docker 或 Visual Studio 2017 ...

  7. Docker Compose容器编排

    Compose是Docker官方的开源项目,可以实现对Docker容器集群的快速编排.Compose 中有两个重要的概念:服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实 ...

  8. Docker(四):Docker 三剑客之 Docker Compose

    前两篇文章我们介绍了 Dockerfile 的使用Docker(二):Dockerfile 使用介绍,我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就 ...

  9. Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ...

  10. Docker学习笔记 - Docker Compose 脚本命令

    Docker Compose 配置文件包含 version.services.networks 三大部分,最关键的是 services 和 networks 两个部分, version: '2' se ...

随机推荐

  1. mysql优化(上)

    磁盘组成  和  磁盘读取过程 尽量减少 i/o 操作. 表结构设计:(1)三范式 :   原子性(不可拆分).唯一性(不能有完全相同的数据).无冗余性(不能有多余的数据),对于冗余性说明一下:拿订单 ...

  2. 【Java Web】简易商品信息管理系统——首个Web项目

    正文之前 在学习了一段时间的Java Web的内容之后,当然需要有个项目来练练手,我相信大多数人的首选项目都是信息管理系统吧,所以我选择了商品信息管理系统 目前项目源码已全部上传至GitHub,欢迎大 ...

  3. 微信小程序开发入门教程(一)---hello world

    由于无法备案网站,前期做了个微信小程序(开发版)就搁置了,几乎忘了开发过程.现在重新梳理,做个记录. 一.最基本的小程序前端例子hello 1.下载安装  微信开发者工具  官网: https://d ...

  4. 小程序开发之后台SSM环境搭建(一)

    1.新建web项目 打开eclipse,选择file-->New-->Dynamic web Project ,填写项目名字,一直点击next,勾选Generate web.xml dep ...

  5. 读狼书,重温flask

    最近做个简单的MIS系统, 趁机读<flask web 开发实战 入门.进阶与原理解析> 李辉.  由于是flask官方团队的人写的.方方面面都很细致. 很多写法.配置,和之前0.X时代也 ...

  6. delphi中Tkbmmemtable数据转成SQL脚本

    unit UMemtableToSql; interface uses SysUtils, Classes, DB, kbmMemTable, Variants, Dialogs, SuperObje ...

  7. 推荐系统系列(五):Deep Crossing理论与实践

    背景 特征工程是绕不开的话题,巧妙的特征组合也许能够为模型带来质的提升.但同时,特征工程耗费的资源也是相当可观的,对于后期模型特征的维护.模型线上部署不太友好.2016年,微软提出Deep Cross ...

  8. html基础(选择器,font属性 )

    css选择器    css与html的关系   css以html为基础 css主要设置的就是html标签中的属性样式,css进行网页布局.   css语法 选择器{属性:值,属性:值}   css选择 ...

  9. CodeForces 707D Persistent Bookcase ——(巧妙的dfs)

    一个n*m的矩阵,有四种操作: 1.(i,j)处变1: 2.(i,j)处变0: 3.第i行的所有位置1,0反转: 4.回到第k次操作以后的状态: 问每次操作以后整个矩阵里面有多少个1. 其实不好处理的 ...

  10. linux shell 值coredump suid_dumpable和 gdb解析coredump文件

    可以设置产生coredump文件,设置dump文件命名非格式,生成dump文件的路径: linux # set suid_dumpable on if [ -e /proc/sys/kernel/su ...