Docker 常用命令指南

一、安装与基本概念

Docker 的核心概念:

  • 镜像(Image):只读模板,用于创建容器
  • 容器(Container):镜像的运行实例
  • 仓库(Registry):存储镜像的服务,如 Docker Hub

验证安装:

docker --version
docker info

二、镜像管理

搜索与拉取镜像

# 搜索镜像
docker search nginx

# 拉取镜像(不指定 tag 默认 latest)
docker pull nginx
docker pull nginx:1.25

# 拉取指定平台的镜像
docker pull --platform linux/amd64 nginx

查看与删除镜像

# 列出本地所有镜像
docker images
docker image ls

# 查看镜像详细信息
docker inspect nginx

# 删除镜像
docker rmi nginx
docker rmi nginx:1.25

# 删除所有未使用的镜像(危险!请确认后执行)
docker image prune -a

构建镜像

# 根据当前目录的 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 .

Dockerfile 基本示例:

FROM ubuntu:22.04
WORKDIR /app
COPY . .
RUN apt-get update && apt-get install -y python3
CMD ["python3", "main.py"]

三、容器管理

运行容器

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

# 后台运行(detach)
docker run -d nginx

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

# 端口映射(宿主机端口:容器端口)
docker run -d -p 8080:80 nginx

# 挂载目录(宿主机路径:容器路径)
docker run -d -v /home/user/html:/usr/share/nginx/html nginx

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

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

# 运行后自动删除容器
docker run --rm ubuntu echo "hello"

# 交互式运行(进入 bash)
docker run -it ubuntu bash

查看容器状态

# 列出运行中的容器
docker ps

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

# 查看容器详细信息
docker inspect my-nginx

# 查看容器资源占用(实时)
docker stats

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

# 实时跟踪日志(类似 tail -f)
docker logs -f my-nginx

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

控制容器生命周期

# 停止容器(发送 SIGTERM,等待优雅退出)
docker stop my-nginx

# 强制停止(发送 SIGKILL)
docker kill my-nginx

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

# 重启容器
docker restart my-nginx

# 删除已停止的容器
docker rm my-nginx

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

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

进入运行中的容器

# 进入容器执行交互式 shell(推荐)
docker exec -it my-nginx bash

# 容器内没有 bash 时用 sh
docker exec -it my-nginx sh

# 在容器内执行单条命令
docker exec my-nginx ls /etc/nginx

# 以 root 用户进入
docker exec -it -u root my-nginx bash

四、数据卷管理

# 创建数据卷
docker volume create mydata

# 列出所有数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect mydata

# 使用数据卷运行容器
docker run -d -v mydata:/var/lib/mysql mysql

# 删除数据卷
docker volume rm mydata

# 删除所有未使用的数据卷(危险!)
docker volume prune

五、网络管理

# 列出所有网络
docker network ls

# 创建自定义桥接网络
docker network create mynetwork

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

# 运行时指定网络(同一网络内容器可互相通信)
docker run -d --network mynetwork --name app1 myapp
docker run -d --network mynetwork --name app2 myapp

# 断开容器与网络的连接
docker network disconnect mynetwork my-nginx

# 删除网络
docker network rm mynetwork

六、Docker Compose

适合管理多容器应用,docker-compose.yml 示例:

version: '3.8'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: mydb
    volumes:
      - dbdata:/var/lib/mysql

volumes:
  dbdata:

常用 Compose 命令:

# 启动所有服务(后台)
docker compose up -d

# 停止并删除容器
docker compose down

# 停止并删除容器+数据卷
docker compose down -v

# 查看服务状态
docker compose ps

# 查看服务日志
docker compose logs -f

# 重新构建镜像
docker compose build

# 扩容(将 web 服务扩展到 3 个实例)
docker compose up -d --scale web=3

七、镜像导入导出

# 将镜像导出为 tar 文件(用于离线传输)
docker save -o nginx.tar nginx:latest

# 从 tar 文件导入镜像
docker load -i nginx.tar

# 将容器文件系统导出(不含镜像层信息)
docker export my-nginx > nginx-container.tar

# 从导出的文件创建镜像
cat nginx-container.tar | docker import - my-nginx:v1

八、清理空间

# 一键清理:停止的容器、未使用的网络、悬空镜像、构建缓存
docker system prune

# 同时清理未使用的镜像和数据卷(更彻底)
docker system prune -a --volumes

# 查看 Docker 占用的磁盘空间
docker system df

九、常用技巧

复制文件

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

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

查看容器 IP

docker inspect -f '' my-nginx

查看镜像构建历史

docker history nginx

给镜像打标签并推送

# 打标签
docker tag myapp:1.0 username/myapp:1.0

# 登录 Docker Hub
docker login

# 推送镜像
docker push username/myapp:1.0