Docker 基本命令
Docker 常用命令详解和使用示例,适合零基础学习
1. 一句话概括主题
Docker 基本命令就是用来管理镜像和容器的工具,就像用命令行管理文件和程序一样简单。
2. 它是什么(口语化解释)
Docker 命令就像是你和 Docker 对话的语言。通过这些命令,你可以:
- 下载镜像(就像下载软件安装包)
- 运行容器(就像启动程序)
- 查看状态(就像查看运行的程序)
- 停止删除(就像关闭和卸载程序)
简单来说:Docker 命令就是控制 Docker 的遥控器,让你能够管理所有的镜像和容器。
3. 能解决什么问题 + 为什么重要
解决的问题
-
快速操作容器和镜像
- 不需要图形界面,一条命令就能完成操作
- 可以写脚本自动化操作
-
统一的管理方式
- 所有 Docker 操作都通过命令完成
- 命令格式统一,容易学习和记忆
-
批量操作
- 可以批量启动、停止、删除容器
- 提高工作效率
为什么重要
- 基础技能:掌握 Docker 命令是使用 Docker 的基础
- 自动化:命令可以写进脚本,实现自动化
- 效率:命令行操作比图形界面更快
- 通用性:所有平台都支持相同的命令
4. 核心知识点拆解
4.1 系统信息命令
查看 Docker 版本
docker version- 就像查看软件版本号
- 显示客户端和服务器的版本信息
查看 Docker 系统信息
docker info- 就像查看系统信息
- 显示容器数量、镜像数量、存储驱动等信息
4.2 镜像管理命令
查看本地镜像
docker images- 就像查看已安装的软件列表
- 显示镜像名称、版本、大小等信息
下载镜像
docker pull nginx:latest- 就像从应用商店下载软件
- 从 Docker Hub 下载镜像到本地
删除镜像
docker rmi nginx:latest- 就像卸载软件
- 删除不需要的镜像,释放空间
4.3 容器管理命令
运行容器
docker run -d nginx:latest- 就像启动程序
- 用镜像创建一个容器并运行
查看运行中的容器
docker ps- 就像查看正在运行的程序
- 显示所有运行中的容器
停止容器
docker stop my-container- 就像关闭程序
- 停止运行中的容器
删除容器
docker rm my-container- 就像卸载程序
- 删除已停止的容器
查看容器日志
docker logs my-container- 就像查看程序日志
- 查看容器的输出信息,用于排查问题
5. 示例代码(逐行注释)
示例 1:完整的容器生命周期操作
# ====== 第一步:查看 Docker 是否正常工作 ======
# 查看 Docker 版本,确认安装成功
docker version
# 查看 Docker 系统信息
docker info
# ====== 第二步:下载镜像 ======
# 从 Docker Hub 下载 nginx 镜像(就像下载软件安装包)
# nginx 是一个流行的 Web 服务器
docker pull nginx:latest
# 查看本地有哪些镜像(确认下载成功)
docker images
# ====== 第三步:运行容器 ======
# 运行 nginx 容器
# -d 表示在后台运行(detached mode),不会占用终端
# --name my-nginx 给容器起个名字,方便后续管理
# -p 8080:80 端口映射,把容器的80端口映射到主机的8080端口
# 这样访问 localhost:8080 就能访问容器内的网站
# nginx:latest 使用的镜像名称
docker run -d --name my-nginx -p 8080:80 nginx:latest
# ====== 第四步:查看容器状态 ======
# 查看运行中的容器
# 应该能看到 my-nginx 容器,状态是 Up(运行中)
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# ====== 第五步:测试容器 ======
# 测试容器是否正常工作
# 在浏览器访问 http://localhost:8080
# 或者用 curl 命令测试(如果没有 curl,可以跳过这步)
curl http://localhost:8080
# ====== 第六步:查看容器日志 ======
# 查看容器的输出日志
# 如果容器有问题,可以通过日志排查
docker logs my-nginx
# 实时查看日志(类似 tail -f)
docker logs -f my-nginx
# 按 Ctrl+C 退出实时查看
# ====== 第七步:进入容器内部 ======
# 进入运行中的容器内部(就像 SSH 到服务器)
# -it 表示交互式终端
# /bin/bash 是要执行的命令(启动 bash shell)
docker exec -it my-nginx /bin/bash
# 在容器内部可以执行命令,比如:
# ls -la # 查看文件列表
# cat /etc/nginx/nginx.conf # 查看配置文件
# exit # 退出容器
# ====== 第八步:停止容器 ======
# 停止运行中的容器(就像关闭程序)
docker stop my-nginx
# 查看容器状态(现在应该是 Exited 状态)
docker ps -a
# ====== 第九步:启动已停止的容器 ======
# 重新启动已停止的容器
docker start my-nginx
# 查看容器状态(应该又变成 Up 状态了)
docker ps
# ====== 第十步:删除容器 ======
# 先停止容器(只能删除已停止的容器)
docker stop my-nginx
# 删除容器(就像卸载程序)
docker rm my-nginx
# 确认容器已删除
docker ps -a示例 2:运行一个交互式容器
# 运行一个 Ubuntu 容器,进入交互式终端
# -it 表示交互式终端(interactive + TTY)
# ubuntu:20.04 使用的镜像
# /bin/bash 启动 bash shell
docker run -it --name my-ubuntu ubuntu:20.04 /bin/bash
# 现在你进入了容器内部,可以执行命令:
# pwd # 查看当前目录
# ls -la # 查看文件列表
# whoami # 查看当前用户
# apt update # 更新软件包列表
# apt install -y curl # 安装 curl 工具
# 退出容器(容器会停止)
exit
# 或者按 Ctrl+P, Ctrl+Q 退出但不停止容器
# 然后可以用 docker attach my-ubuntu 重新进入示例 3:运行一个带数据卷的容器
# 创建一个简单的 HTML 文件
echo "<h1>Hello Docker!</h1>" > index.html
# 运行 nginx 容器,并挂载当前目录
# -v $(pwd):/usr/share/nginx/html 把当前目录挂载到容器的网页目录
# 这样修改 index.html,容器中的网页也会更新
docker run -d \
--name my-site \
-p 8080:80 \
-v $(pwd):/usr/share/nginx/html \
nginx:latest
# 访问 http://localhost:8080 查看网站
# 修改 HTML 文件
echo "<h1>Hello Docker! Updated!</h1>" > index.html
# 刷新浏览器,应该能看到更新后的内容示例 4:管理多个容器
# 运行 3 个 nginx 容器,使用不同的端口
docker run -d --name web1 -p 8081:80 nginx:latest
docker run -d --name web2 -p 8082:80 nginx:latest
docker run -d --name web3 -p 8083:80 nginx:latest
# 查看所有运行中的容器
docker ps
# 停止所有容器
docker stop web1 web2 web3
# 删除所有容器
docker rm web1 web2 web3
# 或者一条命令完成(停止并删除)
docker stop web1 web2 web3 && docker rm web1 web2 web36. 常见错误与踩坑
错误 1:忘记加 -d 参数,终端被占用
问题现象:
- 运行容器后,终端被占用,无法输入其他命令
- 按 Ctrl+C 后容器就停止了
原因:
- 没有使用
-d参数,容器在前台运行
解决方法:
# 错误的方式(终端被占用)
docker run nginx:latest
# 正确的方式(后台运行)
docker run -d nginx:latest
# 如果已经运行了,可以新开一个终端窗口
# 或者按 Ctrl+C 停止,然后重新运行并加上 -d错误 2:端口被占用
问题现象:
Error response from daemon: driver failed programming external connectivity on endpoint:
Bind for 0.0.0.0:8080 failed: port is already allocated
原因:
- 主机的端口(如 8080)已经被其他程序占用
解决方法:
# 方法1:查看哪个程序占用了端口
lsof -i :8080
# 或者
netstat -tulpn | grep 8080
# 方法2:使用其他端口
docker run -d -p 8081:80 nginx:latest
# 方法3:停止占用端口的容器
docker ps # 查看运行中的容器
docker stop <container_id> # 停止占用端口的容器错误 3:容器名称冲突
问题现象:
Error response from daemon: Conflict. The container name "/my-nginx" is already in use
原因:
- 已经有一个同名的容器存在(可能是停止的)
解决方法:
# 方法1:查看所有容器(包括已停止的)
docker ps -a
# 方法2:删除旧的容器
docker rm my-nginx
# 然后再创建新容器
# 方法3:使用不同的名称
docker run -d --name my-nginx-2 nginx:latest
# 方法4:强制删除并重新创建
docker rm -f my-nginx
docker run -d --name my-nginx nginx:latest错误 4:删除正在运行的容器
问题现象:
Error response from daemon: You cannot remove a running container
原因:
- 试图删除正在运行的容器
解决方法:
# 方法1:先停止再删除
docker stop my-container
docker rm my-container
# 方法2:强制删除(不推荐,可能导致数据丢失)
docker rm -f my-container错误 5:镜像不存在
问题现象:
Unable to find image 'myapp:latest' locally
docker: Error response from daemon: pull access denied for myapp
原因:
- 本地没有这个镜像,Docker Hub 上也没有
解决方法:
# 方法1:先检查镜像是否存在
docker search myapp
# 方法2:使用正确的镜像名称
docker pull nginx:latest # 使用官方镜像
# 方法3:先构建镜像
docker build -t myapp:latest .错误 6:权限问题
问题现象:
Got permission denied while trying to connect to the Docker daemon socket
原因:
- 当前用户没有权限访问 Docker
解决方法:
# 方法1:使用 sudo(临时解决)
sudo docker ps
# 方法2:把用户添加到 docker 组(永久解决)
sudo usermod -aG docker $USER
# 然后重新登录或执行
newgrp docker7. 实际应用场景
场景 1:快速启动开发环境
场景:需要快速启动一个 MySQL 数据库用于开发
传统方式:
- 下载 MySQL 安装包
- 安装 MySQL
- 配置 MySQL
- 启动 MySQL
- 创建数据库和用户
使用 Docker:
# 一条命令搞定
docker run -d \
--name mysql-dev \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
mysql:8.0
# 数据库就启动好了,可以直接连接使用
# 连接信息:
# 主机:localhost
# 端口:3306
# 用户名:root
# 密码:123456
# 数据库:testdb场景 2:运行多个版本的软件
场景:需要同时运行 Node.js 14 和 Node.js 16 来测试兼容性
使用 Docker:
# 运行 Node.js 14 容器
docker run -it --name node14 node:14 node --version
# 运行 Node.js 16 容器
docker run -it --name node16 node:16 node --version
# 不需要在系统上安装多个版本的 Node.js场景 3:临时运行一个工具
场景:需要运行一个临时工具,不想在系统上安装
使用 Docker:
# 运行一个 Redis 客户端工具(用完就删)
docker run -it --rm redis:latest redis-cli
# --rm 参数表示容器停止后自动删除
# 这样不会留下任何痕迹场景 4:批量管理容器
场景:需要同时管理多个服务容器
使用 Docker:
# 启动多个服务
docker run -d --name web -p 80:80 nginx:latest
docker run -d --name db -p 3306:3306 mysql:8.0
docker run -d --name cache -p 6379:6379 redis:latest
# 查看所有服务状态
docker ps
# 停止所有服务
docker stop web db cache
# 启动所有服务
docker start web db cache
# 删除所有服务
docker rm web db cache8. 给新手的练习题(可立即实践)
练习 1:运行你的第一个容器
目标:运行一个 Nginx 容器,在浏览器中访问
步骤:
# 1. 拉取 nginx 镜像
docker pull nginx:latest
# 2. 运行容器(后台运行,端口映射到 8080)
docker run -d --name my-nginx -p 8080:80 nginx:latest
# 3. 查看容器是否运行
docker ps
# 4. 在浏览器访问 http://localhost:8080
# 或者用 curl 测试
curl http://localhost:8080
# 5. 查看容器日志
docker logs my-nginx
# 6. 停止容器
docker stop my-nginx
# 7. 删除容器
docker rm my-nginx预期结果:能看到 Nginx 的欢迎页面
练习 2:创建一个简单的网站
目标:创建一个 HTML 文件,用 Nginx 容器来展示
步骤:
# 1. 创建一个 HTML 文件
echo "<h1>我的第一个 Docker 网站</h1>" > index.html
# 2. 运行容器并挂载当前目录
docker run -d \
--name my-site \
-p 8080:80 \
-v $(pwd):/usr/share/nginx/html \
nginx:latest
# 3. 访问 http://localhost:8080 查看你的网站
# 4. 修改 HTML 文件
echo "<h1>我的第一个 Docker 网站 - 已更新</h1>" > index.html
# 5. 刷新浏览器,看看变化预期结果:能看到你创建的 HTML 内容,并且修改后能立即看到变化
练习 3:运行一个交互式容器
目标:进入一个 Ubuntu 容器,体验容器环境
步骤:
# 1. 运行交互式容器
docker run -it --name my-ubuntu ubuntu:20.04 /bin/bash
# 2. 在容器内执行命令
pwd # 查看当前目录
ls -la # 查看文件列表
whoami # 查看当前用户
apt update # 更新软件包列表
apt install -y curl # 安装 curl 工具
curl --version # 查看 curl 版本
# 3. 退出容器
exit
# 4. 查看容器(应该已停止)
docker ps -a预期结果:能够进入容器并执行命令,体验容器的隔离环境
练习 4:管理多个容器
目标:运行多个容器,练习容器的管理
步骤:
# 1. 运行 3 个 nginx 容器,使用不同的端口
docker run -d --name web1 -p 8081:80 nginx:latest
docker run -d --name web2 -p 8082:80 nginx:latest
docker run -d --name web3 -p 8083:80 nginx:latest
# 2. 查看所有运行中的容器
docker ps
# 3. 分别访问 http://localhost:8081、8082、8083
# 4. 停止所有容器
docker stop web1 web2 web3
# 5. 查看所有容器(包括已停止的)
docker ps -a
# 6. 删除所有容器
docker rm web1 web2 web3
# 7. 确认容器已删除
docker ps -a预期结果:能够同时运行多个容器,并管理它们
练习 5:练习常用命令组合
目标:熟悉常用命令的组合使用
步骤:
# 1. 查看 Docker 版本和系统信息
docker version
docker info
# 2. 查看本地镜像
docker images
# 3. 拉取一个新镜像
docker pull redis:latest
# 4. 运行 Redis 容器
docker run -d --name my-redis -p 6379:6379 redis:latest
# 5. 查看运行中的容器
docker ps
# 6. 查看容器日志
docker logs my-redis
# 7. 进入容器内部
docker exec -it my-redis /bin/bash
# 在容器内执行:redis-cli ping
# 应该返回 PONG
# 然后 exit 退出
# 8. 停止容器
docker stop my-redis
# 9. 启动已停止的容器
docker start my-redis
# 10. 删除容器
docker stop my-redis
docker rm my-redis预期结果:熟悉常用命令的使用方法
9. 用更简单的语言再总结一遍(方便复习)
命令分类回顾
查看信息类:
docker version- 查看版本(就像查看软件版本)docker info- 查看系统信息(就像查看系统信息)docker ps- 查看运行中的容器(就像查看运行的程序)docker images- 查看本地镜像(就像查看已安装的软件)
镜像操作类:
docker pull- 下载镜像(就像下载软件)docker rmi- 删除镜像(就像卸载软件)
容器操作类:
docker run- 运行容器(就像启动程序)-d后台运行-it交互式运行-p端口映射-v数据卷挂载--name给容器起名
docker stop- 停止容器(就像关闭程序)docker start- 启动已停止的容器(就像重新启动程序)docker rm- 删除容器(就像卸载程序)docker logs- 查看日志(就像查看程序日志)docker exec- 进入容器(就像 SSH 到服务器)
常用命令组合
完整的容器生命周期:
# 1. 下载镜像
docker pull nginx:latest
# 2. 运行容器
docker run -d --name my-nginx -p 8080:80 nginx:latest
# 3. 查看状态
docker ps
# 4. 查看日志
docker logs my-nginx
# 5. 停止容器
docker stop my-nginx
# 6. 删除容器
docker rm my-nginx重要参数记忆
- -d:后台运行(detached)- 记住:d = daemon(守护进程)
- -it:交互式终端(interactive + TTY)- 记住:i = interactive,t = TTY
- -p:端口映射(port)- 记住:p = port
- -v:数据卷挂载(volume)- 记住:v = volume
- —name:容器名称 - 记住:给容器起个名字
- —rm:自动删除 - 记住:用完就删
常见操作流程
-
运行一个 Web 服务:
docker run -d --name web -p 8080:80 nginx:latest -
运行一个数据库:
docker run -d --name db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 -
运行一个交互式容器:
docker run -it --name ubuntu ubuntu:20.04 /bin/bash -
查看和管理容器:
docker ps # 查看运行中的 docker ps -a # 查看所有的 docker logs <name> # 查看日志 docker stop <name> # 停止 docker rm <name> # 删除
记住这些要点
- 镜像 = 模板(不能运行,只能用来创建容器)
- 容器 = 实例(可以运行,可以修改)
- docker run = 创建并运行容器
- docker ps = 查看运行中的容器
- docker stop = 停止容器
- docker rm = 删除容器
- -d = 后台运行(重要!)
- -p = 端口映射(重要!)
📚 相关链接
- 02-核心概念.md - 理解镜像、容器、仓库的概念
- 01-容器基础操作.md - 学习更多容器管理操作
- 03-镜像基础操作.md - 学习更多镜像管理操作
- 04-容器运行模式.md - 学习容器的不同运行模式