docker制作自定义的tomcat镜像,并且镜像可以在启动新容器后自动启动(方便后期做k8s端口暴露)

本为原创,转载请说明出处!
环境准备:
1、centos 7.4并且可以链接阿里的镜像源
2、通过阿里源已经部署docker
3、准备主机:192.168.226.135 master
4、需要链接外网,并配置yum源(下载阿里镜像会用到)

技能要求:
1、了解基本docker命令

软件包准备:
jdk-8u144-linux-x64.tar.gz
下载地址:https://pan.baidu.com/s/1jJyfm-uWQucsswt5WDY0kQ
提取码:pvyj

apache-tomcat-10.0.0-M7.tar.gz
下载地址:https://pan.baidu.com/s/16fg1BIbtY6eiolsjF8NZZA
提取码:0qxh

镜像制做:
1、定义阿里的docker镜像仓库:

[root@vm135 opt]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.226.135:5000"]     #这里是做为本地镜像私库时设置,这里可以不添加此行
}
[root@vm135 opt]# systemctl restart docker

2、下载docker基础版centos镜像,我这里下载的是centos8.1

[root@vm135 opt]# docker search centos
[root@vm135 opt]# docker pull docker.io/centos

3、用基础centos基本版镜像创建容器

[root@vm135 opt]# docker run -itd docker.io/centos:latest /sbin/init       #这里需要注意用/sbin/init来创建新的容器,不能用/bin/bash,否则后面做tomcat开机自启时systemctl会无效
#如果在docker里不能使用systemctl可以在创建docker时添加--privileged=true来指定初始化程序为/sbin/init
[root@vm135 opt]# docker  ps     #会显示容器ID号(随机创建,这里是:4b7f13bac473)
[root@vm135 opt]# docker  exec -it  4b  bash     #进入容器:4b代表上面的容器ID号,bash是指/bin/bash

4、在基础容器里安装一些小工具(确保yum可以用)

(1)ifconfig命令

[root@4b7f13bac473 /]#  yum  -y  install net-tools 

(2)vim编辑器

[root@4b7f13bac473 /]#  yum -y install vim

(3)tab补全键
安装epel 源

[root@4b7f13bac473 /]#  yum -y install epel-release

安装bash-completion超强的命令补全工具

[root@4b7f13bac473 /]#  yum -y install bash-completion

立即生效

[root@4b7f13bac473 /]#  source /etc/profile.d/bash_completion.sh  

或者退出终端重新登录

(4)安装sshd(此可以不用安装)

[root@4b7f13bac473 /]# yun -y install  openssh-server openssh-client

5、部署JAVA_HOME
下载jdk-8u144-linux-x64.tar.gz并上传到容器里,方法有很多,这里是下载到本地,再传到容器里。

[root@vm135 opt]# docker cp   /opt/jdk-8u144-linux-x64.tar.gz   4b7f13bac473:/usr/local/java/

#把本机上opt下的jdk上传到容器里的java目录下(此地址随意,如果容器里没有java目录可以手动创建一个再上传)

在容器里执行:这里是在/root/.bashrc里添加的,如果在/etc/profile里添加,容器新创建时不会立即生效,需要到容器里再执行source /etc/profile才能生效。

[root@4b7f13bac473 /]# tar -xf  /usr/local/java/jdk-8u144-linux-x64.tar.gz

[root@4b7f13bac473 /]#  vim  /root/.bashrc   
export JAVA_HOME=/usr/local/java/jdk1.8.0_144

6、部署tomcat

[root@vm135 opt]# docker cp   /opt/apache-tomcat-10.0.0-M7.tar.gz   4b7f13bac473:/usr/local/tomcat/
[root@vm135 opt]# docker  exec -it  4b  bash     #进入容器
[root@4b7f13bac473 /]#  cd /usr/local/tomcat/
[root@4b7f13bac473 tomcat ]#  tar  -xf  /usr/local/tomcat/apache-tomcat-10.0.0-M7.tar.gz
[root@4b7f13bac473 tomcat ]# mv apache-tomcat-10.0.0-M7  tomcat-10.0.0
[root@4b7f13bac473 tomcat ]#  cd tomcat-10.0.0
[root@4b7f13bac473 tomcat-10.0.0]# bin/startup.sh   #启动tomcat是否正常
[root@4b7f13bac473 tomcat-10.0.0]# bin/shutdown.sh #关闭tomcat

7、配置tomcat开机自启(也就是创建容器后自动开启tomcat)

[root@4b7f13bac473 tomcat-10.0.0]# cd bin/
[root@4b7f13bac473 bin]# vim  catalina.sh
#找到[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME" 这一行,一般在153行。在这行下方添加:
CATALINA_PID="$CATALINA_BASE/tomcat.pid"

创建tomcat.service文件:

vim /lib/systemd/system/tomcat.service
内容如下:
[Unit]
Description=Tomcat
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking

Environment="JAVA_HOME=/usr/local/java/jdk1.8.0_144"  #这里添加jdk的路径

PIDFile=/usr/local/tomcat/tomcat-10.0.0/tomcat.pid  #这里是tomcat.pid的位置,就是上步在catalina.sh里添加的
ExecStart=/usr/local/tomcat/tomcat-10.0.0/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
[root@4b7f13bac473 bin]# systemctl daemon-reload
[root@4b7f13bac473 bin]# systemctl start tomcat

验证tomcat是否启动了

[root@4b7f13bac473 bin]# netstat -tunlp

把tomcat加入到开机自启动

[root@4b7f13bac473 bin]# systemctl  enable tomcat

8、创建自定义的镜像

[root@vm135 ~]# docker commit -m "admin" -a "docker-tomcat" 4b7f13bac473 tomcat:v1.01

#-m是指定创建的信息,即详细说明,-a是指定制作者,后面以次是容器ID,新创建的镜像信息。

[root@vm135 ~]# docker images

9、验证:

[root@vm135 ~]# docker run -itd tomcat:v1.01  /sbin/init
[root@vm135 ~]# docker ps
[root@vm135 ~]# docker exec -it 容器ID  bash

进入容器后可用netstat -tunlp命令查看tomcat已经启动

备注:后续会再优化本文,如有不足请提出,会尽快修改。

### 回答1: 如果Docker启动Tomcat镜像自动退出,可能是由于以下几个原因引起的: 1. Tomcat容器没有持久化数据:Docker容器默认是无状态的,当容器停止时,容器内部的所有数据都会丢失。要保持Tomcat容器的数据持久化,可以通过挂载宿主机上的目录到容器中,例如使用`docker run -v /path/on/host:/path/on/container`来启动容器。 2. Tomcat启动失败:可能是由于Tomcat配置文件错误、端口冲突等原因导致Tomcat启动失败。可以查看容器的日志输出,使用`docker logs <container_name>`命令查看具体的错误信息,然后相应地解决问题。 3. 容器资源不足:如果Docker宿主机的资源(内存、CPU等)不足,可能会导致容器启动后立即退出。可以检查宿主机的资源占用情况,确保足够的资源供Tomcat容器使用。 4. Tomcat镜像本身的问题:有时候Tomcat镜像本身可能存在问题,导致启动后立即退出。可以尝试使用其他版本的Tomcat镜像自定义构建Tomcat镜像来解决问题。 总之,要解决Docker启动Tomcat镜像启动自动退出的问题,我们需要仔细检查容器的配置和日志输出,确保容器具有足够的资源和正确的配置,以及保证Tomcat容器的数据持久化。 ### 回答2: 当Docker启动Tomcat镜像后立即退出的原因可能有以下几种: 1. 没有指定正确的启动命令:在运行Docker容器时,我们需要通过`docker run`命令指定正确的启动命令,以确保Tomcat能够成功启动并保持运行。例如,正确的启动命令可以是`docker run -d -p 8080:8080 tomcat`,其中`-d`表示以守护进程的方式后台运行容器,`-p`表示将宿主机的8080端口映射到容器的8080端口上,`tomcat`表示所使用的Tomcat镜像。如果启动命令有误或者缺失关键参数,Tomcat可能会启动失败并导致容器自动退出。 2. Tomcat的配置文件有错误:Tomcat的配置文件,如`server.xml`、`web.xml`等,如果存在错误配置,可能会导致Tomcat启动时出现异常。这些错误可能包括端口冲突、无效的路径、无效的XML配置等。当Tomcat启动失败时,Docker容器可能会因为Tomcat的异常退出而关闭。 3. 容器内存不足:如果给Tomcat容器分配的内存不足,Tomcat启动过程中可能会因为无法分配足够的资源而导致异常退出。因此,我们需要适当地调整Docker容器的内存分配,以满足Tomcat的运行需求。 4. Tomcat镜像的问题:有时,所使用的Tomcat镜像本身可能存在问题。这可能是由于不稳定的构建过程、错误的配置或其他问题导致的。如果这是问题的根本原因,建议尝试使用另一个Tomcat镜像或检查是否存在更版本,以解决启动自动退出的问题。 综上所述,当Docker启动Tomcat镜像自动退出时,我们需要检查启动命令、Tomcat配置、容器内存和镜像本身等方面的问题,以找到并解决导致退出的原因。 ### 回答3: docker启动tomcat镜像自动退出的原因可能有多种。 首先,可能是由于在Dockerfile中定义了CMD或ENTRYPOINT指令,但没有指定后台运行选项。若没有使用-d或--detach参数来运行容器,则容器会在启动后立即退出。解决办法是在docker run命令中添加-d选项,将容器以后台模式运行,例如: ``` docker run -d tomcat ``` 其次,可能是由于容器内的进程启动失败或异常导致。可以通过查看容器的日志来了解具体的错误信息。可以使用docker logs命令来查看容器的日志输出,例如: ``` docker logs <container_id> ``` 解决该问题的方法通常是检查容器的配置文件、环境变量和依赖项是否正确设置,并确保容器所需的端口没有被其他进程占用。 另外,如果tomcat镜像是在运行时需要绑定宿主机的目录或文件的,可能是由于宿主机上对应的目录或文件不存在或权限不足而导致容器启动后立即退出。可以通过docker run命令的-v选项来映射宿主机的目录或文件到容器中,确保目录或文件存在且具有足够的访问权限。 总结起来,要解决容器启动自动退出的问题,首先要检查容器的运行模式是否为后台模式,然后查看容器的日志以了解具体的错误信息,并确保容器的配置、环境和依赖项正确设置,并确保相关的目录或文件存在且具有足够的权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值