tomcat

上一节讲到了dockerfile的基础,这一次咱们来作一个小的练习

首先要了解tomcat安装的整个过程

首先搭建 jdk环境:

下载jdk包,解压以后添加环境变量

而后搭建tomcat:

下载tomcat包,解压,修改配置文件到一个工做目录

而后给工做目录加入一些东西,访问。java

From centos

add ./jdk-8u191-linux-x64.tar.gz /usr/local

add ./apache-tomcat-8.5.35.tar.gz /usr/local

ENV JAVA_HOME /usr/local/jdk

ENV CLASSPATH $JAVA_HOME/lib/

ENV PATH $PATH:$JAVA_HOME/bin

RUN mkdir -p /var/www/www.fz.com

VOLUME /var/www/www.fz.com

RUN cd /usr/local/ && mv apache-tomcat-8.5.35 tomcat && mv jdk1.8.0_191 jdk

copy ./server.xml /usr/local/tomcat/conf/

copy ./mysql-connector-java-5.1.7-bin.jar /usr/local/tomcat/lib/

workdir /usr/local/tomcat

CMD bash bin/startup.sh && tail -f logs/catalina.out

这是整个dockerfile的文件。我来一次解释一下

From centos:

这个没什么好说的就是一个基础的centos的源镜像

add:

两个源码包 一个是jdk的一个是tomcat的包

ENV:这里会设置环境变量,就是三个jdk的环境变量

RUN:执行命令,建立一个tomcat的工做目录,

VOLUME:和上面一块儿,建立目录以后把他映射到宿主机,以即可以在外部把具体的页面代码放入。

RUN: 运行命令把tomcat放到制定目录并解压

copy:第一个是把tomcat的配置文件的副本拷贝进去,第二个是拷贝jdbc的包,以便之后链接数据库时用。

workdir:后面的命令都是在/usr/local/tomcat下运行

最后一个CMD很关键。

前面讲过,docker的镜像运行以后在执行完命令就会自动关闭,必需要给他一个可以挂在后台运行的命令,好比说你在run后面会加上 /bin/bash等等让他保持活跃的状态。否则它就会自动关闭。

这里若是只有打开tomcat而没有后面的加载日志,那么就会在打开以后容器立刻又关闭了。因此docker ps就看不见 须要用 ps -a看全部的容器,会发现容器是关闭的。 就须要用刷新日志的方式让tomcat在后台与进行。保持容器的开启状态。

前面的须要的文件放在和dockerfile一个目录下ok了。

而后编译运行

dockerfile添加nohup dockerfile添加java,mysql_dockerfile添加nohup

dockerfile添加nohup dockerfile添加java,mysql_mysql_02

而后运行

dockerfile添加nohup dockerfile添加java,mysql_mysql_03

中间一部分省略

dockerfile添加nohup dockerfile添加java,mysql_dockerfile添加nohup_04

就能够看见相似与平时的开启tomcat的日志

dockerfile添加nohup dockerfile添加java,mysql_dockerfile添加nohup_05

若是不想要在前台看日志,能够-d挂入后台。如上图所示mysql

mysql源码安装

mysql源码安装的大体过程

1.下载源码包,下载一些依赖包例如gcc等

2.编译安装

3.建立用户和组并赋予权限,而后数据库初始化

4.设置数据库root密码linux

from centos

ADD ./mysql-5.6.35.tar.gz /usr/local/

RUN yum install gcc gcc-c++ ncurses-devel perl cmake make autoconf -y

RUN cd /usr/local/mysql-5.6.35 && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

&& make && make install

RUN groupadd mysql && useradd -r -g mysql mysql && \

chown -R mysql:mysql /usr/local/mysql

ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATH

workdir /usr/local/mysql

RUN scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql \

--datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysql.pid

RUN support-files/mysql.server start && mysqladmin -u root password 'redhat'

COPY ./test.sql /root/

RUN support-files/mysql.server start && mysql -uroot -predhat < /root/test.sql

CMD mysqld --user=mysql

这是个人dockerfile文件

依次解释:

from:镜像源

add:把源码包copy进去并解压

run: 第一个是下载一些依赖包,第二个是编译安装。第三个是用户和权限。

env:环境变量

workdir :工做目录设在mysql目录下

run:数据库初始化,

第二个是开启服务并修改root密码

这里我踩了一个坑,修改密码是要在开启服务的状态下的,一开始我没有开服务,会出错。第二次我知道了要开服务,而后我是先在前面开服务,在后面在加一个run修改密码,也会出错,为何呢?

由于dockerfile每一行命令都是把镜像生成一个容器,而后在容器内执行命令,子啊构建成新的镜像,这样一来,上一个镜像是开启服务,像开启服务把他单独列在一行是没有效果的,由于生成容器开启服务再生成镜像还会同样的镜像,下一个执行修改root密码命令时候已是一个新的镜像了因此服务是没打开的。

copy:而后就是拷贝我本身写的一个mysql的脚本进入docker

run:这个是开启服务而且执行脚本,然数据库生成表插入数据

cmd:这个是前台开启数据库服务。

像前面一个编译并开启就ok了

这里数据库的编译是最基础的,没有不少参数,有需求本身加,而后这里的编译须要的时间可能会有点久。c++