2026年3月15日
Docker 入门教程 - 容器化技术基础与实践
Docker 是目前最流行的容器化技术,它可以让开发者将应用程序及其依赖打包到一个可移植的容器中,实现”一次构建,到处运行”。
什么是 Docker
Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵从 Apache2.0 协议开源。容器完全使用沙箱机制,相互之间不会有任何接口。
核心概念
| 概念 | 说明 |
|---|---|
| 镜像 (Image) | 只读模板,包含创建容器所需的所有内容 |
| 容器 (Container) | 镜像的运行实例,相互隔离 |
| 仓库 (Registry) | 存储和分发镜像的地方 |
| Dockerfile | 构建镜像的脚本文件 |
Docker vs 虚拟机
| 特性 | Docker | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB 级 | GB 级 |
| 性能 | 接近原生 | 有损耗 |
| 隔离性 | 进程级 | 系统级 |
| 迁移性 | 极强 | 一般 |
安装 Docker
Linux 安装
# Ubuntu/Debian
curl -fsSL https://get.docker.com | bash
# 启动服务
sudo systemctl start docker
sudo systemctl enable docker
# 添加当前用户到 docker 组
sudo usermod -aG docker $USER
CentOS 安装
# 安装依赖
sudo yum install -y yum-utils
# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动服务
sudo systemctl start docker
sudo systemctl enable docker
Windows/macOS 安装
下载 Docker Desktop:
- Windows: https://www.docker.com/products/docker-desktop
- macOS: https://www.docker.com/products/docker-desktop
验证安装
docker --version
docker run hello-world
镜像管理
搜索镜像
# 搜索官方镜像
docker search nginx
# 搜索带过滤条件
docker search --filter=stars=100 nginx
拉取镜像
# 拉取最新版本
docker pull nginx
# 拉取指定版本
docker pull nginx:1.24
# 拉取指定平台
docker pull --platform linux/arm64 nginx
查看镜像
# 列出本地镜像
docker images
# 查看镜像详情
docker inspect nginx:latest
# 查看镜像历史
docker history nginx:latest
删除镜像
# 删除指定镜像
docker rmi nginx:latest
# 强制删除
docker rmi -f nginx:latest
# 清理悬空镜像
docker image prune
容器操作
创建并运行容器
# 运行交互式容器
docker run -it ubuntu /bin/bash
# 后台运行容器
docker run -d --name my-nginx -p 80:80 nginx
# 挂载目录
docker run -d -v /host/path:/container/path nginx
# 设置环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql
管理容器
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 启动容器
docker start container_name
# 停止容器
docker stop container_name
# 重启容器
docker restart container_name
# 删除容器
docker rm container_name
# 强制删除运行中的容器
docker rm -f container_name
进入容器
# 使用 exec 进入
docker exec -it container_name /bin/bash
# 使用 attach 连接
docker attach container_name
查看日志
# 查看日志
docker logs container_name
# 实时查看日志
docker logs -f container_name
# 查看最近 100 行
docker logs --tail 100 container_name
网络配置
网络类型
| 类型 | 说明 |
|---|---|
| bridge | 默认网络,容器间可通过 IP 互通 |
| host | 容器使用宿主机网络 |
| none | 无网络 |
| overlay | 跨主机网络 |
端口映射
# 映射单个端口
docker run -d -p 80:80 nginx
# 映射多个端口
docker run -d -p 80:80 -p 443:443 nginx
# 指定 IP 映射
docker run -d -p 127.0.0.1:80:80 nginx
# 使用 UDP
docker run -d -p 53:53/udp dns-server
自定义网络
# 创建网络
docker network create my-network
# 容器连接网络
docker run -d --network my-network --name web nginx
# 查看网络
docker network ls
# 删除网络
docker network rm my-network
数据管理
数据卷
# 创建数据卷
docker volume create my-volume
# 查看数据卷
docker volume ls
# 使用数据卷
docker run -d -v my-volume:/data nginx
# 删除数据卷
docker volume rm my-volume
挂载目录
# 挂载主机目录
docker run -d -v /host/www:/usr/share/nginx/html nginx
# 只读挂载
docker run -d -v /host/www:/usr/share/nginx/html:ro nginx
# 挂载单个文件
docker run -d -v /host/nginx.conf:/etc/nginx/nginx.conf:ro nginx
Dockerfile 编写
基本结构
# 基础镜像
FROM ubuntu:22.04
# 维护者信息
LABEL maintainer="your@email.com"
# 设置环境变量
ENV APP_HOME=/app
# 创建目录
WORKDIR $APP_HOME
# 复制文件
COPY . .
# 安装依赖
RUN apt-get update && apt-get install -y \
nginx \
&& rm -rf /var/lib/apt/lists/*
# 暴露端口
EXPOSE 80
# 启动命令
CMD ["nginx", "-g", "daemon off;"]
常用指令
| 指令 | 说明 |
|---|---|
| FROM | 指定基础镜像 |
| RUN | 执行命令 |
| CMD | 容器启动命令 |
| ENTRYPOINT | 入口点 |
| COPY | 复制文件 |
| ADD | 添加文件(支持 URL 和解压) |
| ENV | 设置环境变量 |
| EXPOSE | 声明端口 |
| WORKDIR | 工作目录 |
| USER | 指定用户 |
| VOLUME | 挂载点 |
构建镜像
# 构建镜像
docker build -t my-image:v1 .
# 指定 Dockerfile
docker build -f Dockerfile.prod -t my-image:v1 .
# 构建时传参
docker build --build-arg VERSION=1.0 -t my-image:v1 .
Docker Compose
安装 Compose
# Linux 安装
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose.yml 示例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
image: php:8.1-fpm
volumes:
- ./html:/var/www/html
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: mydb
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
Compose 命令
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 重启服务
docker-compose restart
常用命令速查
# 查看系统信息
docker info
# 查看磁盘使用
docker system df
# 清理系统
docker system prune -a
# 查看容器资源使用
docker stats
# 导出镜像
docker save -o nginx.tar nginx:latest
# 导入镜像
docker load -i nginx.tar
# 容器转镜像
docker commit container_name my-image:v1
最佳实践
镜像优化
- 使用多阶段构建
- 选择合适的基础镜像(alpine)
- 合并 RUN 指令
- 利用构建缓存
- 使用 .dockerignore
安全建议
- 不使用 root 运行容器
- 限制容器资源
- 使用只读文件系统
- 定期更新镜像
- 扫描镜像漏洞
资源限制
# 限制内存
docker run -d --memory=512m nginx
# 限制 CPU
docker run -d --cpus=1.5 nginx
# 限制所有资源
docker run -d \
--memory=512m \
--memory-swap=1g \
--cpus=1.5 \
--pids-limit=100 \
nginx
常见问题
Q: 容器内如何访问宿主机?
使用 host.docker.internal(Docker Desktop)或 --network host。
Q: 如何查看容器 IP?
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
Q: 容器时间不对怎么办?
docker run -d -v /etc/localtime:/etc/localtime:ro nginx
# 或
docker run -d -e TZ=Asia/Shanghai nginx
Q: 如何清理无用资源?
# 清理所有无用资源
docker system prune -a --volumes
总结
Docker 是现代开发和运维必备的技能。通过本文的学习,你应该掌握了:
- Docker 的基本概念和安装
- 镜像和容器的基本操作
- 网络和数据管理
- Dockerfile 的编写
- Docker Compose 的使用
建议在实际项目中多加练习,逐步深入理解容器化技术。