Docker Run命令示例
Docker是一个平台,使我们可以将应用程序开发,测试和部署为可在几乎任何地方运行的可移植的自给自足的容器。
'docker run'命令从给定的镜像创建一个容器,并使用给定的命令启动该容器。
这是开始使用Docker时应熟悉的第一批命令之一。
在本文中,我们将使用官方的Nginx图像来展示运行Docker容器的各种方法。
Docker run命令
'docker run'命令采用以下形式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
从其创建容器的镜像的名称是“ docker run”命令的唯一必需参数。
如果本地系统上不存在该镜像,则将其从注册表中拉出。
如果未指定命令,则在运行容器时将执行Dockerfile的'CMD'或者'ENTRYPOINT'指令中指定的命令。
从版本1.13开始,Docker CLI进行了重组。
所有命令都被分组在与它们交互的对象下。
由于'run'命令与容器交互,因此它是'docker container'的子命令。
新命令的语法如下:
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
仍支持旧的1.13之前的语法。
在后台,“ docker run”命令是“ docker container run”的别名。
鼓励用户使用新的命令语法。
可以在Docker文档页面上找到所有'docker container run'选项的列表。
在前台中运行容器
默认情况下,如果没有为“ docker run”命令提供任何选项,则根进程在前台启动。
这意味着来自根进程的标准输入,输出和错误将添加到终端会话。
docker container run nginx
nginx进程的输出将显示在终端上。
由于没有与Web服务器的连接,因此终端为空。
要停止容器,请按'CTRL + C'终止正在运行的Nginx进程。
以分离模式运行容器
要在退出终端会话时保持容器运行,请以分离模式启动它。
这类似于在后台运行Linux进程。
使用-d选项启动一个分离的容器:
docker container run -d nginx
050e72d8567a3ec1e66370350b0069ab5219614f9701f63fcf02e8c8689f04fa
当根进程终止时,分离的容器将停止。
我们可以使用“ docker container ls”命令列出正在运行的容器。
要将终端添加到分离的容器根进程,请使用“ docker container attach”命令。
退出后删除容器
默认情况下,当容器退出时,其文件系统将保留在主机系统上。
'--rm'选项告诉'docker run'命令在容器自动退出时删除该容器:
docker container run --rm nginx
Nginx镜像可能不是在容器退出后清理容器文件系统的最佳示例。
此选项通常用于执行短期任务(例如测试或者数据库备份)的前台容器。
设置容器名称
在Docker中,每个容器都通过其“ UUID”和名称进行标识。
默认情况下,如果未明确设置,则容器名称由Docker守护程序自动生成。
使用'--name'选项为容器分配一个自定义名称:
docker container run -d --name my_nginx nginx
容器名称必须唯一。
如果我们尝试使用相同的名称启动另一个容器,则会收到类似以下错误消息:
docker: Error response from daemon: Conflict. The container name "/my_nginx" is already in use by container "9...c". You have to remove (or rename) that container to be able to reuse that name.
运行'docker container ls -a'列出所有容器,并查看它们的名称:
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9d695c1f5ef4 nginx "nginx -g 'daemon of…" 36 seconds ago Up 35 seconds 80/tcp my_nginx
有意义的名称对于在Docker网络中或者在运行Docker CLI命令时引用容器很有用。
发布Docker端口
默认情况下,如果未发布任何端口,则只能从容器内部访问容器中运行的进程。
发布端口意味着将容器端口映射到主机端口,以便这些端口可用于Docker外部的服务。
要发布端口,请使用“ -p”选项,如下所示:
-p host_ip:host_port:container_port/protocol
- 如果未指定'host_ip',则默认为'0.0.0.0'。
- 如果未指定“协议”,则默认为TCP。
- 要发布多个端口,请使用多个'-p'选项。
要将容器中的TCP端口80(nginx)映射到主机localhost接口上的端口8080,请运行:
docker container run --name web_server -d -p 8080:80 nginx
我们可以通过在浏览器中打开“ http://localhost:8080”或者在Docker主机上运行以下“ curl”命令来验证端口是否已发布:
curl -I http://localhost:8080
输出将如下所示:
HTTP/1.1 200 OK Server: nginx/1.17.6 Date: Tue, 26 Nov 2019 22:55:59 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 19 Nov 2019 12:50:08 GMT Connection: keep-alive ETag: "5dd3e500-264" Accept-Ranges: bytes
共享数据(挂载卷)
停止容器时,将删除该容器生成的所有数据。
Docker Volumes是使数据持久化并在多个容器之间共享的首选方法。
要创建和管理卷,请使用“ -p”选项,如下所示:
-v host_src:container_dest:options
- “ host_src”可以是主机或者命名卷上文件或者目录的绝对路径。
- “ container_dest”是容器上文件或者目录的绝对路径。
- 选项可以是“ rw”(读写)和“ ro”(只读)。如果未指定任何选项,则默认为'rw'。
为了解释它是如何工作的,让我们在主机上创建一个目录,并其中放置一个“ index.html”文件:
mkdir public_htmlecho "Testing Docker Volumes" > public_html/index.html
接下来,将“ public_html”目录挂载到容器中的“/usr/share/nginx/html”中:
docker run --name web_server -d -p 8080:80 -v $(pwd)/public_html:/usr/share/nginx/html nginx
我们使用的是“ $(pwd)”命令,而不是指定“ public_html”目录的绝对路径,它会打印当前的工作目录。
现在,如果在浏览器中键入“ http://localhost:8080”,则应该看到“ index.html”文件的内容。
我们还可以使用“ curl”:
curl http://localhost:8080
Testing Docker Volumes
交互式运行容器
在处理诸如“ bash”之类的交互式过程时,请使用“ -i”和“ -t”选项启动容器。
'-it'选项告诉Docker将标准输入保留在终端上并分配一个伪tty:
docker container run -it nginx /bin/bash
容器的Bash Shell将添加到终端,命令提示符将更改:
root@1da70f1937f5:/#
现在,我们可以与容器的shell进行交互,并其中运行任何命令。
在此示例中,我们提供了一个命令('/bin/bash')作为已执行的'docker run'命令的参数,而不是Dockerfile中指定的命令。