Docker 基本命令

Docker 常用命令详解和使用示例,适合零基础学习


1. 一句话概括主题

Docker 基本命令就是用来管理镜像和容器的工具,就像用命令行管理文件和程序一样简单。


2. 它是什么(口语化解释)

Docker 命令就像是你和 Docker 对话的语言。通过这些命令,你可以:

  • 下载镜像(就像下载软件安装包)
  • 运行容器(就像启动程序)
  • 查看状态(就像查看运行的程序)
  • 停止删除(就像关闭和卸载程序)

简单来说:Docker 命令就是控制 Docker 的遥控器,让你能够管理所有的镜像和容器。


3. 能解决什么问题 + 为什么重要

解决的问题

  1. 快速操作容器和镜像

    • 不需要图形界面,一条命令就能完成操作
    • 可以写脚本自动化操作
  2. 统一的管理方式

    • 所有 Docker 操作都通过命令完成
    • 命令格式统一,容易学习和记忆
  3. 批量操作

    • 可以批量启动、停止、删除容器
    • 提高工作效率

为什么重要

  • 基础技能:掌握 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 web3

6. 常见错误与踩坑

错误 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 docker

7. 实际应用场景

场景 1:快速启动开发环境

场景:需要快速启动一个 MySQL 数据库用于开发

传统方式

  1. 下载 MySQL 安装包
  2. 安装 MySQL
  3. 配置 MySQL
  4. 启动 MySQL
  5. 创建数据库和用户

使用 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 cache

8. 给新手的练习题(可立即实践)

练习 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:自动删除 - 记住:用完就删

常见操作流程

  1. 运行一个 Web 服务

    docker run -d --name web -p 8080:80 nginx:latest
  2. 运行一个数据库

    docker run -d --name db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
  3. 运行一个交互式容器

    docker run -it --name ubuntu ubuntu:20.04 /bin/bash
  4. 查看和管理容器

    docker ps          # 查看运行中的
    docker ps -a       # 查看所有的
    docker logs <name> # 查看日志
    docker stop <name> # 停止
    docker rm <name>   # 删除

记住这些要点

  • 镜像 = 模板(不能运行,只能用来创建容器)
  • 容器 = 实例(可以运行,可以修改)
  • docker run = 创建并运行容器
  • docker ps = 查看运行中的容器
  • docker stop = 停止容器
  • docker rm = 删除容器
  • -d = 后台运行(重要!)
  • -p = 端口映射(重要!)

📚 相关链接


📚 参考资源


相关笔记