Skip to content

Docker 常用命令与最佳实践

镜像操作

拉取镜像

bash
# 拉取最新版本
docker pull nginx

# 拉取指定版本
docker pull nginx:1.25.3

# 拉取并指定平台(M1/M2 Mac 可能需要)
docker pull --platform linux/amd64 mysql:8.0

查看与删除镜像

bash
# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

# 删除所有未使用的镜像
docker image prune -a

# 查看镜像详情
docker inspect nginx:latest

构建镜像

bash
# 基于 Dockerfile 构建
docker build -t myapp:1.0 .

# 指定 Dockerfile 路径
docker build -f docker/Dockerfile -t myapp:1.0 .

# 不使用缓存构建
docker build --no-cache -t myapp:1.0 .

容器操作

创建与启动

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

# 后台运行
docker run -d nginx

# 指定名称
docker run -d --name my-nginx nginx

# 端口映射
docker run -d -p 8080:80 nginx

# 挂载卷
docker run -d -v /host/path:/container/path nginx

# 设置环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql

# 设置重启策略
docker run -d --restart=always nginx

# 限制资源
docker run -d --memory=512m --cpus=1 nginx

查看容器

bash
# 查看运行中的容器
docker ps

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

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

# 实时跟踪日志
docker logs -f my-nginx

# 查看最近 100 行日志
docker logs --tail 100 my-nginx

# 查看容器详情
docker inspect my-nginx

# 查看容器资源占用
docker stats

进入容器

bash
# 进入容器执行命令
docker exec -it my-nginx bash

# 如果没有 bash,使用 sh
docker exec -it my-nginx sh

# 执行单个命令
docker exec my-nginx cat /etc/nginx/nginx.conf

停止与删除

bash
# 停止容器
docker stop my-nginx

# 启动已停止的容器
docker start my-nginx

# 重启容器
docker restart my-nginx

# 强制停止
docker kill my-nginx

# 删除容器
docker rm my-nginx

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

# 删除所有已停止的容器
docker container prune

数据卷操作

bash
# 创建数据卷
docker volume create my-volume

# 查看数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect my-volume

# 删除数据卷
docker volume rm my-volume

# 删除未使用的数据卷
docker volume prune

网络操作

bash
# 查看网络列表
docker network ls

# 创建自定义网络
docker network create my-network

# 运行容器时指定网络
docker run -d --network my-network --name app1 nginx

# 将容器连接到网络
docker network connect my-network my-nginx

# 断开网络连接
docker network disconnect my-network my-nginx

文件操作

bash
# 从容器复制文件到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf

# 从宿主机复制文件到容器
docker cp ./nginx.conf my-nginx:/etc/nginx/nginx.conf

清理命令

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

# 查看 Docker 磁盘占用
docker system df

Dockerfile 最佳实践

基础示例

dockerfile
# 使用官方基础镜像并指定版本
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 先复制依赖文件(利用缓存)
COPY pom.xml .
COPY mvnw .
COPY .mvn .mvn

# 下载依赖
RUN ./mvnw dependency:go-offline

# 再复制源码
COPY src src

# 构建应用
RUN ./mvnw package -DskipTests

# 暴露端口
EXPOSE 8080

# 启动命令
CMD ["java", "-jar", "target/app.jar"]

多阶段构建(推荐)

dockerfile
# 构建阶段
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
COPY src src
RUN mvn package -DskipTests

# 运行阶段
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Dockerfile 优化要点

要点说明
使用多阶段构建减小最终镜像体积
合理利用缓存不常变化的层放前面(如依赖安装)
使用 .dockerignore排除不必要的文件
指定镜像版本避免使用 latest 标签
使用非 root 用户提高安全性
合并 RUN 命令减少镜像层数

.dockerignore 示例

.git
.gitignore
.idea
*.md
target
node_modules
*.log