Docker基本管理
1.Docker概述
(1)为什么要用到容器?
(1)容器可以屏蔽底层操作系统的差异性,可以让应用程序不管在哪里都能使用容器的环境正常运行,从而保证了开发测试环保局与生产环境的一致性。
(2)容器部署起来非常便捷和迅速,可以大大缩短应用部署的周期时间
容器引擎:docker 、containered 、 podman 、rocket。
●灵活:即使是最复杂的应用也可以集装箱化。
●轻量级:容器利用并共享主机内核。
●可互换:可以即时部署更新和升级。
●便携式:可以在本地构建,部署到云,并在任何地方运行。
●可扩展:可以增加并自动分发容器副本。
●可堆叠:可以垂直和即时堆叠服务。
(2)docker是什么?
docker是用go语言开发并开源的容器引擎,用来运行容器里的应用。docker也是用来管理容器和镜像的工具。
(3)docker容器与虚拟机的区别?
区别 | Docker容器 | 虚拟机 |
---|---|---|
所有容器共享宿主机的内核 | 每个虚拟机都有独立的操作系统和内核 | |
隔离性 | 通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 | 完全隔离。每个虚拟机都有独立的硬件资源分配 |
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 容器相当于宿主机的进程,性能几乎没有损耗 | 需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问,会有一定的性能损耗 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 一个宿主机可以启动成百上千个容器 | 最多几十个虚拟机 |
(4)Linux 六大 namespace
MNT(mount):文件系统隔离
NET(network):网络资源隔离
PID:进程的pid隔离
IPC:进程间通信隔离
UTS:主机名隔离
USER:用户隔离
(5)docker的三大核心概念
镜像:是创建容器的基础,是一个只读的模板文件,里面包含运行容器中的应用程序所需要的所有资料(比如应用程序执行文件、配置文件、动态库文件、依赖包、系统文件和目录等)
容器:是用镜像运行的实例,容器可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的
仓库:是用来集中保存镜像的地方,有公有仓库和私钥仓库之分
2.安装Docker
(1)准备环境
systemctl disable --now firewalld
setenforce 0
vim /etc/selinux/config
disabled
cd /etc/yum.repos.d/
ls
mv local.repo repo.bak/
ls
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
ls
(2)安装依赖包
rpm -q device-mapper-persistent-data lvm2 #查看
yum install -y yum-utils device-mapper-persistent-data lvm2
注:yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
(3)设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)安装 Docker-CE并设置为开机自动启动
#国内源:
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
阿里云docker源:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
注:安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
docker version #查看docker版本
docker info #查看docker详细信息
3.Docker镜像创建与操作
(1)镜像操作
docker search 关键字 #根据仓库或镜像的关键字搜索镜像
docker pull 仓库名/镜像名:标签 #下载镜像,如果不指定标签则默认使用 :latest
docker images [-q] #查看镜像列表,-q 表示仅显示镜像ID
docker inspect 镜像名或镜像ID #查看镜像的详细信息
docker tag 旧镜像名:旧标签 新镜像名:新标签 #添加新的镜像名或标签
docker rmi 镜像名或镜像ID [-f] #删除镜像
docker save -o 镜像文件路径 镜像名或镜像ID #将镜像导出为文件
docker load -i 镜像文件路径 #将镜像文件导入docker
docker load < 镜像文件路径
docker login 仓库地址 #登录镜像仓库
docker push 仓库名/镜像名:标签 #上传镜像到仓库
注:containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。
·根据镜像的唯一标识 ID 号,获取镜像详细信息
·存出镜像:将镜像保存成为本地文件
·载入镜像:将镜像文件导入到镜像库中
方法一:
方法二:
·上传镜像
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
(2)容器操作
docker create [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令] #创建容器
docker start 容器名或容器ID #启动容器
docker ps -a [-q] #查看容器列表
docker inspect 容器名或容器ID #查看容器的详细信息
docker stop 容器名或容器ID [-t 等待时间] #停止容器,发送 SIGTERM 信号,默认等待10s
docker kill 容器名或容器ID #停止容器,默认发送 SIGKILL 信号
docker rm 容器名或容器ID [-f] #删除容器
docker exec -it 容器名或容器ID sh|bash #登录容器
docker cp 宿主机文件路径 容器名或容器ID:绝对路径 #复制宿主机文件到容器中
docker cp 容器名或容器ID:绝对路径 宿主机文件路径 #复制容器文件到宿主机中
docker logs 容器名或容器ID #查看容器中PID=1的主进程的日志
常用选项:
-i:让容器开启标准输入接受用户输入命令
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell
·创建并启动容器
在后台持续运行 docker run 创建的容器
需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。
·不加 -d 选项会创建容器后直接进入容器进行交互,但是退出容器,容器也会停止
#将容器导出成文件
docker export 容器名或容器ID > 容器模板文件
docker export -o 容器模板文件 容器名或容器ID
#将容器模板文件导入成镜像
docker import 容器模板文件 -- 镜像名:标签
cat 容器模板文件 | docker import - 镜像名:标签
(3)docker run 的启动过程
1)检查本地是否有指定镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器
2)在只读的镜像层上再挂载一层可读可写的容器层
3)从docker网桥给容器分配一个虚拟接口和IP地址
4)使用镜像的默认启动命令或docker run 指定的命令来启动容器,直到容器中的PID=1的主进程退出为止
docker run -d [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令] #创建并启动容器
-P #使用随机的宿主机端口映射容器端口(从32768开始)
-p 宿主机端口:容器端口 #使用指定的宿主机端口映射容器端口
-v宿主机绝对路径:容器绝对路径[:ro] #将宿主机的目录或文件挂载到容器的数据卷目录
--volumes-from 数据卷容器名 #共享数据卷容器的数据卷目录,实现容器与容器之间的数据共享
--link 目标容器名:连接别名 #创建容器互联,实现在容器内通过目标容器名或连接别名与目标容器通信
4.docker网络模式
Docker 网络实现原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
(1)bridge
docker容器的默认网络模式。使用此模式的每个容器都有独立的网络命名空间(network namespace),每个容器都有独立的IP、端口范围、路由信息、iptables规则等网络资源。
docker run [--network=bridge] ....
(2)host
使用此模式的容器与宿主机共享网络命名空间,即容器和宿主机使用同一个IP、端口范围(容器与宿主机或其它使用host模式的容器不能使用相同的端口)、路由信息、iptables规则等网络资源。
docker run --network=host ....
(3)container
使用此模式的容器与指定的已存在的容器共享网络命名空间,即两个容器使用同一个IP、端口范围(容器与指定的容器不能使用相同的端口)、路由信息、iptables规则等网络资源。
docker run --network=container:容器名或容器ID ....
(4)none
每个容器都有独立的网络命名空间,但是容器没有自己的eth0网卡、IP、端口等,只有lo网卡。
docker run --network=none ....
(5)自定义网络
可以用来自定义创建一个网段、网桥、网络模式,还可以实现使用自定义网络指定容器IP来创建容器
docker network create --subnet=自定义网段 --opt "com.docker.network.bridge.name"="自定义网桥名" 自定义网络模式名 #创建自定义网络
docker run --network=自定义网络模式名 --ip=自定义容器IP .... #使用自定义网络指定容器IP来创建容器
安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host
5.cgroup资源限制(限制容器进行对CPU 内存 磁盘IO 等资源的最大使用量)
Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。
Cgroup 是 ControlGroups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等等) 的机制,被 LXC、docker 等很多项目用于实现进程资源控制。Cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理是通过该功能来实现的。
(1)CPU限制
1)设置单个容器进程能够使用的CPU使用率上限
针对新建的容器:
docker run --cpu-period=单个CPU的调度周期时间(1000~1000000) --cpu-quota=容器进程能够使用的最大CPU时间(>=1000,<=调度周期时间)
针对已存在的容器:
修改 /sys/fs/cgroup/cpu/docker/
容器ID/ 目录下的 cpu.cfs_period_us(单个CPU的调度周期时间)
cpu.cfs_quota_us(容器进程能够使用的最大CPU时间)
这两个文件的值
2)设置多个容器的CPU占用比份额(只在多个容器同时运行且CPU资源紧张的时候生效)
docker run --cpu-shares=容器进程最大占用的CPU份额(值为1024的倍数)
3)设置容器绑定指定的CPU
docker run --cpuset-cpus CPUID[,CPUID2,....]
验证
分别进入容器,进行压力测试
针对新建的容器
设置多个容器的CPU占用比份额
设置容器绑定指定的CPU
(2)内存限制
设置容器能够使用的内存和swap的上限
docker run -m=内存值 --memory-swap=内存和swap的总值
docker run -m=内存值 --memory-swap=0或不设置,表示容器的swap为内存的2倍
docker run -m=内存值 --memory-swap=-1,表示不限制swap的值,宿主机有多少swap,容器就可使用多少
(3)磁盘IO限制
docker run --device-read-bps 磁盘设备文件路径:速率 #限制容器在磁盘上每秒读的数据量
docker run --device-write-bps 磁盘设备文件路径:速率 #限制容器在磁盘上每秒写的数据量
docker run --device-read-iops 磁盘设备文件路径:次数 #限制容器在磁盘上每秒读的次数
docker run --device-write-iops 磁盘设备文件路径:次数 #限制容器在磁盘上每秒写的次数