自学内容网 自学内容网

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)!