moorlers-moontown

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Docker容器技术解析

一、容器技术的发展历程

1. 初期的容器技术

容器技术起源于1979年Unix系统的chroot命令,旨在隔离计算机资源,降低开发和测试的难度与风险。早期的容器技术以chroot为代表的文件隔离技术为主,但存在诸多限制,如无法有效隔离主机名、网络、系统进程、用户等。

2. 名称空间的引入

2002年,内核引入名称空间(Namespace)机制,提供全局资源封装,解决隔离问题。

3. 资源配额方案

为避免名称空间导致的资源无度占用,发展出控制组(Control Groups)方案。

4. LXC系统级虚拟化技术

随着文件系统、访问、资源隔离技术的成熟,诞生了LXC系统级虚拟化技术,为容器技术提供底层支撑。

5. Docker项目的开源

2013年3月,Docker项目宣布开源,推动容器技术的广泛应用。

二、Docker容器的概念

1. 容器

容器是运行在隔离环境中的程序。

2. 镜像

镜像是只读模板,包含创建容器所需的所有文件和配置信息。

3. 仓库

仓库用于存储、分发、管理镜像。

三、Docker的优势

1. 低资源消耗

Docker容器对系统资源消耗低。

2. 无需Hypervisor

Docker运行无需额外Hypervisor支持,内核级虚拟化性能和效率更高。

3. 可迁移性强

Docker以增量方式分发与更新,自动化程度高,效率高。

四、Docker与虚拟机的比较

1. 虚拟机

虚拟机并非独立运行于宿主机上的完整操作系统,运行自身系统会占用较多CPU、内存、硬盘资源。

2. Docker

Docker只包含应用程序及依赖库,基于libcontainer运行在宿主机上,无需运行完整操作系统,更轻量高效,一台主机可同时运行数千个Docker容器。

五、Docker的架构

1. C/S架构

Docker采用C/S架构,通过Docker daemon作为守护进程,用户通过Docker client与Docker daemon交互。

2. Podman

Podman与Docker类似,但无守护进程,通过Linux多用户对容器进行运行保护。

六、COW技术

1. 镜像核心

镜像是创造容器的核心,镜像文件只读,存储应用程序和基础配置信息。

2. COW机制

通过镜像分层,创建空白原始盘指向镜像盘。读操作从镜像盘读取,写操作时将数据从镜像盘复制到原始盘修改,称为写时拷贝模式。此模式减少重复数据占用,提高数据复用率和空间利用率。

七、Docker的常规使用

1. 镜像下载

由于非技术原因,中国区IP无法直接从Docker官方仓库下载镜像,需配置镜像加速器。在/etc/docker/新建daemon.json文件,写入镜像加速器地址,格式如下:

{
"registry-mirrors": ["http://镜像加速器地址"]
}

然后通过docker pull 镜像名称:标签下载镜像,如docker pull nginx:latest

2. 基础命令

  • docker images:查看本机镜像
  • docker pull 镜像名称:标签:下载镜像
  • docker save 镜像名称:标签 -o 文件名:备份镜像为tar包
  • docker load -i 备份文件名称:导入备份镜像文件
  • docker history 镜像名称:标签:查看镜像制作历史

3. 容器运行与使用

  • docker run -it 镜像名:标签:交互方式运行容器
  • docker run -d 镜像名称:标签:后台方式运行容器
  • docker run -itd --name 容器名 镜像名:标签:为容器指定名字
  • docker start|stop|restart 容器id|容器名:管理容器运行
  • docker ps -a:显示所有容器进程
  • docker ps -aq:查看所有容器的容器id
  • docker exec -it 容器名 容器内命令:在宿主机执行容器命令或进入容器内交互

4. 容器的排错与故障修复

  • docker logs 容器名称:获取容器日志
  • docker cp 容器名:容器中文件的绝对路径地址 宿主机地址:下载容器内文件排错
  • docker cp 本机文件地址 容器名:容器内文件的绝对路径地址:传回修改后的文件修复容器

5. 容器的删除

  • docker rm 容器id:删除容器
  • docker tag 镜像id:标签 镜像名称:新的标签:创建新镜像名称和标签
  • docker rmi 镜像名称:标签:删除镜像(需先删除该镜像衍生的所有容器)

八、镜像的制备

镜像制备可通过获取空白系统镜像或封装已有容器实现。综合练习步骤如下:

  1. 通过空白镜像制作容器
  2. 配置容器yum源
  3. 上传yum仓库配置文件到指定位置
  4. 执行yum下载
  5. 清除yum缓存降低镜像大小
  6. 暂停容器,退回到宿主机
  7. 使用docker commit 容器名 镜像名:标签封装容器为镜像

九、Docker——我即上帝

在容器中运行后,无法使用systemctl启动服务或丢给上帝进程后台运行,因为容器一般仅能运行一个服务。

十、Docker命令补全设置

为了提高命令行操作的效率,可以设置Docker命令补全。以下是具体步骤:

1. 安装bash-completion基础包

在CentOS/RHEL系统中,运行以下命令:

sudo yum install -y bash-completion

在Ubuntu/Debian系统中,运行以下命令:

sudo apt-get install -y bash-completion

安装完成后,执行以下命令刷新环境:

source /usr/share/bash-completion/bash_completion

2. 下载并安装Docker补全脚本

运行以下命令下载官方的Docker补全脚本:

sudo curl -L \
  https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker \
  -o /etc/bash_completion.d/docker

然后刷新Shell环境:

source ~/.bashrc

3. 验证命令补全是否生效

在终端中输入docker p,然后连续按两次Tab键,如果显示pause plugin port ps pull push等子命令,则说明命令补全设置成功。

十一、Docker容器网络调试

网络问题是使用容器技术时常见的问题之一。为了方便调试网络问题,可以使用netshoot工具。以下是使用netshoot的基本步骤:

1. 拉取netshoot镜像

运行以下命令拉取netshoot镜像:

docker pull nicolaka/netshoot

2. 启动netshoot容器

将netshoot容器连接到与问题容器相同的网络中:

docker run -it --rm --name netshoot --network <问题容器所在网络> nicolaka/netshoot

3. 使用netshoot进行网络调试

在netshoot容器中,可以使用各种网络工具(如pingnetstattcpdump等)对问题容器的网络进行调试。

4. 示例

假设有一个名为myapp的容器,其所在网络为my-network。可以按照以下步骤进行网络调试:

# 拉取netshoot镜像
docker pull nicolaka/netshoot

# 启动netshoot容器并连接到my-network网络
docker run -it --rm --name netshoot --network my-network nicolaka/netshoot

# 在netshoot容器中使用ping命令测试网络连通性
ping myapp
posted on 2025-03-21 18:11  moorler  阅读(23)  评论(0)    收藏  举报