Appearance
Docker技术详解
目录
- Docker概述
- Docker架构原理
- Docker安装与配置
- Docker核心组件
- Docker命令行工具详解
- Docker实践示例
- 常见问题与解决方案
1. Docker概述
1.1 基本概念
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上。容器默认使用沙箱机制相互隔离,但可以通过配置 Docker 网络或数据卷机制进行安全的相互通信。
1.2 核心作用
环境一致性:保证开发、测试和生产环境完全一致
快速部署:容器可以在秒级启动,大大提高部署效率
资源隔离:容器之间使用Linux内核的cgroups和namespaces进行资源隔离
轻量级:容器共享宿主机内核,不需要额外的操作系统开销
可移植性:可以在任何支持Docker的平台上运行
2. Docker架构原理
Docker客户端
docker CLI
REST API
Docker守护进程
dockerd
镜像仓库
Docker Hub
镜像
Image
容器
Container
图1. Docker架构示意图
2.1 核心组件
Docker客户端 (Docker CLI):与Docker守护进程通信的命令行工具
Docker守护进程 (dockerd):管理Docker对象(镜像、容器、网络、卷等)
Docker REST API:客户端与守护进程之间的通信接口
Docker Registry:存储Docker镜像的仓库
2.2 工作原理
用户通过Docker CLI发送命令
命令通过REST API发送到Docker守护进程
守护进程执行相应操作(如拉取镜像、创建容器等)
结果通过API返回给客户端并显示
3. Docker安装与配置
3.1 系统要求
Linux:Ubuntu 18.04+、CentOS 7+等
Windows:Windows 10 Pro/Enterprise/Education (1607+)
macOS:macOS 10.14+ (Mojave)
3.2 Ubuntu安装
(注:已更新为不使用废弃的 `apt-key` 的官方最新安全安装方式)
sql
# 更新软件包并安装必要依赖
$ sudo apt-get update
$ sudo apt-get install -y ca-certificates curl gnupg
# 添加Docker官方的GPG密钥并放入keyrings目录
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 设置稳定版仓库源
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker Engine及最新插件(包含Compose等)
$ sudo apt-get update
$ sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 验证安装
$ sudo docker run hello-world3.3 CentOS/RedHat系安装
**注意:** CentOS 7 已于2024年停止维护,如果你在使用较新的 RHEL 兼容系统(如 Rocky Linux 或 AlmaLinux),以下步骤基本适用,但包管理器可能变成了 dnf。
bash
# 安装依赖包
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker CE
$ sudo yum install -y docker-ce
# 启动并设置开机自启
$ sudo systemctl start docker
$ sudo systemctl enable docker
# 验证安装
$ sudo docker run hello-world3.4 配置国内镜像源
**注意:** 国内公共镜像源(如原网易、Docker中国官方等)大多已经关停或限速。下面提供了部分社区常用的可用镜像作为示例,实际生产环境建议建立企业内部私有镜像库或使用阿里云等个人的专有加速器分配地址。
编辑或创建/etc/docker/daemon.json文件:
bash
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json
## 4. Docker核心组件
### 4.1 镜像 (Image)
镜像是一个只读的模板,用于创建Docker容器。镜像包含了运行应用程序所需的所有内容:代码、运行时环境、库、环境变量和配置文件。
基础镜像 (Ubuntu)
安装依赖 (Python, Node.js)
应用代码 (App)
图2. Docker镜像分层结构
### 4.2 容器 (Container)
容器是镜像的运行实例。容器可以被创建、启动、停止、删除和暂停。容器是隔离的,每个容器都有自己的文件系统、网络和进程空间。
**注意:** 容器与虚拟机的区别在于容器共享宿主机内核,而虚拟机有自己的完整操作系统,因此容器更加轻量级和快速。
### 4.3 仓库 (Registry)
仓库是存储Docker镜像的地方。Docker Hub是官方的公共仓库,包含了大量的镜像。用户也可以创建私有仓库。
- **公共仓库**:Docker Hub、阿里云镜像仓库等
- **私有仓库**:企业内部部署的Registry服务
## 5. Docker命令行工具详解
### 5.1 镜像管理命令
#### 5.1.1 docker pull - 拉取镜像
```bash
# 拉取最新版本
$ docker pull ubuntu
# 拉取指定版本
$ docker pull ubuntu:22.04
# 从私有仓库拉取
$ docker pull registry.example.com/myimage5.1.2 docker images - 列出镜像
参数
描述
-a, --all
显示所有镜像
-q, --quiet
只显示镜像ID
--digests
显示镜像摘要
5.1.3 docker rmi - 删除镜像
bash
# 删除单个镜像
$ docker rmi ubuntu:22.04
# 删除多个镜像
$ docker rmi ubuntu alpine
# 强制删除
$ docker rmi -f ubuntu:22.045.2 容器管理命令
5.2.1 docker run - 创建并启动容器
参数
描述
-d, --detach
后台运行容器
-p, --publish
端口映射,如 -p 80:80
-v, --volume
挂载卷,如 -v /host:/container
-e, --env
设置环境变量
--name
指定容器名称
-i, --interactive
保持STDIN打开
-t, --tty
分配伪终端
bash
# 交互式运行容器
$ docker run -it ubuntu /bin/bash
# 后台运行并映射端口
$ docker run -d -p 80:80 --name webserver nginx
# 挂载卷并设置环境变量
$ docker run -v /host/data:/container/data -e MYSQL_ROOT_PASSWORD=123456 mysql5.2.2 docker ps - 列出容器
参数
描述
-a, --all
显示所有容器(包括停止的)
-q, --quiet
只显示容器ID
-s, --size
显示容器大小
5.2.3 docker start/stop/restart - 容器生命周期管理
bash
# 启动容器
$ docker start webserver
# 停止容器
$ docker stop webserver
# 重启容器
$ docker restart webserver
# 暂停容器
$ docker pause webserver
# 恢复容器
$ docker unpause webserver5.3 镜像构建命令
5.3.1 docker build - 构建镜像
参数
描述
-t, --tag
指定镜像名称和标签
-f, --file
指定Dockerfile路径
--no-cache
不使用缓存构建
--build-arg
传递构建参数
bash
# 构建镜像
$ docker build -t myimage:v1 .
# 使用指定Dockerfile
$ docker build -f Dockerfile.prod -t myimage:prod .
# 传递构建参数
$ docker build --build-arg VERSION=1.0 -t myimage:v1 .5.4 仓库相关命令
5.4.1 docker login - 登录仓库
bash
# 登录Docker Hub
$ docker login
# 登录私有仓库
$ docker login registry.example.com5.4.2 docker push - 推送镜像
bash
# 推送镜像到仓库
$ docker push myimage:v1
# 推送带标签的镜像
$ docker tag myimage:v1 registry.example.com/myimage:v1
$ docker push registry.example.com/myimage:v16. Docker实践示例
6.1 使用Nginx运行Web服务器
bash
# 拉取Nginx镜像
$ docker pull nginx
# 运行Nginx容器
$ docker run -d -p 80:80 --name mynginx nginx
# 验证运行
$ curl http://localhost
# 复制配置文件到容器
$ docker cp nginx.conf mynginx:/etc/nginx/nginx.conf
# 重新加载配置
$ docker exec mynginx nginx -s reload6.2 使用Dockerfile构建自定义镜像
创建Dockerfile:
bash
# 基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 5000
# 运行命令
CMD ["python", "app.py"]构建并运行:
bash
# 构建镜像
$ docker build -t myapp .
# 运行应用
$ docker run -d -p 5000:5000 myapp7. 常见问题与解决方案
7.1 权限问题
问题:执行docker命令时需要sudo权限
解决方案:将用户添加到docker组
bash
$ sudo usermod -aG docker $USER
$ newgrp docker7.2 容器无法访问外部网络
问题:容器内无法访问互联网
解决方案:检查网络配置或重启Docker服务
bash
$ sudo systemctl restart docker7.3 镜像拉取缓慢
问题:从Docker Hub拉取镜像速度慢
解决方案:配置国内镜像源(见第3.4节)
7.4 容器占用过多资源
问题:容器占用过多CPU或内存
解决方案:运行容器时限制资源
bash
# 限制CPU使用
$ docker run --cpus=1 myimage
# 限制内存使用
$ docker run --memory=512m myimage