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:

验证安装

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

最佳实践

镜像优化

  1. 使用多阶段构建
  2. 选择合适的基础镜像(alpine)
  3. 合并 RUN 指令
  4. 利用构建缓存
  5. 使用 .dockerignore

安全建议

  1. 不使用 root 运行容器
  2. 限制容器资源
  3. 使用只读文件系统
  4. 定期更新镜像
  5. 扫描镜像漏洞

资源限制

# 限制内存
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 的使用

建议在实际项目中多加练习,逐步深入理解容器化技术。