容器命令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容器中的服务器主页:
最后运行下面的命令停止这个容器。
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
命令可以删除所有已经停止的容器。
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
网友评论