Skip to content

Docker

Docker 核心概念

Image(镜像)

  • 一个只读模板
  • 包含:系统 + 运行环境 + 应用
  • 类似:class
shell
docker pull nginx

Container(容器)

  • 镜像运行后的实例
  • 类似:new Class()
shell
docker run nginx

Dockerfile

  • 用代码描述镜像怎么构建
  • 类似:构建脚本

Volume(数据卷)

  • 容器数据持久化
  • 容器删了,数据还在

Network(网络)

  • 容器之间通信
  • docker-compose 自动处理

Docker 安装

Linux(Ubuntu / Debian)

shell
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
  • 验证:
shell
docker -v
  • 非 root 用户使用
shell
sudo usermod -aG docker $USER
newgrp docker

Docker 基本配置

镜像加速

shell
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
json
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
    "https://docker.m.daocloud.io",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://your_preferred_mirror",
    "https://dockerhub.icu",
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
  ]
}
  • 重启:
shell
sudo systemctl restart docker

查看 Docker 状态

shell
docker info
docker version

常用 Docker 命令

镜像相关

shell
docker images            # 查看本地镜像
docker pull nginx        # 拉取镜像
docker rmi nginx         # 删除镜像
docker build -t myapp .  # 构建镜像

容器相关

shell
docker ps                # 运行中的容器
docker ps -a             # 所有容器
  • 启动容器
shell
docker run nginx
  • 常用参数
shell
docker run -d \
  --name my-nginx \
  -p 8080:80 \
  nginx
参数含义
-d后台运行
--name容器名
-p端口映射
-v数据卷
-e环境变量
  • 停止 / 删除
shell
docker stop my-nginx
docker start my-nginx
docker restart my-nginx
docker rm my-nginx
  • 进入容器
shell
docker exec -it my-nginx /bin/bash
  • 查看日志
shell
docker logs my-nginx
docker logs -f my-nginx

清理命令

shell
docker rm -f $(docker ps -aq)     # 删除所有容器
docker rmi -f $(docker images -q) # 删除所有镜像
docker system prune -a            # 清理无用资源

Volume(数据持久化)

挂载宿主目录

shell
docker run -d \
  -v /data/nginx/html:/usr/share/nginx/html \
  -p 80:80 \
  nginx

匿名 Volume

shell
docker volume ls
docker volume rm xxx

Dockerfile

Node 项目示例

dockerfile
FROM node:22.11.0-alpine

WORKDIR /app

COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm && pnpm install

COPY . .

RUN pnpm build

EXPOSE 3000

CMD ["pnpm", "start"]
  • 构建:
shell
docker build -t my-node-app .
docker run -d -p 3000:3000 my-node-app

Go 项目(多阶段构建)

dockerfile
# 构建阶段
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app

# 运行阶段
FROM alpine
WORKDIR /app
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]

docker-compose

前端 + 后端 + MySQL

yaml
services:
  web:
    image: nginx
    ports:
      - '80:80'
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf

  api:
    build: ./backend
    ports:
      - '3000:3000'

  mysql:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:
  • 启动:
shell
docker compose up -d
docker compose down

网络通信(容器互相访问)

❌ 错误方式

shell
localhost: 3306

✅ 正确方式

shell
mysql:3306   # 使用 service 名

常见坑

总结

  • ❌ 容器里用 localhost 访问宿主
  • ✅ 用 host.docker.internal
  • ❌ 不加 -d 前台卡死
  • 后台运行
  • 数据没挂载
  • volume 持久化
  • 镜像太大
  • alpine + 多阶段构建