Docker 入门:核心指令、端口映射与数据卷详解
·
一、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
七、常用指令速查表
| 分类 | 指令 | 快速记忆 |
|---|---|---|
| 镜像 | pull、images、rmi、tag、push、save、load | 下载、查看、删除、打标、推送、导出、导入 |
| 容器 | run、start、stop、restart、rm、exec、logs、ps | 运行、启动、停止、重启、删除、进入、日志、查看 |
| 网络 | port、network create、network ls | 查看端口映射、创建网络、查看网络 |
| 数据卷 | volume create、volume ls、volume inspect、volume rm | 创建、查看、详情、删除 |
如果这篇文章对你有帮助,欢迎收藏、分享,也欢迎在评论区交流讨论!
更多推荐
所有评论(0)