目 录CONTENT

文章目录

Docker基础-从零上手Docker

vanegoo
2024-04-22 / 0 评论 / 0 点赞 / 20 阅读 / 13319 字 / 正在检测是否收录...

容器技术与传统虚拟化技术

传统虚拟化技术

容器技术

容器技术相较于传统虚拟化技术的区别和优势

资源利用率:

  • 容器技术:容器共享主机操作系统内核,因此容器之间的资源利用率更高,启动速度更快,占用的资源更少。

  • 传统虚拟化技术:每个虚拟机都有自己的操作系统和内核,相互之间独立,因此占用的资源更多,启动速度更慢。

部署和管理:

  • 容器技术:容器可以通过镜像快速部署,易于扩展和管理,支持自动化部署和持续集成。

  • 传统虚拟化技术:虚拟机的部署和管理相对复杂,需要预先分配资源和配置虚拟硬件。

性能和效率:

  1. 容器技术:由于共享操作系统内核,容器之间的通信和资源共享更加高效,因此具有更低的性能损耗。

  2. 传统虚拟化技术:由于每个虚拟机都有自己的操作系统,需要额外的资源来模拟硬件和操作系统的功能,因此性能损耗相对较高。

轻量级和快速启动:

  • 容器技术:容器镜像通常较小且启动速度快,适合于快速部署和微服务架构。

  • 传统虚拟化技术:虚拟机的镜像通常较大,启动速度较慢,需要更长的时间来部署和启动。

总结一下,传统虚拟化技术是虚拟完整的操作系统,而容器技术与宿主机公用内核,轻量、高效、易于部署和管理。

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

0

评论区