
大家好,我是刘叨叨,一个致力于让碎片化技术系统性的运维人。
通过前三篇,我们搞定了理论、装好了环境。现在,是时候让容器“动”起来了!今天,我们就从最核心的 docker run 命令开始,亲手运行你的第一个容器,并掌握如何与它交互、观察它、管理它的整个生命周期。
如果把Docker比作乐高,那么 docker run 就是最核心的那块积木。它的基本语法是:
docker run [选项] 镜像名 [命令] [参数...]让我们通过一个经典示例,拆解其中最关键的几个参数。下面这个命令整合了最常用的参数,提供了一个清晰的实战起点:
# 完整示例:运行一个Nginx容器
docker run -d \ # -d: 后台守护进程模式运行
--name web_lddops \ # --name: 为容器指定唯一名称
-p 8080:80 \ # -p: 端口映射,主机端口:容器端口
-v /host/data:/container/data \ # -v: 数据卷挂载,主机路径:容器路径
-e “ENV_VAR=value” \ # -e: 设置环境变量
--restart=always \ # --restart: 重启策略,always表示总是重启
nginx:latest # 镜像名:标签参数 | 缩写 | 作用 | 生产场景示例 |
|---|---|---|---|
--detach | -d | 后台运行,返回容器ID。 | 运行Web服务器、数据库等长期服务。 |
--interactive --tty | -it | 交互式运行,分配伪终端,通常与/bin/bash组合。 | 调试镜像、进入容器内部操作。 |
--publish | -p | 端口映射,格式主机端口:容器端口。 | -p 80:80将容器80端口映射到主机80端口。 |
--volume | -v | 数据卷挂载,格式主机路径:容器路径:读写模式。 | -v /data:/var/lib/mysql持久化数据库。 |
--name | - | 为容器指定一个唯一名称,便于管理。 | --name web_lddops。 |
--restart | - | 设置重启策略。always确保无论退出状态如何都重启,宿主机Docker服务重启后,容器也能自动拉起来。 | --restart=always确保关键服务高可用。 |
--rm | - | 容器退出时自动删除其文件系统。 | 运行临时测试任务,避免堆积无用容器。 |
--env | -e | 设置容器内的环境变量。 | -e MYSQL_ROOT_PASSWORD=123456。 |
理解这两种模式,是驾驭容器的关键。
适合调试、探索或执行临时任务的容器,就像一个临时工棚,用完即拆。
# 启动一个交互式的Ubuntu容器
docker run -it --name temp_workshop ubuntu:22.04 /bin/bash
# 进入容器后,你可以:
root@容器ID:/# apt update && apt install -y curl # 安装软件
root@容器ID:/# curl http://baidu.com # 执行命令
root@容器ID:/# exit # 退出容器,容器随之停止重要特性:使用 -it 启动的容器,当您通过 exit 退出终端时,容器会立即停止。
适合运行应用服务,就像一个常驻工厂,在后台持续工作。
# 以后台守护进程模式运行Nginx
docker run -d --name web_lddops -p 80:80 nginx:alpine
# 此时,Nginx已在后台运行。你可以:
curl http://localhost # 访问服务
docker logs web_lddops # 查看日志,但不会停止容器核心区别:-d 参数让容器“脱钩”于当前终端,独立在后台运行。
一个容器完整的生命周期,通常遵循 “创建 → 运行 → 停止 → 删除” 的路径。管理它们,你只需要记住以下几个核心命令:
# 1. 查看容器状态
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括已停止的)
docker ps -a | grep nginx # 配合grep过滤查找
# 2. 停止与启动容器
docker stop web_lddops # 优雅停止容器(发送SIGTERM信号)
docker start web_lddops # 启动一个已停止的容器
docker restart web_lddops # 重启容器
# 3. 进入运行中的容器(不创建新进程)
# 这是调试已运行容器的关键命令!
docker exec -it web_lddops /bin/sh
# 在Alpine镜像中,通常使用 `/bin/sh` 而不是 `/bin/bash`
# 4. 删除容器
docker rm temp_workshop # 删除已停止的容器
docker rm -f web_lddops # -f 强制删除一个正在运行的容器(慎用!)💡 运维习惯:对于临时调试的容器,养成使用 --rm 参数的习惯,例如 docker run -it --rm ubuntu bash,这样退出后容器自动清理,不留垃圾。
当容器没有按预期工作时,查看日志是首要的排查手段。
# 查看容器的最新日志
docker logs web_lddops
# 实时追踪日志输出(类似 tail -f)
docker logs -f web_lddops
# 查看最近10行日志
docker logs --tail 10 web_lddops
# 查看时间戳
docker logs -t web_lddops场景一:容器瞬间退出 (“Exited (0)”)
这是最常见的问题,容器启动后立刻停止。
# 1. 查看退出的容器的日志(即使瞬间退出,也可能有输出)
docker logs <容器名或ID>
# 2. 如果日志为空,尝试以交互式前台运行,捕捉错误
docker run --rm -it your_image sh
# 观察启动过程中是否有报错信息场景二:容器启动失败 (“Exited with non-zero code”)
# 1. 查看详细的错误代码和原因
docker inspect <容器ID> | grep -A 5 -B 5 "State"
# 2. 检查主机端口是否已被占用
netstat -tunlp | grep :80场景三:容器运行但服务不可访问
# 1. 进入容器内部,检查服务进程是否存活
docker exec -it web_lddops ps aux
# 2. 在容器内部,尝试访问服务(例如检查Nginx是否监听)
docker exec -it web_lddops curl -I localhost:80
# 3. 检查主机的防火墙或安全组规则
sudo iptables -L -n | grep DOCKER为了帮你巩固记忆,这里将今天的核心命令与逻辑串联成一个简易工作流:
docker run -d --name web_lddops -p 8080:80 nginxcurl -I http://localhost:8080 或 docker logs web_lddopsdocker exec -it web_lddops /bin/shdocker stop/start/restart web_lddopsdocker rm -f web_lddops记住这个流程,你已经能应对80%的日常容器操作了。
实践出真知,我建议你在自己的环境中尝试:
-it 和 -d 参数运行同一个镜像(如 nginx:alpine),体会两者的区别。哪种模式更适合运行数据库?为什么?docker exec 进入容器,修改其首页文件 (/usr/share/nginx/html/index.html),然后在主机浏览器验证更改。欢迎在评论区分享你的操作笔记或遇到的任何问题。
🔜 下期预告
掌握了单个容器的操作,我们就有了管理“单体应用”的能力。但现代应用往往是多个容器组合而成的。下一篇,我们将进入 《镜像操作全解:从Docker Hub到私有仓库管理》,深入学习如何拉取、构建、推送和管理镜像,这是实现“一次构建,处处运行”的基石。
搜索关注【刘叨叨趣味运维】公众号,用有趣的方式,啃下最硬核的技术。咱们下期见!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 [email protected] 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 [email protected] 删除。