容器技术与传统虚拟化技术
传统虚拟化技术
容器技术
容器技术相较于传统虚拟化技术的区别和优势
资源利用率:
容器技术:容器共享主机操作系统内核,因此容器之间的资源利用率更高,启动速度更快,占用的资源更少。
传统虚拟化技术:每个虚拟机都有自己的操作系统和内核,相互之间独立,因此占用的资源更多,启动速度更慢。
部署和管理:
容器技术:容器可以通过镜像快速部署,易于扩展和管理,支持自动化部署和持续集成。
传统虚拟化技术:虚拟机的部署和管理相对复杂,需要预先分配资源和配置虚拟硬件。
性能和效率:
容器技术:由于共享操作系统内核,容器之间的通信和资源共享更加高效,因此具有更低的性能损耗。
传统虚拟化技术:由于每个虚拟机都有自己的操作系统,需要额外的资源来模拟硬件和操作系统的功能,因此性能损耗相对较高。
轻量级和快速启动:
容器技术:容器镜像通常较小且启动速度快,适合于快速部署和微服务架构。
传统虚拟化技术:虚拟机的镜像通常较大,启动速度较慢,需要更长的时间来部署和启动。
总结一下,传统虚拟化技术是虚拟完整的操作系统,而容器技术与宿主机公用内核,轻量、高效、易于部署和管理。
Docker的缺点,容器的隔离性没有虚拟机强,公用Linux内核,安全性有先天缺陷
Docker核心组件
image镜像,构建容器(应用程序运行所需的环境,打包为镜像文件)
Container,容器(应用程序跑在容器中)
镜像仓库(dockerhub)(保存镜像文件)
部署Docker环境
安装条件
需要64位操作系统
至少RHEL6.5以上的版本,建议RHEL8;Docker安装时,内核要求在3.0以上,RHEL7的内核默认在3.0以上,不满足可以单独升级系统内核。
关闭防火墙(非必须)firewalld,Iptables
上述两个防火墙使用的都是红帽的netfilter框架;Docker安装时,会自动的接管防火墙,并向防火墙里添加配置,如果防火墙存在,会产生冲突。
安装Docker
Docker没有专门的Rocky Linux仓库,但Rocky Linux是基于CentOS的,可以使用相同的仓库。添加好仓库后,安装Docker,它由三个软件包组成。
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 查看Linux内核版本
uname -r
# 配置yum源,安装docker,开启路由转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p # 让配置立即生效(否则需要重启)
yum -y install docker-ce docker-ce-cli containerd.io
systemctl enable --now docker # 启动docker服务
docker version
启动Docker守护进程
systemctl start docker
systemctl enable docker
或者
systemctl enable --now docker
Docker镜像管理
什么是Docker镜像
镜像是启动容器的核心
在Docker中容器是基于镜像启动的
镜像采用分层设计
容器使用镜像启动
镜像采用分层技术:
用户可以根据自己的需求来制作镜像,例如:在镜像的第一层定义应用程序的变量,在镜像的第二层修改配置文件,在镜像的第三层进行应用软件的部署;
分层做好镜像后,用户使用镜像启动容器时,可以选择根据镜像的哪一层来启动,类似快照还原;
镜像怎么来的
自己制作镜像
从镜像仓库下载
镜像的名称和标签
指定镜像的方法
每一个镜像都对应唯一的镜像
镜像名称(文件名称)+标签(路径) == 唯一
每一个镜像都有标签,如果没写就是默认标签latest
我们在调用镜像的时候,如果没有指定标签也是latest
镜像管理常用命令
# 查看本机镜像
docker images
# 按关键字从仓库搜索镜像
docker search 关键字
# 删除镜像
docker rmi 镜像名称:镜像标签
# 下载镜像
docker pull
# 备份镜像
docker save 镜像名称:镜像标签 -o 文件名 (tar格式)
# 从tar包恢复镜像(导入镜像)
docker load -i 备份文件名称
# 更新镜像名称和标签
docker tag 镜像名称:镜像标签 新镜像名称:新镜像标签
Docker容器管理
启动容器
docker run
常用选项
-i 以交互模式运行容器,通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d 后台运行容器,并返回容器ID
-v 绑定一个卷,宿主机目录或文件:容器目录或文件,主机不存在该目录或文件时会自动创建
-m 设置容器使用内存最大值
-p 指定端口映射,格式为:主机(宿主)端口:容器端口
-h "mars" 指定容器的hostname
--name="": 为容器指定一个名称;
--dns 8.8.8.8 指定容器使用的DNS服务器,默认和宿主一致
--env-file=[] 从指定文件读入环境变量
--net="bridge" 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型,默认为bridge
-e username="ritchie" 设置环境变量
演示实例
# 下载镜像
[root@demo ~]# docker pull rockylinux:9.1
9.1: Pulling from library/rockylinux
9d28f3f24f51: Pull complete
Digest: sha256:972a6b9cec75b2f47bf0faa425135e1bdb9945306a22f26db0b3a4ee8a289687
Status: Downloaded newer image for rockylinux:9.1
docker.io/library/rockylinux:9.1
[root@demo ~]#
# 启动容器
[root@demo ~]# docker run -it rockylinux:9.1 /bin/bash
[root@11da1b9d6e4f /]# ls
afs bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@11da1b9d6e4f /]#
感兴趣的可以研究下容器部署为知笔记的命令
docker run --name wiz --restart=always -it -d -v ~/wizdata:/wiz/storage -v /etc/localtime:/etc/localtime -p 80:80 -p 9269:9269/udp wiznote/wizserver
查看容器
docker ps
常用选项
-a 所有的容器(运行中的和已停止的)
-q 运行中的容器id值
-aq 查看所有容器的id
删除容器
docker rm 容器id
正在运行的容器无法删除,需要先停止容器在执行删除命令
# 删除所有的容器
docker rm -f $(docker ps -aq) #$()用来获取命令的执行结果
容器的启动、停止和重启
docker start|stop| restart 容器id
拷贝文件
docker cp 本机文件路径 容器id:容器内路径(上传)
docker cp容器id: 容器内路径 本机文件路径(下载)
查看容器信息
docker inspect 容器id
连接容器启动进程
docker attach 容器id
连接容器,启动新进程
docker exec -it 容器id 启动命令
attach连接的是上帝进程,直接退出会导致容器关闭
退出attach而不关闭容器的快捷键(Ctrl + p + q)
有些进程是无法用户交互的,连接上帝进程不能管理容器
这种方式主要用于排错
exec启动新的进程连接,退出不会导致容器关闭
自定义运行新的命令与上帝进程无关
前台/后台服务
容器的启动进程在后台运行不等于容器在后台运行
容器的启动服务
前台服务(-it)
一般是能与用户交互的程序,比如 /bin/bash、/bin/sh等
后台服务(-itd)
一般是一个程序服务,比如apache、nginx、redis等
演示实例 部署应用
# 删除之前所有的容器 启动一个新的rockylinux
[root@demo ~]# docker rm -f $(docker ps -aq)
[root@demo ~]# docker run -it --name apache rockylinux:8.5
[root@50b460616d44 /]# cd /etc/yum.repos.d/
[root@50b460616d44 yum.repos.d]# rm -rf *
# 在容器里面安装相关的软件包
[root@50b460616d44 yum.repos.d]# yum -y install httpd php psmisc
[root@50b460616d44 yum.repos.d]# echo 'hello world' > /var/www/html/index.html
[root@d7cfa9370097 yum.repos.d]# pstree -p
# 因为容器内并没有systemd的服务,无法使用systemctl来启动httpd的服务
# 查看httpd的服务文件,获取环境变量文件和服务启动命令
[root@50b460616d44 yum.repos.d]# cat /lib/systemd/system/httpd.service
...
[Service]
Type=notify
Environment=LANG=C
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND #启动命令,$OPTIONS 此环境变量为空,可以不用写
...
[root@50b460616d44 yum.repos.d]# LANG=C #设置环境变量
[root@50b460616d44 yum.repos.d]# /usr/sbin/httpd -DFOREGROUND #启动httpd服务
AH00558: httpd: Could not reliably determine the servers fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
# 可以在宿主机测试,通过提示的地址172.17.0.2
[root@demo ~]# curl 172.17.0.2
hello world
# 此时容器内容的终端是被占用的,是在前台运行的,如果关闭,不能够再次访问httpd,若想要退出,使用ctrl + pq
[root@demo ~]# docker exec -it 50b460616d44 /bin/bash
[root@d7cfa9370097 /]# pstree -p
bash(1)---httpd(66)-+-httpd(67)
|-httpd(68)
|-httpd(69)
|-httpd(70)
`-httpd(71)
...
[root@50b460616d44 /]# exit
使用commit自定义镜像
# 使用镜像启动容器,在该容器基础上修改,另存为一个新镜像
# 配置yum源,安装软件,系统配置
# docker commit 容器id 新镜像名称:新镜像标签
[root@demo ~]# docker run -it rockylinux:8.5
[root@11da1b9d6e4f /]#
# 安装应用
# 清除yum缓存,减小容器大小,用于镜像制作
[root@11da1b9d6e4f /]# yum clean all
# 退出
exit
# commit 提交容器,生成新的镜像,容器的ID号
[root@demo ~]# docker commit [ID] image:yum
docker imsges
# 使用 docker run 验证新的镜像
[root@demo ~]# docker history image:yum # 查看历史镜像,多出一个镜像层
[root@demo ~]# docker run -it image:yum
评论区