Docker 容器技术快速入门与实战指南
Docker 容器技术快速入门与实战指南
1. 容器化架构与核心概念
传统虚拟机(VM)需要在宿主操作系统之上通过 Hypervisor 模拟完整的硬件层与客户机操作系统(Guest OS),存在启动慢、体积大、资源占用高的问题。Docker 容器引擎直接共享宿主机 Linux 内核(基于 Namespace 实现进程与网络隔离,基于 Cgroups 实现计算资源限制),将应用程序及其全部依赖库打包为轻量、标准化的容器单元,实现秒级启动与“一次构建,随处运行”。
四大核心组件关系
- 镜像(Image):只读的容器模板,采用分层联合文件系统(UnionFS)构建,包含运行应用所需的代码、运行时、库、环境变量与配置文件。
- 容器(Container):镜像的可运行实例。在只读镜像层之上叠加一层可读写层(Container Layer),支持独立启动、停止、移动和销毁。
- 仓库(Registry):集中存放和分发镜像的服务平台(如 Docker 官方镜像仓库或华为云 SWR 容器镜像服务),支持通过
docker pull拉取或docker push推送镜像。 - 守护进程(Docker Daemon / dockerd):运行在宿主机后台的服务进程,负责监听 Docker CLI 请求并调度管理底层的镜像、容器、数据卷(Volumes)与网络。
2. Linux / openEuler 环境部署与镜像加速配置
在企业级 Linux 环境(如 openEuler 22.03 LTS 或 CentOS)中,可通过预编译二进制包快速部署 Docker Engine,并配置国内镜像加速器以提升镜像拉取速度。
步骤一:二进制包解压与 Systemd 服务注册
下载并解压 Docker 二进制归档包,将可执行文件移入 /usr/bin,并编写 /usr/lib/systemd/system/docker.service 守护进程配置文件:
wget https://edu-res.hc-cdn.cn/sharedata/hdinnovation/sandbox/2417/docker-18.09.9.tgz
tar zxf docker-18.09.9.tgz
mv docker/* /usr/bin
cat >/usr/lib/systemd/system/docker.service <<'EOF'
[Unit]
Description=Docker Application Container Engine
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start docker
systemctl enable docker
docker version
步骤二:配置 /etc/docker/daemon.json 镜像加速器
写入华为云 SWR 镜像加速地址并重启 Docker 服务使其立即生效:
mkdir -p /etc/docker
cat >/etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://0cf850bb9480f3170f2dc01234ec1ca0.mirror.swr.myhuaweicloud.com"
]
}
EOF
systemctl restart docker
3. 高频镜像与容器生命周期命令速查
熟练掌握镜像拉取、离线归档导入导出以及容器启动管理命令,可覆盖日常开发调试与服务部署的核心场景。
| 运维场景 | 标准命令语法 | 核心作用与高频参数说明 |
|---|---|---|
| 拉取远程镜像 | docker pull <镜像名>:<标签> |
从镜像仓库下载指定版本镜像(省略标签时默认拉取 :latest)。 |
| 查看本地镜像 | docker images |
列出本地已缓存镜像的仓库名、标签、镜像 ID、创建时间与体积。 |
| 离线加载镜像 | docker load -i <归档包.tar> |
从本地 .tar 归档文件导入恢复镜像(对应导出命令为 docker save -o)。 |
| 删除本地镜像 | docker rmi -f <镜像名或ID> |
删除本地镜像;添加 -f 参数可强制删除存在多个标签引用冲突的镜像。 |
| 后台启动容器 | docker run -itd -p 80:80 --name <名> <镜像> |
创建并运行容器:-d 后台运行,-it 分配交互伪终端,-p 宿主机端口:容器端口。 |
| 挂载持久化目录 | docker run -v /宿主机目录:/容器目录 ... |
将宿主机绝对路径挂载至容器内(或使用命名数据卷),防止容器销毁导致数据丢失。 |
| 查看容器状态 | docker ps -a |
查看所有运行中(Up)及已退出(Exited)的容器;省略 -a 仅显示运行中容器。 |
| 进入运行中容器 | docker exec -it <容器名或ID> /bin/bash |
在运行中的容器内开启交互式 Shell 排查问题,输入 exit 退出时不会停止容器。 |
| 查看容器日志 | docker logs -f --tail 100 <容器名> |
实时追踪容器标准输出日志(-f 持续跟随输出,--tail 指定显示末尾行数)。 |
| 启停与销毁容器 | docker start / stop / rm -f <容器名> |
启动已停止容器、优雅停止运行中容器,或使用 rm -f 强制销毁容器。 |
典型实战:部署带目录挂载与端口映射的 Apache (httpd) 容器
以下命令拉取官方 httpd 镜像,导入并清理离线 centos.tar 镜像包,随后将宿主机 80 端口映射至容器 80 端口,并将宿主机 /data/ 目录挂载到容器的 /var/www/httpd/ 路径:
# 1. 在线拉取 httpd 镜像
docker pull httpd
# 2. 离线导入与强制删除镜像练习
wget https://edu-res.hc-cdn.cn/sharedata/hdinnovation/sandbox/1911/centos.tar
docker load -i centos.tar
docker images
docker rmi -f centos
# 3. 启动带端口映射和目录挂载的 httpd 容器
docker run --privileged -it -d -p 80:80 --name datahttpd -v /data/:/var/www/httpd/ httpd
docker ps -a
4. Dockerfile 声明式构建与工程化交付
当标准基础镜像无法满足业务需求时,可通过编写 Dockerfile 将应用代码、运行时与环境配置固化为自定义镜像,并结合 Docker Compose 统一编排多容器应用。
Dockerfile 核心指令速查表
| 指令名称 | 语法示例 | 功能说明与构建规范 |
|---|---|---|
| FROM | FROM python:3.11-slim |
指定基础镜像,必须作为 Dockerfile 的第一条非注释指令(ARG 除外)。 |
| WORKDIR | WORKDIR /app |
设置后续 RUN、CMD、ENTRYPOINT、COPY 的工作目录(不存在时自动创建)。 |
| COPY / ADD | COPY . /app |
将构建上下文中的本地文件复制到镜像内;普通文件复制优先使用透明可控的 COPY。 |
| RUN | RUN apt-get update && apt-get install -y curl |
在镜像构建阶段执行命令并提交为新镜像层;合并多条命令可有效减少镜像层数。 |
| ENV | ENV APP_ENV=production |
设置环境变量,在镜像构建阶段及容器启动运行时均持续生效。 |
| EXPOSE | EXPOSE 80 |
声明容器在运行时监听的网络端口(仅起文档声明作用,仍需通过 -p 映射宿主机端口)。 |
| ENTRYPOINT / CMD | CMD ["httpd-foreground"] |
指定容器启动时默认执行的进程命令;推荐使用 JSON 数组(Exec 格式)以正确接收信号。 |
编写标准 Dockerfile 并构建自定义镜像
在项目目录下创建 Dockerfile,通过标准指令定义镜像构建层,并调用 docker build 完成构建(注意命令末尾的 . 代表当前上下文路径):
# Dockerfile 示例:基于 httpd 定制静态站点镜像
FROM httpd:latest
WORKDIR /usr/local/apache2/htdocs/
COPY index.html ./index.html
EXPOSE 80
执行构建并启动自定义容器:
echo "<h1>Hello Docker Container!</h1>" > index.html
docker build -t my-web:v1.0 .
docker run -d -p 8080:80 --name custom-web my-web:v1.0
生产环境四大核心实践准则
- 精简镜像层数与体积:优先选用
alpine或slim基础镜像,添加.dockerignore排除无关文件,并使用多阶段构建(Multi-stage builds)分离编译环境与运行环境。 - 状态与计算分离:容器本身应保持无状态(Stateless);数据库文件、上传附件及业务日志必须通过
-v目录挂载或 Docker Volumes 独立持久化存储。 - 最小权限与高可用自愈:生产环境避免滥用
--privileged特权模式,并通过--restart=unless-stopped配置容器异常退出后自动拉起。 - 使用 Docker Compose 编排多服务:针对包含前端、后端与数据库的多容器项目,使用
compose.yaml统一定义服务网络与数据卷,通过docker compose up -d一键启停完整应用栈。
- 点赞
- 收藏
- 关注作者
评论(0)