Docker高级

DockerFile

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

构建三部曲:

  1. 编写Dockerfile文件
  2. docker build命令构建镜像
  3. docker run依镜像运行容器实例

常用保留字指令

  • FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from

  • MAINTAINER:镜像维护者的姓名和邮箱地址

  • RUN:容器构建时需要运行的命令

    • shell格式:

      image-20221101114340053

    • exec格式:

      image-20221101114346992

  • EXPOSE:当前容器对外暴露出的端口

  • WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

  • USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root

  • ENV:用来在构建镜像过程中设置环境变量

  • ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

  • COPY:类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 < 源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

  • VOLUME:容器数据卷,用于数据保存和持久化工作

  • CMD:指定容器启动后的要干的事情

  • ENTRYPOINT:

    也是用来指定一个容器启动时要运行的命令,ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

    例如:

    image-20221101115936743

案例

安装Centos7镜像具备vim+ifconfig+jdk8

  • 准备编写Dockerfile文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    FROM centos
    MAINTAINER wht<136921735@126.com>

    ENV MYPATH /usr/local
    WORKDIR $MYPATH

    #安装vim编辑器
    RUN yum -y install vim
    #安装ifconfig命令查看网络IP
    RUN yum -y install net-tools
    #安装java8及lib库
    RUN yum -y install glibc.i686
    RUN mkdir /usr/local/java
    #ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
    ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
    #配置java环境变量
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    ENV PATH $JAVA_HOME/bin:$PATH

    EXPOSE 80

    CMD echo $MYPATH
    CMD echo "success--------------ok"
    CMD /bin/bash
  • 构建镜像:docker build -f Dockerfile -t 新镜像名字:TAG .

  • 运行:docker run -it 新镜像名字:TAG

虚悬镜像

仓库名、标签都是的镜像,俗称dangling image

  • 查看虚悬镜像:docker image ls -f dangling=true
  • 删除虚悬镜像:docker image prune

部署项目

  • 将项目打包成jar包,并上传到服务器

  • 编写Dockerfile:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 基础镜像使用java
    FROM java:8
    # 作者
    MAINTAINER wht
    # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
    VOLUME /tmp
    # 将jar包添加到容器中并更名为springBoot_docker.jar
    ADD docker_boot.jar springBoot_docker.jar
    # 运行jar包
    RUN bash -c 'touch /springBoot_docker.jar'
    ENTRYPOINT ["java","-jar","/springBoot_docker.jar"]
    #暴露6001端口作为微服务
    EXPOSE 6001
  • 构建镜像:docker build -t springBoot_docker:1.6

  • 运行容器:docker run -d -p 6001:6001 springBoot_docker:1.6

Docker网络

docker启动后,会产生一个名为docker0的虚拟网桥。主要解决容器间的互联和通信以及端口映射、容器IP变动时候通信问题。

相关命令

  • 创建网络:docker network create 网络名(自定义网络本身就维护好了主机名和ip的对应关系)

  • 查看docker网络模式命令:docker network ls (默认会有三种模式:bridge、host、none)

  • 查看网络源数据:docker network inspect XXX网络名字

  • 删除网络:docker network rm XXX网络名字

网络模式

  • bridge模式:为每一个容器分配、设置IP等,并将容器连接到一个docker0,使用–network bridge指定,默认使用docker0

    image-20221102131419291

  • host模式:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口,使用–network host指定

    image-20221102131424958

  • none模式:容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等,使用–network none指定

  • container模式:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等,使用–network container:NAME或者容器ID指定

    image-20221102131442912

Docker-compose容器编排

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器, 负责实现对Docker容器集群的快速编排。

Docker-compose 安装

官网地址:https://docs.docker.com/compose/compose-file/compose-file-v3/

官方下载文档:

  • 下载安装:

    1
    curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  • 给文件权限:chmod +x /usr/local/bin/docker-compose

  • 检验是否安装:docker-compose --version

  • 卸载:sudo rm / usr/ local/bin/ docker-compose

相关概念

  • 重要文件:docker-compose.yml

  • 两要素:

    • 服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
    • 工程(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
  • 三大步骤:

    • 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
    • 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
    • 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线

Compose常用命令

  • docker-compose -h # 查看帮助
  • docker-compose up # 启动所有docker-compose服务
  • docker-compose up -d # 启动所有docker-compose服务并后台运行
  • docker-compose down # 停止并删除容器、网络、卷、镜像。
  • docker-compose exec yml里面的服务id # 进入容器实例内部
  • docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
  • docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
  • docker-compose top # 展示当前docker-compose编排过的容器进程
  • docker-compose logs yml里面的服务id # 查看容器输出日志
  • docker-compose config # 检查配置
  • docker-compose config -q # 检查配置,有问题才有输出
  • docker-compose restart # 重启服务
  • docker-compose start # 启动服务
  • docker-compose stop # 停止服务

部署实例

  • 同样项目打包

  • 编写docker-compose.yml文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    # 版本
    version: "1"
    # 镜像中的服务容器
    services:
    microService:
    # 镜像来源
    image: springboot_docker:1.6
    # 容器名(不加默认目录_服务名_序号)
    container_name: ms01
    # 端口映射
    ports:
    - "6001:6001"
    # 数据卷
    volumes:
    - /app/microService:/data
    # 网络
    networks:
    - test_net
    # 依赖于谁先启动
    depends_on:
    - redis
    - mysql

    redis:
    image: redis:6.0.8
    ports:
    - "6379:6379"
    volumes:
    - /app/redis/redis.conf:/etc/redis/redis.conf
    - /app/redis/data:/data
    networks:
    - test_net
    # 执行命令
    command: redis-server /etc/redis/redis.conf

    mysql:
    image: mysql:5.7
    # 配置环境
    environment:
    MYSQL_ROOT_PASSWORD: '123456'
    MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
    MYSQL_DATABASE: 'db2021'
    MYSQL_USER: 'root'
    MYSQL_PASSWORD: '123456'
    ports:
    - "3306:3306"
    volumes:
    - /app/mysql/db:/var/lib/mysql
    - /app/mysql/conf/my.cnf:/etc/my.cnf
    - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
    - test_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
    # 创建网络
    networks:
    test_net

    由于使用同一网络所以可以将ip改为服务名(改了除了重新打包)

  • 检查docker-compose.yml文件语法是否错误:docker-compose config -q

  • 执行docker-compose:docker-compose up -d

  • 停止compose:docker-compose stop

Portainer

Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。

  • 拉镜像:docker pull lihaixin/portainer

  • 启动容器:

    1
    docker run -d -p 8000:8000 -p 9000:9000 --name portainer     --restart=always     -v /var/run/docker.sock:/var/run/docker.sock     -v portainer_data:/data     lihaixin/portainer
  • 第一次登录需创建admin,访问地址:ip:9000

  • 注册并选择监控本地docker

    image-20221102213545348

  • 主页状态:

    image-20221102214149100

CIG

CIG:Docker容器监控之CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表

一般使用docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据,当容器数据太多时就需要CIG了

安装

  • 新建目录 mkdir /opt/docker_app/cig

  • 新建3件套组合的 docker-compose.yml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    version: '3.1'

    volumes:
    grafana_data: {}

    services:
    influxdb:
    image: tutum/influxdb:0.9
    restart: always
    environment:
    - PRE_CREATE_DB=cadvisor
    ports:
    - "8083:8083"
    - "8086:8086"
    volumes:
    - ./data/influxdb:/data

    cadvisor:
    image: google/cadvisor
    links:
    - influxdb:influxsrv
    command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
    restart: always
    ports:
    - "8080:8080"
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro

    grafana:
    user: "104"
    image: grafana/grafana
    user: "104"
    restart: always
    links:
    - influxdb:influxsrv
    ports:
    - "3000:3000"
    volumes:
    - grafana_data:/var/lib/grafana
    environment:
    - HTTP_USER=admin
    - HTTP_PASS=admin
    - INFLUXDB_HOST=influxsrv
    - INFLUXDB_PORT=8086
    - INFLUXDB_NAME=cadvisor
    - INFLUXDB_USER=root
    - INFLUXDB_PASS=root
  • 启动compose:docker-compose up -d

  • 测试:

  • 在grafana配置数据源:

    image-20221102220325003

    • 选择influxdb数据源:

      image-20221102220347802

    • 配置细节:

      image-20221102220425099

      image-20221102220430381

    image-20221102220440089

    • 配置面板panel:

      image-20221102220509873

      image-20221102220516309

      image-20221102220523022

      image-20221102220529509

      image-20221102220534624

      image-20221102220541842

  • 部署完成