1.Linux容器技术实现基础:Namespaces、CGroups、容器运行时简介及对比
namespace的类型及功能
MNT Namespace(mount) 提供磁盘挂载点和文件系统的隔离能力
cgroups作用是什么
Linux Cgroups的全称是Linux Control Groups,是Linux内核的一个功能,Cgroups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽 等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。
常见的runtime
runc:目前Docker和containerd默认的runtime,基于go语言开发,遵循OCI规范。
crun: redhat推出的运行时,基于c语言开发,集成在podman内部,遵循OCI规范。
gVisor:google推出的运行时,基于go语言开发,遵循OCI规范。
2.OCI、CRI、cri-dockerd、CRI-O、低级容器运行时与高级容器运行时
OCI(Open Container Initiative):2015年Google、docker、Redhat、IBM共同成立,定义了运行标准和镜像 标准。
CRI(Container Runtime Interface):2016 年12月Kubernetes 发布 CRI(容器运行时接口), 可以支持rkt等不同的运行时。
CRI-O:由redhat发起并开源,用于替代docker成为kubernetes的运行时,2016年开发,2019年4月8号进入 CNCF孵化。
什么是高级别运行时和低级别运行时
3.现代应用容器技术Docker的特性、架构与工作机制、存储引擎介绍
Docker 的优势
快速部署: 短时间内可以部署成百上千个应用,更快速交付到线上
高效虚拟化: 不需要额外hypervisor支持,基于linux内核实现应用虚拟化,相比虚拟机大幅提高性 能和效率
节省开支: 提高服务器利用率,降低IT支出
简化配置: 将运行环境打包保存至容器,使用时直接启动即可
环境统一: 将开发,测试,生产的应用运行环境进行标准化和统一,减少环境不一样带来的各种问 题
快速迁移和扩展: 可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将 应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台 更好的实现面向服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横 向扩展,符合开发中高内聚,低耦合的要求,减少不同服务之间的相互影响
Docker 的缺点
多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和 繁琐 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费
Docker的架构
Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机, node节点
Docker 服务端(Server): Docker守护进程,运行docker容器
Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
Docker 镜像(Images): 镜像可以理解为创建实例使用的只读模板,本质上就是一些程序文件的集合 Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库 harbor
Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中 的程序启动后生成的进程
Docker 存储简介
UnionFS是文件级的存储驱动,实现方式是把位于不同位置的目录或文件合并 mount到同一个目的目录中,简单来说 就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统,这种文件系统可以一层一层地叠加修改文件,无论底 下有多少层都是只读的,只有最上层的文件系统是可写的。
docker的存储引擎
centos 7.2及之前的版本默认使用devicemapper存储引擎,不能直接使用overlay存储引擎,除非新添加一快磁盘作为docker的数据盘,并在格式化的时候指定格式化参数-n ftype=1,7.3后修复此问题。
vfs: 用于测试环境,适用于无法使用copy-on-write文件系统的情况。 此存储驱动程序的性能很差,通常不建议用于
4.安装Docker、对Docker进行镜像加速及使用systemd进行资源限制等参数优化;
熟练使用各种方式安装docker
Ubuntu 14.04/16.04(使用 apt-get 进行安装)
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
CentOS 7(使用 yum 进行安装)
如果你之前安装过 docker,请先删掉
# sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
安装校验
root@iZbp12adskpuoxodbkqzjfZ:$ docker version
Client:
Version: 17.03.0-ce
API version: 1.26
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 07:52:04 2017
OS/Arch: linux/amd64
Server:
Version: 17.03.0-ce
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 07:52:04 2017
OS/Arch: linux/amd64
Experimental: false
Docker优化配置
[root@ubuntu2004 ~]#vim /etc/docker/daemon.json
{
"graph": "/var/lib/docker",
"storage-driver": "overlay2",
"insecure-registries": ["harbor.magedu.com","harbor.myserver.com","172.31.7.105"],
"registry-mirrors": ["https://9916w1ow.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": false,
"log-opts": {
"max-file": "5",
"max-size": "100m"
}
}
[root@ubuntu2004 ~]#systemctl daemon-reload ;systemctl restart docker.service
范例:Docker 实现代理功能
[root@ubuntu2204 ~]#mkdir -p /etc/systemd/system/docker.service.d
[root@ubuntu2204 ~]#cat >> /etc/systemd/system/docker.service.d/http-proxy.conf
<<EOF
[Service]
Environment="HTTP_PROXY=http://${PROXY_SERVER_IP}:${PROXY_PORT}/"
Environment="HTTPS_PROXY=http://${PROXY_SERVER_IP}:${PROXY_PORT}/"
Environment="NO_PROXY=127.0.0.0/8,172.17.0.0/16,10.0.0.0/24,10.244.0.0/16,192.16
8.0.0/16,wang.org,cluster.local"
EOF
[root@ubuntu2204 ~]#systemctl daemon-reload && systemctl restart docker.service
5.Docker的管理命令精讲、以及常用的使用案例
常用查询命令
# docker version #显示docker client和docker server的版本信息
# docker ps #列出容器,加上-a是列出包含为运行的所有容器
# docker info #显示系统信息
# docker inspect 容器ID #显示docker对象(镜像、网络、容器等)的详细信息
# docker stats #显示容器资源的实时统计信息
# docker diff 8ddf4ce923ef #对比容器和镜像有差异的文件或目录
# docker events #获取dockerd的实时事件,创建删除容器等操作
# docker logs -f nginx-container-test1 #持续查看容器标准输出和错误输出的日志
# docker port 81b344cff55d #列出一个容器端口映射关系
# docker search nginx #搜索镜像
# docker images #查看本地所有镜像Usage: docker image COMMANDCommands:build #从Docker文件构建新的镜像history #查询镜像的构建历史# docker history centos:7.9.2009 #查看的镜像的构建历史import #从本地或远程的压缩包等导入镜像,可以指定导入后的镜像名称inspect #显示一个或多个镜像的详细信息load #从一个tar包或标准输入导入镜像# docker load -i nginx-1.20.2.tar.gz #从一个tar包或标准输入导入镜像ls #列出本地的所有镜像prune #删除本地未使用的镜像pull #从镜像仓库下载镜像到本地push #从本地上传镜像到镜像仓库rmi #删除一个或者多个本地镜像# docker rmi -f 53ec353d8dc4 90a4cd9dfe4c #删除一个或多个镜像save #保存一个或者多个镜像到一个tar包(默认保存到当前终端的标准输出)tag #对镜像打一个新的标签# docker tag nginx:1.20.2 harbor.magedu.net/myserver/nginx:1.20.2 #为镜像添加一个新的tag# docker build #从dockerfile 构建镜像# docker commit -a "jack jack@magedu.com" -m "v2" --change="EXPOSE 80 443" 8ddf4ce923ef new-nginx-image #将容器提交为一个本地镜像
# docker cp 源 目的 #从容器和宿主机相互拷贝文件或目录# docker create -it --name test1 nginx:1.20.2 #创建一个新的容器且创建后的容器处于退出状态# docker events #获取dockerd的实时事件,创建删除容器等操作# docker exec -it 40e6379cf371 sh/bash #推进入到容器执行命令操作,推荐使用此方式# docker export 8ddf4ce923ef -o new-nginx-image.tar.gz #将容器的文件系统导出为一个本地压缩包,非镜像格式# docker import new-nginx-image.tar.gz #导入export导出的压缩包,导入后的镜像不完整,不能用于创建容器# docker kill $(docker ps -a -q) 强制关闭所有运行中的容器# docker login #登录镜像仓库# docker logout #登出镜像仓库# docker pause 81b344cff55d #暂停一个或者多个容器# docker port 81b344cff55d #列出一个容器端口映射关系# docker pull nginx:1.20.2 #从镜像仓库下载镜像# docker push nginx:1.20.2 #从本地上传镜像到镜像仓库(需要登录认证)# docker rename awesome_cerf nginx-container1 #重命名容器# docker restart ID/容器名称 #重启容器# docker rm -f 11445b3a84d3 #强制删除运行中的容器# docker rm -f `docker ps -aq -f status=exited` #批量删除已退出容器# docker rm -f $(docker ps -a -q) #批量删除所有容器# docker run -it docker.io/centos bash #创建并进入容器,ctrl+p+q退出容器不注销# docker run -it --name nginx-test1 nginx:1.20.2 #自定义容器名称# docker run -p 80:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-container-test1 nginx:1.20.2 #创建容器并指定多端口 映射# docker run -d -p 80:80 --name nginx-container-test1 nginx:1.20.2 #后台运行容器# docker run -it --rm --name nginx-delete-test nginx:1.20.2 bash #单次运行容器# docker run -it -d centos:7.9.2009 /usr/bin/tail -f '/etc/hosts' #创建容器的时候传递命令及参数# docker save 50fe74b50e0d > nginx-1.20.2.tar.gz #保存一个或多个镜像到一个压缩文件(默认是标准输出)# docker start ID/容器名称 #启动一个或多个容器# docker stop ID/容器名称 #停止一个或多个容器# docker unpause 81b344cff55d #取消一个或多个容器的暂停# docker update 容器 --cpus 2 #更新容器配置信息,比如资源限制的值# docker wait #一直等待容器退出并显示容器的退出状态码
6.docker数据卷及数据卷容器
数据卷的使用场景:
- 容器数据持久化(mysql数据、nginx日志等类型)
- 静态web页面挂载
- 应用配置文件挂载
- 多容器间的目录或文件共享
数据卷的特点及使用:
- 数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。
- 在宿主机对数据卷更改数据后会在所有容器里面会立即更新。
- 数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。
- 在容器里面的写入数据不会影响到镜像本身
把容器目录挂载到宿主机目录
把容器目录挂载到卷
#创建容器并指定多端口 映射
# docker run -p 80:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-container-test1 nginx:1.20.2
使用docker创建MySQL容器并把数据保存到宿主机的/data/mysql