Dockere引擎架构详解
2.1 Docker引擎发展历程
2.1.1 首发版本架构
Docker
在首次发布时,其引擎有两个核心组件构成,LXC(Linux Container)
与Docker Daemon
构成。
不过该架构依赖于LXC
,使得Docker
存在严重的问题:
- 依赖于外部工具对
Docker
来说存在着巨大的生存风险。LXC
使得Docker
无法实现跨平台。Docker Daemon
的“大而全‘也带来了严重的问题。- 版本更新与功能扩展较难。
- 运行较慢,带来性能问题。
- 不符合软件哲学。
Docker Daemon
运行出现问题,会直接影响容器的运行。
2.1.2 Docker0.9版本架构
从Docker0.8
版本开始,Docker
使用自研的Libcontainer
工具替换了LXC
。
2.1.3 Docker1.1版本架构
2017年7月OCI
发布了两个规范(镜像规范与运行时规范)的OCI1.0
版本,Docker1.1
版本于2016年底发布,基本遵循了OCI1.0
版本。
从Docker1.1
版本开始:Docker Daemon
中不再包含任何容器运行时代码,而是将容器运行时单独剥离了出来,形成了RUNC
项目。
2.2 Docker引擎架构
Docker
引擎是用来运行管理容器的核心软件,其现代架构由四部分组成,Docker Client
,Dockerd
,Containerd
与runc
。
2.2.1 Docker Client
Docker
客户端,Docker
引擎提供的CLI
工具 ,用于用户向Docker
提交命令请求。
2.2.2 Dockerd
Dockerd
,即Docker Deamon
,在现代Dockerd
中的主要包含的功能有镜像构建,镜像管理,REST API
,核心网络及编排等,其通过gRPC
与Containerd
进行通信。
2.2.3 Containerd
Containerd
,即Container Daemon
,该项目的主要功能是管理容器的生命周期,不过其本身不回去创建容器,而是调用RUNC
来完成容器的创建。Docker
公司后再将Containerd
项目捐献给了CNCF
。
2.2.4 Runc
Runc
,Runc Container
,是OCI
容器运行时规范的实现,Runc
项目的目标之一就是与OCI
规范保持一致,所以Runc
所在层也成为OCI
层,这使得Docker Daemon
中不用再包含任何容器运行时候的代码了,简化了Dokcer Daemon
。
Runc
只有一个作用,创建容器,其本质是一个独立的容器运行时CLI
工具,其在Fork
出一个容器子进程后会启动该容器进程,在容器进程启动完毕后,runc
会自动推出。
2.2.5 Shim
Shim
是实现“Daemonless Container”
不可或缺的工具,使容器与Docker Daemon
解耦,使得Docker Daemon
的维护与升级不会影响到运行中的容器。
每次创建容器时,Containerd
会先Fork
出Shim
进程,然后再由Shim
进程Fork
出Runc
进程,当Runc
自动推出之前,会先将新容器进程的父进程指定为相应的Shim
进程。
除了作为容器的父进程外,Shim
进程还具有两个重要功能:
- 保持所有
STDIN
与STDOUT
流的开启状态,从而使得当前Docker Daemon
重启时,容器不会因为Pipe
的关闭而终止。- 将容器的退出状态反馈给
Docker Daemon
。
下图解释上面各个名词的关系
2.3 Docker引擎分类
在安装Docker
之前需要先了解Docker
官方对其版本的分类,Docker
的版本分为大版本和小版本。
2.3.1 大版本
Docker
从大版本来说,分为三类,Moby,社区版Docker-CE(conmmunity Edition)
,和企业版Docker-EE(Enterprise Edition)
2.3.2 小版本
从V1.13.1
之后,Docker
的发布计划发生了变更,每个大版本下都出现了两个Edge
月版与Stable
季版,不过现在的官网中一般只能看到Stable
版本。
2.4 Docker引擎的安装
Docker
可以安装在Windows,Linux
,Mac
等系统中,但生产环境下,服务器使用Linux
中的CentOS
,所以下面就以Docker
在CentOs7
中的安装为例子来学习Docker
的安装。
官网:(https://docs.docker.com/install/linux/docker-ce/centos/)中可以看到具体的安装步骤
2.5 VMware安装
- 进入官网下载
17pro
版本:VMware官网 下载VMware
- 勾选我接受许可协议中的条款与下一步
- 勾选“增强型键盘驱动程序”与“下一步”,更改安装位置
- 选择性勾选,为了提升用户体验设置的东西,可以不选
- 选择需要创建的快捷方式
- 点击完成,系统提示重新启动
- 点击“是”,重新启动系统
- 启动之后,双击
“VMware Workstation Pro”
图标,即可打开如下界面。输入下面的密钥,如果一个不行,多试几个。
密钥:激活码因侵权不能放到这里,私信我即可
9. 安装激活完成后启动
2.6 CentOS7的下载与在VM中安装centOS 7
2.6.1 镜像下载地址:下载地址
2.6.2 VMware安装Centos 7
- 打开
“VMware Workstation”
软件,选择“创建虚拟机”
。
- 自定义虚拟机设置:您可以根据需要自定义虚拟机的配置,如虚拟机的内存、处理器、网络等设置。
- 虚拟机兼容性选择,一般默认就行
- 选择稍后安装操作系统
- 操作系统的选择,这里选择之后安装的操作系统,正确的选择会让vm tools更好的兼容。这里选择linux下的CentOS
- 虚拟机位置与名称,定义一个虚拟机名字,在虚拟机多的时候方便找到虚拟机,及保存路径
- 处理器与内存的分配,处理器分配需要根据自己的实际需求来分配。在使用过程中
CPU
不够的话还可以在增加。根据实际情况调配
- 内存也要根据实际需求分配。
- 网络连接类型选择,桥接模式,虚拟机和宿主机在网络上就是评级的关系,相当于连接在同一交换机上。
- 按照虚拟机默认选项即可
- 默认选项即可
- 创建新虚拟磁盘
- 磁盘展示分配
50
,后期可以随时增加和缩减 - 磁盘名称默认即可
- 取消不需要的硬件,以便于更快的启动
- 声卡,打印机,及其
USB
控制器等不需要的可以移除,后期也可以添加
- 点击完成后,即可创建好虚拟机,
2.7 CentOS 7 镜像安装
- 悬着
CD/DVD(IDE)
链接光盘 - 点击
CD/DVD
,在选择使用ISO映像文件
,最后选择浏览找到下载好的镜像文件。启动时链接一定要勾选上后确定。
- 开启虚拟机
- 开启虚拟机,选择第一项,直接回车
- 悬着安装过程中使用的语言
- 设置时间
7. 选择上海,查看时间是否正确再选择完成 - 选择安装的软件
- 如果安装的
GUI
及其GNOME
则是带有左面的,我这边选择无桌面最小安装
- 系统中配置安装位置,指的是系统如何分区
- 如果对分区不清楚就选择自动分区,这里我选择了配置分区
- 手动分区我们要选择标准分区,然后点击下面的添加分区。
- 分别创建三个分区
/boot
,swap
交换分区,/
根分区
- 编辑分区完成后,点击“接受更改”
- 回到界面,配置网络和主机名
- 打开以太网,应用主机名,点击完成。
- 注意,如果分区不够则取扩大根分区
出现此报错直接修改"/"
的大小
扩大后,即可进行下一步开始安装 - 创建
root
密码,我这边写了root123456
- 创建用户
这里就是普通用户的权限,权限较低
密码用户创建设置好后,安装完成,点击重启
重启输入账号,密码 - 执行
ip addr
及ping www.baidu.com
测试网络是否正常使用
至此,CentOS7
的安装全部完成了。说明:CentOS 7
默认安装好之后是没有自动开启网络连接的!所以下面我们还要配置一下CentOS 7
的网络。 - 编辑网络配置文件
执行:
“vi /etc/syscibfug/network-scripts/ifcfg-ens333”
按“i”
进入编辑模式,将ONBOOT
改为false
,编辑完成按“ctr+:”
输入:wq
保存退出
- 重启网络服务:
systemctl restart network.service
- 测试网络连通性:
systemctl status network.service //查看网络服务情况
- 测试ping是否成功
ping -c 3 www.baidu.com
请求三次百度
- 打开百度:
curl www.baidu.com
好了,虚拟机安装及其虚拟机安装Centos 7到此就安装完成了,最下面是CentOS 7总结的一些基本常用命令。
2.8 centos
下安装Docker
准备
Docker
官网安装教程:教程
2.8.1安装条件
Docker
支持以下的CentOs
版本:CentOS 7(64-bit)
,目前,CentOS
仅发行版本中的内核支持Docker
。
Docker
运行在CentOS7
上,要求系统为64
位,系统内核版本为3.10
或以上。
2.8.2 查看自己的Centos内核
uname
命令用于打印当前系统相关信息(内核版本号,硬件架构,主机名称,操作系统类型等)
uname -r
2.9 Docker
安装
2.9.1 确定是centos7
的版本
cat /etc/redhat-release
2.9.2卸载旧版本
下面代码中 ""是因为代码太长了,使用“\”进行换行
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum
可能会报告您没有安装任何这些软件包。存储在其中的映像、容器、卷和网络
不是 卸载 Docker
时自动删除 /var/lib/docker
2.9.3 安装方法 注意:必须要在root@权限下进行安装
- 确保
linux
能上外网 - 使用国内的
daocloud
意见安装命令(推荐)
yum -y install curl
curl -sSL https://get.daocloud.io/docker | sh
或者使用yum
安装 yum install docker
2.9.4 使用rpm
存储库安装
在新主机上首次安装 Docker
引擎之前,您需要 需要设置 Docker
仓库。之后,您可以安装和更新 存储库中的 Docker
。
2.9.4.1 设置存储库
安装软件包(提供实用程序)并设置存储库。yum-utils
、yum-config-manager
执行:sudo yum install -y yum-utils
国内安装地址:从国外服务器上下载Docker
安装包非常的慢,可以从国内服务器上下载,在百度搜索“Docker”
的阿里云镜像地址【http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo】
,找到地址代替下面红框中的地址即可。
执行:sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看是否下载完毕:ll /etc/yum.repos.d
2.9.5 安装Docker
引擎
- 安装
Docker Engine
、containerd
和Docker Compose
:
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完成
2.9.6启动Docker
sudo systemctl start docker
2.9.7查看Docker版本
docker version
2.9.8 Docker引擎打印hello-word
sudo docker run hello-world
上图中,没有hell-word镜像
会自动下载一个镜像,现在,您已成功安装并启动Docker
引擎。
第一次运行容器时,Docker
守护进程会从Docker Hub
中提取镜像 “hello-world”
。然后,它将根据该镜像创建一个新容器,并将输出传输到你的终端。从现在开始,镜像被下载到你的本地机器。您可以通过运行以下命令列出所有docker
映像:
sudo docker image ls
下次运行该镜像时,比第一次运行快,可以用image-id
代替镜像名称。例如:
sudo docker run d2c94e258dcb
2.9.9 测试运行negix
docker run --name nginx -p 81:80 -d nginx
或者
docker run --name nginx -p 8080:80 -d docker.io/nginx //将80端口映射为8080
2.9.9.1命令解释:
- docker 是docker系统的命令,表示要使用docker系统的操作
- run : 运行容器
- –name :自定义运行的容器名称
- -p:端口映射
- 81:容器外的端口
- 80:nginx的端口,通过81访问容器80上的运行的程序
- -d:表示容器后台运行
- nginx:镜像名称,是docker系统已经命名的,不是自定义的
查看neginx3
正在运行,再执行ifconfig
命令,查看当前虚拟机的IP地址
再本地浏览器访问:http://192.168.80.59:8085/
2.9.10 设置Docker远程镜像仓库地址
1.在/etc/docker/
目录创建文件daemon.json
sudo vi /etc/docker/daemon.json
- 进入
daemon.json
后按"i"
进入编辑并写入:
{
"registry-mirrors":
["https://registry.docker-cn.com",
"https://nrbewqda.mirror.aliyuncs.com",
"https://dmmxhzvq.mirror.aliyuncs.com"]
}
- 按
"esc"
后输入":wq"
保存退出
- 重启
Docker
服务,镜像仓库才能生效
启动 systemctl start docker
关闭 systemctl stop docker
守护进程重启 sudo systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 sudo service docker restart
关闭docker service docker stop
- 再次执行:
docker run --name nginx5 -p 8085:80 -d docker.io/nginx
遇到的问题:重新运行docker run --name nginx -p 8080:80 -d docker.io/nginx后报错
docker:Error response from daemon:Conflict. The container name "/nginx" is already in use by container "ccbfffe5e22ee852e36e55806bfa78d951e8e2fb3f9094419c23635435cbf0c"you have to remove (or rename) that container to be able to resuse that name
问题解决:这个错误信息表示,你尝试启动的容器名字(“nginx”)已经被另一个容器使用了。Docker容器的名字必须是唯一的,不能有两个活动的容器具有相同的名字。这里的错误是因为之前已经有一个名为“nginx”的容器在运行,或者至少在Docker中注册过且尚未删除。
解决方法一、删除已存在的同名容器:停止容器docker stop nginx
然后删除容器docker rm nginx
解决方法二、重命名已经存在的同名容器:docker rename nginx nginx_old
解决方法三、直接使用不同名字的容器:docker run --name nginx_new -p 8080:80 -d docker.io/nginx
6. 浏览器运行
2.10 卸载 Docker
引擎
- 卸载
Docker Engine
、CLI、containerd
和Docker Compose
包:
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
- 主机上的映像、容器、卷或自定义配置文件 不会自动删除。要删除所有映像、容器和卷,请执行以下操作:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
以上就是Docker安装卸载教程,下面包含一些centOS 7操作系统的常用命令:
2.11 cent OS 7常用命令
2.11.1 cd 切换命令
cd / 切换或进入系统根目录
cd app 切换到app目录
cd .. 切换到上一层目录
cd ~ 切换到用户主目录
cd - 切换到上一个所在目录
2.11.2列出文件列表
ls ll(详情)
2.11.3 创建与删除
mkdir a 创建a目录(文件相似)
rmdir a 删除a目录(文件相似)
mkdir –p b/test 级联创建b以及test目
rm a.txt 询问删除a.txt文件
rm -f a.txt 强制删除a.txt文件
rm -rf a 不询问递归删除
rm -rf * 删除所有文件
rm -rf /* 自杀
cp a.txt b.txt 将a.txt复制为b.txt文件
cp a.txt ../ 将a.txt文件复制到上一层目录中
mv a.txt ../ 将a.txt文件移动到上一层目录中
mv a.txt b.txt 将a.txt文件重命名为b.txt
tar –cvf xxx.tar ./* 打包
tar –zcvf xxx.tar.gz ./* 打包并且压缩
tar –xvf xxx.tar 解压
tar -zxvf xxx.tar.gz -C /usr/aaa 解压
find / -name "ins*" 查找文件名称是以ins开头的文件
find / -name "ins*" –ls
grep lang anaconda-ks.cfg 在文件中查找lang
grep lang anaconda-ks.cfg –color 高亮显示
2.11.4 chmod 权限
chmod -R 777 文件
chmod -R a.txt
2.11.5 更改文件名
mv 更新前文件名 更新后文件名
mv a.txt b.txt
2.11.6 编辑文件
vi 文件名
2.11.7 保存文件 ctrl+:
wq
2.11.8 修改密码
passwd root
2.11.9 显示ip信息
ip addr
2.11.10 清空控制台
clear
2.11.11 切换用户
su 用户名
su huang
su root
2.11.12 查看用户
groups 用户名
groups huang
2.11.13 查看网络服务情况
systemctl status network.service
2.11.14 防火墙
firewall-cmd --state 检查状态
systemctl start firewalld 开启
systemctl stop firewalld 停止
systemctl disable firewalld 禁止开机启动
systemctl enable firewalld 开启开机启动
2.11.15 端口进程
netstat -lnp|grep 端口号 查看端口占用
ps 端口号 查看端口对应进程的信息
kill -9 端口号 杀掉端口进程
2.11.16 操作系统版本
cat /etc/redhat-release 查看操作系统版本
cat /proc/version 查看操作系统信息
2.11.17 修改主机名
hostnamectl set-hostname xxxx(要修改的主机名字)
2.11.18 关机重启
poweroff 关机
reboot 重启
2.11.19 检查磁盘空间使用情况
df -h : 检查磁盘空间使用情况
2.11.20 清理yum缓存
sudo yum clean all : 清理yum缓存
2.11.21 清理临时文件
sudo rm -rf /var/tmp/* : 清理临时文件
2.11.22 docker系统命令
docker image prune :清理未使用的Docker镜像
docker image prune -a : 更彻底的清除未使用的Docker镜像,删除所有未被容器使用的镜像
docker volume prune :清理未使用的卷
docker network prune : 清理未使用的网络
docker stop nginx:移除已存在的同名容器
docker rm nginx 移除nginx容器
以上命令持续更新,感兴趣的搜藏,我会将用到的常用命令收集到当前博文中的哦~