摘要

本文基于提供的学习文档,系统整理了 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&gt;1{print $1":"$2}' -o images.tar.gz
删除镜像
docker rmi nginx:latest
docker rmi docker images | awk 'NR&gt;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 $NAMECMD ["/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;"]

优化策略:

  1. 缩减镜像层:合并多个 RUN 指令。
  2. 多阶段构建:分离构建环境和运行环境。
  3. 使用最精简基础镜像:如 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 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、环境变量、存储卷等参数。
  • 一键启动和停止:通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器,大大简化了多容器应用的部署和管理过程。
  • 服务编排:可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。支持网络配置,使不同服务的容器可以相互通信。
  • 环境变量管理:可以在配置文件中定义环境变量,并在容器启动时传递给容器,便于在不同环境(如开发、测试和生产)中使用不同的配置。

工作原理:

  1. 读取配置文件:Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。
  2. 创建容器:根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需的镜像(如果本地没有),并设置容器的各种参数。
  3. 管理容器生命周期: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

部署步骤:

  1. 创建目录结构:/docker/web/html1/docker/web/html2/docker/conf/haproxy
  2. 在两个 Nginx 容器中放置不同的 HTML 文件以区分服务
  3. 配置 HAProxy 负载均衡器配置文件
  4. 运行 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 容器,实现了高可用和负载均衡。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐