docker进阶

1.DockerFile解析

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

2.概述

 

3.官网 https://docs.docker.com/engine/reference/builder/

4.构建步骤

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

 5.Dockerfile构建过程解析

  • Dockerfile内容基础知识
    • 1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
    • 2:指令按照从上到下,顺序执行
    • 3:#表示注释
    • 4:每条指令都会创建一个新的镜像层并对镜像进行提交
  • Docker执行Dockerfile的大致流程
    • (1)docker从基础镜像运行一个容器
    • (2)执行一条指令并对容器作出修改
    • (3)执行类似docker commit的操作提交一个新的镜像层
    • (4)docker再基于刚提交的镜像运行一个新容器
    • (5)执行dockerfile中的下一条指令直到所有指令都执行完成

             

      1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服    务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

      2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;

      3 Docker容器,容器是直接提供服务的。

6.docker常用保留字指令

  

  • FROM
    • 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
  • MAINTAINER
    • 镜像维护者的姓名和邮箱地址
  • RUN
    • 容器构建时需要运行的命令
    • 两种格式
    • shell格式

      RUN yum -y install vim

  • exec格式
  • RUN是在 docker build时运行
  • EXPOSE
    • 当前容器对外暴露出的端口
  • WORKDIR
    • 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  • USER
    • 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
  • ENV
    • 用来在构建镜像过程中设置环境变量

       ENV MY_PATH /usr/mytest

      这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;

      也可以在其它指令中直接使用这些环境变量,

       比如:WORKDIR $MY_PATH

  • ADD
    • 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
  • COPY
    • 类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
    • COPY src dest
    • COPY ["src", "dest"]
    • <src源路径>:源文件或者源目录
    • <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
  • VOLUME
    • 容器数据卷,用于数据保存和持久化工作
  • CMD
    • 指定容器启动后的要干的事情
    • Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
    • CMD是在docker run 时运行
    • RUN是在 docker build时运行。
  • ENTRYPOINT
    • 也是用来指定一个容器启动时要运行的命令
    • 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
    • 命令格式和案例说明
    •  

      NTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

      当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成

    • 在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。
    • 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效

    

 

7.DockerFile案例

  • Centos7镜像具备vim+ifconfig+jdk8 
  • JDK的下载镜像地址 https://www.oracle.com/java/technologies/downloads/#java8
  • 编写Dockerfile文件   执行    docker build -t centosjava8:1.5 .      (后边要加
  • FROM centos
    MAINTAINER zzyy<zzyybs@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-8u341-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
    ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/
    #配置java环境变量
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_341
    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

     

     运行成功

8.虚悬镜像     仓库名、标签都是<none>的镜像,俗称dangling image

  • docker image ls -f dangling=true
  •  

     docker虚悬镜像没用 删除掉    docker image prune

9.docker网络

1.docker不启动默认网络情况 

  

 

   ens33:本地网络地址

   lo:本地回环地址

  docker启动后会产生一个docker0的虚拟网桥

      

2.查看docker网络模式命令 docker network ls

  

 

 

3.查看网络源数据docker network inspect  xxx网络名字

4.删除网络 docker network rm  xxx网络名字

5.创建自定义网络 docker network create  aaa_network

6.docker网络:荣期间的互联和通信以及映射,容器ip变动时候可以通过服务器名直接网络通信而不受到影响。

7.网络模式 --容器内部的ip是有可能变化的

  bridge :为每个容器分配,设置ip等,并将容器连接到一个docker0虚拟网桥,默认为该模式   使用 --network bridge指定 默认为docker0

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

  none:容器有独立的network namsepace ,但是并没有对其进行任何网络设置  使用 --network none指定

  container:新创建的容器不会创建自己的网卡和配置自己的ip,端口范围等  使用 --network container:name  或者容器ID指定,新建的容器和已经存在的一个容器网络ip,端口配置相同而不是宿主机                共享,两个容器除了网络共享外,其他都还是隔离的

  自定义网络:默认使用的bridge桥接网络  :

    例如:docker run -d -p 8081:8080 --network zzyy_network  --name tomcat81 billygoo/tomcat8-jdk8

       docker run -d -p 8082:8080 --network zzyy_network  --name tomcat82 billygoo/tomcat8-jdk8

    自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

10.docker compose

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

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

  官网下载   https://docs.docker.com/compose/install/

3.安装  

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

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

     docker-compose --version

4.卸载  rm /user/local/bin/docker-compose

5.  Compose核心概念

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

6.Compose使用的三个步骤

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

7.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      # 停止服务

11.docker compose使用实例

  1.需要三个容器  jar微服务,mysql ,redis

  2.编写Dockerfile闯进微服务镜像

# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zzyy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001

  3.构建镜像docker build -t zzyy_docker:1.6 .

  4.编写docker-compose.yml文件

version: "3"

 

services:

  microService:

    image: zzyy_docker:1.6

    container_name: ms01

    ports:

      - "6001:6001"

    volumes:

      - /app/microService:/data

    networks:

      - atguigu_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:

      - atguigu_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: 'zzyy'

      MYSQL_PASSWORD: 'zzyy123'

    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:

      - atguigu_net

    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

 

networks:

   atguigu_net: 

   5. 执行 docker-compose up 或者 执行 docker-compose up -d 启动

12.docker轻量级可视化工具Portainer

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

2.官网 

  • https://www.portainer.io/
  • https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux

3.安装

  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     portainer/portainer

4.页面访问 http://192.168.92.128:9000

5.创建用户

13.docker监控之 CAdvisor+InfluxDB+Granfana

1.通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据,一般小公司够用了。。。。但是,docker stats统计结果只能是当前宿主机的全部容器,数据资料是实时     的,没有地方存储、没有健康指标过线预警等功能

2.CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表

3.部署

  使用compose容器编排 mkdir cfg

  

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

4.查看是否编排没有问题  docker config -q 

5.

  • 浏览cAdvisor收集服务,http://ip:8080/
  • 浏览influxdb存储服务,http://ip:8083/
  • 浏览grafana展现服务,http://ip:3000

 

posted on 2022-10-06 14:59  郝心人forever  阅读(92)  评论(0编辑  收藏  举报