|
|
🎯 你的第一个Docker容器:Hello World到实战
今天我们要完成一个激动人心的任务:运行你人生中的第一个 Docker 容器!从经典的 Hello World 开始,到运行一个真实的 Web 服务器,你将亲手体验 Docker 的魔力。
你将学会:
✅ 运行你的第一个 Docker 容器
✅ 掌握 10 个最常用的容器操作命令
✅ 理解容器的完整生命周期
✅ 部署一个真实的 Nginx Web 服务器
难度等级:⭐⭐☆☆☆(初学者友好)
所需时间:约 30 分钟
前置要求:
已安装 Docker(参考 Day 2)
Docker 服务正在运行
基本的命令行操作能力
准备好了吗?让我们开始这段激动人心的旅程!
━━━━━━━━━━━━━━━━━━━━
🛠️ 环境准备
在开始之前,请确保你的环境满足以下要求:
系统要求
| 项目 | 要求 | 检查方法 |
|------|------|----------|
| 操作系统 | macOS 10.15+ / Windows 10+ / Linux | - |
| Docker版本 | 20.10+ ||
| 内存 | 至少 4GB | - |
| 磁盘空间 | 至少 5GB 可用空间 | - |
检查命令
- # 检查Docker是否安装
- docker --version
- # 预期输出:Docker version 24.0.x, build xxxxx
- # 检查Docker是否运行
- docker ps
- # 预期输出:显示容器列表(即使为空也没关系)
- # 检查Docker信息
- docker info
- # 预期输出:显示Docker系统信息
复制代码
如果以上命令报错,请先阅读 [Day 2 - Docker安装指南]。
准备工作目录
- # 创建工作目录
- mkdir -p ~/docker-practice/day03
- cd ~/docker-practice/day03
- # 创建一个简单的HTML文件(后续会用到)
- echo '<h1>Hello from Docker!</h1>' > index.html
复制代码
✅ 环境准备完成,开始正式操作!
━━━━━━━━━━━━━━━━━━━━
📖 操作步骤
步骤1:运行你的第一个容器 - Hello World
目标:体验 Docker 的"拉取-运行"流程,理解镜像和容器的关系
操作命令:- # 运行 Hello World 容器
- docker run hello-world
复制代码
命令解析:
:Docker 的核心命令,用于创建并启动容器
:镜像名称,Docker 官方提供的最小测试镜像
预期输出:- Unable to find image 'hello-world:latest' locally
- latest: Pulling from library/hello-world
- c1ec31eb5944: Pull complete
- Digest: sha256:4bd78111b6914a99dbc560e6a20eab57ff6655aea4a80c50b0c5491968cbc2e6
- Status: Downloaded newer image for hello-world:latest
- Hello from Docker!
- This message shows that your installation appears to be working correctly.
- To generate this message, Docker took the following steps:
- 1. The Docker client contacted the Docker daemon.
- 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
- 3. The Docker daemon created a new container from that image which runs the
- executable that produces the output you are currently reading.
- 4. The Docker daemon streamed that output to the Docker client, which sent it
- to your terminal.
复制代码
发生了什么?
让我用一个生活化的比喻解释:
你(Docker Client) 向 Docker 服务员(Docker Daemon) 点了一道菜(容器)
服务员 发现厨房(本地)没有这道菜的食谱(镜像),于是从 中央厨房(Docker Hub) 下载了食谱
服务员 按照食谱做好了菜(创建容器),并端给你(输出结果)
你吃完了(容器执行完毕),盘子被收走(容器停止)
验证结果:- # 查看刚才下载的镜像
- docker images | grep hello-world
复制代码
✅ 检查点:如果看到 "Hello from Docker!" 消息,恭喜你成功运行了第一个容器!
━━━━━━━━━━━━━━━━━━━━
步骤2:运行一个交互式容器
目标:学会进入容器内部,体验容器的隔离性
操作命令:- # 运行一个 Ubuntu 容器并进入交互模式
- docker run -it ubuntu:22.04 bash
复制代码
命令解析:
(interactive):保持标准输入打开,让你可以输入命令
(tty):分配一个伪终端,让输出更友好
:使用 Ubuntu 22.04 版本的镜像
:容器启动后执行的命令(启动 bash shell)
预期输出:- Unable to find image 'ubuntu:22.04' locally
- 22.04: Pulling from library/ubuntu
- a48641193673: Pull complete
- Digest: sha256:xxxxxxxxxxxx
- Status: Downloaded newer image for ubuntu:22.04
- root@a1b2c3d4e5f6:/#
复制代码
现在你已经"进入"了一个全新的 Ubuntu 系统!尝试一些命令:
- # 查看系统信息
- cat /etc/os-release
- # 查看当前目录
- pwd
- # 查看进程
- ps aux
- # 创建一个文件
- echo "I'm inside a container!" > /tmp/test.txt
- cat /tmp/test.txt
- # 退出容器(容器会停止)
- exit
复制代码
关键参数说明:
:没有它,你无法输入命令
:没有它,输出会很难看且无法正常显示提示符
两者通常搭配使用,简写为
常见错误 ⚠️
❌ 错误1:忘记加参数- docker run ubuntu:22.04 bash
- # 容器会立即启动并退出,你看不到任何输出
复制代码 原因:没有交互式终端,bash 启动后发现没有输入源,立即退出
解决:添加参数
❌ 错误2:镜像拉取失败- Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
复制代码 原因:网络问题或需要配置镜像加速
解决:配置 Docker 镜像加速器(参考 Day 2)
✅ 检查点:成功进入容器并执行命令,输入退出
━━━━━━━━━━━━━━━━━━━━
步骤3:运行一个后台容器 - Nginx Web服务器
目标:部署一个真实的 Web 服务,理解后台运行和端口映射
操作命令:- # 运行 Nginx 容器
- docker run -d -p 8080:80 --name my-nginx nginx:alpine
复制代码
命令解析:
(detach):后台运行,不占用当前终端
:端口映射,将容器的 80 端口映射到主机的 8080 端口
格式::给容器起个名字,方便后续操作
:使用 Nginx 的 Alpine 版本(体积更小,仅 40MB)
预期输出:- Unable to find image 'nginx:alpine' locally
- alpine: Pulling from library/nginx
- a66142f8d37f: Pull complete
- e477d6e2f545: Pull complete
- f66dba8fcdf1: Pull complete
- ...
- Digest: sha256:xxxxxxxxxxxx
- Status: Downloaded newer image for nginx:alpine
- a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6
复制代码
最后那串长字符串是容器 ID(完整版),容器已经在后台运行了!
验证结果:- # 查看运行中的容器
- docker ps
- # 预期输出类似:
- # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- # a1b2c3d4e5f6 nginx:alpine "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp my-nginx
复制代码
测试访问:
方法1:使用 curl 命令- curl http://localhost:8080
- # 预期输出:
- # <!DOCTYPE html>
- # <html>
- # <head>
- # <title>Welcome to nginx!</title>
- # ...
复制代码
方法2:浏览器访问
打开浏览器
访问应该看到 "Welcome to nginx!" 页面
🎉 恭喜! 你已经成功部署了一个真实的 Web 服务器!
关键概念理解:
- 你的电脑(主机) Docker 容器(隔离环境)
- ┌────────────────┐ ┌──────────────────┐
- │ │ │ │
- │ 浏览器 │ 访问8080 │ Nginx:80 │
- │ localhost:8080├────────────→│ 监听80端口 │
- │ │ 端口映射 │ │
- └────────────────┘ └──────────────────┘
复制代码
✅ 检查点:访问 http://localhost:8080 能看到 Nginx 欢迎页面
━━━━━━━━━━━━━━━━━━━━
步骤4:容器生命周期管理
目标:掌握容器的启动、停止、重启等核心操作
现在我们有一个正在运行的 Nginx 容器,让我们学习如何管理它:
4.1 查看容器状态
- # 查看运行中的容器
- docker ps
- # 查看所有容器(包括已停止的)
- docker ps -a
- # 查看容器详细信息
- docker inspect my-nginx
- # 查看容器资源占用
- docker stats my-nginx
- # 按 Ctrl+C 退出
复制代码
4.2 查看容器日志
- # 查看容器日志
- docker logs my-nginx
- # 实时查看日志(类似 tail -f)
- docker logs -f my-nginx
- # 按 Ctrl+C 退出
- # 查看最近 20 行日志
- docker logs --tail 20 my-nginx
- # 查看带时间戳的日志
- docker logs -t my-nginx
复制代码
4.3 停止和启动容器
- # 停止容器(优雅停止,给容器 10 秒清理时间)
- docker stop my-nginx
- # 验证容器已停止
- docker ps
- # 应该看不到 my-nginx 了
- docker ps -a
- # 能看到 my-nginx,状态为 Exited
- # 再次访问网站
- curl http://localhost:8080
- # 会失败,因为容器已停止
- # 启动已停止的容器
- docker start my-nginx
- # 验证容器已启动
- docker ps
- # 再次访问网站
- curl http://localhost:8080
- # 又能访问了!
- # 重启容器
- docker restart my-nginx
复制代码
4.4 进入运行中的容器
- # 方法1:使用 exec 执行命令(推荐)
- docker exec -it my-nginx sh
- # Alpine 系统使用 sh,其他系统通常用 bash
- # 在容器内部执行命令
- ls /usr/share/nginx/html/
- cat /usr/share/nginx/html/index.html
- exit
- # 方法2:不进入容器,直接执行命令
- docker exec my-nginx ls /usr/share/nginx/html/
- docker exec my-nginx cat /etc/nginx/nginx.conf
复制代码
4.5 删除容器
- # 必须先停止容器
- docker stop my-nginx
- # 删除容器
- docker rm my-nginx
- # 验证容器已删除
- docker ps -a | grep my-nginx
- # 应该没有输出
- # 强制删除运行中的容器(不推荐)
- docker run -d -p 8080:80 --name my-nginx nginx:alpine
- docker rm -f my-nginx
- # -f 会发送 SIGKILL 信号,立即杀死进程
复制代码
容器生命周期图示:
- 创建 → 运行 → 暂停 → 继续运行 → 停止 → 删除
- ↓ ↓ ↓ ↓ ↓ ↓
- docker docker docker docker docker docker
- run start pause unpause stop rm
- │
- └──→ docker restart ──→
复制代码
✅ 检查点:能够熟练地启动、停止、重启、删除容器
━━━━━━━━━━━━━━━━━━━━
步骤5:自定义 Nginx 内容
目标:学习数据卷挂载,让容器使用本地文件
创建自定义 HTML 文件:- # 确保在工作目录
- cd ~/docker-practice/day03
- # 创建一个更酷的页面
- cat > index.html << 'EOF'
- <!DOCTYPE html>
- <html>
- <head>
- <title>我的第一个Docker容器</title>
- <style>
- body {
- font-family: Arial, sans-serif;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
- display: flex;
- justify-content: center;
- align-items: center;
- height: 100vh;
- margin: 0;
- }
- .container {
- text-align: center;
- padding: 50px;
- background: rgba(255, 255, 255, 0.1);
- border-radius: 20px;
- backdrop-filter: blur(10px);
- }
- h1 { font-size: 3em; margin: 0; }
- p { font-size: 1.5em; }
- .emoji { font-size: 5em; }
- </style>
- </head>
- <body>
- <div class="container">
- <div class="emoji">🐳</div>
- <h1>Hello Docker!</h1>
- <p>这是我的第一个 Docker 容器</p>
- <p>Day 3 - 2024</p>
- </div>
- </body>
- </html>
- EOF
复制代码
运行带数据卷的容器:- # 删除之前的容器(如果还在运行)
- docker rm -f my-nginx
- # 运行新容器,挂载本地目录
- docker run -d \
- -p 8080:80 \
- --name my-nginx \
- -v $(pwd)/index.html:/usr/share/nginx/html/index.html \
- nginx:alpine
复制代码
命令解析:
- -v $(pwd)/index.html:/usr/share/nginx/html/index.html
复制代码 :数据卷挂载
:本地文件的绝对路径
:分隔符
- /usr/share/nginx/html/index.html
复制代码 :容器内的路径
Windows 用户使用:- -v ${PWD}/index.html:/usr/share/nginx/html/index.html
复制代码
测试效果:- # 访问网站
- curl http://localhost:8080
- # 或在浏览器打开 http://localhost:8080
复制代码
你应该看到自定义的漂亮页面!
实时修改测试:- # 修改本地文件
- echo '<h1>修改成功!</h1>' > index.html
- # 立即刷新浏览器,内容已经改变
- # 不需要重启容器!
复制代码
✅ 检查点:访问 http://localhost:8080 看到自定义页面,修改文件后刷新页面能看到变化
━━━━━━━━━━━━━━━━━━━━
💻 完整代码
为了方便你快速上手,这里提供完整的操作脚本。
目录结构
- day03/
- ├── index.html # 自定义网页
- ├── run.sh # 一键运行脚本
- └── cleanup.sh # 清理脚本
复制代码
一键运行脚本
创建:- #!/bin/bash
- # run.sh - Docker Day 3 一键运行脚本
- echo "🐳 Docker Day 3 - 你的第一个容器"
- echo "================================"
- # 1. 检查 Docker 是否运行
- echo "📌 检查 Docker..."
- if ! docker info > /dev/null 2>&1; then
- echo "❌ Docker 未运行,请先启动 Docker"
- exit 1
- fi
- echo "✅ Docker 运行正常"
- # 2. 运行 Hello World
- echo ""
- echo "📌 运行 Hello World..."
- docker run hello-world
- # 3. 创建自定义 HTML
- echo ""
- echo "📌 创建自定义网页..."
- cat > index.html << 'EOF'
- <!DOCTYPE html>
- <html>
- <head>
- <title>我的第一个Docker容器</title>
- <style>
- body {
- font-family: Arial, sans-serif;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
- display: flex;
- justify-content: center;
- align-items: center;
- height: 100vh;
- margin: 0;
- }
- .container {
- text-align: center;
- padding: 50px;
- background: rgba(255, 255, 255, 0.1);
- border-radius: 20px;
- backdrop-filter: blur(10px);
- }
- h1 { font-size: 3em; margin: 0; }
- p { font-size: 1.5em; }
- .emoji { font-size: 5em; }
- </style>
- </head>
- <body>
- <div class="container">
- <div class="emoji">🐳</div>
- <h1>Hello Docker!</h1>
- <p>这是我的第一个 Docker 容器</p>
- <p>Day 3 - $(date +%Y-%m-%d)</p>
- </div>
- </body>
- </html>
- EOF
- echo "✅ 网页创建完成"
- # 4. 清理旧容器
- echo ""
- echo "📌 清理旧容器..."
- docker rm -f my-nginx 2>/dev/null
- echo "✅ 清理完成"
- # 5. 启动 Nginx 容器
- echo ""
- echo "📌 启动 Nginx 容器..."
- docker run -d \
- -p 8080:80 \
- --name my-nginx \
- -v $(pwd)/index.html:/usr/share/nginx/html/index.html \
- nginx:alpine
- # 6. 等待容器启动
- echo "⏳ 等待容器启动..."
- sleep 2
- # 7. 验证
- echo ""
- echo "📌 验证容器状态..."
- docker ps | grep my-nginx
- echo ""
- echo "🎉 成功!"
- echo "================================"
- echo "📱 访问 http://localhost:8080"
- echo "📋 查看容器:docker ps"
- echo "📜 查看日志:docker logs my-nginx"
- echo "🛑 停止容器:docker stop my-nginx"
- echo "🗑️ 删除容器:docker rm my-nginx"
- echo ""
复制代码
清理脚本
创建:- #!/bin/bash
- # cleanup.sh - 清理脚本
- echo "🧹 清理 Docker Day 3 环境..."
- # 停止并删除容器
- docker rm -f my-nginx 2>/dev/null
- # 删除镜像(可选,注释掉如果想保留)
- # docker rmi hello-world ubuntu:22.04 nginx:alpine
- echo "✅ 清理完成"
复制代码
使用方法
- # 赋予执行权限
- chmod +x run.sh cleanup.sh
- # 运行脚本
- ./run.sh
- # 清理环境
- ./cleanup.sh
复制代码
📦 代码仓库:https://github.com/your-repo/docker-30-days/tree/main/day03
━━━━━━━━━━━━━━━━━━━━
🚀 进阶实践
掌握了基础操作后,试试这些进阶玩法:
实践1:运行一个 MySQL 数据库
目标:实现一个持久化的 MySQL 数据库容器
提示:
使用镜像
需要设置环境变量考虑数据持久化问题(数据卷)
MySQL 默认端口是 3306
参考命令:- # 提示性命令框架
- docker run -d \
- --name my-mysql \
- -e MYSQL_ROOT_PASSWORD=你的密码 \
- -p 3306:3306 \
- -v mysql-data:/var/lib/mysql \
- mysql:8.0
- # 如何连接?
- docker exec -it my-mysql mysql -u root -p
复制代码
━━━━━━━━━━━━━━━━━━━━
实践2:部署一个 Redis 缓存服务
目标:运行 Redis 并测试基本操作
建议:
使用镜像
Redis 默认端口 6379
尝试使用客户端连接
检查清单:
[ ] 容器成功启动
[ ] 能够连接 Redis
[ ] 能够执行 SET/GET 命令
[ ] 数据持久化(可选)
测试命令:- # 进入 Redis 容器
- docker exec -it <容器名> redis-cli
- # 在 Redis 中测试
- SET mykey "Hello Docker"
- GET mykey
复制代码
━━━━━━━━━━━━━━━━━━━━
实践3:组合多个容器
挑战:同时运行 Nginx + MySQL + Redis
要求:
3个容器同时运行
使用不同的端口避免冲突
每个容器都能正常访问
使用有意义的容器命名
资源:
Docker Hub - 官方镜像
Docker 命令参考
💡 提示:完成这些实践后,在评论区分享你的成果截图和心得!
━━━━━━━━━━━━━━━━━━━━
🐛 故障排查
问题1:端口被占用
症状:- Error response from daemon: driver failed programming external connectivity on endpoint my-nginx:
- Bind for 0.0.0.0:8080 failed: port is already allocated
复制代码
原因:端口 8080 已被其他进程占用
解决方案:
方法1:更换端口- # 使用其他端口,如 8081
- docker run -d -p 8081:80 --name my-nginx nginx:alpine
复制代码
方法2:查找并关闭占用进程- # macOS/Linux
- lsof -i :8080
- kill -9 <PID>
- # Windows (PowerShell)
- netstat -ano | findstr :8080
- taskkill /PID <PID> /F
复制代码
方法3:停止冲突的容器- # 查看所有容器
- docker ps -a
- # 停止冲突的容器
- docker stop <冲突的容器名或ID>
复制代码
━━━━━━━━━━━━━━━━━━━━
问题2:容器启动后立即退出
症状:- docker ps
- # 看不到容器
- docker ps -a
- # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- # a1b2c3d4e5f6 ubuntu "bash" 1 min ago Exited (0) 1 minute ago my-ubuntu
复制代码
原因:容器内的主进程执行完毕就会退出
排查步骤:- # 1. 查看容器日志
- docker logs <容器名>
- # 2. 查看容器退出代码
- docker inspect <容器名> | grep ExitCode
复制代码
解决方案:
情况1:交互式容器忘记加- # 错误
- docker run ubuntu bash
- # 正确
- docker run -it ubuntu bash
复制代码
情况2:后台容器需要一个持续运行的进程- # 错误:sh 会立即退出
- docker run -d ubuntu sh
- # 正确:让 sh 保持运行
- docker run -d ubuntu sh -c "while true; do echo hello; sleep 10; done"
复制代码
━━━━━━━━━━━━━━━━━━━━
问题3:无法访问容器内的服务
症状:- curl http://localhost:8080
- # curl: (7) Failed to connect to localhost port 8080: Connection refused
复制代码
排查步骤:- # 1. 确认容器正在运行
- docker ps | grep my-nginx
- # 2. 确认端口映射正确
- docker port my-nginx
- # 输出应该包含:80/tcp -> 0.0.0.0:8080
- # 3. 查看容器日志
- docker logs my-nginx
- # 4. 在容器内部测试
- docker exec my-nginx curl http://localhost
复制代码
常见原因:
❌ 容器未运行
❌ 端口映射错误(如写反了)
❌ 容器内服务未启动
❌ 防火墙阻止访问
❌ 使用了错误的 IP(应该用 localhost 或 127.0.0.1)
解决方案:- # 重新运行容器,仔细检查参数
- docker rm -f my-nginx
- docker run -d -p 8080:80 --name my-nginx nginx:alpine
- # 等待几秒让服务启动
- sleep 3
- # 再次测试
- curl http://localhost:8080
复制代码
━━━━━━━━━━━━━━━━━━━━
问题4:数据卷挂载失败
症状:- docker: Error response from daemon: invalid mount config for type "bind":
- bind source path does not exist
复制代码
原因:本地路径不存在或路径错误
解决方案:- # 1. 确保文件存在
- ls -l index.html
- # 2. 使用绝对路径
- docker run -d \
- -p 8080:80 \
- -v /Users/yourname/docker-practice/day03/index.html:/usr/share/nginx/html/index.html \
- nginx:alpine
- # 3. 或使用 $(pwd) 获取当前路径
- docker run -d \
- -p 8080:80 \
- -v $(pwd)/index.html:/usr/share/nginx/html/index.html \
- nginx:alpine
- # Windows PowerShell 使用 ${PWD}
- docker run -d -p 8080:80 -v ${PWD}/index.html:/usr/share/nginx/html/index.html nginx:alpine
复制代码
━━━━━━━━━━━━━━━━━━━━
问题5:镜像拉取速度慢或失败
症状:- Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
复制代码
解决方案:
方法1:配置国内镜像加速器(推荐)- # 参考 Day 2 的镜像加速器配置
- # 常用加速器:
- # - 阿里云:https://xxxxx.mirror.aliyuncs.com
- # - 腾讯云:https://mirror.ccs.tencentyun.com
- # - 网易:http://hub-mirror.c.163.com
复制代码
方法2:使用代理- # 在 Docker Desktop 设置中配置 HTTP 代理
复制代码
方法3:手动下载镜像- # 从其他源拉取后重新打标签
- docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine
- docker tag registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine nginx:alpine
复制代码
━━━━━━━━━━━━━━━━━━━━
更多问题?
如果遇到其他问题:
📖 查看 Docker 官方文档
🔍 搜索 Docker GitHub Issues
💬 在评论区留言,我会及时回复
👥 加入学习群讨论(文末有二维码)
━━━━━━━━━━━━━━━━━━━━
📚 知识点回顾
今天我们通过实践学习了 Docker 容器的核心操作:
核心命令速查表
| 命令 | 作用 | 示例 |
|------|------|------|
|| 创建并启动容器 |- docker run -d -p 8080:80 nginx
复制代码 |
|| 查看运行中的容器 ||
|| 启动已停止的容器 ||
|| 停止运行中的容器 ||
|| 重启容器 ||
|| 删除容器 ||
|| 查看容器日志 ||
|| 在容器中执行命令 |- docker exec -it my-nginx sh
复制代码 |
|| 查看容器详细信息 ||
|| 查看端口映射 ||
关键概念
镜像(Image)vs 容器(Container)
镜像是静态的模板(类似于类)
容器是镜像的运行实例(类似于对象)
一个镜像可以创建多个容器
端口映射(Port Mapping)
格式:作用:让外部访问容器内的服务
示例:将容器的 80 端口映射到主机的 8080
数据卷(Volume)
作用:持久化数据,共享文件
绑定挂载:数据卷:
容器生命周期- 创建(Created) → 运行(Running) → 暂停(Paused) → 停止(Stopped) → 删除(Removed)
复制代码
最佳实践
✅ 使用给容器命名,便于管理
✅ 使用让服务容器后台运行
✅ 使用运行交互式容器
✅ 删除容器前先停止:→✅ 定期清理不用的容器:✅ 查看日志排查问题:✅ 使用轻量级镜像(alpine 版本)节省空间
常用参数组合
- # 1. 运行临时测试容器(退出后自动删除)
- docker run --rm -it ubuntu bash
- # 2. 运行后台服务并映射端口
- docker run -d -p 8080:80 --name web nginx
- # 3. 运行容器并挂载数据卷
- docker run -d -v /data:/app/data --name app myimage
- # 4. 运行容器并设置环境变量
- docker run -d -e DB_HOST=localhost -e DB_PORT=3306 --name app myimage
- # 5. 限制容器资源
- docker run -d --memory=512m --cpus=0.5 --name app myimage
复制代码
下一步学习
完成今天的实践后,建议:
✅ 多练习几遍巩固命令
✅ 完成所有进阶实践
✅ 尝试运行不同的官方镜像
✅ 学习下一篇:Day 4 - Docker 镜像深度解析
━━━━━━━━━━━━━━━━━━━━
💬 作业时间
今日挑战:
✅ 成功运行 Hello World 容器
✅ 部署 Nginx 并访问自定义页面
✅ 完成至少 2 个进阶实践
✅ 截图分享你的运行结果
思考题:
为什么容器停止后数据会丢失?如何解决?
一个镜像可以同时运行多个容器吗?
如果我想运行两个 Nginx,端口应该如何设置?
讨论话题:你在操作过程中遇到了什么有趣的问题?是如何解决的?
在评论区分享你的:
✅ 实践成果截图(Nginx 页面、docker ps 输出等)
💡 遇到的问题和解决方案
🎯 进阶实践的想法和成果
🤔 对思考题的答案
━━━━━━━━━━━━━━━━━━━━
📖 系列文章
上一篇:Day 2 - Docker 安装配置完全指南
下一篇:Day 4 - Docker 镜像深度解析:从原理到实践
本系列所有文章:Docker 30天实战系列目录
━━━━━━━━━━━━━━━━━━━━
🎁 学习资源
代码仓库 📦
本文所有示例代码和脚本:https://github.com/your-repo/docker-30-days/tree/main/day03
推荐阅读 📚
Docker 官方入门教程
Docker Hub 官方镜像库
Play with Docker 在线实验环境
加入学习群 👥
扫描下方二维码加入 Docker 学习交流群,和 1000+ 小伙伴一起学习讨论:
获取独家学习资料
参与每日打卡挑战
解决实战中的问题
结识技术大牛
关注公众号 🔔
关注「Docker实战」公众号,回复「Day3」获取:
✅ 本文完整 PDF 版本
✅ 常用命令速查卡片
✅ 容器管理思维导图
✅ 进阶实践参考答案
━━━━━━━━━━━━━━━━━━━━
下期预告 🎬
明天我们将深入探索 Docker 镜像的奥秘:
🔍 镜像的分层存储原理
🏗️ 如何制作自己的镜像
📦 Dockerfile 最佳实践
🚀 镜像优化技巧
记得按时来打卡哦!💪
━━━━━━━━━━━━━━━━━━━━
喜欢这篇文章吗? ❤️
点个「在看」让更多人看到
转发给正在学习 Docker 的朋友
留言说说你的学习心得
我们明天见!🐳
 |
|