docker将Java、vue、nginx打进镜像(涉及容器打成镜像)
一、背景
一个项目更新需要打成镜像包发布。
docker+springboot.jar+vue静态文件+nginx
本文不讲安装docker,安装好安装,镜像源稍微麻烦点
二、操作
抄作业原文 传送门
按照上文拉取centos7,然后将需要的东西直接打进脚本,这样最简单,但是在拉取过程中,初始镜像contos7安装nginx需要安装一些工具包,拉取的时候报错了,原因还是在镜像源上,并且还想在上面装一些工具,另外创建容器不应该在里面做很多初始化的东西,每次更新业务包就行,为了解耦,所以先自己定制一个操作系统镜像,然后再创建应用。
1、创建初始镜像
1)生成镜像并创建容器
# docker images 一下,看看有没有镜像,没有的话拉一个,一般都有
docker pull centos:7
# 创建一个容器 eeb6ee3f44bd镜像id
docker run -itd eeb6ee3f44bd
# 查看下
docker ps -a
# 进入到容器里,安装自己想装的东西
docker exec -it 356f118b8866 /bin/bash
2)安装一些定制的东西
# 拉取的镜像执行这个 才能安装gcc 要不报错
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装这些依赖 必须安装 安装nginx会用到
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
# 再装个网络工具,以便于后面查看端口
yum install net-tools
yum -y install telnet-server
3)将此容器打成镜像
# 前两个参数是作者和描述 后买两个参数一个是容器id 一个是镜像名称和tag
sudo docker commit -a "test" -m "create new img" 2633c8af37b4 centos:v1
# 查看多了一个镜像
docker images
2、安装业务应用
mkdir -p /data/testa
准备下列文件,web是vue打出来的静态文件,其他文件一眼能看出来
-rw-r--r--. 1 root root 2519 Jul 15 00:18 Dockerfile
-rw-r--r--. 1 root root 185515842 Jul 15 00:18 jdk-8u144-linux-x64.tar.gz
-rw-r--r--. 1 root root 1062124 Jul 15 00:18 nginx-1.20.2.tar.gz
-rw-r--r--. 1 root root 2626 Jul 15 00:18 nginx.conf
-rw-r--r--. 1 root root 216162708 Jul 15 00:18 project-service-v1.0.65.gjj.2-springboot.jar
-rw-r--r--. 1 root root 647 Jul 15 00:18 run.sh
drwxr-xr-x. 7 root root 125 Jul 15 00:19 web
1)创建 nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
# user nginx;
worker_processes auto;
error_log /usr/local/nginx/logs/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 100m;
include /usr/local/nginx/conf/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html/public;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
index index.php index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
server {
listen 8088;
server_name localhost;
location / {
root /usr/local/project/web;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://localhost:8080/; #设置监控后端启动的端口
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2)生成Dockerfile
FROM centos:v1
# 描述作者和邮箱,可只写其中一个,也可二个都写
MAINTAINER test
# 时区与字符设置UTF-8并配置环境
ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8
# 在容器里面创建一个java目录,用来放拷贝过来的文件,RUN用来执行linux命令
RUN mkdir /usr/local/java
# 在容器内创建一个project目录和子目录web,用来存放后端jar包和前端打包好的静态页面
RUN mkdir -p /usr/local/project/web
# 把jdk-8u144-linux-x64.tar.gz添加到容器中,文件必须要和你的Dockerfile在同一级目录里面,ADD命令会自动将.gz文件拷贝到容器里面并自动解压
ADD jdk-8u144-linux-x64.tar.gz /usr/local/java/
# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
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 project-service-v1.0.65.gjj.2-springboot.jar /usr/local/project
#将前端打包好的静态文件复制到容器里面的5gsignplay-web目录下面,COPY复制不了文件本身,只能复制文件里面的内容,所以要提前在容器里面创建一个前端目录
COPY web /usr/local/project/web
#配置nginx,将nginx搬到容器里面自动解压
ADD nginx-1.20.2.tar.gz /usr/local/java/
#进入/usr/local/java/nginx-1.20.2目录进行安装和编译
WORKDIR /usr/local/java/nginx-1.20.2
#安装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"]
3)创建run.sh
#!/bin/bash
# 启动nginx服务
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#启动后端jar包,日志打印不额外存储
nohup java -Xms1024m -Xmx1024m -Xss5120k -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:ParallelGCThreads=13 -XX:ConcGCThreads=8 -XX:InitiatingHeapOccupancyPercent=70 -jar /usr/local/project/project-service-v1.0.65.gjj.2-springboot.jar >>nohup.out 2>&1 &
#使这个脚本一直处于运行状态,如果不这样,当这个脚本命令执行结束后,docker容器会立即停止运行,所以这里需要让这个脚本一直运行,使docker容器一直处于运行状态
while [[ true ]];do
sleep 1
done
4)准备文件完成后执行下面的就行(如果配置文件不对,比如nginx的配置等先进入镜像手动调整好,没问题了,再删除掉容器和镜像重新制作镜像即可)
# 生成镜像
docker build -t gjj .
# 查看镜像
docker images
# 创建容器 可以加多个-p 这个就是端口的一个映射 gjj第一个是容器的名字 第二个人是镜像像
docker run -d -p 8088:8088 --name gjj gjj
# 查看容器
docker ps -a
# 进入到容器 可以看看应用都起来没
docker exec -it 6d0ba39493fc /bin/bash
# 删除容器先停止 后删除
docker stop 6d0ba39493fc
docker rm 6d0ba39493fc
原文地址:https://blog.csdn.net/qq_37752382/article/details/140437551
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!