docker container 命令入门

上一篇 / 目录

容器命令docker container是docker初学者最需要掌握的内容,命令包含了很多可选的参数。本文就以几个示例给读者们展示docker container命令的各种用法。

1 下载镜像

容器都是由镜像加载而来的,为了演示容器的启动,首先需要下载一个镜像。在Windows 的powershell 命令行窗口中输入下面的命令下载WildFly镜像:

docker image pull jboss/wildfly

WildFly是一个Java Web应用服务器,并且支持Java EE标准。

2 交互模式

运行容器有两种模式,一种是交互模式,另外一种是后台模式。运行下面的命令以交互模式启动wildfly容器:

docker container run -it jboss/wildfly

容器启动后,在命令行窗口中会打印出如下的日志:

=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/jboss/wildfly

  JAVA: /usr/lib/jvm/java/bin/java

  JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true  --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED

========================================================================

14:26:21,655 INFO  [org.jboss.modules] (main) JBoss Modules version 1.9.1.Final
…
14:26:27,360 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 17.0.1.Final (WildFly Core 9.0.2.Final) started in 6398ms - Started 314 of 576 services (369 services are lazy, passive or on-demand)

可以看到,wildfly服务器的日志信息都打印到了当前的powershell窗口中,并且docker container run命令并没有立刻结束运行,仍然在等待wildfly继续输出日志,这种运行方式就是交互模式。

具体来说,交互有两层含义:一是容器可以接收用户在powershell命令行中输入的字符,这是通过-i参数来指定的;二是容器可以把产生的日志输出到当前的powershell命令行中,这是通过-t参数来指定的。当然,上面的例子中同时指定了-i-t参数,你可以分别输入这两个参数,或者像例子中一样,使用-it把他们组合到一起。

使用 Ctrl + C可以停止这个容器。

这里笔者再举一个交互模式的例子。运行下面的命令可以以交互模式启动openjdk:12容器:

docker container run -it openjdk:12

容器启动后,在poweshell窗口中会输出下面的日志:

Sep 20, 2019 2:41:10 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 12.0.2
|  For an introduction type: /help intro

jshell>

此时光标会停在jshell>的右边,等待用户输入。我们通过键盘输入的字符串都会发送给openjdk:12容器中的jshell程序,并且jshell程序的输出也会显示在当前窗口中。例如输入下面的内容:

jshell> int a = 1, b = 2;
a ==> 1
b ==> 2

jshell> a + b
$3 ==> 3

jshell>

使用Ctrl + D可以停止这个容器。注意Ctrl + C不能停止openjdk:12容器。针对不同的容器,退出命令会有差别。

3 Detached模式(后台模式)

除了交互模式之外,启动容器还有另外一种模式,那就是Detached模式,意思就是在后台运行容器。使用-d参数指定后台模式。下面的命令以后台模式启动wildfly容器:

docker container run -d jboss/wildfly

容器启动后,命令行窗口会显示容器的ID,并且docker conainer run命令会立刻结束,如下图所示:

后台模式

使用docker container ls命令可以查看所有正在运行中的容器:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ce5c1ffa53a1        jboss/wildfly       "/opt/jboss/wildfly/…"   2 minutes ago       Up 2 minutes        8080/tcp            angry_shannon

在上面的列表中,CONTAINER ID列是唯一标识容器的ID号,NAMES列则是唯一标识容器的一个名称,这个名称是由docker随机生成的。使用docker container logs ce5c1ffa53a1 或者 docker container logs angry_shannon 可以显示这个容器的日志信息。注意,凡是需要使用容器ID的命令,其ID都可以替换为容器的名称(Name),ID或者Name都可以唯一标识一个容器。

使用下面的命令停止这个后台运行的容器:

docker container stop CONTAINER-ID

这里CONTAINER-ID需要替换成容器的ID,例如 docker container stop ce5c1ffa53a1

4 自定义Name

启动容器时,也可以使用--name参数给容器自定义一个名称。下面的命令给新启动的wildfly容器设置一个自定义名称mywildfly:

docker container run -d --name mywildfly jboss/wildfly

运行docker container ls查看正在运行的容器:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e6c751511bbc        jboss/wildfly       "/opt/jboss/wildfly/…"   9 seconds ago       Up 8 seconds        8080/tcp            mywildfly

可以看到,NAMES列显示的名称是我们自定义的mywildfly,这样就可以使用该名称来标识这个容器了。例如显示容器输出的日志信息:

docker container logs mywildfly

运行下面的命令停止容器:

docker container stop mywildfly

5 对外映射TCP端口

如果使用之前的命令启动wildfly容器,那么这个容器并不能通过TCP端口来访问,这是因为容器并没有对宿主机暴露任何端口。为此,需要使用-P参数把容器中监听的端口映射到宿主机的一个随机端口上。我们在powershell中运行下面的命令再次启动wildfly容器:

docker container run -d -P jboss/wildfly

接下来运行docker container ls查看一下刚启动的容器:

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                     NAMES
c6a9b353c0d9        jboss/wildfly       "/opt/jboss/wildfly/…"   About a minute ago   Up About a minute   0.0.0.0:32768->8080/tcp   gifted_grothendieck

从PORTS列中可以看到这个容器的端口映射关系。0.0.0.0:32768->8080/tcp 表示宿主机的端口32768与容器的tcp端口8080建立了一对一的映射。此时,我们可以在浏览器中访问网址 http://localhost:32768 来加载wildfly容器中的服务器主页:

wildfly容器主页

最后运行下面的命令停止这个容器。

docker container stop c6a9b353c0d9

6 指定映射的端口号

上一节我们使用大写的-P参数随机分配了一个映射的端口。其实我们也可以使用小写的-p参数来显示指定端口。-p 参数的格式是 -p HOST-PORT:CONTAINER-PORT。下面的命令将把宿主机的38888端口映射到容器的8080端口:

docker container run -d --name wildfly-custom-port -p 38888:8080 jboss/wildfly

容器启动后,可以在浏览器中访问http://localhost:38888 来打开wildfly的服务器主页。

7 停止容器

使用docker container stop命令通过容器的ID或者容器的名称来停止一个容器:

docker container stop CONTAINER-ID
docker container stop CONTAINER-NAME

例如,我们在前一步启动了一个wildfly容器,运行下面的命令可以将其停止:

docker container stop wildfly-custom-port

想停止多个容器,可以用空格来分隔各个容器的ID或Name,例如:

docker container stop mywildfly wildfly-custom-port

如果想要停止所有正在运行的容器,可以运行下面的命令:

docker container stop $(docker container ls -q)

$(docker container ls -q) 的作用是先执行docker contianer ls -q找到所有正在运行的容器,-q参数表示仅打印出容器的ID。然后把这些ID作为参数传递给docker container stop命令。

8 启动容器

使用docker container start来启动一个或多个处于停止状态的容器。

docker container start CONTAINER-ID
docker container start CONTAINER-NAME

例如,运行下面的命令启动mywildfly和wildfly-custom-port容器:

docker container start mywildfly wildfly-custom-port

docker container start 默认是以后台模式启动容器。通过参数-ai可以开启交互模式。例如,我们先停止mywildfly容器:

docker container stop mywildfly

然后以交互模式启动mywildfly:

docker container start -ai mywildfly

你会看到powershell窗口打印出容器的日志信息,并且docker container start命令不会立刻返回。

交互模式

使用Ctrl + C退出容器。

9 查看端口映射

docker container port命令可以查看某个容器的端口映射。

docker container port CONTAINER-ID
docker container port CONTAINER-NAME

例如,输入下面的命令查看wildfly-custom-port容器的端口映射:

docker container port wildfly-custom-port

你会看到下面的输出日志:

8080/tcp -> 0.0.0.0:38888

这表明容器的tcp端口8080映射到宿主机的38888端口。注意,这和我们使用docker container ls命令看到的端口映射正好相反。docker container ls命令会把宿主机的端口放在左边,而docker container port命令会把宿主机的端口放在右边。不过意思都是一样的,读者们应该不难理解。

10 删除容器

对于正在运行的容器,最好不要使用-f参数强行删除,你可以先将其停止,然后再删除。这是因为某些容器在停止过程中还需要进行一些状态保存的操作,例如把内存中的一些数据写回到硬盘中。

使用docker container rm命令删除容器。

docker container rm CONTAINER-ID
docker container rm CONTAINER-NAME

例如,运行下面的命令停止mywildfly和wildfly-custom-port容器。然后将其删除

docker container stop mywildfly wildfly-custom-port
docker container rm mywildfly wildfly-custom-port

使用docker container prune命令可以删除所有已经停止的容器。

prune命令

11 总结

读者朋友们已经学会了docker container命令最常见的用法。如果需要查看完整的文档,可以输入命令:

docker container --help

下面列出本篇指南用到的所有命令,供读者们参考:

# 下载jboss/wildfly镜像
docker image pull jboss/wildfly
# 以交互模式启动一个新的wildfly容器
docker container run -it jboss/wildfly
# 以交互模式启动一个新的openjdk容器
docker container run -it openjdk:12
# 后台模式
docker container run -d jboss/wildfly
# 查看正在运行的容器
docker container ls
# 给容器设置自定义名称
docker container run -d --name mywildfly jboss/wildfly
# 查看容器的日志
docker container logs mywildfly
# 对外映射到随机端口
docker container run -d -P jboss/wildfly
# 对外映射到指定端口
docker container run -d --name wildfly-custom-port -p 38888:8080 jboss/wildfly
# 停止容器
docker container stop CONTAINER-ID
docker container stop CONTAINER-NAME
# 停止多个容器
docker container stop mywildfly wildfly-custom-port
# 停止所有的容器
docker container stop $(docker container ls -q)
# 启动容器
docker container start CONTAINER-ID
docker container start CONTAINER-NAME
# 启动多个容器
docker container start mywildfly wildfly-custom-port
# 交互模式启动容器
docker container start -ai mywildfly
# 查看端口映射
docker container port CONTAINER-ID
docker container port CONTAINER-NAME
# 停止并删除多个容器
docker container stop mywildfly wildfly-custom-port
docker container rm mywildfly wildfly-custom-port
# 删除所有已经停止的容器
docker container prune

上一篇 / 目录

你可能感兴趣的:(docker container 命令入门)