如何把 Docker 镜像运行成容器?
docker run 镜像名:标签 即从镜像创建并启动容器;常用参数:-it 交互、-d 后台、--name 命名、-p 端口、-v 挂载、-e 环境变量。本文给出入门到常用的完整说明。
最简命令:docker run <镜像名:标签>——从镜像创建一个容器并启动。先 docker images 确认本地有哪些镜像(REPOSITORY:TAG 或 ID),然后按需加参数:-it 交互终端、-d 后台、--name 起名、-p 映射端口、-v 挂目录、-e 传环境变量。
从 images 到 run
docker images
# REPOSITORY TAG ID ...
# ubuntu 22.04 8dbd9e392a96 ...
# 按名称:标签运行(交互进 bash)
docker run -it ubuntu:22.04 /bin/bash
# 按镜像 ID 运行(等价)
docker run -it 8dbd9e392a96 /bin/bash
常用参数组合
# 后台运行,命名并设置重启策略;端口仅绑定本机回环地址
docker run -d \
--name myapp \
--restart unless-stopped \
-p 127.0.0.1:8080:80 \
-v app-data:/data \
-e MODE=prod \
myimage:1.2
端口映射省略主机地址时通常绑定所有主机接口;按实际访问范围选择。镜像后的命令会替换 CMD,但不会自动清除 ENTRYPOINT;需要更换入口时使用 --entrypoint。命名卷的数据生命周期独立于容器。
三种典型形态
# 1. 交互式试用(退出即删)
docker run -it --rm ubuntu:22.04 bash
# 2. 后台服务
docker run -d --name web -p 80:80 nginx
# 3. 一次性任务(跑完自动删)
docker run --rm myimage python etl.py
运行之后
docker ps # 看运行状态
docker logs -f myapp # 看输出
docker exec -it myapp sh # 进去排查
docker stop myapp # 停止
默认 --pull=missing 时,镜像不在本地才尝试拉取;--pull=always 每次先拉取,--pull=never 不拉取。
常见问题(FAQ)
Q:run 的时候报找不到镜像?
A:先确认本地镜像完整引用与 pull 策略;需要拉取却失败时,检查名称、仓库权限与网络。
Q:每次 run 都创建新容器?
A:对。未指定名称时会创建不同名称的容器;重复使用同一个 --name 会报名称冲突,不会生成多个同名容器。继续使用已有容器用 docker start;删除旧容器前先确认可写层数据,调试的一次性容器可用 --rm。
Q:容器一启动就退出?
A:主进程退出了——看 docker logs 容器名;调试命令类容器记得给前台命令(如 bash/sleep)。