Docker 核心技术全总结
一、Docker 基础认知
(一)核心概念
-
容器:轻量级、可移植、自包含的软件打包技术,包含应用及依赖,共享宿主机内核,启动秒级、资源开销低。
-
镜像:只读模板,是创建容器的基础,采用分层文件系统,支持版本管理和增量构建。
-
仓库:集中存放镜像的场所,分公有(如 Docker Hub、华为云 SWR)和私有(如 Harbor)。
-
Docker 架构:C/S 架构,客户端(docker 命令)通过 REST API 与守护进程(dockerd)通信,守护进程负责镜像构建、容器管理等核心操作。
(二)容器与虚拟机对比
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 性能 | 接近原生 | 有虚拟化开销 |
| 资源占用 | 极低(MB 级) | 较高(GB 级) |
| 隔离性 | 进程级隔离(namespace) | 完全隔离(独立内核) |
| 运行密度 | 单机支持上千个 | 数十个 |
(三)容器生态系统
-
核心技术:OCI 规范(runtime spec、image format spec)、容器运行时(runc、lxc、rkt)、管理工具(Docker Engine)、定义工具(Dockerfile、ACI)、仓库(Docker Hub)、容器 OS(CoreOS、Atomic)。
-
平台技术:编排引擎(Docker Swarm、Kubernetes、Mesos+Marathon)、管理平台(Rancher)、容器 PaaS(Deis、Dokku)。
-
支持技术:网络(Docker Network、Flannel、Calico)、服务发现(etcd、Consul、Zookeeper)、监控(cAdvisor、Weave Scope)、数据管理(Flocker)、日志(docker logs、logspout)、安全(OpenSCAP)。
二、Docker 安装与环境配置
(一)系统要求
-
操作系统:CentOS Stream 8(推荐)、Ubuntu、Windows、macOS。
-
依赖:内核版本 ≥ 3.10,关闭 SELinux,配置静态 IP。
(二)安装步骤(CentOS Stream 8)
-
卸载旧版本:
yum remove docker-ce -
安装依赖工具:
yum install -y yum-utils lvm2 vim -
配置镜像源(阿里云):
yum-config-manager --add-repo ``https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -
安装 Docker CE:
yum install -y docker-ce -
启动并设置开机自启:
systemctl enable docker.service --now -
验证安装:
docker --version、systemctl status docker
(三)镜像加速器配置
-
阿里云加速器:修改
/etc/docker/daemon.json,添加"registry-mirrors": ["``https://xxx.mirror.aliyuncs.com``"] -
华为云加速器:配置
"registry-mirrors": ["``https://xxx.mirror.swr.myhuaweicloud.com``"] -
生效配置:
systemctl daemon-reload && systemctl restart docker -
验证:
docker info查看 Registry Mirrors 字段。
三、镜像核心操作
(一)镜像基础命令
| 功能 | 命令 |
|---|---|
| 查看镜像 | docker images |
| 搜索镜像 | docker search 镜像名(如 docker search nginx) |
| 拉取镜像 | docker pull 镜像名:标签(如 docker pull centos:7) |
| 删除镜像 | docker rmi 镜像ID/镜像名:标签 |
| 保存镜像 | docker save -o 文件名.tar 镜像名 |
| 导入镜像 | docker load -i 文件名.tar |
(二)镜像构建
1. Dockerfile 核心指令
| 指令 | 功能 |
|---|---|
| FROM | 指定基础镜像(如 FROM centos:8.4.2105) |
| RUN | 构建时执行命令(如 yum install -y openssh-server) |
| COPY | 复制本地文件到镜像(仅复制,不解压) |
| ADD | 复制文件并自动解压归档文件(如 ADD jdk.tar.gz /usr/local/) |
| ENV | 设置环境变量(如 ENV JAVA_HOME /usr/local/java) |
| WORKDIR | 指定工作目录(如 WORKDIR /usr/local) |
| EXPOSE | 声明容器暴露端口(如 EXPOSE 80) |
| CMD | 容器启动默认命令(可被 docker run 参数覆盖) |
| ENTRYPOINT | 容器启动必执行命令(参数可被 CMD 传递) |
2. 构建命令
docker build -t 镜像名:标签 -f Dockerfile路径 构建上下文路径
示例:基于当前目录的 Dockerfile 构建镜像
docker build -t centos:ssh .
3. 镜像分层与缓存
-
镜像由多层只读镜像层叠加而成,上层覆盖下层同名文件。
-
构建时优先使用缓存,若某层指令变更,其上层缓存全部失效,建议将稳定指令(如安装依赖)放在前面。
(三)镜像仓库使用
1. 公有仓库(Docker Hub)
-
登录:
docker login -u 用户名 -
镜像命名规范:
用户名/镜像名:标签(如gaoqiaodong/centos_httpd:v1) -
推送镜像:
docker push 用户名/镜像名:标签 -
拉取镜像:
docker pull 用户名/镜像名:标签
2. 私有仓库(Harbor)
-
安装:下载离线安装包,修改
harbor.yml(配置 hostname、密码),执行./``install.sh。 -
登录:
docker login 仓库地址(如docker login ``192.168.108.30) -
镜像推送:
docker tag 本地镜像 仓库地址/项目名/镜像名:标签 && docker push 仓库地址/项目名/镜像名:标签
四、容器核心操作
(一)容器生命周期管理
| 功能 | 命令 |
|---|---|
| 创建容器 | docker create --name 容器名 镜像名 |
| 启动容器 | docker start 容器ID/容器名 |
| 运行容器 | docker run -d(后台)-it(交互)--name 容器名 镜像名 |
| 停止容器 | docker stop 容器ID/容器名(温和停止) |
| 强制停止 | docker kill 容器ID/容器名(发送 SIGKILL) |
| 重启容器 | docker restart 容器ID/容器名 |
| 查看容器 | docker ps(运行中)、docker ps -a(所有) |
| 删除容器 | docker rm 容器ID/容器名(需先停止) |
| 强制删除 | docker rm -f 容器ID/容器名(强制停止并删除) |
(二)容器交互与监控
-
进入容器:
docker exec -it 容器ID /bin/bash(推荐,不中断容器进程)、docker attach 容器ID(依附于启动命令终端)。 -
查看日志:
docker logs -f 容器ID(实时输出)。 -
资源监控:
docker stats(实时查看 CPU、内存、网络占用)、docker top 容器ID(查看容器内进程)。
(三)容器资源限制
-
内存限制 :
docker run -m 200M --memory-swap=300M 镜像名(限制内存 200M,swap 100M)。 -
CPU 限制 :
docker run --cpu-shares 512 镜像名(设置 CPU 权重,默认 1024,资源紧张时生效)。 -
自动重启 :
docker run --restart=always 镜像名(容器退出时自动重启)。
五、Docker 网络配置
(一)原生网络类型
| 网络类型 | 特点 | 适用场景 |
|---|---|---|
| bridge | 默认网络,通过 docker0 网桥转发,支持端口映射 | 容器间通信、容器访问外网 |
| host | 共享宿主机网络栈,无端口映射开销 | 对网络性能要求高的场景 |
| none | 仅保留 lo 接口,无网络连接 | 无需联网的安全场景(如生成密码) |
(二)自定义网络
-
创建桥接网络:
docker network create --driver bridge --subnet ``172.22.16.0/24`` --gateway ``172.22.16.1`` 网络名 -
容器连接网络:
docker run --network 网络名 --ip ``172.22.16.8`` 容器名 -
容器跨网络通信:
docker network connect 目标网络 容器名(为容器添加多网卡)
(三)端口映射与外部访问
-
随机映射:
docker run -P 镜像名(映射容器暴露端口到宿主机随机端口)。 -
指定映射:
docker run -p 宿主机端口:容器端口 镜像名(如docker run -p 8080:80 nginx)。 -
容器访问外网:通过 NAT 实现,宿主机 iptables 自动配置 MASQUERADE 规则。
(四)容器间通信
-
IP 通信:同一网络内容器可通过私有 IP 直接通信。
-
DNS 通信 :自定义网络支持容器名解析,
docker run --name 容器名 --network 网络名 镜像名后,可通过容器名 ping 通。 -
Joined 容器 :
docker run --network container:目标容器名 镜像名,共享目标容器网络栈,支持 127.0.0.1 通信。
六、Docker 存储管理
(一)存储类型
-
镜像层与容器层:由 storage driver 管理(默认 overlay2),容器层可写,镜像层只读,采用 Copy-on-Write 机制。
-
Data Volume:持久化存储,独立于容器生命周期,分两种类型:
-
Bind Mount :挂载宿主机已有目录 / 文件到容器,
docker run -v 宿主机路径:容器路径 镜像名,支持只读权限(:ro)。 -
Docker Managed Volume :Docker 自动在
/var/lib/docker/volumes/创建目录,docker run -v 容器路径 镜像名,容器内已有数据会自动复制到卷。
(二)数据共享与备份
-
容器间共享:通过
--volumes-from 数据卷容器实现,数据卷容器仅提供卷,无需运行。 -
备份:直接复制宿主机卷目录(如
/var/lib/docker/volumes/xxx/_data)或使用docker cp拷贝容器内数据。 -
恢复:将备份数据复制到新卷目录,或通过
docker cp导入容器。
(三)实战:MySQL 数据持久化
创建数据卷挂载目录
mkdir -p /gqd/mysql/{data,conf,log}
启动 MySQL 容器,挂载卷并配置字符集
docker run -d -p 3306:3306 --privileged=true \\
-v /gqd/mysql/data:/var/lib/mysql \\
-v /gqd/mysql/conf:/etc/mysql/conf.d \\
-v /gqd/mysql/log:/var/log/mysql \\
-e MYSQL\_ROOT\_PASSWORD=123456 \\
\--name mysql mysql:5.7
配置中文支持(在 /gqd/mysql/conf 中创建 my.cnf)
echo -e "\[client]\ndefault\_character\_set=utf8\n\[mysqld]\ncharacter\_set\_server=utf8\ncollation\_server=utf8\_general\_ci" > /gqd/mysql/conf/my.cnf
docker restart mysql
七、Docker Compose 多容器编排
(一)核心概念
-
服务(Service):一个应用容器,可包含多个相同镜像的实例。
-
项目(Project) :由一组关联服务组成的完整业务单元,通过
docker-compose.yml定义。
(二)常用命令
| 功能 | 命令 |
|---|---|
| 启动项目 | docker compose up -d(后台运行) |
| 停止项目 | docker compose down(停止并删除容器、网络) |
| 查看服务 | docker compose ps |
| 查看日志 | docker compose logs -f 服务名 |
| 构建镜像 | docker compose build(基于 Dockerfile) |
(三)实战:WordPress 多容器部署
docker-compose.yml
services:
db:
image: mysql:latest
restart: always
environment:
MYSQL\_ROOT\_PASSWORD: huawei
MYSQL\_DATABASE: wordpress
blog:
image: wordpress:latest
restart: always
ports:
- "80:80"
links:
- db
environment:
WORDPRESS\_DB\_HOST: db
WORDPRESS\_DB\_USER: root
WORDPRESS\_DB\_PASSWORD: huawei
WORDPRESS\_DB\_NAME: wordpress
启动命令:docker compose up -d
八、Docker 图形化管理工具
(一)Docker UI
-
安装:
docker run -d --name docker.ui --restart always -v /var/run/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui -
访问:
http://宿主机IP:8999,默认账号密码:ginghan/123456。
(二)Portainer
- 安装:
-
创建卷:
docker volume create portainer_data -
启动容器:
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
- 访问:
https://宿主机IP:9443,首次登录创建管理员账号。
九、Docker 实战案例
(一)自定义 SSH 镜像
centos.ssh.dockerfile
FROM centos:8.4.2105
RUN sed -e "s|^mirrorlist=|#mirrorlist=|g" -e "s|^#baseurl=http://mirror.centos.org/\\\$contentdir/\\\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/8.4.2105|g" -i.bak /etc/yum.repos.d/CentOS-\*.repo
RUN yum install -y openssh-server && ssh-keygen -t rsa -f /etc/ssh/ssh\_host\_rsa\_key && ssh-keygen -t ecdsa -f /etc/ssh/ssh\_host\_ecdsa\_key
RUN echo "root:huawei" | chpasswd
EXPOSE 22
CMD \["/usr/sbin/sshd", "-D"]
构建并启动
docker build -t centos:ssh -f centos.ssh.dockerfile .
docker run -d -p 2022:22 --name sshtest centos:ssh
(二)Ghost 博客系统部署
拉取镜像
docker pull ghost
创建数据目录
mkdir -p /data/ghost && chmod -R 777 /data/ghost
启动容器
docker run -d --restart always --name ghost -p 2368:2368 -v /data/ghost:/var/lib/ghost/content -e NODE\_ENV=development -e url=http://192.168.108.30:2368 ghost
访问:http://192.168.108.30:2368,后台:http://192.168.108.30:2368/ghost
十、Docker 核心命令速查表
| 类别 | 常用命令 |
|---|---|
| 镜像操作 | docker images docker pull docker build docker push docker rmi |
| 容器操作 | docker run docker ps docker stop docker rm docker exec docker logs |
| 网络操作 | docker network ls docker network create docker network connect |
| 存储操作 | docker volume ls docker volume inspect docker run -v |
| Compose | docker compose up docker compose down docker compose logs |