Docker 命令
系统信息命令
# 查看 Docker 版本
docker version
# 输出示例:
# Client: Docker Engine - Community
# Version: 24.0.7
# API version: 1.43
# Go version: go1.20.10
# Git commit: afdd53b
# Built: Thu Oct 26 09:07:41 2023
# OS/Arch: linux/amd64
# Context: default
#
# Server: Docker Engine - Community
# Engine:
# Version: 24.0.7
# API version: 1.43 (minimum version 1.12)
# Go version: go1.20.10
# Git commit: a61a2ff
# Built: Thu Oct 26 09:07:41 2023
# OS/Arch: linux/amd64
# Experimental: false
# 查看系统信息
docker info
# 输出示例:
# Client:
# Context: default
# Debug Mode: false
# Plugins:
# buildx: Docker Buildx (Docker Inc., v0.11.2)
# compose: Docker Compose (Docker Inc., v2.23.3)
# extension: Manages extensions (Docker Inc., v0.2.19)
# sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., v0.6.0)
# scan: Docker Scan (Docker Inc., v0.25.0)
#
# Server:
# Containers: 5
# Running: 2
# Paused: 0
# Stopped: 3
# Images: 15
# Server Version: 24.0.7
# Storage Driver: overlay2
# Backing Filesystem: extfs
# Supports d_type: true
# Using metacopy: false
# Native Overlay Diff: true
# userxattr: false
# 查看磁盘使用情况
docker system df
# 输出示例:
# TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 15 8 2.123GB 1.456GB (68%)
# Containers 5 2 156.2MB 156.2MB (100%)
# Local Volumes 3 2 1.234GB 0B (0%)
# Build Cache 0 0 0B 0B
# 查看 Docker 守护进程状态
docker system info
# 输出示例:
# Containers: 5
# Running: 2
# Paused: 0
# Stopped: 3
# Images: 15
# Server Version: 24.0.7
# Storage Driver: overlay2
# Backing Filesystem: extfs
# Supports d_type: true
# Using metacopy: false
# Native Overlay Diff: true
# userxattr: false
# 查看 Docker 上下文
docker context ls
# 输出示例:
# NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
# default * moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://kubernetes.docker.internal:6443 swarm
# my-remote-context docker Remote Docker daemon ssh://user@remote-host:22
docker context use [上下文名]
# 示例:docker context use my-remote-context
# 输出:my-remote-context
镜像管理
# 搜索镜像
docker search [镜像名]
docker search nginx
# 输出示例:
# NAME DESCRIPTION STARS OFFICIAL AUTOMATED
# nginx Official build of Nginx. 19500 [OK]
# jwilder/nginx-proxy Automated nginx proxy for Docker containers 3000 [OK]
# richarvey/nginx-php-fpm Container running Nginx + PHP-FPM + PHP 800 [OK]
docker search --filter=stars=10 [镜像名] # 搜索星数大于10的镜像
docker search --filter=is-official=true [镜像名] # 搜索官方镜像
# 拉取镜像
docker pull [镜像名]:[标签]
docker pull nginx:latest
# 输出示例:
# Using default tag: latest
# latest: Pulling from library/nginx
# 7b1a6ab2e44d: Pull complete
# 33c188fd4f7d: Pull complete
# 9e5e79b546b4: Pull complete
# 8c0120a6f8c7: Pull complete
# 8c0120a6f8c7: Pull complete
# Digest: sha256:2b7d6430f40b1a3ab14580f6cc93653d649f406d63e924953d98605b4b359cd7
# Status: Downloaded newer image for nginx:latest
docker pull nginx:1.21-alpine
# 输出示例:
# 1.21-alpine: Pulling from library/nginx
# 59bf1c3509f3: Pull complete
# 719ad85d4fd8: Pull complete
# 1e987daa7652: Pull complete
# Digest: sha256:2b7d6430f40b1a3ab14580f6cc93653d649f406d63e924953d98605b4b359cd7
# Status: Downloaded newer image for nginx:1.21-alpine
# 查看本地镜像
docker images
# 输出示例:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# nginx latest 2b7d6430f40b 2 weeks ago 133MB
# mysql 8.0 8b8c9d4c5120 3 weeks ago 514MB
# ubuntu 20.04 ba6acccedd29 4 weeks ago 72.8MB
# redis alpine a89cb8156933 5 weeks ago 32.4MB
docker image ls
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" # 格式化输出
# 输出示例:
# REPOSITORY TAG SIZE
# nginx latest 133MB
# mysql 8.0 514MB
# ubuntu 20.04 72.8MB
# redis alpine 32.4MB
# 删除镜像
docker rmi [镜像ID/名称]
docker rmi nginx:latest
# 输出示例:
# Untagged: nginx:latest
# Deleted: sha256:2b7d6430f40b1a3ab14580f6cc93653d649f406d63e924953d98605b4b359cd7
docker image rm [镜像ID/名称]
docker rmi -f [镜像ID/名称] # 强制删除
# 批量删除镜像
docker rmi $(docker images -q) # 删除所有镜像
docker rmi $(docker images -f "dangling=true" -q) # 删除悬空镜像
# 输出示例:
# Deleted: sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
# Deleted: sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
# 构建镜像
docker build -t [镜像名]:[标签] [Dockerfile路径]
docker build -t myapp:latest .
# 输出示例:
# Sending build context to Docker daemon 2.048kB
# Step 1/5 : FROM node:16-alpine
# ---> 1234567890ab
# Step 2/5 : WORKDIR /app
# ---> Running in abcdef123456
# ---> 2345678901bc
# Step 3/5 : COPY package*.json ./
# ---> 3456789012cd
# Step 4/5 : RUN npm install
# ---> Running in def123456789
# ---> 4567890123de
# Step 5/5 : COPY . .
# ---> 5678901234ef
# Successfully built 5678901234ef
# Successfully tagged myapp:latest
docker build -f Dockerfile.prod -t myapp:prod .
# 构建时传递参数
docker build --build-arg VERSION=1.0 -t myapp:latest .
# 输出示例:
# Sending build context to Docker daemon 2.048kB
# Step 1/5 : FROM node:16-alpine
# ---> 1234567890ab
# Step 2/5 : ARG VERSION
# ---> Running in abcdef123456
# ---> 2345678901bc
# Step 3/5 : ENV VERSION=$VERSION
# ---> Running in def123456789
# ---> 3456789012cd
# Step 4/5 : WORKDIR /app
# ---> Running in 4567890123de
# ---> 5678901234ef
# Step 5/5 : COPY . .
# ---> 6789012345fg
# Successfully built 6789012345fg
# Successfully tagged myapp:latest
容器管理
# 运行容器
docker run [选项] [镜像名] [命令]
# 常用选项详解:
# -d, --detach: 后台运行
# -p, --publish: 端口映射 (主机端口:容器端口)
# -P, --publish-all: 发布所有暴露的端口
# -v, --volume: 挂载卷 (主机路径:容器路径)
# -e, --env: 环境变量
# --name: 容器名称
# --rm: 容器停止后自动删除
# -it: 交互式终端
# --network: 指定网络
# --restart: 重启策略 (no, always, unless-stopped, on-failure)
# 运行示例
docker run -d --name my-nginx -p 80:80 nginx
docker run -it --rm ubuntu:20.04 bash
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql:8.0
docker run -d -v /host/path:/container/path nginx
docker run -d --restart=unless-stopped nginx
# 查看运行中的容器
docker ps
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
# 查看所有容器
docker ps -a
docker ps -a --filter "status=exited" # 查看已退出的容器
# 启动容器
docker start [容器ID/名称]
docker start -a [容器ID/名称] # 启动并附加到容器
# 停止容器
docker stop [容器ID/名称]
docker stop -t 10 [容器ID/名称] # 设置停止超时时间
# 重启容器
docker restart [容器ID/名称]
docker restart -t 10 [容器ID/名称]
# 暂停/恢复容器
docker pause [容器ID/名称]
docker unpause [容器ID/名称]
# 删除容器
docker rm [容器ID/名称]
docker rm -f [容器ID/名称] # 强制删除运行中的容器
docker rm -v [容器ID/名称] # 同时删除关联的卷
# 批量删除容器
docker rm $(docker ps -aq) # 删除所有容器
docker rm $(docker ps -f "status=exited" -q) # 删除已退出的容器
# 重命名容器
docker rename [旧名称] [新名称]
容器操作
# 进入容器
docker exec -it [容器ID/名称] bash
docker exec -it [容器ID/名称] sh
docker exec -it [容器ID/名称] /bin/bash
# 在容器中执行命令
docker exec [容器ID/名称] ls /app
docker exec -u root [容器ID/名称] whoami
# 查看容器日志
docker logs [容器ID/名称]
docker logs -f [容器ID/名称] # 实时查看
docker logs --tail 100 [容器ID/名称] # 查看最后100行
docker logs --since "2023-01-01" [容器ID/名称] # 查看指定时间后的日志
docker logs --timestamps [容器ID/名称] # 显示时间戳
# 复制文件
docker cp [本地路径] [容器ID/名称]:[容器路径]
docker cp [容器ID/名称]:[容器路径] [本地路径]
docker cp ./config.json mycontainer:/app/
docker cp mycontainer:/app/logs/ ./local-logs/
# 查看容器详细信息
docker inspect [容器ID/名称]
docker inspect --format='{{.NetworkSettings.IPAddress}}' [容器ID/名称]
docker inspect --format='{{.Config.Env}}' [容器ID/名称]
# 查看容器资源使用情况
docker stats [容器ID/名称]
docker stats --no-stream [容器ID/名称] # 只显示一次
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 查看容器进程
docker top [容器ID/名称]
# 提交容器为镜像
docker commit [容器ID/名称] [镜像名]:[标签]
docker commit -m "添加新功能" -a "作者" [容器ID/名称] myapp:v2.0
# 查看容器文件系统变化
docker diff [容器ID/名称]
网络管理
# 查看网络列表
docker network ls
docker network ls --format "table {{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.Scope}}"
# 创建网络
docker network create [网络名]
docker network create --driver bridge my-network
docker network create --subnet=172.18.0.0/16 my-network
docker network create --driver overlay --attachable my-overlay-network
# 查看网络详细信息
docker network inspect [网络名]
docker network inspect --format='{{.IPAM.Config}}' [网络名]
# 删除网络
docker network rm [网络名]
docker network prune # 删除未使用的网络
# 连接容器到网络
docker network connect [网络名] [容器ID/名称]
docker network connect my-network my-container
# 断开容器与网络的连接
docker network disconnect [网络名] [容器ID/名称]
docker network disconnect my-network my-container
# 创建网络时指定选项
docker network create \
--driver bridge \
--subnet=172.20.0.0/16 \
--gateway=172.20.0.1 \
my-custom-network
数据卷管理
# 创建数据卷
docker volume create [卷名]
docker volume create my-data
# 查看数据卷列表
docker volume ls
docker volume ls --format "table {{.Name}}\t{{.Driver}}"
# 查看数据卷详细信息
docker volume inspect [卷名]
docker volume inspect --format='{{.Mountpoint}}' [卷名]
# 删除数据卷
docker volume rm [卷名]
docker volume rm -f [卷名] # 强制删除
# 清理未使用的数据卷
docker volume prune
docker volume prune -f # 不确认直接清理
# 挂载数据卷到容器
docker run -v [卷名]:[容器路径] [镜像名]
docker run -v my-data:/app/data nginx
# 绑定挂载
docker run -v [主机路径]:[容器路径] [镜像名]
docker run -v /host/path:/container/path nginx
# 只读挂载
docker run -v [主机路径]:[容器路径]:ro [镜像名]
docker run -v /host/path:/container/path:ro nginx
# 临时文件系统
docker run --tmpfs /tmp [镜像名]
系统清理
# 清理未使用的容器
docker container prune
docker container prune -f # 不确认直接清理
# 清理未使用的镜像
docker image prune
docker image prune -a # 清理所有未使用的镜像
docker image prune -a -f
# 清理未使用的网络
docker network prune
docker network prune -f
# 清理未使用的数据卷
docker volume prune
docker volume prune -f
# 清理所有未使用的资源
docker system prune -a
docker system prune -a -f
# 查看系统使用情况
docker system df -v # 详细显示
# 清理构建缓存
docker builder prune
docker builder prune -a
高级命令
# 查看 Docker 事件
docker events
docker events --filter 'type=container'
docker events --since '2023-01-01' --until '2023-01-02'
# 查看 Docker 上下文
docker context ls
docker context use [上下文名]
docker context create [上下文名] --docker host=ssh://user@host
# 查看 Docker 插件
docker plugin ls
docker plugin install [插件名]
# 查看 Docker 构建历史
docker history [镜像名] --no-trunc
# 导出/导入容器
docker export [容器ID] > container.tar
docker import container.tar [镜像名]:[标签]
# 查看容器资源限制
docker stats --no-stream [容器ID]
# 设置容器资源限制
docker run --memory=512m --cpus=1.0 nginx
docker run --memory=1g --memory-swap=2g nginx
docker run --cpuset-cpus="0,1" nginx
# 查看容器端口映射
docker port [容器ID/名称]
# 查看容器日志驱动
docker inspect --format='{{.HostConfig.LogConfig.Type}}' [容器ID]
常用组合命令
# 清理所有停止的容器和未使用的镜像
docker system prune -a -f
# 查看容器IP地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [容器ID]
# 批量停止所有运行中的容器
docker stop $(docker ps -q)
# 批量删除所有容器
docker rm $(docker ps -aq)
# 查看容器环境变量
docker exec [容器ID] env
# 查看容器挂载的卷
docker inspect -f '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}{{end}}' [容器ID]
# 查看容器网络配置
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [容器ID]
故障排查命令
# 查看容器日志并跟踪
docker logs -f --tail 100 [容器ID]
# 进入容器进行调试
docker exec -it [容器ID] /bin/bash
# 查看容器资源使用情况
docker stats --no-stream [容器ID]
# 查看容器进程
docker top [容器ID]
# 检查容器健康状态
docker inspect --format='{{.State.Health.Status}}' [容器ID]
# 查看容器配置
docker inspect [容器ID] | grep -A 10 "Config"
# 查看容器网络配置
docker inspect [容器ID] | grep -A 20 "NetworkSettings"
