docker创建javaweb容器并部署应用

在实际生产应用中,一台服务器上可能同时部署了多个应用,为了很好的对各个应该或系统进行安全隔离,同时也为了增强系统的可移植性,可以对系统进行容器化封装,也就是在docker容器中部署相关应用,对docker的接触时间并不长,很多高大上的专业知识和词汇并不是特别了解,只是把docker简单的理解为一个新的虚拟环境,在这里不需要特别担心内存和CPU分配等一些配置问题,本文就介绍如何创建一个docker容器并部署一个javaweb应用

网上说创建docker镜像一般分为两种,一种是启动一个纯净的系统容器,然后在容器里安装所需依赖,一种是编写dockerfile,对于第二种不是很懂,就以第一种为例

准备工作:

1,需要一台可以连外网的服务器,连外网也不是必须的,只是在联网是情况下,很多依赖下载会很方便,不然需要不断的手动添加,既繁琐还容易出错

2,这台服务器已经安装了docker服务,相关安装方法可以网上搜到很多,这里不在介绍


第一步:下载系统镜像(以CentOS为例),默认会下载最新版本的centos镜像,如果想要下载指定版本号的镜像,可以在命令后边添加版本号,如:docker pull centos:7.2.1511

使用命令:docker images  查看下载情况,因为我之前下载过,所以会出现两个,可以看到大小只有200多兆

docker创建javaweb容器并部署应用_第1张图片


第二步:根据该镜像创建容器

docker创建javaweb容器并部署应用_第2张图片

其中,-it为参数,表示以“交互模式”进行容器,并在容器启动后进行命令行模式,所以执行万以后,会看到前边方括号的地方变化了,表示我们已经进到这个centos的容器里

eeb6ee3f44bd为刚才docker images命令中看到的镜像ID(IMAGE ID),启动容器的时候,以镜像ID来启动

/bin/bash为初始命令

其实,启动容器的参数也很丰富,具体可自行查找使用,比如添加  -v <宿主机目录>:<容器目录>  参数表示将本地哪个目录挂载到容器中等等

当我们执行完上述运行命令后,已经进入到容器中,如果退出,使用exit即可,这个时候查看已经运行的容器列表发现并没有我们刚才创建的那个容器,是因为退出后默认这个容器就停止了

查看已经运行的容器列表命令:docker ps

怎么才能找到我们刚才创建的容器呢?使用命令:docker ps -a

查看所有容器,然后使用容器启动命令,运行刚才创建的centos容器:docker start stupefied_perlman

docker创建javaweb容器并部署应用_第3张图片

其中,stupefied_perlman为容器名称,在我们创建这个容器的时候,如果没有指定名称,那个docker会给他一个默认的名称,这里就是默认的,具体这个命名规则是啥,我也不清楚,总是运行的时候使用名称就对了

start以后出现这个容器名称就表示已经运行起来了,相应的关闭容器使用命令:docker stop stupefied_perlman

我们这个时候在使用命令docker ps,就可以看到这个centos容器了


第三步:在容器中添加相应依赖

容器创建好以后,需要进入到容器中添加相关依赖,进入容器的命令如下:

其中参数-it后边既可以写容器名称,也可以使用容器ID,相应的,退出容器命令为exit

进入容器后,就可以当作一个centos虚拟机,在里边主要安装JDK和TOMCAT,传入安装包,创建路径,解压安装,配置环境变量等,网上教程很多,不在赘述

以我已经创建好的为例,安装完以后可分别查看

  docker创建javaweb容器并部署应用_第4张图片


第四步,在网上诸多教程中,这一步需要配置容器的启动环境变量并编写运行脚本,目的是在启动容器的时候能够同时启动tomcat,同理,在停止tomcat的时候,容器也跟着一起停止了,这里可以参考这篇博客,写的很详细:

Docker容器部署Java web应用(容器基础上创建新镜像)_wangyuanjun008的博客-CSDN博客_docker容器java

但是我不想这样,我想的是这个容器就是一个centos的运行环境,tomcat的启动与否需要我自己手动控制,这样更符合我自己的使用习惯,我不希望tomcat已关闭,容器就停止了

经过反复尝试,发现如果想要实现我这个要求,最简单的就是不配置启动环境变量即可,但是后续的步骤和连接中的步骤存在一些命令上的差别,按照我这个思路继续执行步骤如下:


第五步:将已经部署了环境依赖的容器提交为新镜像

docker创建javaweb容器并部署应用_第5张图片

这里,提交新镜像的命令为:docker commit f74d3b0fa1a5 javaweb8,其中f74d3b0fa1a5为刚才的容器ID,javaweb8为新镜像名称,提交完以后执行docker images ,可以看到这个新镜像,我这里使用的是已经安装好的,如果第一次使用,容器ID应该是安装了JDK和tomcat的46b15c89d3b4


第六步,基于新镜像运行javaweb容器

docker创建javaweb容器并部署应用_第6张图片

图中第一条命令,是和之前链接中的不同之处,这里的运行命令不使用参数-d,初始命令也不是启动脚本,而是和启动centos容器一样使用/bin/bash,后续步骤和centos容器一样,退出后容器也会停止,然后再次start启动即可

第一条启动命令中,参数-p用来做宿主机和容器的端口映射,宿主机端口在前,容器端口在后,中间用冒号  :  隔开,参数--name为新容器命名,新容器名称在前,镜像名称在后,中间用空格隔开

然后我们进入到新容器中,就可以在tomcat的webapps路径下部署war包运行了


补充:

1,关于容器和宿主机的通信方式,网上说docker容器是通过NAT技术和宿主机进行通信的,对于docker-->宿主机-->外网,在docker容器中的系统可以直接配置成外网地址进行访问,对于外网-->宿主机-->docker容器,则是通过端口映射,下面这篇博客对整个包的流程做了较为详细的分析:

Docker容器访问外部世界 - 南宫乘风 - 博客园

2,docker创建centos容器后,默认使用的是UTC时区,和北京时间相差八小时,修改方法为:修改Docker容器的时间和宿主时间一致_IChen.的博客-CSDN博客_docker 修改时间与宿主时间一致

在容器中依次执行:

cd /etc

mv localtime localtime_bak

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

查看更改后的时间:date

3,上文所述的centos容器中,是一个纯净的容器,里边缺少很多相关包和命令,比如常用的which,gcc,telnet等,都需要在容器里一一安装,所以在创建基于centos的javaweb容器时,要首先明确Java应用都需要哪些功能需求和测试需求,在centos容器里提前安装好相应包和命令,然后在提交生成javaweb镜像,这样javaweb容器创建后就可以直接使用了,因为我们的Java部署环境大都不支持外网连接,所以如果发现缺少命令,可能需要重新基于centos创建新javaweb容器,给维护带来繁琐

4,docker里的应用如何访问宿主机的数据库?

首先在宿主机上执行ifconfig,找到docker0的网卡,查看他的IP地址

docker创建javaweb容器并部署应用_第7张图片

然后在Java应用的数据库配置里,数据库地址写上刚才的ip即可

docker创建javaweb容器并部署应用_第8张图片

5,删除镜像和删除容器命令

删除容器:docker rm <容器名称>

docker创建javaweb容器并部署应用_第9张图片

删除镜像:docker rmi <镜像名称>

docker创建javaweb容器并部署应用_第10张图片

你可能感兴趣的:(docker,docker,容器,运维)