人生理想,技术交流加Q:411239339

Day 03 你的第一个Docker容器:Hello World到实战

浏览:7次阅读
没有评论

共计 12944 个字符,预计需要花费 33 分钟才能阅读完成。

🎯 你的第一个 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+ docker --version
内存 至少 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 run:Docker 的核心命令,用于创建并启动容器
  • hello-world:镜像名称,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.

发生了什么?

让我用一个生活化的比喻解释:

  1. 你(Docker Client)Docker 服务员(Docker Daemon) 点了一道菜(容器)
  2. 服务员 发现厨房(本地)没有这道菜的食谱(镜像),于是从 中央厨房(Docker Hub) 下载了食谱
  3. 服务员 按照食谱做好了菜(创建容器),并端给你(输出结果)
  4. 你吃完了(容器执行完毕),盘子被收走(容器停止)

验证结果

# 查看刚才下载的镜像
docker images | grep hello-world

检查点:如果看到 "Hello from Docker!" 消息,恭喜你成功运行了第一个容器!


步骤 2:运行一个交互式容器

目标:学会进入容器内部,体验容器的隔离性

操作命令

# 运行一个 Ubuntu 容器并进入交互模式
docker run -it ubuntu:22.04 bash

命令解析

  • -i(interactive):保持标准输入打开,让你可以输入命令
  • -t(tty):分配一个伪终端,让输出更友好
  • ubuntu:22.04:使用 Ubuntu 22.04 版本的镜像
  • bash:容器启动后执行的命令(启动 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

关键参数说明

  • -i:没有它,你无法输入命令
  • -t:没有它,输出会很难看且无法正常显示提示符
  • 两者通常搭配使用,简写为 -it

常见错误 ⚠️

错误 1 :忘记加 -it 参数

docker run ubuntu:22.04 bash
# 容器会立即启动并退出,你看不到任何输出

原因:没有交互式终端,bash 启动后发现没有输入源,立即退出
解决:添加 -it 参数

错误 2 :镜像拉取失败

Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled

原因:网络问题或需要配置镜像加速
解决:配置 Docker 镜像加速器(参考 Day 2)

检查点:成功进入容器并执行命令,输入 exit 退出


步骤 3:运行一个后台容器 – Nginx Web 服务器

目标:部署一个真实的 Web 服务,理解后台运行和端口映射

操作命令

# 运行 Nginx 容器
docker run -d -p 8080:80 --name my-nginx nginx:alpine

命令解析

  • -d(detach):后台运行,不占用当前终端
  • -p 8080:80:端口映射,将容器的 80 端口映射到主机的 8080 端口
    • 格式:主机端口: 容器端口
  • --name my-nginx:给容器起个名字,方便后续操作
  • nginx:alpine:使用 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:浏览器访问

  • 打开浏览器
  • 访问 http://localhost:8080
  • 应该看到 "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:数据卷挂载
    • $(pwd)/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          # 清理脚本

一键运行脚本

创建 run.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 ""

清理脚本

创建 cleanup.sh

#!/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:8.0 镜像
  • 需要设置环境变量 MYSQL_ROOT_PASSWORD
  • 考虑数据持久化问题(数据卷)
  • 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:alpine 镜像
  • Redis 默认端口 6379
  • 尝试使用 redis-cli 客户端连接

检查清单

  • 容器成功启动
  • 能够连接 Redis
  • 能够执行 SET/GET 命令
  • 数据持久化(可选)

测试命令

# 进入 Redis 容器
docker exec -it < 容器名 > redis-cli

# 在 Redis 中测试
SET mykey "Hello Docker"
GET mykey

实践 3:组合多个容器

挑战:同时运行 Nginx + MySQL + Redis

要求

  • 3 个容器同时运行
  • 使用不同的端口避免冲突
  • 每个容器都能正常访问
  • 使用有意义的容器命名

资源

💡 提示:完成这些实践后,在评论区分享你的成果截图和心得!


🐛 故障排查

问题 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 :交互式容器忘记加 -it

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

常见原因

  • ❌ 容器未运行
  • ❌ 端口映射错误(如 -p 80:8080 写反了)
  • ❌ 容器内服务未启动
  • ❌ 防火墙阻止访问
  • ❌ 使用了错误的 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

更多问题?

如果遇到其他问题:

  1. 📖 查看 Docker 官方文档
  2. 🔍 搜索 Docker GitHub Issues
  3. 💬 在评论区留言,我会及时回复
  4. 👥 加入学习群讨论(文末有二维码)

📚 知识点回顾

今天我们通过实践学习了 Docker 容器的核心操作:

核心命令速查表

命令 作用 示例
docker run 创建并启动容器 docker run -d -p 8080:80 nginx
docker ps 查看运行中的容器 docker ps -a
docker start 启动已停止的容器 docker start my-nginx
docker stop 停止运行中的容器 docker stop my-nginx
docker restart 重启容器 docker restart my-nginx
docker rm 删除容器 docker rm -f my-nginx
docker logs 查看容器日志 docker logs -f my-nginx
docker exec 在容器中执行命令 docker exec -it my-nginx sh
docker inspect 查看容器详细信息 docker inspect my-nginx
docker port 查看端口映射 docker port my-nginx

关键概念

  1. 镜像(Image)vs 容器(Container)

    • 镜像是静态的模板(类似于类)
    • 容器是镜像的运行实例(类似于对象)
    • 一个镜像可以创建多个容器
  2. 端口映射(Port Mapping)

    • 格式:-p 主机端口: 容器端口
    • 作用:让外部访问容器内的服务
    • 示例:-p 8080:80 将容器的 80 端口映射到主机的 8080
  3. 数据卷(Volume)

    • 作用:持久化数据,共享文件
    • 绑定挂载:-v 本地路径: 容器路径
    • 数据卷:-v 卷名: 容器路径
  4. 容器生命周期

    创建(Created) → 运行(Running) → 暂停(Paused) → 停止(Stopped) → 删除(Removed)
    

最佳实践

  • ✅ 使用 --name 给容器命名,便于管理
  • ✅ 使用 -d 让服务容器后台运行
  • ✅ 使用 -it 运行交互式容器
  • ✅ 删除容器前先停止:docker stopdocker rm
  • ✅ 定期清理不用的容器:docker container prune
  • ✅ 查看日志排查问题:docker logs
  • ✅ 使用轻量级镜像(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

下一步学习

完成今天的实践后,建议:

  1. ✅ 多练习几遍巩固命令
  2. ✅ 完成所有进阶实践
  3. ✅ 尝试运行不同的官方镜像
  4. ✅ 学习下一篇:Day 4 – Docker 镜像深度解析

💬 作业时间

今日挑战

  1. ✅ 成功运行 Hello World 容器
  2. ✅ 部署 Nginx 并访问自定义页面
  3. ✅ 完成至少 2 个进阶实践
  4. ✅ 截图分享你的运行结果

思考题

  • 为什么容器停止后数据会丢失?如何解决?
  • 一个镜像可以同时运行多个容器吗?
  • 如果我想运行两个 Nginx,端口应该如何设置?

讨论话题:你在操作过程中遇到了什么有趣的问题?是如何解决的?

在评论区分享你的:

  • ✅ 实践成果截图(Nginx 页面、docker ps 输出等)
  • 💡 遇到的问题和解决方案
  • 🎯 进阶实践的想法和成果
  • 🤔 对思考题的答案

📖 系列文章

  • 上一篇:Day 2 – Docker 安装配置完全指南
  • 下一篇:Day 4 – Docker 镜像深度解析:从原理到实践
  • 本系列所有文章:Docker 30 天实战系列目录

🎁 学习资源

代码仓库 📦
本文所有示例代码和脚本:https://github.com/your-repo/docker-30-days/tree/main/day03

推荐阅读 📚

加入学习群 👥
扫描下方二维码加入 Docker 学习交流群,和 1000+ 小伙伴一起学习讨论:

  • 获取独家学习资料
  • 参与每日打卡挑战
  • 解决实战中的问题
  • 结识技术大牛

关注公众号 🔔
关注「Docker 实战」公众号,回复「Day3」获取:

  • ✅ 本文完整 PDF 版本
  • ✅ 常用命令速查卡片
  • ✅ 容器管理思维导图
  • ✅ 进阶实践参考答案

下期预告 🎬
明天我们将深入探索 Docker 镜像的奥秘:

  • 🔍 镜像的分层存储原理
  • 🏗️ 如何制作自己的镜像
  • 📦 Dockerfile 最佳实践
  • 🚀 镜像优化技巧

记得按时来打卡哦!💪


喜欢这篇文章吗? ❤️

  • 点个「在看」让更多人看到
  • 转发给正在学习 Docker 的朋友
  • 留言说说你的学习心得

我们明天见!🐳

正文完
创作不易,扫码加点动力
post-qrcode
 0
果较瘦
版权声明:本站原创文章,由 果较瘦 于2026-03-20发表,共计12944字。
转载说明:除特殊说明外本站文章皆由果较瘦原创发布,转载请注明出处。