day104 dockerfile多阶段构建java的容器

day104 dockerfile多阶段构建java的容器

前提

层层递进,每一个镜像,都可以作为公共的镜像,让其他的镜像再使用。

使用公共的资源

而非一个镜像,包罗万象

优化,是一个玄学,没有场景,就没有场景下的优化

死记硬背,是根本不适合的,

只有合适的选择,没有最准确的选择。

前提

我们目前构建一个docker的镜像
都是一个文件,一个完整的镜像,环境加上代码

centos

centos + nginx + flask + jdk

centos + php-fpm

基于jdk,部署多个阶段的镜像

1.centos基础镜像(基础镜像,可以给很多其他的镜像,作为一个bash image(基础镜像,)
时区环境,
容器内部的环境,支持中文


# 写一个Dockerfile 


RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo;
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo;
FROM centos:7.6.1810
RUN  yum install net-tools bash-completion supervisor vim  -y \
&& yum clean all \
&& rm -rf /etc/localtime \
&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 


构建镜像
docker build -t base_centos .
2.jdk基础镜像 base_centos + jdk java 运行的环境 
运行 (业务1jar包部署)
这个也就是修改环境的变量,安装jdk

# 本地准备好一个/etc/profile ,加入环境变量
1. 找到一个干净的/etc/profile (其实就是一个干净的环境变量)
2. 其实开启一个新的centos容器发送到一个目录即可。


[root@docker-100 jdk-centos]# docker ps
CONTAINER ID   IMAGE             COMMAND            CREATED          STATUS          PORTS     NAMES
6744ed4d2e28   centos:7.6.1810   "ping baidu.com"   35 seconds ago   Up 29 seconds             crazy_robinson
[root@docker-100 jdk-centos]# docker cp 674:/etc/profile .
Successfully copied 3.58kB to /mutil-images/jdk-centos/.
[root@docker-100 jdk-centos]# 
[root@docker-100 jdk-centos]# 
[root@docker-100 jdk-centos]# ll
total 4
-rw-r--r-- 1 root root 1819 Oct 31  2018 profile

# 修改profile的文件加入jdk的环境

[root@docker-100 jdk-centos]# tail -5 profile 
export JAVA_HOME=/opt/jdk
export TOMCAT_HOME=/opt/tomcat
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH

export CLASSPATH=.$CLASSPATH:$JAVA_HOME/bin:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar


# 准备构建centos + jdk 的安装包
[root@docker-100 jdk-centos]# lsc
jdk-8u221-linux-x64.tar.gz  profile


# 写Dockerfile
FROM base_centos
ADD jdk-8u221-linux-x64.tar.gz /opt
ADD profile /etc/profile
RUN ln -s /opt/jdk1.8.0_221 /opt/jdk
ENV JAVA_HOME /opt/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin


# 构建jdk基础环境,可以再组合jdk+hadoop jdk+es  jdk_springboot等。
[root@docker-100 jdk-centos]# docker build -t base_jdk:1.8.0 .

# 查看镜像
[root@docker-100 jdk-centos]# docker images 
REPOSITORY               TAG              IMAGE ID       CREATED          SIZE
base_jdk                 1.8.0            a881f340546c   32 seconds ago   693MB
base_centos              latest           047524a2dd40   21 hours ago     286MB


# 启动容器
docker run -it base_jdk:1.8.0 bash 

# 查看jdk的版本
[root@e199b670cba0 /]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

到了第三层部署应用--->halo博客

docker run -d -p 8090:8090 -v /multi-iamges/jdk-centos/jar-app:/jar-app/ base_jdk:1.8.0   java -jar /jar-app/halo-1.4.1.jar
7e5129e0a98dc27f7d789c14152b3bfd89df316e96c6aafeff33e8e4899e70e3

重要的是jpress 博客,用的是自己的数据库

jpress 博客,用的是自己的数据库
# 如何连接数据库
1. 连接redis ? id:port
2. 还是yum部署给宿主机? ip:port
3. 还是连接容器内的宿主机 IP:port(确保jpress博客数据的安全)


# 下载mysql的镜像
[root@docker-100 jdk-centos]# docker pull mysql:5.7.25


# 启动数据库的容器
docker run -e MYSQL_ROOT_PASSWORD='linux0224'  -d -p 3306:3306  -v /var/lib/mysql:/var/lib/mysql   mysql:5.7.25 
# 数据库有了
# 部署后台了,源码的准备
[root@docker-100 war-app]# ll
total 67640
-rw-r--r-- 1 root root 69261961 May 22 12:02 jpress.war

# 准备一个tomcat的运行环境
# 建立一个公共的tomcat + supervisor 环境
# 准备一个tomcat 的包
[root@docker-100 tomcat_centos]# ls
apache-tomcat-8.0.27.tar.gz  jpress.war  tomcat.ini


# docker内的进程运行,必须是前台运行
# /opt/tomcat/bin/catalina.sh run,run指令会让tomcat前台运行
# 准备一个supervisor的配置文件
cat > tomcat.ini << 'EOF'
[program:my-tomcat]
command=/opt/tomcat/bin/catalina.sh run
autostart=true
autorestart=true
startsecs=5
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile=/var/log/supervisor/tomcat.log
EOF::

# 准备一个Dockerfile构建环境

# Dokcerfile


FROM base_jdk:1.8.0
ADD apache-tomcat-8.5.82.tar.gz /opt
RUN ln -s /opt/apache-tomcat-8.5.82 /opt/tomcat



# 构建tomcat镜像
docker build -t base_tomcat:8.5.82 .


# 查看镜像的环境
[root@docker-100 tomcat_centos]# docker run -it base_tomcat:8.5.82 bash
[root@62b929ab2b27 /]# env

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/jdk/bin
PWD=/
JAVA_HOME=/opt/jdk
SHLVL=1
HOME=/root
CLASSPATH=/opt/jdk/lib:/opt/jdk/jre/lib
_=/usr/bin/env


[root@6cce04cfe8b9 /]# /opt/tomcat/bin/catalina.sh  version 
Using CATALINA_BASE:   /opt/tomcat
Using CATALINA_HOME:   /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME:        /opt/jdk/jre
Using CLASSPATH:       /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.27
Server built:   Sep 28 2015 08:17:25 UTC
Server number:  8.0.27.0
OS Name:        Linux
OS Version:     3.10.0-1160.71.1.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_221-b11
JVM Vendor:     Oracle Corporation
[root@6cce04cfe8b9 /]# 

运行jpress博客

Dockerfile构建环境,加入supervisor

supervisor + tomcat + 业务代码 ====运行环境镜像

FROM base_jdk:1.8.0
ADD apache-tomcat-8.0.27.tar.gz /opt
RUN ln -s /opt/apache-tomcat-8.0.27 /opt/tomcat
COPY jpress.war  /opt/tomcat/webapps/
COPY tomcat.ini /etc/supervisord.d/
RUN sed -i 's/nodaemon=false/nodaemon=true/g' /etc/supervisord.conf
EXPOSE  8080
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
# 创建镜像
docker build -t base_tomcat:8.5.82 .


#运行博客 
docker run -d --name test-jpress -p 8080:8080  --link test-mysql  base_tomcat:8.5.82

最后看到这里就表示ok

posted @ 2025-05-22 14:14  国家一级冲浪yzk  阅读(42)  评论(0)    收藏  举报