Docker Compose

1.Docker Compose 

  Compose 项目是Docker官方的开源项目主要用于容器集群快速编排。从功能上看,跟OpenStack 中的 Heat 十分类似。其代码目前在 https://github.com/docker/compose 上开源。什么是编排容器?比如我们一个应用有多个微服务,但是这些微服务都部署在docker上,这时候我们需要创建容器并且启动或者暂停,只能一个一个的启动,这样对于运维来说是非常的麻烦,所以这时候就出现了docker-compse 用来快速创建,启动,停止容器等操作。对于我们熟知的k8s全称kubernetes,k它也是为容器服务而生的一个可移植容器的编排管理工具。

Compose中有两个重要的概念:

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

Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose项目由Python编写,实现上调用了Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

2.Docker Compose.yml指令

模板指令是写在docker-compose.yml文件中的,使用来为容器服务的。

使用docker-compose -f  docker-compose.yml  来操作。

2.1 services名称

        定义一个服务名称和网络别名一致。

services: 
  nacosdockerservice:  
    image: docker_nacos
    container_name: docker_nacos
    networks:
      - mynetwork
    ports:
      - 38848:8848

2.1 images

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

image: producter-one:latest

2.2 ports

使用宿主端口:容器端(HOST:CONTAINER)格式,或者仅仅指定容器的端(宿主将会随机选择端口)

ports:  #端口

      - "50000:8080"

2.3 volumes

 卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模(HOST:CONTAINER:ro),挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读。

  # 指定绝对路径映射,需要事先创建绝对路径
    volumes:
        - /opt/data:/var/lib/mysql:rw
        - html_files:/etc/nginx
        - dockernacos-data:/var/lib/postgresql/data  #需要以具名的方式挂载
        - D:/dockerFile/home/zzzhcj/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  #配置文件目录
        - D:/dockerFile/home/zzzhcj/nginx/logs:/var/log/nginx #日志
        - D:/dockerFile/home/zzzhcj/nginx/conf.d:/etc/nginx/conf.d #配置
    




#方式1
#运行docker-compose up如果不存在将创建一个名为<project_name>_html_files(project_name是docker-compose所在文件的目录名)
volumes:
  html_files:

#方式2
#html_files需要手动创建 docker volume create html_files
volumes:
  html_files:
    external: true

# 方式3 bind mount
volumes:
  dockernacos-data:
    name: dockernacos-data
    driver: local
    driver_opts:
      o: bind
      type: none
      device: C:/MyTemp/mydocker/nacos/data

2.4 networks

配置容器连接网络方式。Docker默认提供了3种网络模式,当你安装Docker时,它会自动创建三个网络Bridge(创建容器,默认连接到此网络,如果不设置,使用默认bridge方式)、none、host

bridge方式(自定义网络):

#默认方式可以不用设置
    network_mode: "bridge"

# 方式1指定全部的默认网络
#mynetwork已经手动创建的
# networks:
#   default:
#     external:
#       name: mynetwork      

#方式2
#mynetwork已经手动创建的
networks:
  mynetwork:     
    external: true

#方式3
#mynetwork已经手动创建的
# networks:
#   mynetwork:    #网络名称
#     external:   #使用已存在的网络
#       name: mynetwork #mynetwork网络名已经用docker network create创建

#方式4
#my_network会自动创建
# networks:
#   my_network:     #网络名称
#     driver: bridge      #桥接模式
#     attachable:true      #允许独立的网络连接到该网络上

#方式5
#my_networkauto会自动创建,类型是bridge
# networks:
#   my_networkauto:     #<project_name>_my_networkauto 如果它不存在,将自动创建



注:mynetwork方式是先通过docker network create mynetwork创建

host方式

     在主机模式下,容器与主机共享网络命名空间。容器将直接使用主机的网络接口,而不是创建独立的网络栈。这意味着容器可以使用主机上的所有网络功能和服务,包括使用主机的IP地址和端口。主机模式适用于需要容器与主机之间网络性能最大化的场景。

version: '3'

services:
  mygeteway:
    image: 镜像地址
    container_name: mygeteway
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    volumes:
      # 配置文件
      - ./gatawary/logs/:/bussiness-test/api-geteway/logs/
      - ./gatawary/api_geteway-1.0.jar:/bussiness-test/api-geteway/app.jar
    #是否自启动
    restart: always
    privileged: true
    network_mode: "host"

 none方式

     在无网络模式下,容器没有分配任何网络资源。这意味着容器内部没有网络接口,也没有IP地址。无网络模式适用于不需要网络连接的容器,例如用于批处理作业或与外部网络完全隔离的容器。

network_mode: "none"

container方式

      在容器模式下,多个容器共享同一个网络命名空间。这意味着这些容器可以使用相同的IP地址和端口,它们可以直接通过本地主机名相互通信,就像它们在同一个主机上一样。容器模式适用于需要多个容器之间进行高性能通信的场景。

network_mode: "container:[container name/id]"

2.5 container_name

指定一个自定义容器名称,而不是生成的默认名称。并且这个名称也是网络别名

container_name: producter-one

2.6 environment 

添加环境变量。 你可以使用数组或字典两种形式。 任何布尔值; true,false,yes,no需要用引号括起来,以确保它们不被YML解析器转换为True或False。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。
如果 environment 和env_file同时存在,environment 会覆盖env_file

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET: ""
#设置中文语言环境
  LANG: zh_CN.UTF-8
 
environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

2.7 env_file

使用文件添加环境变量

env_file : .envtxt

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

2.8 command

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

command单个指令

 command: "java -jar producter-one.jar"
或者
 command: java -jar producter-one.jar
或者
 command: ["java","-jar","producter-one.jar"]

command多个指令

使用/bin/bash -c实现 

#字符串方式
command: /bin/bash -c "cp /app/dtest/config.default.yml /app/config.yml && python -u /app/dtest/tcc.py"

#使用/bin/bash -c,串行运行,配置会按顺序执行cmd1,之后再执行cmd2,之后cmd3
command:
    - sh
    - -c 
    - |
        cmd1
        cmd2
        cmd3
#使用/bin/bash -c,并行运行,&会后台同时执行cmd1,cmd2,cmd3
command:
    - sh
    - -c 
    - |
        cmd1 &
        cmd2 &
        cmd3 &

2.9 depends_on

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

version: "3.8"
services:
  web:
    build: .
    depends_on:
      - db # 注意此处是服务名,而不是容器名
      - redis

2.10 healthcheck

通过命令检查容器是否健康运行

healthcheck:
  test: [ "CMD", "curl", "-f", “http://localhost"]
  interval: 1m30s # 前多少秒不检查
  timeout: 10s # 等待时间
  sretries: 3 # 尝试三次

2.11 sysctls

配置容器内核参数,下面两种写法都可以,并不是必须的,有些服务受容器内操作系统内核参数的限制,可能无法启动,必须通过修改内核参数才能启动

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

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

2.12 ulimits

指定容器的ulimits限制值。
例如,指定最大进程数为65535,指定文件句柄数为200 (软限制,应用可以随时修改,不能超过硬限制)和4000(系统硬限制,只能root 用户提高)

ulimits:
  nproc: 65535 # 修改容器内操作系统的最大进程数,可根据服务的要求修改
  nofile:
    soft: 2000
    hard: 4000

2.13  build

build 等同于docker build,用来将指定的Dockerfile打包成对应镜像,然后再运行该镜像,不需要手动先构建镜像。

version: "3.0" #compose 文件版本(1.2.x+  用3即可)
services: 
  producter-one: 
    build:  #编译镜像
      dockerfile: dockerfile-build
      context: ./  #指定上下文目录,可以写绝对路径也可以写相对路
      args:  #添加构建镜像的参数,环境变量只能在构建过程中访问
        - appname=producter-one
    image: producter-one:latest
    container_name: producter-one

2.14 args

添加构建镜像的参数,环境变量只能在构建过程中访问。类似于

docker build --build-arg appname=producter-one
build:
  context: .
  args:
    - appname=producter-one

dockerfile-build文件

from java_ubuntu

arg appname

run pwd

copy ${appname}.jar ${appname}.jar

env logfilename=${appname}
env spring_profiles_active=docker

expose 8080

#cmd不能执行${}
#cmd java -jar producter-two.jar

自动构建镜像docker-compose.yml

version: "3.0" #compose 文件版本(1.2.x+  用3即可)
services: 
  producter-one: 
    build:  #编译镜像
      dockerfile: dockerfile-build
      context: ./  #指定上下文目录,可以写绝对路径也可以写相对路
      args:  #添加构建镜像的参数,环境变量只能在构建过程中访问
        - appname=producter-one
    image: producter-one:latest
    container_name: producter-one
    ports:   
      - "50000:8080"
    environment:   
      - NACOS_CONFIG_DATAID1=producter-one.yaml
    command: "java -jar producter-one.jar"  # command 可以覆盖容器启动后默认执行的命令
  producter-one2:
    build:
      dockerfile: dockerfile-build
      context: ./
      args:
        - appname=producter-one
    image: producter-one:latest
    container_name: producter-one2
    ports:
      - "50001:8080"
    environment:
      - NACOS_CONFIG_DATAID1=producter-one2.yaml
    command: "java -jar producter-one.jar"
  producter-two:
    build:
      dockerfile: dockerfile-build
      context: ./
      args:
        - appname=producter-two
    image: producter-two:latest
    container_name: producter-two
    ports:
      - "50010:8080"
    environment:
       - NACOS_CONFIG_DATAID1=producter-two.yaml
    command: "java -jar producter-two.jar"


# 指定全部的默认网络
networks:
  default:
    external:
      name: mynetwork      


#第一种方式指定
# networks:
#   mynetwork:
#     external: true

#第二种方式指定
# networks:
#   mynetwork:
#     external: 
#       name: mynetwork

手动构建镜像docker-compose.yml

version: "3.0" #compose 文件版本(1.2.x+  用3即可)
services: 
  producter-one:  #指定服务名,会自动加入网络别名集合
    image: producter-one:latest
    container_name: producter-one #容器名,如果不指定会自动生产(dokcer-(services name)-1),也会自动加入网络别名列表
    ports:  #端口
      - "50000:8080"
    networks:  #网络
      - mynetwork
    environment:   #环境变量
      - NACOS_CONFIG_DATAID1=producter-one.yaml
  producter-one2:
    image: producter-one:latest
    container_name: producter-one2
    ports:
      - "50001:8080"
    networks:
      - mynetwork
    environment:
      - NACOS_CONFIG_DATAID1=producter-one2.yaml
  producter-two:
    image: producter-two:latest
    container_name: producter-two
    ports:
      - "50010:8080"
    networks:
      - mynetwork
    environment:
       - NACOS_CONFIG_DATAID1=producter-two.yaml


# 方式1指定全部的默认网络
# networks:
#   default:
#     external:
#       name: mynetwork      

#方式2指定
networks:
  mynetwork:
    external: true

#方式3指定
# networks:
#   mynetwork:
#     external: 
#       nam

2.15 restart 

services: 
  dockerregistryserver:
    image: registry
    container_name: docker_registry
    restart: always

##############
no:
    不要自动重启容器。(默认)
 
on-failure: 
    如果容器由于错误而退出,则重新启动容器,该错误表现为非零退出代码。
 
always:
    如果容器停止,请务必重启容器。如果手动停止,则仅在Docker守护程序重新启动或手动重新启动容器本身时才重新启动。(参见重启政策详情中列出的第二个项目)
 
unless-stopped:
    类似于always,除了当容器停止(手动或其他方式)时,即使在Docker守护程序重新启动后也不会重新启动容器。

3 Docker Compose常用命令

docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND]x可以查看具体某个命令的使用格式。此命令后跟的都是服务名或服务id,而不是容器名。

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


[-f=<arg>...]和[options] 说明

f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。

-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。

--verbose 输出更多调试信息。

-v, --version 打印版本并退出。

3.1  up

  1. 自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
  2. 链接的服务都将会被自动启动,除非已经处于运行状态。
  3. 如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
-d 在后台运行服务容器。

--no-color 不使用颜色来区分不同的服务的控制台输出。

--no-deps 不启动服务所链接的容器。

--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。

--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。

--no-build 不自动构建缺失的服务镜像。

-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

 3.2 config

验证 Compose 文件语法格式是否正确,若正确则显示配置,若格式错误显示错误原因。

3.3 down

此命令将会停止 up 命令所启动的容器,并移除网络

3.4 exec

和docker exec 类似,执行指定容器命令

3.5 ps

列出项目中目前的所有容器。

3.6 restart

重启项目中的服务。如果不写service id,默认重启所有服务

3.7 rm

docker-compose rm [options] [SERVICE...]

删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。

-f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。

-v 删除容器所挂载的数据卷

3.8 start

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

3.9 stop

停止已经处于运行状态的容器

3.10 top

查看各个服务容器内运行的进程。

3.11 logs

docker-compose logs [options] [SERVICE...]

查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
 

参考:

Docker Compose详解_万wu皆可爱的博客-CSDN博客_docker-compse

Docker:Docker Compose 详解 - 苍青浪 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值