Docker 常用命令

Docker 常用命令详细教程

目录

  • [1. Docker 基础命令](#1. Docker 基础命令)
  • [2. 镜像管理命令](#2. 镜像管理命令)
  • [3. 容器管理命令](#3. 容器管理命令)
  • [4. 网络管理命令](#4. 网络管理命令)
  • [5. 数据卷管理命令](#5. 数据卷管理命令)
  • [6. Docker Compose 命令](#6. Docker Compose 命令)
  • [7. 系统管理命令](#7. 系统管理命令)
  • [8. 实用技巧与最佳实践](#8. 实用技巧与最佳实践)

1. Docker 基础命令

1.1 查看 Docker 版本

bash 复制代码
docker --version
docker version

说明:

  • --version: 显示简短版本信息
  • version: 显示详细的客户端和服务端版本信息

1.2 查看 Docker 系统信息

bash 复制代码
docker info

说明: 显示 Docker 系统的详细信息,包括容器数量、镜像数量、存储驱动、网络配置等。

1.3 查看帮助信息

bash 复制代码
docker --help
docker <command> --help

示例:

bash 复制代码
docker run --help  # 查看 run 命令的帮助

2. 镜像管理命令

2.1 搜索镜像

bash 复制代码
docker search <镜像名>
docker search --filter stars=100 <镜像名>
docker search --limit 10 <镜像名>

示例:

bash 复制代码
docker search nginx
docker search --filter stars=500 python

2.2 拉取镜像

bash 复制代码
docker pull <镜像名>[:标签]

示例:

bash 复制代码
docker pull nginx
docker pull nginx:1.21.6
docker pull mysql:8.0
docker pull redis:alpine

2.3 查看本地镜像

bash 复制代码
docker images
docker image ls
docker images -a  # 显示所有镜像(包括中间层)
docker images -q  # 只显示镜像ID
docker images --no-trunc  # 显示完整的镜像ID

示例:

bash 复制代码
docker images
docker images nginx
docker images --filter "dangling=true"  # 查看悬空镜像

2.4 删除镜像

bash 复制代码
docker rmi <镜像ID/镜像名>
docker rmi -f <镜像ID>  # 强制删除
docker image prune  # 删除所有悬空镜像
docker image prune -a  # 删除所有未使用的镜像

示例:

bash 复制代码
docker rmi nginx:latest
docker rmi $(docker images -q)  # 删除所有镜像

2.5 构建镜像

bash 复制代码
docker build -t <镜像名>[:标签] <Dockerfile路径>
docker build -t <镜像名> .
docker build --no-cache -t <镜像名> .
docker build --build-arg VERSION=1.0 -t <镜像名> .

参数说明:

  • -t, --tag: 指定镜像名称和标签
  • -f, --file: 指定 Dockerfile 文件
  • --no-cache: 不使用缓存
  • --build-arg: 设置构建参数

示例:

bash 复制代码
docker build -t myapp:1.0 .
docker build -t myapp:latest -f Dockerfile.prod .

2.6 保存和加载镜像

bash 复制代码
# 导出镜像到文件
docker save -o <文件名.tar> <镜像名>
docker save <镜像名> > <文件名.tar>

# 从文件加载镜像
docker load -i <文件名.tar>
docker load < <文件名.tar>

示例:

bash 复制代码
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar

2.7 标记镜像

bash 复制代码
docker tag <源镜像>[:标签] <目标镜像>[:标签]

示例:

bash 复制代码
docker tag nginx:latest myregistry.com/nginx:v1
docker tag myapp:latest myapp:1.0.0

2.8 查看镜像历史

bash 复制代码
docker history <镜像名>
docker history --no-trunc <镜像名>

2.9 查看镜像详细信息

bash 复制代码
docker inspect <镜像名/镜像ID>
docker image inspect <镜像名>

示例:

bash 复制代码
docker inspect nginx:latest
docker inspect --format='{{.Config.ExposedPorts}}' nginx

3. 容器管理命令

3.1 创建并运行容器

bash 复制代码
docker run [选项] <镜像名> [命令]

常用参数:

  • -d, --detach: 后台运行
  • -it: 交互式终端
  • --name: 指定容器名称
  • -p: 端口映射(主机端口:容器端口)
  • -P: 随机映射端口
  • -v: 挂载数据卷(主机路径:容器路径)
  • -e: 设置环境变量
  • --rm: 容器停止后自动删除
  • --restart: 重启策略(no/on-failure/always/unless-stopped)
  • --network: 指定网络
  • -m, --memory: 限制内存
  • --cpus: 限制CPU

示例:

bash 复制代码
# 基本运行
docker run nginx

# 后台运行并命名
docker run -d --name my-nginx nginx

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

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

# 挂载数据卷
docker run -d -v /host/path:/container/path nginx
docker run -d -v my-volume:/data nginx

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

# 交互式运行
docker run -it ubuntu /bin/bash

# 容器停止后自动删除
docker run --rm -it ubuntu /bin/bash

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

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

# 综合示例
docker run -d \
  --name my-mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=root123 \
  -v mysql-data:/var/lib/mysql \
  --restart=always \
  mysql:8.0

3.2 查看容器

bash 复制代码
# 查看运行中的容器
docker ps
docker container ls

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

# 只显示容器ID
docker ps -q

# 查看最近创建的容器
docker ps -l

# 显示容器大小
docker ps -s

参数说明:

  • -a, --all: 显示所有容器
  • -q, --quiet: 只显示容器ID
  • -l, --latest: 显示最近创建的容器
  • -s, --size: 显示容器大小

示例:

bash 复制代码
docker ps
docker ps -a
docker ps --filter "status=exited"
docker ps --filter "name=nginx"

3.3 启动和停止容器

bash 复制代码
# 启动容器
docker start <容器ID/容器名>

# 停止容器
docker stop <容器ID/容器名>

# 重启容器
docker restart <容器ID/容器名>

# 强制停止容器
docker kill <容器ID/容器名>

# 暂停容器
docker pause <容器ID/容器名>

# 恢复容器
docker unpause <容器ID/容器名>

示例:

bash 复制代码
docker start my-nginx
docker stop my-nginx
docker restart my-nginx

# 批量操作
docker start $(docker ps -a -q)  # 启动所有容器
docker stop $(docker ps -q)  # 停止所有运行中的容器

3.4 删除容器

bash 复制代码
docker rm <容器ID/容器名>
docker rm -f <容器ID>  # 强制删除运行中的容器
docker rm -v <容器ID>  # 删除容器并删除关联的匿名卷
docker container prune  # 删除所有停止的容器

示例:

bash 复制代码
docker rm my-nginx
docker rm -f my-nginx
docker rm $(docker ps -a -q)  # 删除所有容器
docker rm $(docker ps -a -q -f status=exited)  # 删除所有已停止的容器

3.5 进入容器

bash 复制代码
# 执行命令(推荐)
docker exec -it <容器ID/容器名> /bin/bash
docker exec -it <容器ID/容器名> sh

# 附加到容器(不推荐)
docker attach <容器ID/容器名>

区别说明:

  • exec: 在容器中启动新进程,退出不会停止容器
  • attach: 附加到容器主进程,退出会停止容器

示例:

bash 复制代码
docker exec -it my-nginx /bin/bash
docker exec -it my-mysql mysql -uroot -p
docker exec my-nginx ls /etc/nginx

3.6 查看容器日志

bash 复制代码
docker logs <容器ID/容器名>
docker logs -f <容器ID>  # 实时查看日志
docker logs --tail 100 <容器ID>  # 查看最后100行
docker logs --since "2024-01-01" <容器ID>  # 查看指定时间后的日志
docker logs -t <容器ID>  # 显示时间戳

参数说明:

  • -f, --follow: 实时跟踪日志
  • --tail: 显示最后N行
  • --since: 显示指定时间后的日志
  • --until: 显示指定时间前的日志
  • -t, --timestamps: 显示时间戳

示例:

bash 复制代码
docker logs my-nginx
docker logs -f --tail 50 my-nginx
docker logs --since "2024-10-20T00:00:00" my-nginx

3.7 查看容器详细信息

bash 复制代码
docker inspect <容器ID/容器名>
docker inspect --format='{{.NetworkSettings.IPAddress}}' <容器名>

示例:

bash 复制代码
docker inspect my-nginx
docker inspect --format='{{.State.Status}}' my-nginx
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx

3.8 查看容器进程

bash 复制代码
docker top <容器ID/容器名>

3.9 查看容器资源使用

bash 复制代码
docker stats  # 查看所有容器的资源使用
docker stats <容器ID>  # 查看指定容器
docker stats --no-stream  # 只显示一次

3.10 复制文件

bash 复制代码
# 从容器复制到主机
docker cp <容器ID>:<容器路径> <主机路径>

# 从主机复制到容器
docker cp <主机路径> <容器ID>:<容器路径>

示例:

bash 复制代码
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./app.conf my-nginx:/etc/nginx/conf.d/

3.11 导出和导入容器

bash 复制代码
# 导出容器为tar文件
docker export <容器ID> > <文件名.tar>
docker export -o <文件名.tar> <容器ID>

# 导入容器快照为镜像
docker import <文件名.tar> <镜像名>[:标签]

3.12 容器提交为镜像

bash 复制代码
docker commit [选项] <容器ID> <镜像名>[:标签]

参数说明:

  • -a, --author: 作者信息
  • -m, --message: 提交信息

示例:

bash 复制代码
docker commit my-nginx my-nginx-custom:v1
docker commit -a "author" -m "add custom config" my-nginx my-nginx:v2

3.13 容器重命名

bash 复制代码
docker rename <旧容器名> <新容器名>

3.14 更新容器配置

bash 复制代码
docker update [选项] <容器ID>

示例:

bash 复制代码
docker update --restart=always my-nginx
docker update --memory="1g" --cpus="2" my-nginx

4. 网络管理命令

4.1 查看网络

bash 复制代码
docker network ls
docker network ls --filter driver=bridge

4.2 创建网络

bash 复制代码
docker network create <网络名>
docker network create --driver <驱动类型> <网络名>
docker network create --subnet <子网> <网络名>

驱动类型:

  • bridge: 桥接网络(默认)
  • host: 主机网络
  • overlay: 覆盖网络(Swarm)
  • macvlan: MAC地址网络
  • none: 无网络

示例:

bash 复制代码
docker network create my-network
docker network create --driver bridge my-bridge
docker network create --subnet=172.18.0.0/16 my-net
docker network create --driver=bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 custom-net

4.3 查看网络详情

bash 复制代码
docker network inspect <网络名>

4.4 连接和断开网络

bash 复制代码
# 连接容器到网络
docker network connect <网络名> <容器名>

# 断开容器网络连接
docker network disconnect <网络名> <容器名>

4.5 删除网络

bash 复制代码
docker network rm <网络名>
docker network prune  # 删除所有未使用的网络

4.6 创建容器时指定网络

bash 复制代码
docker run -d --network <网络名> --name <容器名> <镜像名>

示例:

bash 复制代码
docker run -d --network my-network --name web nginx
docker run -d --network host --name app myapp

5. 数据卷管理命令

5.1 查看数据卷

bash 复制代码
docker volume ls
docker volume ls -q
docker volume ls --filter dangling=true

5.2 创建数据卷

bash 复制代码
docker volume create <卷名>
docker volume create --driver <驱动> <卷名>

示例:

bash 复制代码
docker volume create my-volume
docker volume create --driver local my-data

5.3 查看数据卷详情

bash 复制代码
docker volume inspect <卷名>

5.4 删除数据卷

bash 复制代码
docker volume rm <卷名>
docker volume prune  # 删除所有未使用的数据卷

5.5 使用数据卷

bash 复制代码
# 命名卷
docker run -d -v <卷名>:<容器路径> <镜像名>

# 绑定挂载
docker run -d -v <主机路径>:<容器路径> <镜像名>

# 只读挂载
docker run -d -v <卷名>:<容器路径>:ro <镜像名>

示例:

bash 复制代码
docker run -d -v mysql-data:/var/lib/mysql mysql
docker run -d -v /host/data:/app/data nginx
docker run -d -v config:/etc/nginx:ro nginx

6. Docker Compose 命令

6.1 启动服务

bash 复制代码
docker-compose up
docker-compose up -d  # 后台运行
docker-compose up --build  # 构建并启动
docker-compose up --force-recreate  # 强制重新创建容器
docker-compose up --scale <服务名>=<数量>  # 扩展服务

6.2 停止服务

bash 复制代码
docker-compose down  # 停止并删除容器
docker-compose down -v  # 同时删除数据卷
docker-compose down --rmi all  # 同时删除镜像
docker-compose stop  # 仅停止容器

6.3 查看服务

bash 复制代码
docker-compose ps
docker-compose ps -a

6.4 查看日志

bash 复制代码
docker-compose logs
docker-compose logs -f  # 实时查看
docker-compose logs -f <服务名>  # 查看指定服务
docker-compose logs --tail=100

6.5 执行命令

bash 复制代码
docker-compose exec <服务名> <命令>
docker-compose exec -it <服务名> /bin/bash

6.6 构建服务

bash 复制代码
docker-compose build
docker-compose build --no-cache
docker-compose build <服务名>

6.7 其他命令

bash 复制代码
docker-compose restart  # 重启服务
docker-compose pause  # 暂停服务
docker-compose unpause  # 恢复服务
docker-compose top  # 查看进程
docker-compose config  # 验证配置文件
docker-compose pull  # 拉取镜像
docker-compose push  # 推送镜像

7. 系统管理命令

7.1 清理系统

bash 复制代码
# 清理未使用的数据
docker system prune

# 清理所有未使用的数据(包括未使用的镜像)
docker system prune -a

# 清理所有数据(包括数据卷)
docker system prune -a --volumes

# 强制清理(不提示确认)
docker system prune -f

7.2 查看磁盘使用

bash 复制代码
docker system df
docker system df -v  # 详细信息

7.3 查看系统事件

bash 复制代码
docker events
docker events --since '2024-10-20'
docker events --filter 'type=container'

7.4 登录和登出镜像仓库

bash 复制代码
# 登录 Docker Hub
docker login

# 登录私有仓库
docker login <仓库地址>

# 登出
docker logout

7.5 推送和拉取镜像

bash 复制代码
# 推送镜像
docker push <镜像名>[:标签]

# 拉取镜像
docker pull <镜像名>[:标签]

8. 实用技巧与最佳实践

8.1 批量操作

停止所有容器
bash 复制代码
docker stop $(docker ps -q)
删除所有容器
bash 复制代码
docker rm $(docker ps -a -q)
删除所有镜像
bash 复制代码
docker rmi $(docker images -q)
删除所有未使用的资源
bash 复制代码
docker system prune -a --volumes
删除悬空镜像
bash 复制代码
docker rmi $(docker images -f "dangling=true" -q)
删除已停止的容器
bash 复制代码
docker rm $(docker ps -a -q -f status=exited)

8.2 常用组合命令

构建并运行
bash 复制代码
docker build -t myapp . && docker run -d -p 8080:80 myapp
停止并删除容器
bash 复制代码
docker stop my-nginx && docker rm my-nginx
查看容器IP地址
bash 复制代码
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名>
查看容器环境变量
bash 复制代码
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' <容器名>

8.3 常用 Dockerfile 指令

dockerfile 复制代码
# 基础镜像
FROM nginx:alpine

# 维护者信息
LABEL maintainer="your@email.com"

# 设置工作目录
WORKDIR /app

# 复制文件
COPY . /app
ADD archive.tar.gz /app

# 运行命令
RUN apk add --no-cache python3

# 设置环境变量
ENV NODE_ENV=production

# 暴露端口
EXPOSE 80 443

# 挂载点
VOLUME ["/data"]

# 设置用户
USER nginx

# 容器启动命令
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT ["nginx"]

8.4 常用 docker-compose.yml 模板

yaml 复制代码
version: '3.8'

services:
  web:
    image: nginx:alpine
    container_name: web
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    networks:
      - app-network
    restart: always
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - db

  db:
    image: mysql:8.0
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    networks:
      - app-network
    restart: always

  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - app-network
    restart: always

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:
  redis-data:

8.5 性能优化技巧

1. 减小镜像体积 - 使用多阶段构建
dockerfile 复制代码
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
2. 使用 .dockerignore
复制代码
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
*.md
3. 合并 RUN 命令
dockerfile 复制代码
# 推荐
RUN apt-get update && \
    apt-get install -y nginx && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

8.6 安全最佳实践

1. 使用非 root 用户
dockerfile 复制代码
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
2. 限制容器资源
bash 复制代码
docker run -d \
  --memory="512m" \
  --memory-swap="1g" \
  --cpus="1.0" \
  --pids-limit=100 \
  nginx
3. 只读文件系统
bash 复制代码
docker run -d --read-only --tmpfs /tmp nginx

8.7 常用调试命令

bash 复制代码
# 查看容器详细信息
docker inspect <容器名>

# 查看容器日志
docker logs -f --tail 100 <容器名>

# 进入容器调试
docker exec -it <容器名> /bin/sh

# 查看容器进程
docker top <容器名>

# 查看资源使用
docker stats <容器名>

# 查看端口映射
docker port <容器名>

# 查看容器文件系统变化
docker diff <容器名>

8.8 数据备份与恢复

备份容器数据
bash 复制代码
# 备份数据卷
docker run --rm -v <卷名>:/data -v $(pwd):/backup ubuntu tar czf /backup/backup.tar.gz /data

# 备份容器
docker export <容器名> > container-backup.tar
恢复数据
bash 复制代码
# 恢复数据卷
docker run --rm -v <卷名>:/data -v $(pwd):/backup ubuntu tar xzf /backup/backup.tar.gz -C /

# 恢复容器
docker import container-backup.tar <镜像名>

附录:快速参考

镜像命令快查

命令 说明
docker pull 拉取镜像
docker build 构建镜像
docker images 查看镜像
docker rmi 删除镜像
docker tag 标记镜像
docker save 保存镜像
docker load 加载镜像

容器命令快查

命令 说明
docker run 创建并运行容器
docker ps 查看容器
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker rm 删除容器
docker exec 进入容器
docker logs 查看日志

常用参数快查

参数 说明
-d 后台运行
-it 交互式终端
-p 端口映射
-v 数据卷挂载
-e 环境变量
--name 容器名称
--restart 重启策略
--network 网络设置

相关推荐
选与握5 小时前
ubuntu22 docker安装ros1 noetic
docker·ros1
wuyunhang1234565 小时前
Docker----快速入门
docker·容器·架构
liliangcsdn6 小时前
docker环境如何基于python操作mysql关系数据库
docker·容器
java_logo7 小时前
Docker 部署微服务项目保姆级教程
java·运维·docker·微服务·容器·eureka·架构
冲上云霄的Jayden9 小时前
修改 Docker 容器中 MySQL 8.0 默认编码为 utf8mb4_unicode_ci
utf-8·mysql·ci/cd·docker·utf8mb4
zwjapple9 小时前
react+springboot的Docker部署
docker·部署·springboot·react
遇见火星10 小时前
Docker入门:快速部署你的第一个Web应用
前端·docker·容器
维诺菌12 小时前
k8s java应用pod内存占用过高问题排查
java·jvm·云原生·容器·性能优化·kubernetes
浪飘12 小时前
k8s device plugin
java·docker·kubernetes