【Docker】一文看懂docker run的使用方法
文章目录
- 1. `docker run` 的基本用法
- 2. 常用的 `docker run` 选项
- 2.1. `-d`:后台运行容器
- 2.2. `--name`:为容器指定名称
- 2.3. `-it`:交互式终端
- 2.4. `-p`:端口映射
- 2.5. `-v`:挂载卷
- 2.6. `--rm`:自动删除容器
- 2.7. `-e`:设置环境变量
- 3. 容器生命周期管理
- 4. 运行容器的典型场景
- 4.1. 运行一个 Web 服务器
- 4.2. 运行数据库服务
- 4.3. 本地开发环境
- 5. 进阶用法
- 5.1. `--network`:自定义网络配置
- 5.2. `--link`:连接其他容器
- 5.3. `--cpus` 和 `--memory`:限制容器资源
- 5.4. `--restart`:自动重启策略
- 5.5. `--env-file`:批量设置环境变量
- 6. `docker run` 实践案例
- 6.1. 部署一个 LAMP 环境
- 6.2. 持续集成(CI)环境中的应用测试
1. docker run
的基本用法
docker run
的基本格式为:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
IMAGE
:你想要运行的 Docker 镜像名。COMMAND
:你希望在容器中执行的命令(可选)。[ARG...]
:传递给命令的参数(可选)。
例如,运行一个简单的 Ubuntu 容器:
docker run ubuntu
这会从 Docker Hub 拉取 ubuntu
镜像(如果本地不存在),并启动一个基于该镜像的容器。
2. 常用的 docker run
选项
2.1. -d
:后台运行容器
使用 -d
选项可以让容器在后台运行,而不是占据当前终端。它是“detached”模式的缩写。
docker run -d ubuntu
此时容器会在后台运行,你不会看到输出,但可以通过 docker ps
查看容器的状态。
2.2. --name
:为容器指定名称
每次启动容器时,Docker 都会为它分配一个随机名称。如果你希望为容器指定一个自定义名称,可以使用 --name
选项。
docker run --name my_container ubuntu
这样,你的容器将以 my_container
为名称,而不是自动生成的名字。
2.3. -it
:交互式终端
-i
和 -t
常常一起使用,分别表示交互式模式(-i
)和分配一个伪终端(-t
)。这通常用于需要与容器交互的场景,例如运行 Bash 终端:
docker run -it ubuntu bash
此命令将启动一个 Ubuntu 容器,并进入 Bash 终端,你可以直接与容器进行交互。
2.4. -p
:端口映射
当容器内部的应用需要通过特定端口与外部通信时,可以使用 -p
选项将容器的端口映射到主机的端口。格式为:
docker run -p [host_port]:[container_port] IMAGE
例如,将本地主机的 8080 端口映射到容器的 80 端口:
docker run -p 8080:80 nginx
此时,你可以通过访问 http://localhost:8080
来与 Nginx 服务器交互。
2.5. -v
:挂载卷
为了在主机和容器之间共享文件,Docker 提供了卷(Volume)功能。使用 -v
选项可以将主机的目录挂载到容器中。
docker run -v /host/path:/container/path ubuntu
例如,将本地主机的 /data
目录挂载到容器的 /mnt
目录:
docker run -v /data:/mnt ubuntu
这样,容器可以访问并修改主机上的 /data
目录内容。
2.6. --rm
:自动删除容器
默认情况下,容器在退出后会保留它的文件系统和状态。使用 --rm
选项可以在容器退出时自动删除该容器,以节省资源。
docker run --rm ubuntu
此容器在任务完成后将被自动删除。
2.7. -e
:设置环境变量
通过 -e
选项,可以在容器中设置环境变量。例如,运行一个 MySQL 容器时,通常需要设置 MySQL 的 root 用户密码:
docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
这会在容器中设置 MYSQL_ROOT_PASSWORD
环境变量。
3. 容器生命周期管理
使用 docker run
启动的容器可以通过以下命令进行管理:
docker ps
:列出正在运行的容器。docker stop [container_name]
:停止指定的容器。docker start [container_name]
:启动已停止的容器。docker rm [container_name]
:删除一个已停止的容器。
例如,停止名为 my_container
的容器:
docker stop my_container
4. 运行容器的典型场景
4.1. 运行一个 Web 服务器
使用 docker run
快速启动一个 Web 服务器是 Docker 的常见用法。例如,运行一个 Nginx 服务器,并将主机的 8080 端口映射到容器的 80 端口:
docker run -d -p 8080:80 nginx
此时,你可以通过访问 http://localhost:8080
来查看 Nginx 服务器的默认页面。
4.2. 运行数据库服务
你可以使用 docker run
轻松启动一个数据库服务。例如,启动一个 MySQL 容器,并设置 root 用户的密码:
docker run -d -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 mysql
这会启动一个 MySQL 容器,外界可以通过端口 3306 访问数据库。
4.3. 本地开发环境
在开发过程中,很多开发者使用 Docker 运行本地开发环境。例如,运行一个带有 Node.js 的容器:
docker run -it -v $(pwd):/app -w /app node bash
这会将当前目录挂载到容器中的 /app
目录,并进入 Node.js 容器中的 Bash 终端。
5. 进阶用法
除了常用的选项外,docker run
还提供了很多进阶用法,可以让用户对容器的行为和资源进行更精细的控制。
5.1. --network
:自定义网络配置
Docker 提供了多种网络模式,例如 bridge、host 和 overlay 等。在容器启动时,可以通过 --network
选项指定网络模式。
- bridge(默认模式):容器之间通过 NAT 网络隔离。
- host:容器和主机共享同一个网络栈,这使得容器中的服务可以直接使用主机的 IP 和端口。
docker run --network host nginx
此时,容器中的 Nginx 服务会与主机共享网络。
还可以通过 docker network create
创建自定义的网络,容器可以通过该网络进行互联。
docker network create my_network
docker run --network my_network ubuntu
5.2. --link
:连接其他容器
--link
选项允许一个容器与另一个容器进行通信,主要用于在没有自定义网络的情况下快速实现容器间的网络连接。它的格式为:
docker run --link [other_container_name]:[alias] IMAGE
例如:
docker run --link db_container:mysql web_container
此命令会将名为 db_container
的容器的网络别名设置为 mysql
,并让 web_container
能通过 mysql
这个别名访问 db_container
。
5.3. --cpus
和 --memory
:限制容器资源
为了防止容器占用过多的系统资源,Docker 提供了 CPU 和内存的限制选项。--cpus
选项允许指定容器可以使用的 CPU 数量:
docker run --cpus="1.5" ubuntu
这将限制容器最多使用 1.5 个 CPU 核心。
--memory
选项则用来限制容器的内存使用:
docker run --memory="512m" ubuntu
这将限制容器使用不超过 512MB 的内存。
5.4. --restart
:自动重启策略
--restart
选项允许指定容器的自动重启策略,这在生产环境中非常有用。常用的策略有:
no
:不重启(默认值)。on-failure
:当容器非正常退出时(退出码不为 0)自动重启。always
:无论退出码为何,容器都会自动重启。unless-stopped
:容器会在非手动停止的情况下自动重启。
例如:
docker run --restart always nginx
这会确保 Nginx 容器在退出后会自动重启。
5.5. --env-file
:批量设置环境变量
除了使用 -e
来单独设置环境变量,Docker 还支持通过 --env-file
从文件中批量加载环境变量。文件的格式是一行一个变量:
docker run --env-file ./env.list ubuntu
env.list
文件的内容示例如下:
MYSQL_ROOT_PASSWORD=my-secret-pw
MYSQL_DATABASE=mydb
这种方式可以方便地管理大量的环境变量。
6. docker run
实践案例
为了更好地理解 docker run
的强大功能,以下是一些常见的实践案例。
6.1. 部署一个 LAMP 环境
假设你需要快速部署一个 Linux + Apache + MySQL + PHP (LAMP) 的开发环境,使用 docker run
可以轻松实现。
首先,运行 MySQL 容器:
docker run -d --name mysql_container -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=app_db mysql
然后,运行 Apache 和 PHP 的组合容器,并将它与 MySQL 容器链接:
docker run -d --name web_container --link mysql_container:mysql -p 8080:80 php:apache
此时,访问 http://localhost:8080
即可查看 LAMP 环境下的网站。
6.2. 持续集成(CI)环境中的应用测试
在持续集成(CI)环境中,docker run
通常用于自动化测试。例如,在每次代码提交后,可以使用一个干净的容器环境来运行测试,确保代码的正确性。
可以通过如下方式运行测试容器:
docker run --rm -v $(pwd):/app -w /app maven mvn test
这个命令会拉取 Maven 镜像,在容器中执行测试,并在完成后自动删除容器。