Docker run命令

本文将介绍Docker run命令,该命令用来运行执行的镜像,启动一个容器。可以通过docker ps查看我们已经运行了哪些容器。

使用“docker run --help”命令查看docker run命令的帮助信息。如下:

[root@localhost ~]# docker run --help

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
... more ...

实例1:使用-i和-t运行一个可以交互的centos镜像。

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              db421afca7de        35 hours ago        143MB
centos              6.7                 9f1de3c6ad53        4 months ago        191MB
centos              latest              9f38484d220f        4 months ago        202MB
tomcat              8.0                 ef6a7c98d192        10 months ago       356MB
memcached           1.4.21              622897abf0a4        4 years ago         130MB
[root@localhost ~]# docker run -it centos
[root@6755058b1670 /]# ll
total 12
-rw-r--r--.   1 root root 12082 Mar  5 17:36 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 bin -> usr/bin
drwxr-xr-x.   5 root root   360 Jul 21 02:00 dev
drwxr-xr-x.   1 root root    66 Jul 21 02:00 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Mar  5 17:34 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 124 root root     0 Jul 21 02:00 proc
dr-xr-x---.   2 root root   114 Mar  5 17:36 root
drwxr-xr-x.  11 root root   148 Mar  5 17:36 run
lrwxrwxrwx.   1 root root     8 Mar  5 17:34 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Jul 16 13:57 sys
drwxrwxrwt.   7 root root   132 Mar  5 17:36 tmp
drwxr-xr-x.  13 root root   155 Mar  5 17:34 usr
drwxr-xr-x.  18 root root   238 Mar  5 17:34 var

其中:

  • -i 表示已交互模式运行容器,通常与-t同时使用;

  • -t 为容器重新分配一个伪输入终端,通常与-i同时使用;

我们重新打开一个终端,使用“docker ps”查看当前正在运行的容器。如下:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6755058b1670        centos              "/bin/bash"         42 seconds ago      Up 41 seconds                           frosty_cori

仔细观察,你会发现 docker ps 显示的 CONTAINER ID="6755058b1670",正好和运行 centos 镜像打开的终端提示符“root@6755058b1670”中的“6755058b1670”匹配。说明我们使用 docker 使用 centos 镜像运行了一个 id 为 6755058b1670 的容器,并且用户可以与运行的 centos 容器交互(root@6755058b1670)。

如果上面还是不明确,我们可以使用“--name=容器新名称”命令为容器指定新的名称。

[root@localhost ~]# docker run -it --name="mycentos" centos
[root@19fdd0a78ea2 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
19fdd0a78ea2        centos              "/bin/bash"         9 seconds ago       Up 8 seconds                            mycentos

注意查看“NAMES”列,mycentos 就是我们通过 --name 指定的名称,CONTAINER ID与运行的 centos 容器主机名一致(用户名@主机名, root@19fdd0a78ea2 )。

实例2:使用“-d”将容器启动为后台运行。

[root@localhost ~]# docker run -d centos
c77fe408dbd32c76ea848e01ca0f3d54bd3e6ac7ca13bb132ca06aa90afa09e1

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

注意:使用 -d 启动的容器,通过 docker ps 命令查看不到的。因为在 docker 中,后台服务必须要有一个前台服务才能运行(前台服务即使用 -it 选项启动的服务)。我们可以在启动容器时,在容器中运行shell代码,循环输出东西。此时,docker -d 启动的容器就不会自动关闭了,如下:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[root@localhost ~]# docker run -d centos /bin/sh -c "while true;do echo hello;sleep 2;done"
6d72e5c3201eed8097416646ba96d9cbb19dc2206b4c962b72c42bc2c4456efe

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6d72e5c3201e        centos              "/bin/sh -c 'while t…"   4 seconds ago       Up 3 seconds                            unruffled_archimedes

首先使用“docker ps”查看当前运行的容器,这里没有任何容器在运行。接下来执行“docker run -d centos /bin/sh -c "while true;do echo hello;sleep 2;done"”命令,运行后会返回容器ID“6d72e5c3201eed8097416646ba96d9cbb19dc2206b4c962b72c42bc2c4456efe”,然后再次使用“docker ps”查看运行的容器,你会发现多了容器ID为“6d72e5c3201e”的容器。

注意:其中的“while true;do echo hello;sleep 2;done”是一段简单的shell脚本。

实例3:使用“-p”或者“-P”端口暴露容器中的端口,这里使用tomcat作为实例。

[root@localhost ~]# docker images tomcat
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              8.0                 ef6a7c98d192        10 months ago       356MB

[root@localhost ~]# docker run -it -p 8888:8080 tomcat:8.0
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /docker-java-home/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
......
21-Jul-2019 02:12:36.046 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
21-Jul-2019 02:12:36.062 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-apr-8009"]
21-Jul-2019 02:12:36.067 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 3171 ms

上面使用“docker images tomcat”命令查看本地拥有的tomcat镜像。拥有一个 tomcat8.0 的镜像。使用“docker run -it -p 8888:8080 tomcat:8.0”命令运行 tomcat:8.0 镜像,启动成功后将会看见如下日志信息:

Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /docker-java-home/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
......
21-Jul-2019 02:12:36.046 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
21-Jul-2019 02:12:36.062 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-apr-8009"]
21-Jul-2019 02:12:36.067 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 3171 ms

等等。然后在浏览器中访问:https://127.0.0.1:8888/ 你就看以看见tomcat的界面了。如下图:

Docker run命令

如果你使用“-P”选项,则会随机分配一个端口给宿主主机。如下:

[root@localhost ~]# docker run -it -P tomcat:8.0
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /docker-java-home/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
......
21-Jul-2019 02:16:46.194 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 3007 ms

上面使用“docker run -it -P tomcat:8.0”命令运行tomcat,然后使用“docker ps”查看端口信息,如下:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
6b589ff76bc9        tomcat:8.0          "catalina.sh run"   18 seconds ago      Up 17 seconds       0.0.0.0:32769->8080/tcp   boring_easley

注意查看“0.0.0.0:32769”表示随机暴露的端口为“32769”。我们可以使用“https://127.0.0.1:32769”访问tomcat,如下图:

Docker run命令

天下之事常成于困约,而败于奢靡。——陆游
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号