前端工程化 - Docker 部署Node项目、Nginx容器(二)

Docker容器化部署Node、Nginx容器,以上一篇文章安装的Docker为基础环境。基于Nodejs博客系统来详细说明,记得点赞哦

一、前言

使用 Docker 容器来部署Nodejs后台以及ngnix,ngnix使用源代码方式安装。本文中使用 Dockerfile 的方式来构建发布此项目(博客系统)。Dockerfile 是 由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

二、Nodejs 镜像部署

1. 准备工作

  • Dockerfile 文件(下面有详细说明)

  • HarlieBlog.tar.gz (代码压缩文件,注意代码中的后台服务接口以及端口不要写错)

2. Dockerfile 文件

# 定制需要的基础镜像 node:14 为所需要的基础镜像
FROM node:14
# 标签 如镜像作者
LABEL maintainer HarlieYang
# ADD 指令和 COPY 的使用格式一致.在执行 <源文件> 为 tar 压缩文件的话,会自动复制并解压到 <目标路径>
ADD HarlieBlog.tar.gz /
# 执行后面的命令行命令
RUN cd HarlieBlog \
    && npm install -g cnpm --registry=https://registry.npm.taobao.org  \
    && cnpm install 
# 工作目录
WORKDIR /HarlieBlog/server
# 设置端口
EXPOSE 7000  
# 用于运行程序 CMD在docker run时执行, RUN在docker build时执行
CMD ["node", "app.js"]

3. Docker 打包此镜像

# -t:镜像的名字及标签  -f:  Dockerfile 文件所在位置 
# 最后一个参数指定的是 docker build 的 workdir
docker build -t blog-node-server-image -f /root/blog-node-server/Dockerfile /root/blog-node-server
docker images

4. 容器运行,完成Nodejs后台项目部署

# -p: 端口映射,这里后台服务端口为7000
docker run -di --name blog-node-server -p 7000:7000 blog-node-server-image
# 进入容器命令行
docker exec -it blog-ngnix-static /bin/bash
# 打印日志查看
docker logs -f blog-node-server

三、静态文件部署 ngnix

1. 准备工作

  • 准备Dockerfile 文件

  • nginx-1.15.5.tar.gz (http://nginx.org/download/)

  • ngnix.conf (ngnix的配置文件)

  • blog.conf (静态文件所对应的ngnix相关配置)

  • blog (打包好的静态文件)

2. Dockerfile 文件

# centos:7为基础镜像 
FROM centos:7 
# 标签 如镜像作者
LABEL maintainer HarlieYang 
# yum安装环境 
RUN yum install -y gcc gcc-c++ make \   
    openssl-devel pcre-devel gd-devel \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*   

RUN mkdir -p /var/www/html/blog
COPY blog /var/www/html/blog/
ADD nginx-1.15.5.tar.gz / 

RUN cd nginx-1.15.5 && \
    ./configure --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --with-http_gzip_static_module && \
    make -j 4 && make install && \
    mkdir /usr/local/nginx/conf/vhost && \
    cd / && rm -rf nginx* && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 配置ngnix环境变量
ENV PATH $PATH:/usr/local/nginx/sbin 
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY blog.conf /usr/local/nginx/conf/vhost/
# 工作目录
WORKDIR /usr/local/nginx 
# 网页端口这里设置为3000
EXPOSE 3000 
# 启动ngnix
CMD ["nginx", "-g", "daemon off;"]

3. blog.conf 文件

server {
    listen 3000;
    server_name blog.test.local;
    root /var/www/html/blog/;
    index index.html index.htm;
        gzip on;
        gzip_comp_level 9;
        gzip_static on;
    location / {
       try_files $uri $uri/ /index.html;
      # index index.html;
    }
    #设置需要跨域的指定文件
    location ^~/upload/ {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET,POST';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        alias /data/web/res/;
    }
}

4. ngnix.conf 文件

user                 nobody;
worker_processes     4;
worker_rlimit_nofile 65535;
error_log  logs/error.log  notice;
pid        /var/run/nginx.pid;
events {
    use epoll;
    worker_connections  4096;
}

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 off;
    keepalive_timeout  65;
    client_max_body_size         64m;
    include /usr/local/nginx/conf/vhost/*.conf;
    server {
        listen 80;
        server_name localhost;
        index index.html;

        location / {
            root html;
        }
    }
}

5. Docker 打包此镜像

docker build -t blog-ngnix-static-image -f /root/blog-ngnix-static/Dockerfile /root/blog-ngnix-static
docker images

6.容器运行,完成ngnix + 静态文件部署

# 前台界面使用 3000 端口
docker run -di --name blog-ngnix-static -p 3000:3000 blog-ngnix-static-image
docker exec -it blog-ngnix-static /bin/bash
docker logs -f blog-ngnix-static

三、结尾

在写Dockerfile文件时,建议先基于基础镜像将 Dockerfile 文件中的命令执行一遍,这样就不会在 docker build 打包遇到问题时很迷茫(我就经历了好几次这样的状况)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容