Docker容器启动命令docker run全解析
引言
在 Docker 的世界里,docker run 是最核心、最强大的命令之一。无论是初学者还是经验丰富的开发者,每天都会与它打交道。它负责从一个 Docker 镜像(Image)创建一个新的容器(Container),并启动它。理解 docker run 的工作机制和常用选项,是精通 Docker 的关键第一步。
本文将全面、深入地解析 docker run 命令,从基础语法到高级选项,并通过丰富的示例帮助你理解如何在不同场景下使用它。
docker run 的基本工作流程
当你执行 docker run 命令时,Docker 在后台执行了一系列操作:
- 检查镜像:Docker 会检查本地是否存在指定的镜像。
- 拉取镜像:如果本地不存在该镜像,Docker 会默认从公共的 Docker Hub 仓库(或其他配置的仓库)中拉取(pull)这个镜像。
- 创建容器:Docker 使用这个镜像作为模板,创建一个新的容器。这本质上是在镜像的只读层之上添加一个可写的容器层。
- 分配资源:Docker 为容器分配文件系统、网络接口,并根据需要设置 IP 地址。
- 执行命令:Docker 启动容器,并执行镜像中
Dockerfile定义的默认命令(CMD或ENTRYPOINT),或者执行你在docker run命令中指定的命令。
基本语法
docker run 的命令格式如下:
bash
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
[OPTIONS]:选项,用于配置容器的各种运行参数,如端口映射、后台运行、数据卷挂载等。这是docker run最灵活的部分。IMAGE:必需参数,指定创建容器所基于的镜像名称。[:TAG|@DIGEST]:可选参数,用于指定镜像的版本(标签)或摘要。如果省略,默认为latest。[COMMAND]:可选参数,用于覆盖镜像中定义的默认启动命令。[ARG...]:可选参数,传递给[COMMAND]的参数。
核心选项 (OPTIONS) 详解
docker run 的选项非常多,下面我们介绍一些最常用也最重要的选项。
1. -d 或 --detach:后台运行
默认情况下,容器在前台运行,你的终端会连接到容器的标准输入、输出和错误流。使用 -d 选项可以让容器在后台(detached mode)运行,并返回容器 ID。
示例:在后台启动一个 Nginx 容器。
bash
docker run -d nginx
2. -it:交互式运行
这两个选项通常一起使用:
– -i (--interactive):保持标准输入(STDIN)打开,即使没有附加到它。
– -t (--tty):分配一个伪终端(pseudo-TTY)。
当你需要进入容器内部并执行命令时,-it 是必不可少的。
示例:启动一个 Ubuntu 容器并进入其 bash shell。
bash
docker run -it ubuntu bash
执行后,你将直接进入 Ubuntu 容器的命令行界面。输入 exit 即可退出并停止容器。
3. --name:指定容器名称
Docker 会为每个容器生成一个随机的、唯一的名称(如 vigilant_murdock)。使用 --name 可以为容器指定一个易于记忆的自定义名称。
示例:启动一个名为 my-web-server 的 Nginx 容器。
bash
docker run -d --name my-web-server nginx
4. --rm:自动清理
这是一个非常有用的选项。它会在容器停止后自动删除容器文件系统。这对于运行一次性任务或测试非常方便,可以避免产生大量无用的、已停止的容器。
示例:运行一个打印 “Hello World” 的临时容器,运行结束后自动删除。
bash
docker run --rm ubuntu echo "Hello World"
5. -p 或 --publish:端口映射
这个选项用于将宿主机(Host)的端口映射到容器的端口,从而让外部可以访问容器内运行的服务。
格式为:-p <HOST_PORT>:<CONTAINER_PORT>
示例:启动一个 Nginx 容器,并将宿主机的 8080 端口映射到容器的 80 端口。
bash
docker run -d --name my-nginx -p 8080:80 nginx
现在,你可以通过访问 http://<你的宿主机IP>:8080 来访问 Nginx 的欢迎页面。
6. -v 或 --volume:数据卷挂载
容器默认是无状态的,容器删除后,其内部的数据也会丢失。为了实现数据持久化,我们需要使用数据卷(Volume)或绑定挂载(Bind Mount)。
格式为:-v <HOST_PATH>:<CONTAINER_PATH>
示例:启动一个 MySQL 容器,并将宿主机的 /my/own/datadir 目录挂载到容器的 /var/lib/mysql 目录,以持久化数据库文件。
bash
docker run -d \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v /my/own/datadir:/var/lib/mysql \
--name my-mysql \
mysql:8.0
注意:
HOST_PATH必须是绝对路径。
7. -e 或 --env:设置环境变量
许多 Docker 镜像允许通过环境变量来配置其行为。-e 选项用于在容器内设置环境变量。
格式为:-e <KEY>=<VALUE>
示例:启动一个 PostgreSQL 容器,并通过环境变量设置默认用户名和密码。
bash
docker run -d -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypassword postgres
8. --network:连接到网络
Docker 允许你创建自定义的桥接网络,以便容器之间可以通过容器名称进行通信。--network 选项可以将容器连接到指定的网络。
示例:
1. 创建一个名为 my-net 的网络:
bash
docker network create my-net
2. 将一个应用容器和一个数据库容器连接到同一个网络:
bash
docker run -d --network my-net --name my-db redis
docker run -d --network my-net --name my-app my-app-image
现在,my-app 容器可以直接通过主机名 my-db 来访问 Redis 服务。
9. --restart:重启策略
这个选项定义了当容器退出时 Docker 应采取的行动。这对于需要保证高可用的服务非常重要。
常用策略:
– no:默认策略,不自动重启。
– on-failure[:max-retries]:仅当容器以非零状态退出时才重启,可以指定最大重试次数。
– unless-stopped:除非容器被手动停止(docker stop),否则总是重启。
– always:无论退出状态如何,总是重启。
示例:让一个 Nginx 容器总是在退出后自动重启。
bash
docker run -d --restart always --name always-running-nginx nginx
覆盖默认命令
如前所述,你可以在镜像名称之后添加自定义命令来覆盖 Dockerfile 中的默认 CMD。
示例:在一个 alpine 镜像的容器中执行 ping google.com 命令。
bash
docker run --rm alpine ping google.com
这个容器会一直运行 ping 命令,直到你手动停止它(Ctrl+C 或 docker stop)。由于设置了 --rm,容器停止后会被自动删除。
综合示例:部署一个完整的 Web 应用栈
让我们结合以上多个选项,模拟部署一个简单的 WordPress 网站。这需要一个 WordPress 容器和一个 MySQL 数据库容器。
-
创建网络:
bash
docker network create wordpress-net -
启动 MySQL 数据库容器:
bash
docker run -d \
--network wordpress-net \
--name wordpress-db \
-v wordpress_db_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=somewordpress \
-e MYSQL_DATABASE=wordpress \
mysql:5.7--network: 连接到wordpress-net网络。--name: 命名为wordpress-db。-v: 创建一个名为wordpress_db_data的命名卷来持久化数据。-e: 设置数据库相关的环境变量。
-
启动 WordPress 应用容器:
bash
docker run -d \
--network wordpress-net \
-p 8080:80 \
--name wordpress-app \
-e WORDPRESS_DB_HOST=wordpress-db:3306 \
-e WORDPRESS_DB_PASSWORD=somewordpress \
wordpress--network: 连接到同一个网络。-p: 将宿主机的 8080 端口映射到容器的 80 端口。--name: 命名为wordpress-app。-e: 配置 WordPress 连接数据库所需的环境变量,其中WORDPRESS_DB_HOST直接使用了数据库容器的名称wordpress-db。
现在,打开浏览器访问 http://localhost:8080,你就可以看到 WordPress 的安装界面了。
结论
docker run 是 Docker 工具箱中最基本也是最强大的命令。通过组合使用其丰富的选项,你可以精确地控制容器的创建、网络、存储和生命周期。
掌握 docker run 不仅意味着能够启动和停止容器,更意味着理解了容器化应用部署的核心理念。希望这篇详细的解析能帮助你更好地驾驭 Docker,并将其应用到你的开发和运维工作中。