docker-compose常用模板指令

注意docker-compose版本不同,指令执行结果会不同,具体的以官网文档为主

注意docker-compose版本不同,指令执行结果会不同,具体的以官网文档为主

注意docker-compose版本不同,指令执行结果会不同,具体的以官网文档为主

docker-compose模板指令和指令不太一样,模板指令是用再docker-compose.yml文件中的,指令是运行docker-compose的一些指令

指令中文API文档,看这里

模板命令中文API文档,看这里

ports映射的端口,用引号引起来,避免出现进制转换出问题

version: "3.0"
services:
  tomcat:
    # image: 镜像ID也可以
    image: tomcat:jre8
    ports:
     - "8080:8080"

宿主机与容器中目录数据卷共享

// 可以使用几种方式挂载数据卷
volumes:
  - 宿主机绝对路径:容器内部的文件路径
  - # 相对路径挂容器内部路径,注意这种要在外部声明一下volumes
  - testFile:/user/local/tomcat/webapps
version: "3.0"
services:
  tomcat:
    image: tomcat:jre8
    ports:
     - "8080:8080"
    volumes:
     # 要在外部声明一下
     - test:/usr/local/tomcat/webapps
# 声明上面服务所使用的自动创建的卷名
volumes:
  # 声明指定的卷名
  test

使用指令执行docker-compose之后,docker volume ls查看创建的数据卷,会发现和你yml中的不一致,默认的规则是项目名+你的数据卷名字,例如你写的项目名是A,那么会是A_test这种

// 查看数据卷
docker inspect A_test

使用自定义卷名

version: "3.0"
services:
  tomcat:
    image: tomcat:jre8
    ports:
     - "8080:8080"
    volumes:
     # 要在外部声明一下
     - test:/usr/local/tomcat/webapps
# 声明上面服务所使用的自动创建的卷名
volumes:
  # 声明指定的卷名
  test:
    # 使用自定义卷名,注意使用自定义卷的话,需要你自己先创建一个test数据卷
    # docker volume create test
    external:
      true # true代表使用自定义卷名

network网桥

version: "3.0"
services:
  tomcat:
    image: tomcat:jre8
    ports:
     - "8080:8080"
    volumes:
     - test:/usr/local/tomcat/webapps
    # 指定一个网桥
    networks:
     - test_network
  tomcat02:
    image: tomcat:jre8
    ports:
     - "8081:8080"
    volumes:
     - test02:/usr/local/tomcat/webapps
    networks:
     - test_network
volumes:
  test:
    external:
      true
  test02:
    external:
      true
# 定义服务用到桥
networks:
  # 定义上面的服务用到的网桥名称,默认是bridge,创建的网桥会默认带上项目名字,例如项目名字是A,那么是A_test_network
  test_network

container_name指定容器名字,默认是:项目名称_服务名称_序号

version: "3.0"
services:
  tomcat:
    # 相当于run的 --name
  	container_name: test01
  	# 相当于run的 image
    image: tomcat:jre8
    # 相当于run -p
    ports:
     - "8080:8080"
    # 相当于run -v
    volumes:
     - test:/usr/local/tomcat/webapps
    # 相当于run -network
    networks:
     - test_network
  tomcat02:
    container_name: test02
    image: tomcat:jre8
    ports:
     - "8081:8080"
    volumes:
     - test02:/usr/local/tomcat/webapps
    networks:
     - test_network
volumes:
  test:
    external:
      true
  test02:
    external:
      true
networks:
  test_network
    external:
      # 使用外部网桥,网桥必须存在
      # docker network create -d bridge test_network
      true 

配置mysql,redis

version: "3.0"
services:
  tomcat:
    # 相当于run的 --name
  	container_name: test01
  	# 相当于run的 image
    image: tomcat:jre8
    # 相当于run -p
    ports:
     - "8080:8080"
    # 相当于run -v
    volumes:
     - test:/usr/local/tomcat/webapps
    # 相当于run -network
    networks:
     - test_network
  tomcat02:
    container_name: test02
    image: tomcat:jre8
    ports:
     - "8081:8080"
    volumes:
     - test02:/usr/local/tomcat/webapps
    networks:
     - test_network
   mysql:
     image: mysql:5.7.32
     container_name: mysql
     ports:
      - "3307:3306"
     volumes:
      - mysqldata:/var/lib/mysql
      - mysqlconfig:/etc/mysql
     environment:
      - MYSQL_ROOT_PASSWORD=root
     networks:
      - test_network
volumes:
  test:
    external:
      true
  test02:
    external:
      true
  mysqldata:
  mysqlconf:
networks:
  test_network
    external:
      # 使用外部网桥,网桥必须存在
      # docker network create -d bridge test_network
      true 
version: "3.0"
services:
  tomcat:
    # 相当于run的 --name
  	container_name: test01
  	# 相当于run的 image
    image: tomcat:jre8
    # 相当于run -p
    ports:
     - "8080:8080"
    # 相当于run -v
    volumes:
     - test:/usr/local/tomcat/webapps
    # 相当于run -network
    networks:
     - test_network
  tomcat02:
    container_name: test02
    image: tomcat:jre8
    ports:
     - "8081:8080"
    volumes:
     - test02:/usr/local/tomcat/webapps
    networks:
     - test_network
  mysql:
    image: mysql:5.7.32
    container_name: mysql
    ports:
     - "3307:3306"
    volumes:
     - mysqldata:/var/lib/mysql
     - mysqlconfig:/etc/mysql
    environment:
     - MYSQL_ROOT_PASSWORD=root
    networks:
     - test_network
  redis:
    image: redis:5.0.10
    container_name: redis
    ports:
     - "6379:6379"
    volumes:
     - redisdata:/data
    # command 覆盖容器内部命令
    command: "redis-server --appendonly yes"
    networks:
     - test_network
volumes:
  test:
    external:
      true
  test02:
    external:
      true
  mysqldata:
  mysqlconf:
  redisdata:
networks:
  test_network
    external:
      # 使用外部网桥,网桥必须存在
      # docker network create -d bridge test_network
      true 

env_file用来将配置的环境变量放到配置文件中,也可以解决和environment的环境变量冲突

# 新建一个env的文件
touch xxx.env
vi xxx.env
MYSQL_ROOT_PASSWORD=root
version: "3.0"
services:
  tomcat:
    # 相当于run的 --name
  	container_name: test01
  	# 相当于run的 image
    image: tomcat:jre8
    # 相当于run -p
    ports:
     - "8080:8080"
    # 相当于run -v
    volumes:
     - test:/usr/local/tomcat/webapps
    # 相当于run -network
    networks:
     - test_network
  tomcat02:
    container_name: test02
    image: tomcat:jre8
    ports:
     - "8081:8080"
    volumes:
     - test02:/usr/local/tomcat/webapps
    networks:
     - test_network
  mysql:
    image: mysql:5.7.32
    container_name: mysql
    ports:
     - "3307:3306"
    volumes:
     - mysqldata:/var/lib/mysql
     - mysqlconfig:/etc/mysql
    env_file:
     # 可以是相对路径,也可以是绝对路劲,相对路劲需要保持在一个目录下
      - xxx.env 
    networks:
     - test_network
  redis:
    image: redis:5.0.10
    container_name: redis
    ports:
     - "6379:6379"
    volumes:
     - redisdata:/data
    # command 覆盖容器内部命令
    command: "redis-server --appendonly yes"
    networks:
     - test_network
volumes:
  test:
    external:
      true
  test02:
    external:
      true
  mysqldata:
  mysqlconf:
  redisdata:
networks:
  test_network
    external:
      # 使用外部网桥,网桥必须存在
      # docker network create -d bridge test_network
      true 

depends_on 容器编排使用,例如tomcat的一个web服务依赖mysql,还依赖Redis,那么先启动mysql,redis,再启动tomcat服务

注:不会依赖mysql和redis完全启动完才会启动,而是mysql和redis启动到一定程度,web服务就会启动

version: "3.0"
services:
  tomcat:
    # 相当于run的 --name
  	container_name: test01
  	# 相当于run的 image
    image: tomcat:jre8
    # 相当于run -p
    ports:
     - "8080:8080"
    # 相当于run -v
    volumes:
     - test:/usr/local/tomcat/webapps
    # 相当于run -network
    networks:
     - test_network
    # 代表这个容器必须依赖哪些容器启动之后才能启动
    # 注意这里是服务名字
    depends_no:
     - mysql
     - redis
  tomcat02:
    container_name: test02
    image: tomcat:jre8
    ports:
     - "8081:8080"
    volumes:
     - test02:/usr/local/tomcat/webapps
    networks:
     - test_network
  mysql:
    image: mysql:5.7.32
    container_name: mysql
    ports:
     - "3307:3306"
    volumes:
     - mysqldata:/var/lib/mysql
     - mysqlconfig:/etc/mysql
    env_file:
     # 可以是相对路径,也可以是绝对路劲,相对路劲需要保持在一个目录下
      - xxx.env 
    networks:
     - test_network
  redis:
    image: redis:5.0.10
    container_name: redis
    ports:
     - "6379:6379"
    volumes:
     - redisdata:/data
    # command 覆盖容器内部命令
    command: "redis-server --appendonly yes"
    networks:
     - test_network
volumes:
  test:
    external:
      true
  test02:
    external:
      true
  mysqldata:
  mysqlconf:
  redisdata:
networks:
  test_network
    external:
      # 使用外部网桥,网桥必须存在
      # docker network create -d bridge test_network
      true 

healthcheck健康检查,其实就是发一个请求调用看是否正常

version: "3.0"
services:
  tomcat:
    # 相当于run的 --name
  	container_name: test01
  	# 相当于run的 image
    image: tomcat:jre8
    # 相当于run -p
    ports:
     - "8080:8080"
    healthcheck:
      test: ["CMD", "curl", "-f", "你机器的地址和接口路劲"]
      interval: 1m30s
      timeout: 10s
      retries: 3

sysctls 配置容器内核参数,注意每个容器的内部参数不一样,你要看报错的提示然后进行自定义的修改

ulimits 指定容器的线程数,同上,要根据报错提示进行修改

version: "3.0"
services:
  tomcat:
    # 相当于run的 --name
  	container_name: test01
  	# 相当于run的 image
    image: tomcat:jre8
    # 相当于run -p
    ports:
     - "8080:8080"
    healthcheck:
      test: ["CMD", "curl", "-f", "你机器的地址和接口路劲"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    # 修改容器中系统内部参数,服务启动可能容器内操作系统参数有误或限制,可以通过修改来进行访问启动
    sysctls:
      - net.core.somaxconn=1024
      - net.ip4.tcp_syncookies=0
    # 修改系统最大进程数
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000

build指令,用来指定DockerFile所在目录,先根据build中dockerfile自动构建镜像,自动运行容器

version: "3.0"
services:
  demo:
    # 先将build命令中指定dockerfile打包成镜像,再运行该镜像
    build:
      # 指定上下文目录,dockerfile所在路径,相对路劲或者绝对路劲
      context: demo
      # 指定dockerfile的文件名字
      dockerfile: Dockerfile
    container_name: demo
    ports:
     - "8080:8080"
    networks:
     - test
    depends_no:
     - test01
  tomcat:
    # 相当于run的 --name
  	container_name: test01
  	# 相当于run的 image
    image: tomcat:jre8
    # 相当于run -p
    ports:
     - "8080:8080"

你可能感兴趣的:(docker,容器,运维)