镜像管理
docker pull ubuntu:22.04 # 拉取镜像
docker images # 列出本地镜像
docker rmi < imag e > # 删除镜像
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