Docker 核心知识整理:从入门到企业级应用
摘要
本文基于提供的学习文档,系统整理了 Docker 容器技术的核心知识体系。内容涵盖 Docker 简介与部署、镜像与容器基础操作、镜像构建与优化、容器网络与存储、资源限制与安全隔离,以及 Docker Compose 容器编排。旨在为读者提供一个结构清晰、内容全面的 Docker 学习与参考指南。
一、Docker 简介与部署
1.1 Docker 是什么?
Docker 是一个管理容器的引擎,为应用提供打包、部署和运行的平台。它并非传统的虚拟化技术,而是更轻量的操作系统级虚拟化。
核心特点与优势:
- 轻量高效:容器启动仅需数秒,远快于传统虚拟机。
- 环境一致性:确保应用在开发、测试、生产环境中的表现一致。
- 可移植性:容器可在不同平台间轻松迁移,无需担心环境差异。
- 资源利用率高:多个容器共享主机内核,更有效地利用系统资源。
- 易于部署与扩展:支持快速部署和水平扩展。
1.2 Docker 与虚拟机的对比
| 特性 | 虚拟机 (VM) | Docker 容器 |
|---|---|---|
| 操作系统 | 宿主机上运行完整的 Guest OS | 共享宿主机 OS 内核 |
| 存储 | 镜像较大 (GB 级别) | 镜像小 (MB 级别) |
| 性能 | 有额外的 OS 资源消耗 | 几乎无性能损耗 |
| 移植性 | 笨重,与虚拟化技术耦合度高 | 轻量、灵活、易于迁移 |
| 隔离性 | 完全隔离 | 安全隔离 |
| 部署速度 | 慢 (分钟级) | 快速 (秒级) |
| 运行密度 | 一般几十个 | 单机可支持上千容器 |
1.3 Docker 部署 (以 RHEL 9 为例)
# 1. 配置 Docker CE 仓库
cd /etc/yum.repos.d
cat > docker.repo << EOF
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable
gpgcheck=0
EOF
2. 安装 Docker CE
yum install -y docker-ce
3. 配置 Docker 使用 iptables (可选,RHEL 9 默认可能为 nftables)
vim /usr/lib/systemd/system/docker.service
在 ExecStart 行末尾添加 --iptables=true
4. 启动并设置开机自启
systemctl enable --now docker
docker info
5. 激活内核网络模块 (容器网络所需)
echo br_netfilter > /etc/modules-load.d/docker_mod.conf
modprobe br_netfilter
cat > /etc/sysctl.d/docker.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
systemctl restart docker
二、Docker 镜像与容器基础操作
2.1 镜像管理
搜索与拉取镜像:
# 搜索镜像
docker search nginx
拉取镜像
docker pull busybox
docker pull nginx:1.26-alpine # alpine 版本更精简
查看本地镜像
docker images
镜像信息、导出与删除:
# 查看镜像详细信息
docker image inspect nginx:1.26-alpine
导出镜像到文件
docker image save nginx:latest -o nginx-latest.tar.gz
docker image save nginx:latest nginx:1.26-alpine -o nginx.tag.gz
导出所有镜像
docker save docker images | awk 'NR>1{print $1":"$2}' -o images.tar.gz
删除镜像
docker rmi nginx:latest
docker rmi docker images | awk 'NR>1{print $1":"$2}'
2.2 容器常用操作
启动容器:
# 后台运行并命名,端口映射
docker run -d --name mario -p 80:8080 timinglee/mario
交互式运行并进入容器
docker run -it --name centos7 centos:7
按 Ctrl+P+Q 退出但不停止容器
按 Ctrl+D 退出并停止容器
常用 run 参数
-d # 后台运行
-i # 交互式
-t # 分配伪终端
--name # 指定容器名称
-p # 端口映射 (主机端口:容器端口)
--rm # 容器停止后自动删除
--network # 指定容器使用的网络
容器生命周期管理:
# 查看容器
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器
docker inspect busybox # 查看容器详细信息
停止、启动、重启、删除容器
docker stop busybox
docker kill busybox # 强制停止
docker start busybox # 启动已停止的容器
docker rm centos7 # 删除已停止的容器
docker rm -f busybox # 强制删除运行中的容器
docker container prune -f # 删除所有停止的容器
进入已运行的容器或执行命令
docker attach centos7 # 重新进入容器 (会共享输入输出)
docker exec -it test ifconfig # 在容器内执行命令并返回结果
容器与宿主机文件传输:
# 宿主机文件复制到容器
docker cp /etc/fstab test2:/fstab
容器文件复制到宿主机
docker cp test2:/leefile /mnt
查看容器日志:
docker logs web
提交容器更改为新镜像:
# 在容器内创建文件后,提交为新的镜像版本
docker commit -m "add leefile" test busybox:v1
# 查看镜像历史
docker image history busybox:v1
三、Docker 镜像构建
3.1 镜像结构与原理
- 分层结构:镜像由多个只读层叠加而成,最大好处是共享资源。
- Copy-on-Write:容器层是可写的,保存对镜像的修改,下层镜像只读。
- 镜像获取方式:
docker pull从仓库拉取;docker load -i从本地文件加载。
3.2 Dockerfile 指令详解
| 指令 | 说明 | 示例 |
|---|---|---|
FROM |
指定基础镜像 | FROM busybox:latest |
COPY |
复制文件到镜像 | COPY leefile / |
ADD |
类似 COPY,支持 URL 和自动解压 | ADD leefile.gz / |
ENV |
设置环境变量 | ENV NAME lee |
EXPOSE |
声明容器运行时监听的端口 | EXPOSE 80 443 |
VOLUME |
定义匿名数据卷挂载点 | VOLUME ["/var/www/html"] |
WORKDIR |
设置工作目录 | WORKDIR /var/www/html |
RUN |
在构建时执行的命令 | RUN touch file |
CMD |
容器启动时默认执行的命令,可被覆盖 | CMD echo $NAME 或 CMD ["/bin/sh", "-c", "echo $NAME"] |
ENTRYPOINT |
类似 CMD,但命令不可被覆盖 | ENTRYPOINT echo $NAME |
3.3 镜像构建与优化
构建示例:
# 基础构建示例
FROM centos:7
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
优化策略:
- 缩减镜像层:合并多个 RUN 指令。
- 多阶段构建:分离构建环境和运行环境。
- 使用最精简基础镜像:如 Alpine、Distroless。
# 多阶段构建优化示例
FROM centos:7 AS build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel && \
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
./configure --with-http_ssl_module --with-http_stub_status_module && \
make && make install && cd .. && rm -fr nginx-1.23.3 && yum clean all
FROM centos:7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
四、容器网络
4.1 Docker 网络模式
- bridge (默认):容器连接到 docker0 网桥,通过 NAT 与外界通信。
- host:容器共享宿主机的网络命名空间。
- none:容器没有网络接口。
- container:容器共享另一个容器的网络栈。
- 自定义网络:用户定义的桥接或 overlay 网络。
4.2 网络操作命令
# 查看网络
docker network ls
创建自定义桥接网络
docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.254 mynet1
运行容器时指定网络和IP
docker run -it --name test --network mynet1 --ip 192.168.100.100 busybox
容器连接/断开网络
docker network connect mynet1 test
docker network disconnect mynet1 test
删除网络
docker network rm mynet1
五、容器存储
5.1 数据卷 (Volume)
数据卷是独立于容器生命周期的持久化存储。
# 创建数据卷
docker volume create myvol
查看数据卷
docker volume ls
docker volume inspect myvol
运行容器时挂载数据卷
docker run -it --name test -v myvol:/data busybox
删除未使用的数据卷
docker volume prune
5.2 绑定挂载 (Bind Mount)
将宿主机目录或文件直接挂载到容器。
# 挂载宿主机目录到容器
docker run -it --name test -v /host/data:/container/data busybox
挂载单个文件 (只读)
docker run -it --name test -v /etc/passwd:/tmp/passwd:ro busybox
六、容器资源限制
6.1 CPU 与内存限制
# 限制容器内存使用
docker run -it --memory 200M ubuntu
限制容器 CPU 使用 (例如限制使用 1.5 个 CPU 核心)
docker run -it --cpus 1.5 ubuntu
限制容器 CPU 份额 (权重)
docker run -it --cpu-shares 512 ubuntu
6.2 磁盘 I/O 限制
# 限制容器块设备读写速率 (需要 direct I/O 测试)
docker run -it --device-write-bps /dev/nvme0n1:10mb ubuntu
# 在容器内测试:dd if=/dev/zero of=bigfile bs=1M count=100 oflag=direct
七、容器安全与隔离
7.1 默认隔离性问题与 LXCFS
默认情况下,容器内查看的 CPU、内存等信息是宿主机的,未完全隔离。使用 LXCFS 可提供准确的资源视图。
# 安装 LXCFS (RHEL 9)
dnf install lxcfs/*.rpm
启动 LXCFS
lxcfs /var/lib/lxcfs &
运行容器时挂载 LXCFS 的 proc 文件系统
docker run -it -m 256m
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw
ubuntu
容器内执行 free -m 将显示被限制的内存大小
7.2 容器特权与能力 (Capabilities)
默认容器内的 root 权限受限。可通过 --privileged 或 --cap-add 赋予特定权限。
# 赋予容器完全特权 (接近宿主机 root,危险)
docker run --rm -it --privileged busybox
# 此时容器内可执行 ip a a 192.168.0.100/24 dev eth0 等操作
仅添加必要的网络管理权限 (更安全)
docker run --rm -it --cap-add NET_ADMIN busybox
容器内可管理网络,但无法操作磁盘等
八、Docker Compose 容器编排
8.1 概述与核心概念
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它是 Docker 官方的开源项目,托管在 GitHub 上(https://github.com/docker/compose)。
主要功能:
- 定义服务:使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、环境变量、存储卷等参数。
- 一键启动和停止:通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器,大大简化了多容器应用的部署和管理过程。
- 服务编排:可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。支持网络配置,使不同服务的容器可以相互通信。
- 环境变量管理:可以在配置文件中定义环境变量,并在容器启动时传递给容器,便于在不同环境(如开发、测试和生产)中使用不同的配置。
工作原理:
- 读取配置文件:Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。
- 创建容器:根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需的镜像(如果本地没有),并设置容器的各种参数。
- 管理容器生命周期:Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。它还可以处理容器的故障恢复,例如自动重启失败的容器。
Docker Compose 中的管理层:
- 服务 (Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (Project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
- 容器 (Container):容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义的镜像创建的运行实例。
8.2 Docker Compose 常用命令
一、服务管理:
# 1. 启动服务(-d 后台运行,-f 指定配置文件)
docker compose up -d
docker compose -f test/docker-compose.yml up -d
2. 停止并删除服务
docker compose down
3. 启动已存在的服务
docker compose start
4. 停止正在运行的服务
docker compose stop
5. 重启服务
docker compose restart
二、服务状态查看:
# 1. 查看服务状态
docker compose ps
2. 查看服务日志
docker compose logs
docker compose logs db # 查看特定服务日志
三、构建和重新构建服务:
# 1. 构建服务镜像
docker compose -f test.yml build
docker compose -f test.yml build test1 # 构建特定服务
2. 启动前重新构建镜像
docker compose -f test.yml up --build
四、其他操作:
# 1. 在运行的服务容器中执行命令
docker compose -f test.yml exec test sh
2. 拉取服务使用的镜像
docker compose -f test.yml pull
3. 验证并查看解析后的 Compose 文件内容
docker compose -f test.yml config
8.3 Docker Compose YAML 文件详解
Docker Compose 使用 YAML 文件定义和配置多容器应用程序的各个服务。
一、服务配置:
version: "3.8"
services:
web:
image: nginx:latest
container_name: webserver
restart: always
ports:
- "80:80"
expose:
- "1234" # 仅对链接的服务可见,不映射到主机
environment:
MYSQL_ROOT_PASSWORD: lee
volumes:
- /docker/web/html:/usr/share/nginx/html
- /etc/passwd:/tmp/passwd:ro # 只读挂载
networks:
- mynet1
command: ["/bin/sh", "-c", "sleep 3000"]
network_mode: bridge # 使用本机自带 bridge 网络
二、网络配置:
networks:
mynet1:
driver: bridge
mynet2:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
gateway: 172.28.0.254
default:
external: true # 使用外部网络
name: bridge # 指定外部网络名称
三、存储卷配置:
volumes:
data:
name: timinglee # 指定卷名称
app_data:
driver: local
8.4 企业实践示例:HAProxy + Nginx 负载均衡
以下是一个使用 Docker Compose 部署 HAProxy 和 Nginx 负载均衡架构的完整示例:
version: "3.8"
services:
web1:
image: nginx:latest
container_name: web1
restart: always
networks:
- mynet1
expose:
- "80"
volumes:
- /docker/web/html1:/usr/share/nginx/html
web2:
image: nginx:latest
container_name: web2
restart: always
networks:
- mynet1
expose:
- "80"
volumes:
- /docker/web/html2:/usr/share/nginx/html
haproxy:
image: haproxy:2.3
container_name: haproxy
restart: always
networks:
- mynet1
- mynet2
volumes:
- /docker/conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
ports:
- "80:80"
depends_on:
- web1
- web2
networks:
mynet1:
driver: bridge
mynet2:
driver: bridge
部署步骤:
- 创建目录结构:
/docker/web/html1、/docker/web/html2、/docker/conf/haproxy - 在两个 Nginx 容器中放置不同的 HTML 文件以区分服务
- 配置 HAProxy 负载均衡器配置文件
- 运行
docker compose up -d启动所有服务
HAProxy 配置文件示例:
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin
server web1 web1:80 check
server web2 web2:80 check
通过这个架构,外部请求通过 HAProxy 的 80 端口进入,HAProxy 根据负载均衡策略将请求分发到后端的两个 Nginx 容器,实现了高可用和负载均衡。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)