Docker第二篇:镜像的基本使用-搭建Centos系统和JDK
Posted 牧竹子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker第二篇:镜像的基本使用-搭建Centos系统和JDK相关的知识,希望对你有一定的参考价值。
镜像操作篇
大多数的运行都依赖于操作系统,当然有些可以单独运行比如hello word,
以centos的镜像为例 ,
注意前提是要修改镜像加速器【参考第一篇中的-配置镜像加速器】,否则下面对于翻墙安装来说非常浪费时间,或者根本安装不成功。
查找仓库中可以用的镜像
docker search centos
在docker中安装CENTOS
docker pull centos
默认会安装官方提供的最新版本镜像
查看已经安装的镜像列表
docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE
centos latest e934aafc2206 2 weeks ago 199MB
lwieske/java-8 latest 6e05355899ef 3 months ago 164MB
hello-world latest f2a91732366c 5 months ago 1.85kB
REPOSITORY:镜像名称
TAG:标签
IMAGE ID:镜像短ID
CREATED:镜像创建时间
SIZE:镜像大小
用 ID、镜像名、摘要删除镜像
从上面的镜像列表中可以知道,镜像列表的信息
可以根据这些信息删除该镜像
docker image rm lwieske/java-8
Untagged 和 Deleted
如果观察上面这几个命令的运行输出信息的话,你会注意到删除行为分为两类,一类是 Untagged,另一类是 Deleted。我们之前介绍过,镜像的唯一标识是其 ID 和摘要,而一个镜像可以有多个标签。
因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 docker rmi 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。
当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。这就是为什么,有时候会奇怪,为什么明明没有别的标签指向这个镜像,但是它还是存在的原因,也是为什么有时候会发现所删除的层数和自己 docker pull 看到的层数不一样的源。
除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。之前讲过,容器是以镜像为基础,再加一层容器存储层,组成这样的多层存储结构去运行的。因此该镜像如果被这个容器所依赖的,那么删除必然会导致故障。如果这些容器是不需要的,应该先将它们删除,然后再来删除镜像。
用 docker image ls 命令来配合
像其它可以承接多个实体的命令一样,可以使用 docker image ls -q 来配合使用 docker image rm,这样可以成批的删除希望删除的镜像。我们在“镜像列表”章节介绍过很多过滤镜像列表的方式都可以拿过来使用。
比如,我们需要删除所有仓库名为 redis 的镜像:
或者删除所有在 mongo:3.2 之前的镜像:
使用镜像运行容器
docker run <相关参数> <镜像 ID> <初始命令>
docker run -it --rm centos bash
docker run 就是运行容器的命令,具体格式我们会在 容器 一节进行详细讲解,我们这里简要的说明一下上面用到的参数。
• -it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
• –rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 –rm 可以避免浪费空间。
• centos :这是指用 centos 镜像为基础来启动容器。
• -v:表示需要将本地哪个目录挂载到容器中 (这个目录和本地是交互的,目录下的文件在容器和本地上是可以相互看见的)
格式:-v <宿主机目录>:<容器目录>
• bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。
会自动进入容器,运行如下命令
[root@ac43d254403c /]# uname -a
查看系统版本号,可以看到内核和64位的版本
[root@ac43d254403c /]# cat /etc/os-release
1
可以看到更详细的系统版本情况
ac43d254403c 这个很重要,用来标记容器实例的名称
通过 exit 退出这个容器,这个容器也随之删除了
后台模式启动容器(正式环境使用)
在正式使用时我们当然不能会每次都在退出终端时删除容器了,那样就没法回到宿主机下了。因此我们常使用的方式是让容器实例进入后台模式运行,并执行打印输出hello world到docker中的实例控制台
docker run -d centos bash -c "while true; do echo hello world; sleep 1; done"6a85f6eae05c50efacf3e592ad2208d8a5ec2ab1c7191cce6ac1c1d9c5f7875b
在输出中,我们没有看到是一串长字符
6a85f6eae05c50efacf3e592ad2208d8a5ec2ab1c7191cce6ac1c1d9c5f7875b
这个长字符串叫做容器ID,对每个容器来说都是唯一的
因为一个机器可以启动多个容器,这个ID就起到了唯一标识的作用
查看运行的实例进程
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES5f0580926e17 centos "/bin/sh -c 'while t…" 5 seconds ago Up 4 seconds vigilant_tesla
CONTAINER ID:容器ID
NAMES:自动分配的容器名称
COMMAND :执行的命令
在容器内使用docker logs命令,查看容器内的标准输出
docker logs 容器ID或者NAMES
docker logs 5f05
hello world
hello world
停止容器
我们使用 docker stop 命令来停止容器:
docker stop vigilant_tesla
或者是使用ID
docker stop 5f05
启动容器
docker start vigilant_tesla
上面我们关闭的容器实例运行起来了, docker ps可以看到它的启动状态
java在docker中的安装
做java环境镜像之前必须先做操作系统,可以从docker的库中用docker pull imagename下载,也可以自己制作镜像
必要条件:
1.已经安装centos镜像
2.已经有centos启动的容器实例
以上步奏在前面的步奏中已经完成,因此目前有一个centos的实例容器名称叫vigilant_tesla
如果在镜像实例中通过exit退出docker环境后我们接下来安装jdk
下载并安装jdk8.0
http://download.oracle.com/
去官网下载到本地之后,使用sftp上传到主机中
下面这种方式存在问题:
这种方法默认是没有同意官方协议的下载,jar包是一个错误的格式,因此无法解压使用。
yum install wget
wget http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.tar.gz[root@localhost ~]# lsjdk-8u171-linux-x64.tar.gz
宿主机和docker实例之间的文件拷贝
可以用命令【docker cp 文件名称 容器id : 容器下的路径】把相应的安装文件复制到容器中
docker cp ./jdk-8u171-linux-x64.tar.gz vigilant_tesla:/mnt/
通过这个命令就把主机上的jdk文件拷贝到容器实例中的路径/下面了
进入容器
[root@localhost ~]# docker exec -it vigilant_tesla bash[root@5f0580926e17 /]# ls mnt/jdk-8u171-linux-x64.tar.gz
从主机中进入运行中的容器我们才能看到是里面的文件是否存在,可以看到jdk已经进来了。
配置jdk
和在主机中配置模式是一样的,这里直接看命令
[root@5f0580926e17 /]# cd mnt/[root@5f0580926e17 mnt]# tar -zxvf jdk-8u171-linux-x64.tar.gz [root@5f0580926e17 mnt]# ls jdk1.8.0_171[root@5f0580926e17 mnt]# vi ~/.bashrc
配置文件
export JAVA_HOME=/mnt/jdk1.8.0_171#export JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$JAVA_HOME/bin:$PATH
生效
[root@5f0580926e17 mnt]# source ~/.bashrc
至此我们就创建了一个有jdk的容器实例,我们可以把它打包为一个镜像文件。
通过上面的方式我们知道了一个镜像的内容是怎么制作出来的,它需要基本的操作系统,然后是相关的基础文件安装,整个安装过程都是在其他镜像实例的基础上进行的。因此操作起来还是很一个漫长的过程,但是一旦制作成功,我们就可以直接使用制成镜像运行起来,非常方便。
创建镜像
查看当前正在运行中的容器
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES21708d1896bd tomcat "catalina.sh run" 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp tomcat5f0580926e17 centos "/bin/sh -c 'while t…" 7 hours ago Up 6 hours vigilant_tesla
根据容器vigilant_tesla制作一个新的镜像,因为它本身已经包含了centos和java,因此这里我们取名为centos:java
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
[root@localhost ~]# docker commit --author "bamboo <zjcjava@163.com>" --message "java" vigilant_tesla centos:java
sha256:8a6ba946d54a5ab4e511ed4317d9ceb4eff50366b0c3595aec6b0a7ba9badcbe
–author 是指定修改的作者,
–message 则是记录本次修改的内容
查看所有本地镜像,可以看到centos的tag为java的已经出现在下方了。
[root@localhost ~]# docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE
centos java 8a6ba946d54a 15 seconds ago 777MB
tomcat latest 33e02377a00f 2 weeks ago 554MB
nginx latest b175e7467d66 2 weeks ago 109MB
centos latest e934aafc2206 3 weeks ago 199MB
lwieske/java-8 latest 6e05355899ef 3 months ago 164MB
hello-world latest f2a91732366c 5 months ago 1.85kB
tomcat镜像的使用
这里我们直接使用tomcat镜像,不再像上面的方式使用,比较上面的步骤还是很繁琐的。
通过这个镜像我们看看它都是什么内容,其实和jdk的内容大同小异
docker pull tomcat docker run --name tomcat -p 8080:8080 -d tomcatdocker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES21708d1896bd tomcat "catalina.sh run" 17 seconds ago Up 14 seconds 0.0.0.0:8080->8080/tcp tomcat5f0580926e17 centos "/bin/sh -c 'while t…" 4 hours ago Up 4 hours vigilant_tesla
命令说明:
-p 8080:8080:将容器的8080端口映射到主机的8080端口
进入容器终端模式
docker exec -it tomcat bash
root@21708d1896bd:/usr/local/tomcat# lsLICENSE RELEASE-NOTES bin include logs temp workNOTICE RUNNING.txt conf lib native-jni-lib webapps
可以看到,其实就是把tomcat的文件放在了容器里面,和java的安装方式是一抹一样的。
打开宿主机的端口可以看到容器的服务启动起来了
http://192.168.1.101:8080/
版权声明:本文为zjcjava原创文章,转载请注明出处http://blog.csdn.net/zjcjava https://blog.csdn.net/zjcjava/article/details/78523213
以上是关于Docker第二篇:镜像的基本使用-搭建Centos系统和JDK的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes第二篇:从零开始搭建k8s集群(亲测可用)
Docker——使用docker工具管理软件/组件的运行,镜像容器数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境
Docker——使用docker工具管理软件/组件的运行,镜像容器数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境