• 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
    
  • 相关阅读:
    【Java八股文总结】之消息队列
    ​力扣解法汇总1624-两个相同字符之间的最长子字符串
    【03】概率论基础
    C语言大战“扫雷”
    小程序页面跳转
    Python从基础到项目实战——基础篇
    建筑结构抗震分析之施加地震波的方法与理论机理
    现代C++学习指南-类型系统
    华为交换机:STP的详解和试验
    1326_ADC模块以及功能参数初步
  • 原文地址:https://blog.csdn.net/qq_37752382/article/details/140437551