所有的环境安装,都是在centos系统中操作的,并非本地windows系统。
Docker 中国官方镜像加速 http://www.docker-cn.com/registry-mirror
获取JAVA镜像:
在终端客户端命令行输入以下命令,获取JAVA镜像。
docker pull java
默认是从Docker Hub官方的仓库中下载镜像的。如果没有指定对应的版本,默认会获取版本为latest的镜像。
注意:
latest是针对于镜像所在的仓库里面的软件最新版本。并非是软件本身的最新发布版本。
回车执行,一开始会进行下载对应的依赖库,稍作等待:
出现下面的信息,说明镜像下载完成:
查看下载的镜像
命令行中执行命令,查看刚刚下载的JAVA镜像:
docker images
如下图所示:
启动容器
命令行中执行命令,启动JAVA镜像容器:
docker run -d -it --name java java
如下图所示,说明成功启动了容器:
其中,--name后面的“java”是为容器指定了一个别名,而最后的那个“java”指的是下载镜像时的名称。
命令以及参数的含义:
run:启动一个镜像容器
-d:指定容器运行于后台
-it:-i 和 -t 的缩写;
-i:以交互模式运行容器,通常与 -t 同时使用
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name:指定容器名字,后续可以通过名字进行容器管理
具体更多的参数含义,可自行网上学习。
查看运行的容器
首先我们在命令行中执行命令,查看处于运行状态的容器:
docker ps
因为在上面的操作步骤中,我们运行了java镜像,所以你会看到有一个名称为java的容器正在运行,如下图:
通过输出的信息可以看到,当前容器的ID是“9179eb86b007”,容器别名是java(最后一列的值)。
登录容器
【询问】:如果想查看容器中安装的jdk版本,该怎么做呢?
如果直接在命令行输入java -version会报错的,如下图:
原因是因为:jdk是安装在容器里面的,需要进入容器,才能查看。意思就是说,jdk环境是在容器里面的,并非是宿主机。
进入容器内部
- 使用attach进入容器
docker attach 91
其中的 “91” 指的是什么呢?
上面有提到过,我们启动的java镜像的容器ID是“9179eb86b007”,所以, docker attach 命令后面,你可以指定容器ID来进入具体的容器。可以指定91、9179、9179e等任意长度的值,都代表了当前的java容器。
回车,效果如下图:
如果回车后没有反应,可以再次按下回车就可以进入容器的命令行模式了。
除了使用容器ID进入容器之外,也可以使用容器的别名进入容器:
docker attach java
上面这种是通过容器的别名进入容器内部的。
- 使用exec命令进入容器
【方式一】:通过容器别名进入容器:
docker exec -it java /bin/bash
【方式二】:通过容器ID进入容器:
docker exec -it 91 /bin/bash
回车之后,就会看到命令行发生了一些变化:
仔细看第二行的开头,@符号后面的“9179eb86b007”就是我们的java容器的ID吧,这也就说明,我们已经进入了容器内部了,可以对容器进行操作了。
进入容器后,输入 java -version 查看JDK版本信息
java -version
无论是通过attach还是exec进入的容器,我们都可以在命令行中输入命令“java -version”来查看JDK版本信息。
下面我们就分别使用这2个命令进入容器,来看看效果,如下图所示:
- attach命令进入容器,查看JDK版本信息
- exec命令进入容器,查看JDK版本信息
登陆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退出的话,就会导致容器停止!!这是极其不方便的!
见下图所示结果:
你会发现通过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 | 容器别名) 的命令,可以停止正在运行状态的容器:
docker stop java
上面是通过容器别名来停止容器的,你也可以使用容器ID。