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