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 容器化。