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 dfDockerfile 最佳实践
基础示例
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