Docker
2022-05-20 20:08:05 77 举报
AI智能生成
Docker
作者其他创作
大纲/内容
特点
Docker 和传统虚拟化方式的不同
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;<br>*容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。<br>* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
(1)docker有着比虚拟机更少的抽象层<br> 由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。<br>(2)docker利用的是宿主机的内核,而不需要加载操作系统OS内核<br> 当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
子主题
子主题<br>
架构
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
运行流程
架构图
三要素
镜像 image
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。<br> <br>只有通过这个镜像文件才能生成Docker容器实例
容器 container
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境.<br>可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。<br>镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台<br>
仓库 repository
集中存放镜像文件的场所。
公开仓库
私有仓库
常用命令
启动和帮助命令
子主题
镜像命令
子主题<br>
run
子主题
前台启动 docker run -it imageName:tag /bin/bash
后台守护线程启动 docker run -d imageName:tag
容器命令
基本
重点
数据挂载
功能
共享容器和主机文件
特点
1:数据卷可在容器之间共享或重用数据<br>2:卷中的更改可以直接实时生效<br>3:数据卷中的更改不会包含在镜像的更新中<br>4:数据卷的生命周期一直持续到没有容器使用它为止
操作
docker <options> -d -v /<挂在内容>:/<容器内路径>:<容器读写权限> imageName
挂载类型
文件挂载
文件路径
文件夹挂载
文件夹路径
宿主机文件夹内容会强制覆盖容器, 无论宿主目录有无文件
卷挂载
卷名
其它参数
容器读写权限
rw
read write
ro
read only
权限赋值
默认容器的root权限是主机当前用户权限, 可能会权限不足
--privileged=true<br>
复制卷挂载策略
--volumes-from <被复制策略容器名><br>
网络模式
概述
负责docker与宿主/容器之间的网络通信、端口映射.<br>容器ip变动时, 可通过容器名通信而不受影响. (docker内部容器ip是可能变动的)<br>
命令
基本命令
子主题
使用
创建网络
docker network create --driver <DriverType> <DriverName>
默认创建的驱动类型是 bridge
(容器)指定网络
--network <NetName>
对于 container
--network container:<containerName><br>
网络类型
bridge
默认
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
两两对应原则
子主题
host
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行网络地址转换<br>
子主题<br>
none
禁用网络功能,只有lo标识(127.0.0.1, 表示本地回环)
container
新建的容器使用另一个容器的网络ip配置, 不和宿主机直接通信。<br>
子主题
自定义网络
同一个Docker服务下, 默认桥接时, 容器内部可以通过ip内网互通. 但是ip是可变动的, 使用服务名(容器名)ping不通. <br>自定义网络(桥接即可)默认维护了服务名和ip的关系, 多个容器使用同一个自定义网络即可实现稳定的通过服务名的通信;<br>
子主题
镜像构建与发布
原理
镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。<br>分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。<br>所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
子主题
构建镜像<br>
依靠容器
docker commit -m="提交的描述信息" -a="作者" <containerId> <imgName>:<tag>
Dockerfile
是什么
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建镜像步骤
编写Dockerfile文件
创建镜像
docker build -f <目标Dockerfile文件名> -t <imgName:tag> .<br>
注意: 末尾有 空格 + "."
生成容器
常用保留字
子主题
demo
基于centos7, 增强 ifconfig, vim, jdk
#基于centos, 增强 vim, jdk, ipconfig<br><br># 基于centos<br>FROM centos:7<br><br># 作者信息<br>maintainer ryze<test@test.com><br><br># 环境变量<br>ENV WORKPATH /usr/local<br><br># 工作默认路径(引用环境变量)<br>WORKDIR $WORKPATH<br><br># RUN: 执行命令(build时)<br># 安装vim<br> RUN yum -y install vim<br># 安装 ipconfig<br>RUN yum -y install net-tools<br># 安装jdk<br>RUN yum -y install glibc.i686<br>RUN mkdir /usr/local/java<br><br># 宿主机文件添加到镜像中<br>ADD jdk-8u212-linux-x64.tar.gz /usr/local/java/<br><br># jdk环境变量<br>ENV JAVA_HOME /usr/local/java/jdk1.8.0_212<br>ENV JRE_HOME $JAVA_HOME/jre<br>ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH<br>ENV PATH $JAVA_HOME/bin:$PATH<br><br># 暴露端口<br>EXPOSE 10000<br><br>CMD eoho $WORKPATH<br>CMD echo "======镜像构建成功======"<br>CMD /bin/bash<br>
基于jdk环境, 发布java微服务
问题
创建img过程中可能出现各种问题导致出现虚悬镜像
删除虚悬镜像
docker image prune<br>
镜像发布
操作
公有仓库
阿里云(个人版)
镜像容器服务 >> 新建 命名空间 >> 新建 >> 镜像仓库
根据镜像仓库指示操作
私有库
创建仓库(容器形式)
docker pull registry<br>
运行仓库
docker run -d -p 5000:5000 --restart=always --name registry -v /ryze/registry/5000:/var/lib/registry registry<br>
放开http连接(仓库和客户端)
vi /etc/docker/daemon.json<br>
添加内容: <br>"insecure-registries": ["124.221.116.110:5000"]<br> <br>
查看私服中镜像
curl -XGET http://<registryHost:registryPort>/v2/_catalog<br>
推送到私服
复制目标镜像成私服规范
docker tag <srcImg> <Host:Port>/<newImgName:newTag><br>
此操作将生成引用镜像, 根据ImgId可认为是原始镜像的引用.<br>引用对象前缀即host:port, 后缀name:tag可自定义
推送
docker push <Host:Port>/<newImgName:newTag><br>
拉去
docker pull <Host:Port>/<name:tag><br>
docker-compose 容器编排
概述
Docker-Compose是Docker官方的开源项目,<br>负责实现对Docker容器集群的快速编排。
定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器<br>
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。<br>可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。其中的容器 可通过服务名互相访问, Docker-Compose 解决了容器与容器之间如何管理编排的问题。
安装 / 修改权限 / 版本查看 / 卸载
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose<br>
chmod +x /usr/local/bin/docker-compose<br>
docker-compose --version
rm /usr/local/bin/docker-compose
核心概念
子主题
常用命令
子主题
编排步骤
准备好docker镜像(基础镜像 / 本地dockerfile构建)
编写docker-compose.yml
检测配置 docker-compose config<br>
后台启动 dockr-compose up -d
关停 docker-compose stop<br>
demo
构建一个集成 mysql/redis 的服务镜像
其中配置文件依赖的同Docker下的服务可用服务名替代<br>
<br># 基于基础镜像java:8<br>FROM java:8<br># 作者<br>MAINTAINER raozheng<br># VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp<br>VOLUME /tmp<br># 将jar包添加到容器中并更名为zzyy_docker.jar<br>ADD Demo-Docker.jar Demo-Docker.jar<br># 运行jar包<br>RUN bash -c 'touch /Demo-Docker.jar'<br>ENTRYPOINT ["java","-jar","/Demo-Docker.jar"]<br>#暴露端口作为微服务<br>EXPOSE 8888<br>
docker build -t raozheng:2.0 .<br>
编写docker-compose.yml
<br>version: "3"<br><br>services:<br> microService:<br> image: raozheng:2.0<br> container_name: democompose<br> ports:<br> - "8888:8888"<br> volumes:<br> - /ryze/demodockercompose/microService:/data<br> networks:<br> - compose_net<br> depends_on:<br> - redis<br> - mysql<br><br> redis:<br> image: redis:6.0.8<br> container_name: redis<br> ports:<br> - "6380:6379"<br> volumes:<br> - /ryze/demodockercompose/redis/redis.conf:/etc/redis/redis.conf<br> - /ryze/demodockercompose/redis/data:/data<br> networks:<br> - compose_net<br> command: redis-server /etc/redis/redis.conf<br><br> mysql:<br> image: mysql:5.7<br> container_name: mysql<br> environment:<br> MYSQL_ROOT_PASSWORD: '0000'<br> MYSQL_ALLOW_EMPTY_PASSWORD: 'no'<br> MYSQL_DATABASE: 'test'<br> ports:<br> - "3307:3306"<br> volumes:<br> - /ryze/demodockercompose/mysql/db:/var/lib/mysql<br> - /ryze/demodockercompose/mysql/conf/my.cnf:/etc/my.cnf<br> - /ryze/demodockercompose/mysql/init:/docker-entrypoint-initdb.d<br> networks:<br> - compose_net<br> command: --default-authentication-plugin=mysql_native_password #解决外部无法访问<br><br>networks:<br> compose_net:<br> driver:<br> bridge<br><br>
启动
docker-compose up -d<br>
子主题
注意
容器之间通过容器名进行网络通信, 需要在compose手动指定容器名 container_name<br>
Docker的虚拟化原理
Docker容器只是一种特殊的进程, 是一个“单进程”模型。
使用Linux的特性进行"虚拟机的效果"
访问隔离: namespace
资源限制: CGroups
由于一个容器的本质就是一个进程,用户的应用进程实际上就是容器里 PID=1 的进程,也是其他后续创建的所有进程的父进程。这就意味着,在一个容器中,你没办法同时运行两个不同的应用,除非你能事先找到一个公共的 PID=1 的程序来充当两个不同应用的父进程,
容器可视化监控
Portainer<br>
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。
docker run -d -p 7000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer<br>
子主题
重量级监控<br>CAdvisor + InfluxDB + Granfana
概述
Cadvisor 监控收集
内存, cpu, io 的实时监控
InfluxDB 数据存储
时序数据库, C 支持其集成
Granfana 图表展示
图形化丰富的数据分析可视化
安装
Dockerfile
version: '3.1'<br> <br>volumes:<br> grafana_data: {}<br> <br>services:<br> influxdb:<br> image: tutum/influxdb:0.9<br> restart: always<br> environment:<br> - PRE_CREATE_DB=cadvisor<br> ports:<br> - "8083:8083"<br> - "8086:8086"<br> volumes:<br> - ./data/influxdb:/data<br> <br> cadvisor:<br> image: google/cadvisor<br> links:<br> - influxdb:influxsrv<br> command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086<br> restart: always<br> ports:<br> - "8080:8080"<br> volumes:<br> - /:/rootfs:ro<br> - /var/run:/var/run:rw<br> - /sys:/sys:ro<br> - /var/lib/docker/:/var/lib/docker:ro<br> <br> grafana:<br> user: "104"<br> image: grafana/grafana<br> user: "104"<br> restart: always<br> links:<br> - influxdb:influxsrv<br> ports:<br> - "3000:3000"<br> volumes:<br> - grafana_data:/var/lib/grafana<br> environment:<br> - HTTP_USER=admin<br> - HTTP_PASS=admin<br> - INFLUXDB_HOST=influxsrv<br> - INFLUXDB_PORT=8086<br> - INFLUXDB_NAME=cadvisor<br> - INFLUXDB_USER=root<br> - INFLUXDB_PASS=root<br>
测试
8080, 8083, 3000 端口
设置
3000 端口(Granfana)
配置 数据源
子主题
子主题<br>
配置 面板
子主题
子主题<br>
坐标数据均可自定义源
效果
0 条评论
下一页