目录

Docker 入门:从安装到实战的完整指南

Docker 是目前最主流的容器化工具,它将应用及其依赖打包成一个轻量级、可移植的容器,解决"在我机器上能跑"的经典问题。相比传统虚拟机,Docker 容器共享宿主机内核,启动速度从分钟级降到秒级,资源占用也大幅降低。

核心概念

在使用 Docker 之前,需要理解三个核心概念:

概念 说明 类比
镜像(Image) 只读的应用模板,包含代码、运行时、依赖 Java 的 .class 文件
容器(Container) 镜像的运行实例,可读写 JVM 中运行的进程
仓库(Registry) 存储和分发镜像的服务 Maven Central

它们的关系:从仓库拉取镜像,用镜像创建容器运行。

安装 Docker

安装以 Ubuntu 系统为例,其他系统参考官方文档

卸载旧版本

sudo apt remove docker docker-engine docker.io containerd runc

使用官方仓库安装

# 安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg

# 添加 Docker 官方 GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

验证安装

sudo docker run hello-world

看到 Hello from Docker! 即表示安装成功。

非 root 用户使用

默认情况下 Docker 需要 sudo 权限。将当前用户加入 docker 组可以免 sudo:

sudo usermod -aG docker $USER
# 重新登录生效

也可以使用官方一键脚本安装:curl -fsSL https://get.docker.com | sh

镜像操作

搜索与拉取

# 从 Docker Hub 搜索镜像
docker search nginx

# 拉取镜像(默认 latest 标签)
docker pull nginx

# 拉取指定版本
docker pull nginx:1.25-alpine

查看与删除

# 列出本地所有镜像
docker images

# 删除镜像
docker rmi nginx:latest

# 清理无用镜像(悬空层)
docker image prune

导入导出

# 导出镜像为 tar 文件
docker save -o nginx.tar nginx:latest

# 从 tar 文件导入
docker load -i nginx.tar

容器操作

创建与运行

# 运行容器(前台)
docker run nginx

# 后台运行 + 命名
docker run -d --name my-nginx nginx

# 端口映射(宿主机 8080 → 容器 80)
docker run -d -p 8080:80 --name my-nginx nginx

# 挂载目录(宿主机目录 → 容器目录)
docker run -d -v /host/html:/usr/share/nginx/html -p 8080:80 nginx

# 传递环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql:8

查看与进入

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 进入容器内部
docker exec -it my-nginx /bin/bash

# 查看容器日志
docker logs -f my-nginx

# 查看容器资源占用
docker stats

停止与删除

# 停止/启动/重启
docker stop my-nginx
docker start my-nginx
docker restart my-nginx

# 删除容器(需先停止)
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

# 清理所有已停止的容器
docker container prune

常用命令速查

操作 命令
运行 docker run -d -p 8080:80 --name web nginx
查看 docker ps -a
进入 docker exec -it web /bin/bash
日志 docker logs -f web
停止 docker stop web
删除 docker rm -f web

Dockerfile 构建自定义镜像

Dockerfile 是一个文本文件,描述了如何构建一个镜像。

基本结构

# 基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装
COPY package*.json ./
RUN npm ci --production

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "server.js"]

常用指令

指令 说明 示例
FROM 基础镜像 FROM python:3.12-slim
WORKDIR 工作目录 WORKDIR /app
COPY 复制文件 COPY . .
RUN 构建时执行 RUN apt install -y curl
ENV 环境变量 ENV NODE_ENV=production
EXPOSE 声明端口 EXPOSE 8080
CMD 启动命令 CMD ["python", "app.py"]

构建与运行

# 构建镜像
docker build -t my-app:1.0 .

# 运行自定义镜像
docker run -d -p 3000:3000 my-app:1.0

构建优化

# 多阶段构建,减小最终镜像体积
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o server .

FROM alpine:3.19
COPY --from=builder /app/server /server
CMD ["/server"]

多阶段构建可以将最终镜像从数百 MB 压缩到几十 MB。

Docker Compose 多容器编排

当应用需要多个服务配合(如 Web + Redis + MySQL)时,使用 Docker Compose 管理。

docker-compose.yml 示例

services:
  web:
    build: .
    ports:
      - "8080:3000"
    environment:
      - REDIS_HOST=redis
      - DB_HOST=db
    depends_on:
      - redis
      - db

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: myapp
    volumes:
      - db-data:/var/lib/mysql

volumes:
  redis-data:
  db-data:

Compose 常用命令

# 启动所有服务(后台)
docker compose up -d

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f web

# 停止并删除所有资源
docker compose down

# 停止并删除(包含数据卷)
docker compose down -v

实用技巧

清理系统资源

# 清理所有未使用的资源(镜像、容器、网络、构建缓存)
docker system prune -a

# 查看磁盘占用
docker system df

容器内文件拷贝

# 从容器拷贝到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf

# 从宿主机拷贝到容器
docker cp ./config.yml my-nginx:/app/config.yml

查看容器详细信息

# 查看容器 IP、挂载、环境变量等
docker inspect my-nginx

# 只获取 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx

下一步

掌握了以上内容,你已经可以应对日常开发中 90% 的 Docker 使用场景。进阶方向:

  • 网络管理:自定义 bridge 网络,实现容器间通信
  • 数据卷管理:named volumes vs bind mounts 的选择
  • Docker Swarm / Kubernetes:多节点容器编排
  • CI/CD 集成:在 GitHub Actions 或 GitLab CI 中构建推送镜像

相关文章:etcd 集群部署 中的多节点方案也依赖 Docker 容器化。