Docker Compose和可视化工具Portainer

发布于 2021-09-23  7.58k 次阅读


一,Docker-Compose概述

Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排(开源地址:https://github.com/topics/docker-compose)

Docker-Compose定位:定义和运行多个容器的应用,其前身是开源项目Fig

DockerFile模板文件可以让用户很方便的定义一个单独的容器镜像,然后在正常开发中,应用的运行需要多个容器相互依赖配合,例:一个web项目除了它本身,还需要redis,mysql,tomcat,nginx……这通过DockerFile是不能实现的,假如使用DockerFile打包自定义镜像了,启动时还需要将依赖容器提前启动,很麻烦

Docker-Compose就能很好的满足上述需求,它允许通过单独的docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目

Docker-Compose两个核心概念:

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

注:服务本质上就是容器的容器,一个docker-compose.yml文件就是代表一个项目

Docker-Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理

Docker-Compose由python编写,实际上调用了Docker服务提供的API来对容器进行管理,因此只要所在操作系统支持Docker API,就可以在其上利用Compose来进行编排

二,Docker-Compose的安装和卸载

Docker官方提供了简单下载和卸载命令且docker-compose不需要配置,照着敲即可

一,Docker-Compose的安装

1,Docker官方提供一个curl的下载命令(运行即可)

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2,给docker-compose加可执行权限

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

3,查看docker-compose是否安装成功

docker-compose -v

二,Docker-Compose的卸载

1,移除/usr/local/bin下的docker-compose文件

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

2,pip卸载docker-compose

pip uninstall docker-compose

三,Docker Compose模板命令

模板命令是在docker-compose.yml中使用的命令,因为是yml文件格式,所有书写格式也要匹配

1,version:声明使用Compose的版本号(建议3.9以下)

#version一般在第一行就声明
version "3.5"

2,services:定义多个容器服务,servers下面可以定义多个容器,这些容器共同组成了servers服务

#servers定义多个容器
servers:
    tomcat:#服务名称(自定义,注意这是服务名称而不是容器名称)
        image:tomcat:9.0#容器使用的镜像
        ports:#映射端口
            -"8080:8080"

        volumes:
            -/home/volumes:/vsr/local/volumes#使用自定义路径进行数据卷共享

    redis:#服务名称(自定义)
        image:tomcat:9.0#容器使用的镜像
        ports:#映射端口
            -"6379:6379"

3,images:容器使用那个镜像运行生成(本地没有该镜像就会去远程仓库pull)

 image:tomcat:9.0#使用tomcat9.0镜像生成容器

4,ports:端口映射,一次可以映射多个端口

ports:
    -"8080:8080"#容器8080映射主机8080

5,volumes:定义数据卷

注:docker-compose中volumes自定义路径映射和自动映射两种写法不一样

① 使用自定义数据卷

servers:
    fq: 
        images:tomcat:9.0   
        volumes:
            -/home/volumes:/vsr/local/volumes#使用自定义路径映射进行数据卷共享

② 使用数据卷名

servers:

    fq:
        images:tomcat:9.0   
        volumes:
            -wql:/vsr/local/volumes#使用自动映射进行数据卷共享(需要在servise外部定义自动映射的数据卷名)
volumes:#声明上面服务所使用的自动创建的卷名
    wql:#定义卷名
    external:#是否使用外部的卷名
        false #为ture则必须在外部必须已存在此卷名,不能容器加载会报错

6,networks:服务使用的网络名称

servers:
    fq:
        images:tomcat:9.0   
        networks:
            -hello#网络名称,docker必须要有此网络(如果没有需要手动创建)

#创建网络
networks:
    hello:#创建名为hello的网络,默认网络类型是bridge网桥
    external:#是否使用外部的网络
        false #为ture则必须在外部必须已存在此网络,不能容器加载会报错

7,container_name:定义容器名称

servers:
    fq:
        images:tomcat:9.0   
        container_name:tom #容器名称为tom

8,environment:设置容器内的环境变量

#两种书写格式:字典格式和数组格式
environment: # 字典格式,注意第二个变量没有赋值。 也不用 用 - 来开头
      RACK_ENV: development
      SESSION_SECRET:
  
    environment: # 数组格式,注意第二个变量没有赋值。 需要用 - 来开头
      - RACK_NEN=development
      - SESSION_SECRET

9,env_file:从文件中获取环境变量(本质上和environment一样的但它是把变量写在文件中)

① 书写env_file文件的格式

支持井号注释,key=value格式

# common.env Set development environment 注释
PROG_ENV=development # 这个是内容

② env_file命令引入外部env文件

env_file: # 指定多个env_file, 文件名字各式各样,而且还有相对路径和绝对路径 
    - ./common.env # 相对路径下的
    - ./apps/web.env # 相对路径下的 
    - /app/secrets.env # 绝对路径下的

10,command:覆盖容器启动后默认执行的命令(相当于run镜像之后覆盖内部默认的命令)

command: echo "hello world"

11,depends_on:解决容器依赖问题,指定当前容器依赖那些容器,先启动依赖容器再启动当前容器(编排作用)

version: "3"
services:
  web:
  build: .
  depends_on:#优先启动redis和mysql
    - db_container # 注意这里写的是服务名字
    - redis_container # 注意这里写的是服务名字,不是服务container_name里面的名字

  redis_container:
    image: redis

  db_container:
    image: mysql

注:depends_on 里面写的是服务的名字,不是容器的名字

12,healthcheck:通过命令检查容器是否正常运行(心跳检测)

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

13,sysctls:配置容器内核参数

用来修改容器内 系统内部参数, 但是这个命令并不是必须的。。有些服务启动的时候,会受到容器内参数的限制导致可能无法成功启动,则必须修改容器内参数才能让这个服务启动成功

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

14,ulimits: 用来指定容器中最大进程数,指定容器的ulimits限制值

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

15,build:将dockerfile打包成镜像,然后运行该镜像(在compose中使用外部dockerfile打包镜像并运行)

build:

service:
    web:
        build:#指定dockerfile所在目录,根据build中的ddockerfile自动构建镜像,自动运行容器
            context:dome#上下文目录dockerfile所在目录
            dockerfile:docketfile#指定dockerfile文件名,默认就是dockerfile

外部dockerfile:./dome/dockerfile

FROM tomcat:8.5.70-jre8-temurin
WORKDIR /usr/local/tomcat/webapps
EXPOSE 8080
RUN echo "晴天">wql.txt
例:
version: "3.2"


services:
  tomcat-1:
    container_name: tomcat-1_name
    image: tomcat:8.0-jre8
    ports:
      - "8080:8080"
    volumes:
      - appdata1:/usr/local/tomcat/webapps
      - /home:/home
    networks:
      - tomcat-net # 这里一样的网络
    depends_on:
      - tomcat-2
      - mysql
      - redis
    healthcheck: # 心跳检测让系统每隔30秒发送curl命令请求docker,看系统是否正常运行
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
    sysctls: # 用来修改系统内部参数
      - net.core.somaxconn=1024 # 这里是例子
      - net.ipv4.tcp_syncookies=0
    ulimits: #用来修改系统内进程数限制,日后使用,可以根据当前容器运行服务要求,进行修改,用以满足容器的成功启动
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000


  tomcat-2:
    image: tomcat:8.0-jre8
    ports:
      - 8081:8080
    volumes:
      - appdate2:/usr/local/tomcat/webapps
    networks:
      - tomcat-net # 这里一样的网络
      - tomcat2-net


  mysql:
    image: mysql:5.7.23
    container_name: mysql
    ports:
      - "3307:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - mysql_config:/etc/mysql
#    environment:
#      MYSQL_ROOT_PASSWORD: "123456"
#    第二种方法:用env_file
    env_file:
      - mysql.env
    networks:
      - tomcat-net


  redis:
    image: redis:5.0.10
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    command: "redis-server --appendonly yes" # 原本的redis启动的命令是 redis-server 但是我们要这个是容器,而且要做数据持久化,所以需要覆盖原本的命令,新命令是 command: "redis-server --appendonly yes"
    networks:
      - tomcat-net
volumes:
  appdata1:
  appdate2:
  mysql_data:
  mysql_config:
  redis_data:

networks:
  tomcat-net:
    external:
      true
  tomcat2-net:

四,Docker Compose指令

Docker Compose指令和模板指令的区别:

  • 指令:用来对整个docker-compose.yml对应的项目进行操作,书写在docker-compose命令后面
  • 模板指令:书写在docker-compose.yml文件中的指令称为模板指令,用来构造整个服务和项目

一,Docker Compose命令格式和选项

对于Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或容器,如果没有特别说明,命令对象就是项目,这意味着所有的服务都会受到命令影响

帮助命令:docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]

docker-compose命令的基本格式:

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

命令选项(options):

  • -f(--file FIFE):指定使用的Compose模板文件,默认为docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml
  • -p(--project-name NAME):指定项目名称,默认将所在的目录名称作为项目名
  • --x--networking:使用Docker的可拔插网络后端特性
  • --x-network-driver DRIVER:指定后端的驱动,默认为bridge
  • --verbose:输出更多调试信息
  • -v(--version):打印版本号

二,Docker Compose命令

1,up

格式:docker-compose up [options] [SERVICE…]

  • 该命令自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作
  • 链接的服务都将被自动启动,除非处于运行状态
  • 默认情况下,doocker-compose up启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便的进行调试
  • 当通过Ctrl-C停止命令时,所有容器将会停止
  • 如果使用docker-compose up -d 将会后台并运行所有容器(生产环境不推荐)
  • 默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建

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

3,exec:进入指定容器

4,ps:查看项目运行的所有容器

  • -q:只打印容器ID

5,restart:重启项目

  • -t:指定重启前停止容器的超时时间

6,rm:删除所有停止状态的服务容器

  • -f:强制直接删除,包括非停止状态的容器,一般开发中不要使用这个
  • -v:删除容器所挂载的数据卷

7,start:启动已经存在的服务容器

8,stop:停止处于运行状态的容器

9,top:查看服务容器内运行的进程

10,pause:暂停服务

11,unpause:恢复处于暂停状态的服务

五,docker可视化工具Portainer

一,安装Portainer工具

1,下载portainer

docker pull portainer/portainer:latest

2,运行portainer(命令固定不需要更改)

docker run -d \
           -p 8000:8000 \
           -p 9000:9000 \
           --name portainer \
           --restart always \
           -v /var/run/docker.sock:/var/run/rundocker.sock \
           -v protainer_data:/data \
           portainer/portainer

-v /var/run/docker.sock:/var/rundocker.sock:让proatiner容器引擎和docker引擎同步产生对应关系(默认安装位置在/var/run/docker.sock目录中)

3,访问

ip地址:9000

二,protainer使用的简单说明

1,首次访问需要进行注册(密码需要8位数)

2,portainer使用模式(我们连接本地docker使用本地模式即可)

3,进入本地容器

注:portainer提供了对容器和镜像的各种可视化操作,还能pull远程仓库,基本上除了dockerfile和docker-compose,其他的操作都可以傻瓜式操作


路漫漫其修远兮,吾将上下而求索