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

上一篇 / 目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容