jdk - 图1

所有的环境安装,都是在centos系统中操作的,并非本地windows系统。

Docker 中国官方镜像加速 http://www.docker-cn.com/registry-mirror

获取JAVA镜像:

在终端客户端命令行输入以下命令,获取JAVA镜像。

  1. docker pull java

默认是从Docker Hub官方的仓库中下载镜像的。如果没有指定对应的版本,默认会获取版本为latest的镜像。

注意: latest是针对于镜像所在的仓库里面的软件最新版本。并非是软件本身的最新发布版本。

回车执行,一开始会进行下载对应的依赖库,稍作等待:
jdk - 图2

出现下面的信息,说明镜像下载完成:
jdk - 图3

查看下载的镜像

命令行中执行命令,查看刚刚下载的JAVA镜像:

  1. docker images

如下图所示:
jdk - 图4

启动容器

命令行中执行命令,启动JAVA镜像容器:

  1. docker run -d -it --name java java

如下图所示,说明成功启动了容器:
jdk - 图5
其中,—name后面的“java”是为容器指定了一个别名,而最后的那个“java”指的是下载镜像时的名称。

命令以及参数的含义: run:启动一个镜像容器 -d:指定容器运行于后台 -it:-i 和 -t 的缩写;

  • -i:以交互模式运行容器,通常与 -t 同时使用

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

—name:指定容器名字,后续可以通过名字进行容器管理

具体更多的参数含义,可自行网上学习。

查看运行的容器

首先我们在命令行中执行命令,查看处于运行状态的容器:

  1. docker ps

因为在上面的操作步骤中,我们运行了java镜像,所以你会看到有一个名称为java的容器正在运行,如下图:
jdk - 图6
通过输出的信息可以看到,当前容器的ID是“9179eb86b007”,容器别名是java(最后一列的值)。

登录容器

【询问】:如果想查看容器中安装的jdk版本,该怎么做呢?

如果直接在命令行输入java -version会报错的,如下图: jdk - 图7 原因是因为:jdk是安装在容器里面的,需要进入容器,才能查看。意思就是说,jdk环境是在容器里面的,并非是宿主机。

进入容器内部

  • 使用attach进入容器
  1. docker attach 91

其中的 “91” 指的是什么呢?

上面有提到过,我们启动的java镜像的容器ID是“9179eb86b007”,所以, docker attach 命令后面,你可以指定容器ID来进入具体的容器。可以指定91、9179、9179e等任意长度的值,都代表了当前的java容器。

回车,效果如下图:

jdk - 图8

如果回车后没有反应,可以再次按下回车就可以进入容器的命令行模式了。

除了使用容器ID进入容器之外,也可以使用容器的别名进入容器:

  1. docker attach java

上面这种是通过容器的别名进入容器内部的。

  • 使用exec命令进入容器

【方式一】:通过容器别名进入容器:

  1. docker exec -it java /bin/bash

【方式二】:通过容器ID进入容器:

  1. docker exec -it 91 /bin/bash

回车之后,就会看到命令行发生了一些变化:

jdk - 图9

仔细看第二行的开头,@符号后面的“9179eb86b007”就是我们的java容器的ID吧,这也就说明,我们已经进入了容器内部了,可以对容器进行操作了。

进入容器后,输入 java -version 查看JDK版本信息

  1. java -version

无论是通过attach还是exec进入的容器,我们都可以在命令行中输入命令“java -version”来查看JDK版本信息。

下面我们就分别使用这2个命令进入容器,来看看效果,如下图所示:

  • attach命令进入容器,查看JDK版本信息

jdk - 图10

  • exec命令进入容器,查看JDK版本信息

jdk - 图11

登陆Docker容器的方式

上面已经简单的介绍了attach、exec命令的使用,下面讲解一下这两个命令之间的区别。

对于运行在后台的Docker容器,我们运维人员时常是有登陆进去的需求。登陆Docker容器的方式:

  • 使用ssh登陆容器

这种方法需要在容器中启动sshd,存在开销和攻击面增大的问题。同时也违反了Docker所倡导的一个容器一个进程的原则。

  • 使用自带命令docker attach登陆容器

docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法

  • 使用自带命令docker exec登陆容器

docker exec和docker attach是Docker的原生方法,大多数情况下就使用这两种命令登陆容器。docker exec命令是在docker1.3之后出现的,比docker attach命令更加方便

分别使用attach与exec进入容器,查看它们的区别

1、Docker attach必须是登陆到一个已经运行的容器里。需要注意的是如果从这个容器中exit退出的话,就会导致容器停止!!这是极其不方便的!
见下图所示结果:
jdk - 图12

你会发现通过attach进入容器的话,当使用exit退出容器的时候,对应的容器也停止运行了,所以在生产环境中很少使用。

2、docker exec登陆容器,注意有两个参数:-t和-i,这两个参数很重要!

对于 -t 、-i 的具体作用,可以参考 https://www.cnblogs.com/kevingrace/p/6656095.html

使用docker exec -it 进入容器和我们平常操作console界面类似。而且不像attach方式退出,导致整个容器退出,exec在生产环境中用的比较多。exec 比使用ssh 、nsenter、nsinit方式更方便,生产中常用的方式。

在使用docker exec登陆容器或执行容器中的命令时,最好都带上-t和-i参数。

退出Docker容器

  • 如果是通过 attach 进入的容器,在退出容器的时候,如果不想让容器停止运行的话,就不能使用exit命令或者Ctrl+D快捷键的形式退出,而是使用 Ctrl + P + Q 组合键退出容器。
  • 如果是通过 exec 命令进入的容器,在退出容器的时候,就可以使用exit或者Ctrl+D快捷键退出容器,同时容器不会停止运行,这也是exec与attach的最大区别。当然,你也可以使用Ctrl + P + Q 组合键退出容器,容器一样不会停止运行。

所以,通过上面的比较,也就印证了exec在实际使用过程中用的最多的,也是建议使用的一种方式。尤其是生产环境下,强烈建议使用exec的方式。

停止容器

通过 docker stop (容器ID | 容器别名) 的命令,可以停止正在运行状态的容器:

  1. docker stop java

上面是通过容器别名来停止容器的,你也可以使用容器ID。