Docker 使用和常用命令
Docker 使用和常用命令
Docker 核心概念
| 概念 | 说明 | 比喻 |
|---|---|---|
| 镜像 (Image) | 一个只读的模板,用于创建容器。相当于面向对象中的 类。 | 一个软件的安装包(.exe) |
| 容器 (Container) | 镜像运行时的实体。容器可以被创建、启动、停止、删除。相当于类的 实例。 | 一个正在运行的软件进程 |
| 仓库 (Registry) | 集中存放镜像的地方。官方仓库是 Docker Hub。 | 应用商店(App Store) |
简单关系: 简单关系:从仓库 pull 一个 Image -> 使用 run 命令基于 Image 创建并启动一个 Container。
常用命令介绍
镜像(Image)命令
搜索镜像
# 基本语法
docker search [OPTIONS] TERM
# 示例:搜索带有 "nginx" 名称的镜像
docker search nginx
# 选项:限制返回结果数量
docker search --limit 5 nginx
# 选项:只显示官方镜像
docker search --filter is-official=true nginx
拉取镜像
# 基本语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 示例:拉取最新的 nginx 镜像(等价于 nginx:latest)
docker pull nginx
# 示例:拉取指定标签的镜像( alpine 版本,更小巧)
docker pull nginx:alpine
# 示例:拉取指定版本的 Ubuntu 镜像
docker pull ubuntu:20.04
# 示例:从所有支持的平台上拉取镜像(包括 arm64, amd64 等)
docker pull --platform linux/amd64 nginx
列出本地镜像
# 基本语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
# 示例:列出所有镜像
docker images
# 或
docker image ls
# 示例:列出所有镜像,包括中间镜像层
docker images -a
# 示例:只显示镜像ID
docker images -q
# 示例:以特定格式显示(例如,只显示仓库名和标签)
docker images --format "table {{.Repository}}\t{{.Tag}}"
# 示例:列出 nginx 相关的镜像
docker images nginx
删除镜像
# 基本语法
docker rmi [OPTIONS] IMAGE [IMAGE...]
# 或
docker image rm [OPTIONS] IMAGE [IMAGE...]
# 示例:通过镜像ID删除(ID可通过 docker images 查看)
docker rmi a1523e859360
# 示例:通过仓库名:标签删除
docker rmi nginx:alpine
# 示例:强制删除一个镜像(即使有容器正在使用它)
docker rmi -f a1523e859360
# 示例:删除所有悬虚镜像( none 标签的,通常是构建过程中的残留)
docker image prune
# 示例:删除所有未被使用的镜像(谨慎使用!)
docker image prune -a
查看镜像详情
# 基本语法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# 示例:查看 nginx 镜像的详细信息
docker inspect nginx
# 示例:查看镜像的特定信息,例如只获取 IP 地址配置(需要镜像有配置)
docker inspect -f '{{.NetworkSettings.IPAddress}}' nginx
# 示例:查看镜像的构建历史
docker history nginx
导出和导入镜像
# 将镜像保存为 tar 归档文件
# 语法:docker save [OPTIONS] IMAGE [IMAGE...]
docker save -o nginx_image.tar nginx:alpine
# 从 tar 归档文件加载镜像到本地仓库
# 语法:docker load [OPTIONS]
docker load -i nginx_image.tar
# 将容器当前状态提交为新的镜像(不推荐作为主要构建方式,但可用于临时保存状态)
# 语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -m "Added new config" my_container my_nginx:v1
容器 (Container) 命令
创建并启动容器
# 基本语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用 OPTIONS:
| 选项 | 全称 | 说明 |
|---|---|---|
| -d | --detach | 在后台运行容器(守护模式),并打印容器 ID。 |
| -it | --interactive + --tty | 以交互模式运行容器,通常与终端(如 /bin/bash)结合使用。 |
| --name | 为容器指定一个名称,便于后续管理。 | |
| -p | --publish | 映射主机端口到容器端口。格式:[主机 IP:][主机端口]:容器端口 |
| -P | --publish-all | 随机映射所有暴露的(EXPOSE) 容器端口到主机的高端口。 |
| -v | --volume | 挂载数据卷,实现数据持久化或共享。 |
| --rm | 容器退出时自动删除该容器文件系统。常用于测试。 | |
| -e | --env | 设置容器内的环境变量。 |
| --restart | 配置容器的重启策略(如 no, on-failure, always, unless-stopped)。 | |
| --network | 将容器连接到指定网络。 |
# 1. 交互式运行一个 Ubuntu 容器,并进入其 bash shell
# (-it 是必须的,/bin/bash 是容器内要执行的命令)
docker run -it --name my_ubuntu ubuntu:20.04 /bin/bash
# (在容器内执行命令,输入 exit 退出并停止容器)
# 2. 后台运行 nginx,并将主机 8080 端口映射到容器的 80 端口
docker run -d -p 8080:80 --name my_nginx nginx
# 3. 运行一个一次性容器(--rm),执行完 echo 命令后自动删除
docker run --rm ubuntu:20.04 echo "Hello, Docker!"
# 4. 运行容器并设置环境变量
docker run -e MY_VAR=my_value -e APP_ENV=production --name my_app my_image
# 5. 运行容器并挂载数据卷
# 将主机当前目录挂载到容器 /app 目录
docker run -v ${PWD}:/app --name my_app my_image
# Windows CMD 中(使用 %CD%)
docker run -v %CD%:/app --name my_app my_image
# 6. 使用主机网络模式(容器直接使用主机网络栈,性能高,但隔离性差)
docker run -d --name my_nginx --network host nginx
列出容器
# 基本语法
docker ps [OPTIONS]
# 示例:查看正在运行的容器
docker ps
# 示例:查看所有容器(包括已停止的)
docker ps -a
# 示例:查看最新创建的容器
docker ps -l
# 示例:只显示所有容器的 ID
docker ps -aq
# 示例:格式化输出(例如,显示名称、状态、端口)
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
启动/停止/重启容器
# 启动一个已停止的容器
# 语法:docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start my_nginx
# 停止一个运行中的容器(发送 SIGTERM,允许优雅退出)
# 语法:docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop my_nginx
# 强制停止一个容器(发送 SIGKILL,立即终止)
# 语法:docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker kill my_nginx
# 重启容器(先 stop,再 start)
# 语法:docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker restart my_nginx
# 暂停容器内所有进程
docker pause my_nginx
# 恢复容器内所有进程
docker unpause my_nginx
进入运行中的容器
# 基本语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 示例:进入名为 my_nginx 的容器,并启动一个 bash shell(推荐方式)
# (-it 保证交互式操作)
docker exec -it my_nginx /bin/bash
# 如果容器没有 bash,可以尝试 sh
docker exec -it my_nginx /bin/sh
# 示例:在容器内执行一条命令并查看结果,然后退出
docker exec my_nginx ls -l /etc/nginx
docker exec my_nginx cat /etc/passwd
# 示例:在容器内设置环境变量并执行命令
docker exec -e MY_VAR=value my_nginx env
提示
使用 docker exec 是在已运行的容器中新开进程。docker attach 是连接到容器正在运行的终端(通常是主进程),一般不推荐使用,退出(exit)可能导致容器停止。
查看容器日志
# 基本语法
docker logs [OPTIONS] CONTAINER
# 示例:查看容器日志
docker logs my_nginx
# 示例:实时跟踪(跟随)日志输出(类似 tail -f)
docker logs -f my_nginx
# 示例:实时跟踪日志,并显示时间戳
docker logs -f -t my_nginx
# 示例:查看日志的最后 10 行
docker logs --tail 10 my_nginx
# 示例:查看从某个时间点之后的日志
docker logs --since 2023-10-01T10:00:00 my_nginx
# 示例:查看最近 10 分钟内的日志
docker logs --since 10m my_nginx
删除容器
# 基本语法
docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 示例:删除一个已停止的容器
docker rm my_nginx
# 示例:强制删除一个容器(无论是否运行中)
docker rm -f my_nginx
# 示例:删除所有已停止的容器
docker container prune
# 示例:删除所有容器(危险操作!)
# 先停止所有运行中的容器
docker stop $(docker ps -aq)
# 再删除所有容器
docker rm $(docker ps -aq)
# 示例:删除容器的同时,也删除其关联的匿名数据卷(避免成为孤卷)
docker rm -v my_nginx
拷贝文件
# 基本语法
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
# 示例:从容器拷贝 nginx.conf 文件到主机当前目录
docker cp my_nginx:/etc/nginx/nginx.conf .
# 示例:从主机拷贝一个配置文件到容器的指定位置
docker cp ./custom.conf my_nginx:/etc/nginx/conf.d/
# 示例:拷贝整个目录
docker cp my_nginx:/usr/share/nginx/html ./backup_files
查看容器详情
# 基本语法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# 示例:查看容器的所有信息(输出为 JSON 格式)
docker inspect my_nginx
# 示例:使用 Go 模板语法过滤信息,只获取 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_nginx
# 示例:获取容器的日志路径
docker inspect -f '{{.LogPath}}' my_nginx
# 示例:获取容器的状态信息
docker inspect -f '{{.State.Status}}' my_nginx
数据卷管理(Volume)命令
创建数据卷
# 创建一個命名卷
docker volume create my_volume
# 列出所有数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect my_volume
# 删除未使用的数据卷
docker volume prune
# 删除指定数据卷
docker volume rm my_volume
使用数据卷启动容器
# -v 方式:使用命名卷
docker run -d -v my_volume:/app/data --name my_app nginx
# -v 方式:使用匿名卷(不指定主机源,由 Docker 自动生成哈希值名称)
docker run -d -v /app/data --name my_app nginx
# --mount 方式(语法更清晰明确)
docker run -d --mount source=my_volume,target=/app/data --name my_app nginx
网络管理(Network)命令
查看网络
# 列出所有网络
docker network ls
# 查看网络详细信息(包括连接的容器)
docker network inspect bridge
创建网络
# 创建一个自定义桥接网络
docker network create my_network
# 创建时指定子网和网关
docker network create --subnet=172.18.0.0/16 --gateway=172.18.0.1 my_custom_net
将容器连接到网络
# 运行容器时连接到自定义网络
docker run -d --name app1 --network my_network nginx
# 将正在运行的容器连接到另一个网络
docker network connect my_network existing_container
# 断开容器与网络的连接
docker network disconnect my_network existing_container
使用示例(部署 Mysql)
以下流程完全使用 docker 命令在 Windows CMD 或 PowerShell 中部署一个功能完整的 MySQL 8.0 服务。
部署流程
部署一个 MySQL 8.0 容器。
设置 root 用户密码。
将数据库文件持久化存储在宿主机上(防止容器删除后数据丢失)。
映射端口,允许外部客户端(如 Navicat, Workbench)连接。
详细步骤
拉取 MySQL 镜像
拉取官方 MySQL 8.0 镜像
docker pull mysql:8.0
规划并创建数据存储目录
创建一个目录用于永久存储 MySQL 数据
启动 MySQL 容器(核心步骤)
使用一条命令完成所有配置
docker run --name mysql-server ^
-e MYSQL_ROOT_PASSWORD=my-secret-pw ^
-p 3306:3306 ^
-v D:\docker_data\mysql:/var/lib/mysql ^
-d ^
mysql:8.0
命令解释:
--name mysql-server:将容器命名为 mysql-server,方便管理。
-e MYSQL_ROOT_PASSWORD=my-secret-pw:必须设置的环境变量,用于配置 MySQL root 用户的密码。请将 my-secret-pw 改为你的强密码。
-p 3306:3306:将宿主机的 3306 端口映射到容器的 3306 端口。这样你才能从外部连接。
-v D:\docker_data\mysql:/var/lib/mysql:将宿主机 D:\docker_data\mysql 目录挂载到容器内的 MySQL 数据目录 (/var/lib/mysql)。这是实现数据持久化的关键,即使容器被删除,数据也安然无恙。
-d:让容器在后台运行(守护模式)。
mysql:8.0:指定使用的镜像。
验证容器是否运行
查看容器状态,应为 "Up" 或者专门查看 mysql 容器
docker ps
docker ps --filter "name=mysql-server"
查看启动日志(排查问题)
如果状态不是 Up,查看日志输出以排查错误
docker logs mysql-server
- 进入容器内部进行测试
使用 exec 命令进入容器内的 MySQL 命令行客户端
docker exec -it mysql-server mysql -uroot -p
执行后会提示输入密码,输入之前设置的 my-secret-pw。
成功后会看到 mysql> 提示符。可以执行一些 SQL 命令测试:
- 使用外部客户端连接
主机: 127.0.0.1 或 localhost
端口: 3306
用户名: root
密码: my-secret-pw
使用 MySQL Workbench、Navicat、DBeaver 或 VSCode 扩展等进行连接测试。
管理和维护命令
- 停止 MySQL 服务:
docker stop mysql-server - 启动 MySQL 服务:
docker start mysql-server - 重启 MySQL 服务:
docker restart mysql-server - 删除 MySQL 容器(谨慎!):
docker stop mysql-server,docker rm mysql-server
提示
由于使用了 -v 卷挂载,此操作不会删除宿主机 D:\docker_data\mysql 目录下的数据。下次只需用相同的 -v 参数重新运行 docker run 命令,即可恢复所有数据。