3.1 容器反打镜像
#将java服务制作成镜像
#java服务依赖于动态库
#动态库对底层linux信号量参数有要求,不能用默认信号量参数,docker启动容器时配置文件按默认信号量运行,信号量参数需要在容器启动的时候进行加载,加载后demo服务才能运行起来
#从一个已经存在的容器创建一个新的镜像
#以上是前提条件,相关资源如下
demo-1.0.jar
libdemo_jni.so
application.yml
gcc_rpm.tar
setuptools-41.1.0.zip
supervisor-4.2.5.tar.gz
jdk-8u152-linux-x64.tar.gz
start.sh
3.1.1 运行基础镜像容器centos:7
#拉centos基础镜像
docker pull centos:7
#运行centos基础镜像,容器id为d4886e085be8
docker run -it centos:7 /bin/bash
3.1.2 从宿主机复制文件至容器
#容器内在home下创建demo目录
cd home
mkdir demo
#创建lib目录
cd demo
mkdir lib
#退出容器
在容器内exec 回车
#从宿主机复制文件至容器 d4886e085be8 可取容器id前两位d4
docker cp libdemo_jni.so d4:/home/demo/lib
docker cp demo-1.0.jar d4:/home/demo/
docker cp application.yml d4:/home/demo/
docker cp jdk-8u152-linux-x64.tar.gz d4:/home/demo/
docker cp start.sh d4:/home/demo/
3.1.3 基础镜像容器中安装jdk
tar -xvf jdk-8u152-linux-x64.tar.gz
vi /etc/profile
#set java environment
JAVA_HOME=/home/demo/jdk1.8.0_152
JRE_HOME=/home/demo/jdk1.8.0_152/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
LD_LIBRARY_PATH=/home/demo/lib
export JAVA_HOME JRE_HOME CLASS_PATH PATH LD_LIBRARY_PATH
3.1.4 基础镜像容器中修改信号量
#修改信号量
vi /etc/sysctl.conf
kernel.sem = 2000 125000 32 500
#加载信号量生效,当打为镜像时,启动容器后信号量加载会失效
sysctl -p
#查看信号量
cat /proc/sys/kernel/sem
ipcs -l
3.1.5 基础镜像容器中gcc安装
tar-xvf gcc_rpm.tar
#强制安装
rpm -ivh *.rpm --nodeps --force
3.1.6 基础镜像容器中setuptools工具安装
安装包:https://pypi.org/project/setuptools/41.1.0/#files
解压安装:unzip setuptools-41.1.0.zip解压到本地 ,
进入解压后的文件夹中,执行python setup.py install即可。
3.1.7 基础镜像容器中Supervisor二进制版本安装
#解压
tar -xvf supervisor-4.2.5.tar.gz
cd supervisor-4.2.5/
#安装
./setup_supervisor.sh
#启动脚本
/home/demo/supervisor-4.2.5/start_supervisor.sh
3.1.8 start.sh脚本内容
#!/bin/bash
#启动容器时使信号量生效
sysctl -p
/home/demo/supervisor-4.2.5/start_supervisor.sh
echo "================start====================="
java -jar /home/demo/demo-1.0.jar
echo "=================end====================="
3.1.9 将修改后的基础镜像容器打镜像
docker commit d4 demo:v1
3.2 dockerfile直接制作镜像
3.2.1 Dockerfile编写
# 使用官方 CentOS 基础镜像,假如时普通的java服务,基础镜像可以直接使用jdk,不用单独安装
FROM centos:7
# 复制 JDK 和其他文件到容器中
COPY jdk-8u152-linux-x64.tar.gz /home/mg/
COPY start.sh /home/demo/
COPY demo-1.0.jar /home/demo/
COPY application.yml /home/demo/
COPY libdemo_jni.so /home/demo/lib/
COPY gcc_rpm.tar.gz /home/demo/
COPY setuptools-41.1.0/ /home/demo/setuptools-41.1.0
COPY supervisor-4.2.5.tar.gz /home/demo/
#根据情况加入java服务需要验证网卡地址和cpu序列号及有普通用户执行的服务时需要将以下包安装
#COPY net-tools-deprecated-2.0+git20170221.479bb4a-3.11.x86_64.rpm /home/demo/
#COPY dmidecode-3.2-5.el7.x86_64.rpm /home/demo/
#COPY sudo-1.8.23-10.el7.x86_64.rpm /home/demo/
#设置环境变量
ENV TZ=Asia/Shanghai
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENV JAVA_HOME=/usr/lib/jdk1.8.0_152
ENV PATH=${PATH}:${JAVA_HOME}/bin
ENV LD_LIBRARY_PATH=/home/demo/lib
# 解压JDK包使环境变量生效
RUN tar -xvf /home/demo/jdk-8u152-linux-x64.tar.gz -C /usr/lib/ \
&& rm -f /home/demo/jdk-8u152-linux-x64.tar.gz \
&& echo "kernel.sem = 2000 125000 32 500" > /etc/sysctl.conf \
&& tar -zxf /home/demo/gcc_rpm.tar.gz -C /home/demo/ \
&& rm -f /home/demo/gcc_rpm.tar.gz \
&& rpm -ivh /home/demo/gcc_rpm/*.rpm --nodeps --force \
# 设置工作目录
WORKDIR /app
# 暴露端口(假设你的应用运行在8080端口)
EXPOSE 18089
# 定义容器启动时执行的命令,运行你的 JAR 包
CMD ["/home/demo/start.sh"]
3.2.2 Dockerfile制作镜像
#在Dockerfile同级目录下制作镜像
docker build -t demo:v1.0 .