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 的镜像:

d o c k e r i m a g e r m (docker image ls -q redis) 
或者删除所有在 mongo:3.2 之前的镜像:

d o c k e r i m a g e r m (docker image ls -q -f before=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




 

人海茫茫孤影浮


伞如浮萍风飘雨

平平淡淡的

普通经历

一个工作多于生活的
程序员
自述
牧竹子


坐标/深圳

CSDN博客:blog.csdn.net/zjcjava/

Email:zjcjava@163.com 






以上是关于Docker第二篇:镜像的基本使用-搭建Centos系统和JDK的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes第二篇:从零开始搭建k8s集群(亲测可用)

Docker——使用docker工具管理软件/组件的运行,镜像容器数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境

Docker——使用docker工具管理软件/组件的运行,镜像容器数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境

Docker应用之仓库

项目案例第二篇中小型公司优化性能安全篇

巨蟒python全栈开发linux之cento9