一、Docker 核心概念

在开始动手之前,先理清两个最基本的概念:

概念说明类比
镜像(Image)只读的模板,包含了运行应用程序所需的所有文件和配置类似于虚拟机的快照 / 安装光盘
容器(Container)镜像的运行实例,是一个轻量级的、可执行的独立环境类似于虚拟机中运行的操作系统实例

简单理解:镜像 = 类(Class),容器 = 对象(Object)。镜像是静态的,容器是动态的、可读写的。


二、镜像核心指令

2.1 镜像管理常用指令

指令说明示例
docker pull从镜像仓库拉取镜像docker pull nginx:latest
docker images查看本地已有镜像列表docker images -a
docker rmi删除指定镜像docker rmi nginx:latest
docker tag给镜像打标签docker tag nginx myrepo/nginx:v1
docker push将镜像推送到远程仓库docker push myrepo/nginx:v1
docker save将镜像导出为压缩包docker save -o nginx.tar nginx
docker load从压缩包导入镜像docker load -i nginx.tar
docker inspect查看镜像详细信息docker inspect nginx

2.2 镜像操作实战

# 1. 拉取一个 Nginx 镜像
docker pull nginx:alpine

# 2. 查看本地镜像
docker images

# 输出示例:
# REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
# nginx        alpine    xxxxxxxx       2 weeks ago    23MB

# 3. 给镜像打一个新标签
docker tag nginx:alpine myweb:latest

# 4. 查看镜像详细信息(查看层级、环境变量等)
docker inspect myweb:latest | grep -i "env"

# 5. 导出镜像(用于备份或迁移)
docker save -o myweb-backup.tar myweb:latest

# 6. 删除镜像
docker rmi myweb:latest

# 7. 从备份文件加载镜像
docker load -i myweb-backup.tar

三、容器核心指令

3.1 容器生命周期管理

指令说明示例
docker run创建并启动容器docker run -d --name web nginx
docker start启动已停止的容器docker start web
docker stop优雅停止容器docker stop web
docker restart重启容器docker restart web
docker pause暂停容器中的进程docker pause web
docker unpause恢复暂停的容器docker unpause web
docker rm删除容器docker rm -f web
docker kill强制终止容器docker kill web

3.2 容器查看与调试

指令说明示例
docker ps查看运行中的容器docker ps -a(查看所有)
docker logs查看容器日志docker logs -f web
docker exec进入容器执行命令docker exec -it web /bin/bash
docker cp在宿主机和容器间复制文件docker cp /tmp/a.txt web:/app/
docker stats查看容器资源占用docker stats web
docker top查看容器内进程docker top web

3.3 容器操作实战

# 1. 创建并运行一个 Nginx 容器(前台运行)
docker run --name web nginx

# 2. 后台运行(-d 表示 detach 模式)
docker run -d --name web nginx

# 3. 查看运行中的容器
docker ps

# 4. 查看所有容器(包括已停止的)
docker ps -a

# 5. 查看容器日志(实时跟踪)
docker logs -f web

# 6. 进入容器内部(交互式 Shell)
docker exec -it web /bin/sh

# 7. 停止并删除容器
docker stop web
docker rm web

# 8. 强制删除运行中的容器(一步到位)
docker rm -f web

# 9. 查看容器资源占用
docker stats --no-stream

四、端口映射(Port Mapping)

4.1 为什么需要端口映射?

容器拥有自己的网络命名空间,内部服务监听的端口(如 Nginx 的 80 端口)默认只对容器内部可见。要让外部用户访问容器内的服务,需要将宿主机端口映射到容器端口

4.2 端口映射语法

docker run -p <宿主机IP>:<宿主机端口>:<容器端口> <镜像>

4.3 常见映射方式

映射方式示例说明
动态映射(随机端口)docker run -P nginx宿主机随机端口映射到容器暴露的端口
指定端口映射docker run -p 8080:80 nginx宿主机 8080 → 容器 80
指定 IP + 端口docker run -p 192.168.1.100:8080:80 nginx仅绑定到指定 IP
多端口映射docker run -p 8080:80 -p 8443:443 nginx同时映射 HTTP 和 HTTPS
UDP 端口映射docker run -p 53:53/udp dns显式指定 UDP 协议

4.4 端口映射实战

# 1. 启动一个 Nginx,将宿主机 8080 映射到容器 80
docker run -d --name nginx-web -p 8080:80 nginx

# 2. 访问测试
curl http://localhost:8080

# 3. 启动一个 Tomcat,映射多个端口
docker run -d --name tomcat-app -p 8081:8080 -p 8009:8009 tomcat

# 4. 映射到指定 IP(多网卡场景)
docker run -d --name nginx-ip -p 10.0.0.100:8888:80 nginx

# 5. 查看端口映射关系
docker port nginx-web

# 输出示例:
# 80/tcp -> 0.0.0.0:8080

4.5 端口映射常见问题

⚠️ 端口冲突:宿主机端口被占用时,Docker 会报错 bind: address already in use,更换端口即可。

⚠️ 容器重启后 IP 变化:容器重启后内网 IP 可能变化,但端口映射规则不变,建议通过容器名或固定 IP 访问。


五、数据卷(Volume)

5.1 为什么需要数据卷?

容器默认是无状态的,容器删除后所有数据会丢失。数据卷(Volume)用于实现数据的持久化存储和容器间数据共享。

5.2 数据卷的三种类型

类型说明适用场景
绑定挂载(Bind Mount)将宿主机目录挂载到容器内开发调试、配置文件挂载
卷(Volume)Docker 管理的存储卷,存放在 /var/lib/docker/volumes/生产环境持久化数据
临时挂载(Tmpfs)挂载在内存中,重启即失敏感信息、临时缓存

5.3 常用数据卷指令

指令说明示例
docker volume create创建卷docker volume create data
docker volume ls查看所有卷docker volume ls
docker volume inspect查看卷详情docker volume inspect data
docker volume rm删除卷docker volume rm data
docker volume prune删除未使用的卷docker volume prune

5.4 数据卷实战

5.4.1 绑定挂载(Bind Mount)
# 1. 准备宿主机目录
mkdir -p /app/webroot

# 2. 创建 index.html
echo "<h1>Hello Docker Volume</h1>" > /app/webroot/index.html

# 3. 挂载宿主机目录到容器的 /usr/share/nginx/html
docker run -d --name web-volume \
  -p 8080:80 \
  -v /app/webroot:/usr/share/nginx/html \
  nginx

# 4. 访问测试(能看到自定义的页面)
curl http://localhost:8080

# 5. 在宿主机修改文件,容器内实时生效
echo "<h1>Updated</h1>" > /app/webroot/index.html
5.4.2 命名卷(Volume)
# 1. 创建卷
docker volume create mysql-data

# 2. 查看卷列表
docker volume ls

# 3. 查看卷详情(确认挂载点)
docker volume inspect mysql-data

# 4. 使用卷启动 MySQL
docker run -d --name mysql-db \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  mysql:5.7

# 5. 容器删除后,卷仍然存在(数据不丢失)
docker rm -f mysql-db

# 6. 重新创建容器,挂载同一个卷,数据恢复
docker run -d --name mysql-db-new \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  mysql:5.7
5.4.3 多容器共享数据卷
# 1. 创建一个共享卷
docker volume create shared-logs

# 2. 容器 A 写入日志
docker run -d --name app-writer \
  -v shared-logs:/logs \
  alpine sh -c "while true; do echo `date` >> /logs/app.log; sleep 2; done"

# 3. 容器 B 读取日志(共享同一卷)
docker run -d --name app-reader \
  -v shared-logs:/logs \
  alpine tail -f /logs/app.log

# 4. 查看 reader 容器日志,可以看到共享数据
docker logs app-reader

5.5 数据卷管理最佳实践

场景推荐方案
开发环境配置文件修改使用绑定挂载(-v ./conf:/app/conf
数据库数据持久化使用命名卷(docker volume create
日志文件持久化使用命名卷或绑定挂载
容器间数据共享多个容器挂载同一个卷
临时缓存/敏感信息使用 --tmpfs

六、综合实战:部署一个完整 Web 应用

结合以上所学,部署一个 Nginx + PHP + MySQL 的完整应用:

# 1. 创建持久化卷
docker volume create mysql-data
docker volume create web-root

# 2. 启动 MySQL
docker run -d --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=app \
  -v mysql-data:/var/lib/mysql \
  mysql:5.7

# 3. 启动 PHP-FPM
docker run -d --name php-fpm \
  -v web-root:/var/www/html \
  php:7.4-fpm

# 4. 启动 Nginx(端口映射 + 共享 web 目录)
docker run -d --name nginx \
  -p 80:80 \
  -v web-root:/var/www/html \
  -v /app/nginx-conf:/etc/nginx/conf.d \
  nginx

# 5. 验证所有容器运行状态
docker ps

# 6. 查看端口映射
docker port nginx

七、常用指令速查表

分类指令快速记忆
镜像pullimagesrmitagpushsaveload下载、查看、删除、打标、推送、导出、导入
容器runstartstoprestartrmexeclogsps运行、启动、停止、重启、删除、进入、日志、查看
网络portnetwork createnetwork ls查看端口映射、创建网络、查看网络
数据卷volume createvolume lsvolume inspectvolume rm创建、查看、详情、删除

如果这篇文章对你有帮助,欢迎收藏、分享,也欢迎在评论区交流讨论!

更多推荐