linux安装docker-compose 方法一

sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

安装docker-compose方法二

CentOS:
yum install epel-release -y
yum install python-pip -y

Ubuntu:
apt-get install python-pip -y

# 通用命令
pip --version
pip install --upgrade pip
pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose 
docker-compose version


参考文档:https://docs.docker.com/compose/install/#install-compose


docker-compose常用命令讲解

以官方提供的examples为例

#定义compose的版本,有些参数高版本有,低版本谬
version: "3"
#定义服务,可以多个
services:
#具体的服务名,其他的服务可以通过该服务名来访问
  redis:
  #第一这个服务使用的镜像一个镜像的版本,默认版本latest,建议不要使用latest
    image: redis:alpine
    #定义暴露的端口,若写成6379:6379/tcp则表示将宿主机的6379转发到容器的6379,写成6379或6379/tcp表示docker随机分配一个宿主机端口给容器内的6379
    ports:
      - "6379"
     #定义网络,frontend为网络名,可以先手动创建,可以使用 aliases为该网络设置别名
    networks:
      - frontend
    #定义你这个服务的运行方式  
    deploy:
      #模式定义,主要两种,全局模式和复制模式(自己翻译的),全局模式将会在所有的Swarm节点上运行一个实例,复制模式则指定运行你在replicas指定的个数。
      #也可以理解为容器咋swarm中运行的个数
      replicas: 2
      #定义服务自动更新的方式
      update_config:
        #定义一次更新容器的个数
        parallelism: 2
        # 在更新一组之间等待的时间
        delay: 10s
      #定义重启容器的规则,  condition: on-failure表示失败立即重启
      restart_policy:
        condition: on-failure
  #下面只写上面没写过的命令
  db:
    image: postgres:9.4
    #定义卷,可以是卷,也可以是目录,可以设置容器内的权限是什么
    # 大致格式:src:dest:mode
    # src: 可以是卷名,宿主机目录等,可以是文件或者目录,若是文件则文件必须存在,否则会是目录的形式挂载
    # dest: 容器内的路径,可以是文件可以是目录,若是文件则文件必须存在,否则会是目录的形式挂载
    # mode: 权限,只读(ro),可读可写(rw)
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      #定义该server在集群的位置,node.role == manager表示只在manager节点上运行
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    #表示服务之间的依赖关系  
    #作用 :docker-compose up 将以依赖关系启动服务,这里讲先启动redis,再启动vote 
    #      docker-compose up SERVICE单独指定时也会根据依赖关系启动redis
    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
      #指定服务标签,这些标签只会在server中设置,不会再容器中设置
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        #最大尝试次数
        max_attempts: 3
        #window:在决定重启是否成功之前等待的时间,默认为立即执行
        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]
# 定义这个compose文件中使用的网络
networks:
  #网络名称,和上文中的保持一致
  frontend:
  backend:
# 定义这个compose文件中使用的数据卷
volumes:
  #数据卷名称,和上文中的保持一致
  db-data:


常用命令详解

详情请看官方文档:https://docs.docker.com/compose/compose-file/

  • build

   应用构建是的配置选项

e.g.

    build:
      #指定构建时Dockerfile文件路径或url
      context: ./dir
      #使用Dockerfile-alternate代替Dockerfile构建
      dockerfile: Dockerfile-alternate
      #构建参数,只在构建过程中所有的环境变量,在build命令下指定
      #可以指定值,如果不指定将使构建环境中的值,详情请看:https://docs.docker.com/compose/compose-file/#args
      args:
        buildno: 1

e.g.

build:
  context: .
  #构建是需要使用到的镜像列表
  cache_from:
    - alpine:latest
    - corp/web_app:3.14

e.g.

build:
  context: .
  # 标签,向生成的镜像中添加数据
  labels:
    com.example.description: "Accounting webapp"
    com.example.department: "Finance"
    com.example.label-with-empty-value: ""

build:
  context: .
  labels:
    - "com.example.description=Accounting webapp"
    - "com.example.department=Finance"
    - "com.example.label-with-empty-value"


  • command

    覆盖默认的command

command: bundle exec thin -p 3000

或者

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


  • deploy

3版本中新增功能,用于定义服务运行的配置

详情看官方文档:https://docs.docker.com/compose/compose-file/#deploy


LABELS

3.3新增功能,能够使用VIP和DNS round-robin


LABELS

      标签,只会在服务中设置,不会在容器中显示


MODE

    模式,有两种globalreplicated


PLACEMENT
定义该节server在集群中的角色


REPLICAS

复制数量


RESOURCES

宿主机资源约束配置,能够限制cup、内存等使用量,可以设置预留空间


UPDATE_CONFIG

更新服务设置,用于轮滚更新

    parallelism: 一次更新的数量

    delay:每次更新之间的等待时间

    failure_action:失败后的策略



  • devices


  • depends_on

设置依赖关系,被依赖的服务会先启动


  • DNS

设置容器的DNS


  • TMPFS

挂在目录到容器的/tmp


  • entrypoint

覆盖默认的entrypoint


  • env_file

通过一个文件设置环境变量,默认文件是  .env,设置的环境变量可以为空会未定义,可以指定多个文件


  • environment

设置环境变量,直接在compose文件中指定


  • expose

暴露端口


  • external_links

不太理解,需要试试


  • extra_hosts

hosts,在/etc/hosts文件中添加域名解析

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


  • healthcheck

健康检查

e.g.

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3


  • image

指定构建使用的镜像


  • logging

服务的日志设置

有"json-file"、"syslog"、"none"三种格式

注意:只有json-file格式可以通过docker-compose up和docker-compose logs 获取到日志,其他的不行

e.g.

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"
    max-size: "200k"
    max-file: "10"


  • network_mode

网络模式,有bridge 桥接模式,host 仅主机模式,none 应该是无网络模式,service:[service name]使用和指定service一样的网络模式,container用法同service

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


  • networks

指定加入的网络,该网络可以自己先创建,可以加入多个网络

有bridge、overlay、host、none四种

ALIASES

给网络设置别名

IPV4_ADDRESS, IPV6_ADDRESS

设置IPV4地址,设置IPV6地址,可以只设置其中一个,也可以不设置


  • ports

暴露的端口

    target:容器内的端口

    published:公开的端口

    protocol:连接协议,可以是tcp和udp

    mode:host和ingress两种模式,host在每个节点暴露端口,ingress是swarm模式中的端口,将会被负载均衡(基于轮询) 

e.g.

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"
 - target: 80
   published: 8080
   protocol: tcp
   mode: host


  • sysctls

设置内核参数

e.g.

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

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

设置ulimits

e.g.

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


  • volumes

挂载主机路径或卷

有三种模式consistent、cacheddelegated,consistent是默认模式

e.g.

volumes:
  # Just specify a path and let the Engine create a volume
  #只指定一个路径,让docker引擎创建一个卷(匿名卷)
  - /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


  • restart

重启策略,有4中

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped


卷设置参考信息:https://docs.docker.com/compose/compose-file/#volume-configuration-reference

网络设置参考信息:https://docs.docker.com/compose/compose-file/#network-configuration-reference

配置设置参考信息:https://docs.docker.com/compose/compose-file/#configs-configuration-reference


参考文档:https://docs.docker.com/compose/compose-file/

感谢布小沫大佬的指导