因为同时开7个vmware的虚拟机对笔记本还是有些压力,所以最近学习一下docker的用法,看看能不能在这个下边发布redis的集群和zookeeper的集群等。


在对docker进行了一番折腾后大概理解的容器和镜像的关系如下

安装docker的centos7是我的一个vmware的虚拟机,我在这下边安装了一个docker。docker的镜像(以下用Image指代)和容器(以下用Container)在我理解就是docker的静态文件和动态运行时。当我要启动一个docker的Container时我必须要有一个Image,当我用这个Image启动成功后就有了一个基于这个Image运行的Container。所有后续我们要做的事情都是在这个Container当中来进行。比如安装mysql或者tomcat,或得redis等等。


这个Container运行起来之后也如同一个简易的小操作系统环境一样,它就可以和外部的虚拟机或者实际的操作系统进行文件交换了


在做导出的时候有对Image的导出,也有对Container的导出。对镜像的导出实际就是对container所运行需基于的Image的导出。和Container本身没有什么太大的关系。比如我在一开始练习时在Container中配置了一个JDK,那么我导出相应的Image后(无论Container是否运行),再把这个Image导入进来,再启动这个Image还是不会看到我刚刚安装的JDK.


而对Container进行Image导出则会导出容器中所安装的JDK等信息。再导入做为镜像时,这个新的镜像中就包含我刚刚安装的JDK。我理解的docker中分层的概念也就是从这里提取到的。就是可以把Image运行成为Container后进行安装,安装后再导出就行动新一层的Image。新一层的Image再运行成为Container再进行安装配置。这样逐层叠加。


了解了容器和镜像的关系,也就能理顺了为什么启动容器的时候命令语句是要用 Image的名称或者Image ID,


docker run -di --name mas-centos7-jdk Image名称(Id)


而退出的时候命令中要用到Container ID


docker stop containerId



下边是在docker中安装JDK的操作记录

(附加一个将下载的jdk tar 解压的命令  tar -zxvf jdk-8u241-linux-x64.tar.gz,将从oracle官网下载的tar包进行解压)


将docker的centos7的image运行起来后,将虚拟机下的jdk拷入到container中,

docker cp /home/zsj/jdk1.8.0_241 062b2a1bdf40 cdb:/etc  

(按刚才描述的,062b2a1bdf40  这里就应该是一个containerId,因为是在和Container打交道)


拷贝进去后,就可以在docker的容器下看到这个相应的文件目录了,细心的同学可能发现我这两个containerID

不一样,这是因为我是在反复练习中分别截的图,所以容器号不再是一样的了。


在Container下对JDK进行配置,这个和常配的linux下配置一样,vi /etc/profile即可

(还是记住4个命令即可 Insert键或者i进行编辑模式,ESC键退出编辑模式,:q退出不保存,:wq保存并退出,退出时先退出编辑模式)

对应的环境变量文本如下,可以直接复制粘贴,替换下路径和JDK版本即可

export JAVA_HOME=/etc/jdk1.8.0_241

export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar

export PATH=$PATH:${JAVA_HOME}/bin


安装完后刷一下环境变量 执行 source /etc/profile

然后正常无误的话就可以看到jdk的环境变量,如果有错误提示或者无反应,注意查看一下JAVA_HOME配置的路径是否有误


配置完成后,就可以对这个当前container进行导出了。之前在练习的时候一直导出的是Image所以总是再启动container后没有看到安装的jdk

docker commit mas-centos7-jdk mas-centos7-jdk  (这里边我写成一样的了,前边的mas-centos7-jdk是我启动的container名称,也可以放containerID,后边的是我要导出的镜像的命名)


再打docker image命令就能看到刚刚导出的Image了,再根据这个新的Image来启动Container就会启动一个包含刚刚安装的JDK的cotainer了


以上,完成一个简单的JDK配置以container镜像的导出


下附一些在安装中用到的docker的基本命令以做备查(基于centos7,centos8的同学可以先关注下podman)


yum install -y docker  新装docker


yum -y remove docker 卸载docker


systemctl start docker 启动docker


systemctl start docker 重橷启动docker(当头一次装完docker后可能修改下daemon.json文件中的默认下载路径,那么修改完后可以使用这个命令来重新启动一下)


docker Images 看看当前本地有哪些镜像(刚安装后没有任何镜像)


docker pull centos:7 拉取镜像 centos是要拉取的软件 7是版本号 : 连接符


docker run -it --name=centos7 centos:7 /bin/bash  以交互命令行的方式启动container

centos7 是启动的container的名称  centos:7  启动的container所基于的Image


这个方式启动成功之后会直接进入到container中,当退出后相应的容器也会退出。对于新使用的同学来说可能会出现再次进不去也不知道为什么的情况。所以可以用下边的命令来进入


docker run -di --name=centos7 centos:7 /bin/bash 这个方式启动container后当前并不会进入到container中,需要手工再执行命令进入,好处是退出后再次进入的时候可以直接进入,退出后以docker ps 命令查看,相应的container还是up的状态


对container进行停止

docker stop containerID 


docker ps 可以查看当前正常的container

docker ps -a 可以查看当前所有的container 包括不能正常启动的,和操作退出后变成不可用状态的


docker commit mas-centos7-jdk mas-centos7-jdk 基于container导出Image


docker load -i mas-centos7-jdk 导入Image


docker start centos:7 进入基于某个Image的Container