输入关键词开始搜索

Docker 常用命令与 Dockerfile

镜像管理

docker pull ubuntu:22.04          # 拉取镜像
docker images                     # 列出本地镜像
docker rmi <image>                # 删除镜像
docker tag src:latest dst:v1.0    # 打标签
docker save -o img.tar myapp:v1   # 导出
docker load -i img.tar            # 导入

容器操作

# 运行
docker run -d --name myapp -p 8080:80 myapp:v1
# -d 后台  --name 命名  -p 宿主机:容器

# 常用选项
docker run -it ubuntu bash        # 交互式终端
docker run -v /host/data:/data    # 挂载卷
docker run -e ENV=production      # 环境变量
docker run --restart=always       # 自动重启
docker run --cpus=2 -m 512m       # 限制资源

# 生命周期
docker ps                         # 运行中的容器
docker ps -a                      # 全部容器
docker stop myapp                 # 停止
docker start myapp                # 启动
docker restart myapp              # 重启
docker rm myapp                   # 删除(先 stop)
docker rm -f myapp                # 强制删除

# 调试
docker logs myapp                 # 查看日志
docker logs -f myapp              # 跟随日志
docker exec -it myapp bash        # 进入容器
docker inspect myapp              # 查看配置详情
docker stats                      # 资源占用

Dockerfile 模板

# ── 构建阶段(多阶段构建)──
FROM gcc:13 AS builder
WORKDIR /app
COPY . .
RUN cmake -B build -DCMAKE_BUILD_TYPE=Release \
    && cmake --build build -j$(nproc)

# ── 运行阶段 ──
FROM ubuntu:22.04
RUN apt update && apt install -y \
    libqt6widgets6 \
    libqt6sql6-sqlite \
    && rm -rf /var/lib/apt/lists/*

COPY --from=builder /app/build/myapp /usr/local/bin/
CMD ["myapp"]

Dockerfile 指令速查

指令作用
FROM基础镜像
WORKDIR工作目录
COPY / ADD复制文件(ADD 可解压 tar)
RUN构建时执行命令
ENV环境变量
EXPOSE声明端口
CMD容器启动时默认命令
ENTRYPOINT容器入口(不被 docker run 覆盖)

卷与数据持久化

# 命名卷(推荐)
docker volume create app-data
docker run -v app-data:/data myapp

# 绑定挂载(开发时用)
docker run -v $(pwd):/app myapp

# tmpfs(内存,不持久化)
docker run --tmpfs /tmp myapp

网络

# 创建自定义网络(容器间通过名称互访)
docker network create mynet
docker run --network mynet --name db mysql
docker run --network mynet --name app myapp  # app 可以通过 db:3306 连接

# 查看网络
docker network ls
docker network inspect mynet

docker-compose 模板

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:80"
    environment:
      - DB_HOST=db
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - db-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 3

volumes:
  db-data:
docker-compose up -d         # 启动
docker-compose down          # 停止 + 删除
docker-compose logs -f app   # 查看日志
docker-compose exec app bash # 进入服务容器
docker-compose build         # 重新构建

多阶段构建优势

单阶段多阶段
最终镜像~1.2GB (含编译工具)~50MB
安全源码 + 编译工具残留只含运行时
层缓存改一行代码全部重来COPY 之前层全部缓存

常见问题

# 容器内时区不对
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime

# 磁盘空间不足
docker system prune -a     # 清理未使用的镜像/容器/卷/网络
docker builder prune       # 清理构建缓存

# 镜像太大
# ① 多阶段构建 ② FROM alpine ③ 合并 RUN 命令减少层
# ④ .dockerignore 排除 node_modules/.git