docker 高级 compose/swarm

docker高级

前言:最近让我部署一个项目,该项目是多个服务的,在启动多个容器的时候是比较麻烦的。于是就想到了docker-compose 容器编排。

结构:

  • docker-compose 容器编排
  • docker-swarm 容器集群

目录:

文章目录

  • docker高级
    • docker compose
      • 安装
      • docker-compose 文件的组成
      • docker-compose 常用命令
      • 实战
    • docker swarm
    • CI/CD

docker compose

docker 容器编排。当需要启动多容器的时候,需要docker-compose进行编排管理

结构:

  • 安装
  • docker-compose 文件的组成
  • docker-compose 常用命令
  • 实战

安装

流程:

  1. 下载
  2. 添加可执行权限
  3. 测试安装结果

1、下载

  • 从gitHub下载
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  • daocloud镜像下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

2、添加可执行权限

sudo chmod +x /usr/local/bin/docker-compose

3、

docker-compose --version

docker-compose 文件的组成

docker-compose 文件是一个定义服务,网络,数据卷的yaml文件,默认文件名为 docker-compose.yml

组成:

  • version

  • services

  • images

  • ports

  • volumes

  • container_name

  • command

  • build

  • depends_on

  • networks

  • sysctls

  • ulimits

  • environment

  • env_file

案例:

version: "3.7"

services:

  saas_group:
    build:
      context: ../saas-group
      dockerfile: ../saas-group/Dockerfile
    container_name: saas_group
    restart: "no"
    external_links:
      - nacos_server:nacoshost
      - mysql_db:mysqlhost
      - redis_db:redishost
    volumes:
      - /private/docker/application-logs:/mnt/logs
    environment:
      - nacoshost=xx.xx.xx.xx
      - mysqlhost=xx.xx.xx.xx
      - redishost=xx.xx.xx.xx
      - NACOS_CONFIG_GROUP=develop_group
      - DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
      - NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
    ports:
      - 20880-20085:20880-20885
      - 6000-6005:6000-6005
    networks:
      - qa-overlay


  application_group:
    build:
      context: ../application-group
      dockerfile: ./Dockerfile
    container_name: application_group
    restart: "no"
    external_links:
      - nacos_server:nacoshost
      - mysql_db:mysqlhost
      - redis_db:redishost
    volumes:
      - /private/docker/application-logs:/mnt/logs
    environment:
      - nacoshost=xx.xx.xx.xx
      - mysqlhost=xx.xx.xx.xx
      - redishost=xx.xx.xx.xx
      - NACOS_CONFIG_GROUP=develop_group
      - DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
      - NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
    ports:
      - 30880-30889:30880-30889
      - 9000-9005:9000-9005
    networks:
      - qa-overlay

  global_gateway:
    build:
      context: middleware-group/global-gateway
      dockerfile: ./Dockerfile
    container_name: global_gateway
    restart: "no"
    external_links:
      - nacos_server:nacoshost
      - mysql_db:mysqlhost
      - redis_db:redishost
    ports:
      - 8080:8080
    volumes:
      - /private/docker/application-logs:/mnt/logs
    environment:
      - nacoshost=xx.xx.xx.xx
      - mysqlhost=xx.xx.xx.xx
      - redishost=xx.xx.xx.xx
      - NACOS_CONFIG_GROUP=develop_group
      - DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
      - NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
    networks:
      - qa-overlay
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 1024M



networks:
  qa-overlay:
    external: true

1、version

  • 定义版本号,一般3.0-4.0都行,可以在官网查对应的关系:Compose file | Docker Documentation

2、services

  • service代表一个容器,servieces 下可以有多个容器

3、image

  • 指定为镜像名称【:版本号】或者镜像ID,如果镜像在本地不存在,compose 会尝试拉取这个镜像。
image: centos7.7
image: orchardup/postgresql
image: a4bc65fd

4、ports

  • 暴露端口信息

宿主端口:容器端口host:container格式;或者仅仅指定容器的端口,宿主机将会随机选择端口。

ports:
 - "3000"
 - "49100:22"

5、volumes

  • 数据卷所挂载的路径设置,可以设置为宿主机路径host:container,并且可以设置访问模式host:container:ro
  • 支持相对路径
volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

  • 如果路径为数据卷名称,必须在文件中配置数据卷
version: "3"

services:
  my_src:
    image: mysql:8.0
    # 数据卷声明
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data: # 声明的数据卷

6、container_name

  • 指定容器名称,将会默认使用项目名称_服务名称_序号 这样的格式
version: "3"
services:
  docker-service-name:  # 容器服务名
    container_name: docker-web-container  # 容器名称

7、command

  • 覆盖容器后,默认执行命令
command: echo "hello world"

8、build

  • 指定 Dockerfile 所在文件夹路径(可以是绝对路径,或者是相对 docker-compose.yaml 文件的路径),compose 将会利用它自动构建这个镜像,然后使用这个镜像
version: '3'
services:

  webapp:
    build: ./dir
  • 也可以使用 context 指令指定 Dockerfile 所在文件夹路径
  • 使用 dockerfile 指令指定 Dockerfile 文件名,使用 arg 指令指定构建镜像时的变量
version: '3'
services:
  webapp:
    build:
      context: /opt/docker
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
    container_name: webapp
    ports:
      - "8080:8080"

9、depends_on

  • 解决容器的依赖,启动先后的问题,以下例子中启动顺序为: dbredisweb
  • 注意:不是【完全启动后】才启动,只是启动顺序
version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

10,networks

  • 配置容器连接的网络
version: "3"
services:

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

networks:
  some-network:
  other-network:

11、sysctls

  • 配置容器内核参数
sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

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

12、ulimits

  • 指定容器的 ulimits 限制值

例如:指定最大进程数为 65535 ,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过应限制)和 40000(系统硬限制,只能用户root 提高)

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

13、environment

  • 设置环境变量,例如设置mysql 默认启动密码
environment:
  - MYSQL_ROOT_PASSWORD=root

14、env_file

  • 从文件中获取环境变量,可以为单独的文件路径或者列表
  • 如果通过 docker-compose -f FILE 方式来指令 compose 模板文件,则 env_file 中变量的路径会基于模板文件的路径
  • 如果 env_file 的环境变量名称 与 environment 指令冲突,以 environment 为准
env_file: .env

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

支持 # 开头的注释,同dockerfile文件一致。


docker-compose 常用命令

注意:

​ 对于docker-compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。

​ 如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令的影响。

基本命令格式:

docker-compose [-f=...] [options] [COMMAND] [ARGS...]

结构:

  • up
  • down
  • ps
  • log

1、up

docker-compose up [options] [SERVICE…]
  • 该命令十分强大,它将尝试自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作
  • 链接的服务都会被自动启动,除非已经处于运行状态
  • 可以说大部分时候都可以直接通过该命令,来启动一个项目
  • 默认情况下,,docker-compose up 启动并进入容器;如果当前容器正在运行,将会重新加载 yml 文件,重新创建。
  • 使用 ctrl c 退出容器
  • docker-compose up -d 后台启动

2、dokcer-compose down

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

3、docker-compose ps [options] [service…]

  • 列出项目中目前所有的容器 ,-q 只打印容器的id

4、docker-compose log 容器id

  • 查看服务日志

实战

实战列表:


docker-compose tomcat

yml文件:

version: "3.0"
services:
  tomcat-docker:  # 唯一服务名
    image: tomcat:8.0-jre8 # 创建当前这个容器的镜像
    ports:
      - 8094:8080   # 映射端口

启动:

  • 进入docker-compose.yml 文件目录下
#启动并进入容器
docker-compose up

#启动容器后台运行
docker-compose up -d

访问:

ip地址:8094

docker swarm

相当于简单版k8s

CI/CD

  • 持续集成/部署

  • jenkins 流水线

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