dockerfile自定义镜像安装jdk8,nginx,后端jar包和前端静态文件,并启动容器访问
- 简介
- centos7系统里面我准备的服务如下:
- 5gsignplay-web静态文件内容如下:
- nginx.conf配置文件内容如下:
- Dockerfile内容如下:
- run.sh启动脚本内容如下:
- 制作镜像并启动访问
简介
通过用dockerfile来制作一个自定义的镜像,基础镜像是centos7,然后里面安装jdk8,安装nginx,启动的后端jar包,以及前端打包的静态文件,将这些放到一个docker容器里面,然后启动容器访问项目。
centos7系统里面我准备的服务如下:
这里我将测试需要的文件都放在了/opt/wrapper/test目录下面。
5gsignplay-web静态文件内容如下:
nginx.conf配置文件内容如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name 192.168.5.43;#填写你的宿主机ip
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/local/project/5gsignplay-web;
index index.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
}
Dockerfile内容如下:
FROM centos:7
# 描述作者和邮箱,可只写其中一个,也可二个都写
MAINTAINER test test@163.com
# 时区与字符设置UTF-8并配置环境
ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8
# 在容器里面创建一个java目录,用来放拷贝过来的文件,RUN用来执行linux命令
RUN mkdir /usr/local/java
# 在容器内创建一个project目录和子目录5gsignplay-web,用来存放后端jar包和前端打包好的静态页面
RUN mkdir -p /usr/local/project/5gsignplay-web
# 把jdk-8u172-linux-x64.tar.gz添加到容器中,文件必须要和你的Dockerfile在同一级目录里面,ADD命令会自动将.gz文件拷贝到容器里面并自动解压
ADD jdk-8u172-linux-x64.tar.gz /usr/local/java/
# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_172
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
#将后端jar包复制到容器里面的project
COPY 5gsignplay-consumer-0.0.1.jar /usr/local/project
#将前端打包好的静态文件复制到容器里面的5gsignplay-web目录下面,COPY复制不了文件本身,只能复制文件里面的内容,所以要提前在容器里面创建一个前端目录
COPY 5gsignplay-web /usr/local/project/5gsignplay-web
#配置nginx,将nginx搬到容器里面自动解压
ADD nginx-1.18.0.tar.gz /usr/local/java/
#进入/usr/local/java/nginx-1.18.0目录进行安装和编译
WORKDIR /usr/local/java/nginx-1.18.0
#安装nginx的四个依赖
RUN yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
#配置环境,考虑到后续安装ssl证书 添加两个模块
RUN ./configure --with-http_stub_status_module --with-http_ssl_module
#make编译,make install安装,make && makeinstall的意思就是执行make如果没有发生错误就执行make install
RUN make && make install
#将nginx.conf拷贝到容器里面nginx安装后的目录,make install安装成功后,/usr/local下面会多出一个nginx目录,所以这里需要将nginx.conf拷贝到/usr/local/nginx文件目录里面
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
#将启动脚本拷贝到容器里面的/usr/local/project下面
COPY run.sh /usr/local/project
#给run.sh可执行权限
RUN chmod 777 /usr/local/project/run.sh
#对外暴露80,8880端口,暴不暴露端口没有什么影响,重要的是要在启动的时候使用-p映射宿主机端口:容器端口,暴露端口你也得使用-p映射端口
#EXPOSE 80 8880
#通过脚本同时启动后端jar包和nginx
CMD ["sh","/usr/local/project/run.sh"]
run.sh启动脚本内容如下:
#!/bin/bash
# 启动nginx服务
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#启动后端jar包,日志打印不额外存储
nohup java -jar /usr/local/project/5gsignplay-consumer-0.0.1.jar >/dev/null 2>& 1 &
#使这个脚本一直处于运行状态,如果不这样,当这个脚本命令执行结束后,docker容器会立即停止运行,所以这里需要让这个脚本一直运行,使docker容器一直处于运行状态
while [[ true ]];do
sleep 1
done
制作镜像并启动访问
然后docker build -t 5gsignplay . 开始制作镜像,这里的.表示dockerfile文件的当前位置,
-t 是给自己制作的镜像取名。
然后用docker images查看自己的镜像文件
使用docker run -d -p 80:80 -p 8880:8880 --name 5gsignplay 5gsignplay启动镜像,
-d表示后台启动,-p是映射宿主机端口:容器端口,–name 第一个5gsinplay是给容器起名叫5gsignplay,第二个5gsignplay是镜像名称。
然后通过docker ps查看正在运行的docker容器,发现容器在正常运行。
docker ps -a可用来查看历史运行过的容器。
如果你想进入运行中的容器,可以使用docker exec -it 6652c30befd3 /bin/bash就能进入5gsignplay容器里面:
查看容器里面的nginx和jar包是否启动:
发现都是正常启动
退出容器输入exit即可退出容器。
因为你的容器里面的nginx监听端口是80,然后这里又将容器的80端口映射给了宿主机的端口,所以本地浏览器访问前端页面地址就是访问你宿主机的ip即可。
如:http://192.168.5.43/即可访问到页面
好了我的docker学习自定义镜像打包先记录到这里。