基于centos7.4的docker化nignx前端部署笔记 - IAMSBLOL/RecordOfApplicationLayer GitHub Wiki

概述

本笔记包括docker、DockerFile、nginx相关知识。 基本上是docker化部署nginx的完整例子与相关知识摘要。 注意:这是基于centos7.4的例子


Docker

概念简述

宿主机->镜像->容器。简单来说,就是电脑上的一个进程。

宿主机就是你的电脑,镜像一般都是在docker.hub上找的官方镜像,然后使用dockerFile定制自己的镜像。 镜像是分层的,使用dockerfile的时候,命令尽量用&&连接起来,尽量想办法操作更少写,不然会一层一层的叠加,导致镜像体积增大。

创建完镜像后,需要docker run镜像生成容器。

可以使用docker命令操作容器,比如使用”卷“关联宿主机与容器内部文件关联。宿主机文件更改会同步到容器。

基本简述完毕。

安装dokcer

官方文档地址

==docker -v==查看版本。如果已经存在相对较旧的版本,你可能不支持一些新语法。所以需要先卸载。

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

执行以下命令安装依赖包:

sudo yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2

鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。

执行下面的命令添加 yum 软件源:

sudo yum-config-manager \
    --add-repo \
    https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo


# 官方源
# $ sudo yum-config-manager \
#     --add-repo \
#     https://download.docker.com/linux/centos/docker-ce.repo

如果需要测试版本的 Docker CE 请使用以下命令:(反正我不用)

sudo yum-config-manager --enable docker-ce-test

如果需要每日构建版本的 Docker CE 请使用以下命令:

sudo yum-config-manager --enable docker-ce-nightly

更新 yum 软件源缓存,并安装 docker-ce。

sudo yum makecache fast
sudo yum install docker-ce

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:

curl -fsSL get.docker.com -o get-docker.sh

sudo sh get-docker.sh --mirror Aliyun

启动docker ce

sudo systemctl enable docker
sudo systemctl start docker

测试一下安装是否成功

docker -v

镜像

获取镜像

前端嘛,除了需要nginx,我们还需要个Node镜像。
为啥还要个Node镜像,直接装环境不就好了?毕竟在centos上装node还是有点恶心的

nginx

docker pull nginx

node

docker pull node

查看是否获取成功

docker images
#你会看到很多镜像相关的内容

操作镜像

删除

docker image rm [name|tag]
# 可以tag前几位,自己会匹配的

dockerfile定制镜像

这个放到最后介绍,走路得一步一步走,步子迈大了容易扯蛋。

容器

docker run --name [容器名] [参数] [镜像名]

例子:

 docker run --name some-nginx -t -i -p 3003:80 -v /some/content:/usr/share/nginx/html:ro -d nginx

参数简介:

参数 解释
-t 表示在新容器内指定一个伪终端或终端
-i 表示允许我们对容器内的STDIN进行交互
-d 让docker容器在后台运行。
-p 指定端口映射,格式为:主机(宿主)端口:容器端口
-P (大写的)随机端口映射,容器内部端口随机映射到主机的高端口
-v 定义卷,简单说就是宿主机文件容器可以访问
--name 容器名

其他配置详解

查看容器是否在运行:

docker ps 
# docker ps -as 
# 这个是查看所有容器

进入容器:

docker exec -it [容器名] /bin/bash
#例子:docker exec -it some-nginx /bin/bash

copy宿主机内容到容器

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# 从容器copy到宿主机
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 从宿主机copy到容器
#例子:docker cp /some/content/docker/nginx.conf test1:/etc/nginx

删除容器

docker rm 容器名
# 例子:docker rm test

Dockerfile

一般不会直接使用官方镜像,会经过Dokcerfile定制在使用。 先去看看这个语法文档相关

看完后,看看这个例子加深理解。
每一条命令都是一层commit。下次build会对比md5,如果改动了会重新跑,所以通用的先写或者多条命令其实性质一致的时候应该合并。

# 指定node镜像并且名为builder
FROM node as builder 
# ARG SERVER_ENV=prod
# 指定工作目录
WORKDIR /usr/src/app
# 复制多个文件的语法之一,最后一项是镜像路径。
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", ".npmrc", "./"]
# RUN
RUN npm install
# COPY当前目录全部到镜像/usr/src/app
COPY . .
#打包
RUN npm run build

# 指定nginx镜像
FROM nginx
# 类似定义卷的操作,定义上海时间
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 指定nginx的配置路径
WORKDIR /etc/nginx/
# 指定了/etc/nginx/,使用相对路径“./”,也可以绝对路径/etc/nginx/
COPY docker/nginx.conf ./
# 重新指定工作路径
WORKDIR /usr/share/nginx/html/
# 从node镜像copy静态文件到 /usr/share/nginx/html/ 下
COPY --from=builder /usr/src/app/dist .

docker build

菜鸟教程详细介绍

==重点==:需要理解构建镜像的上下文。

使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。

docker build -t cjefd:v1 -f /docker/Dockerfile . 
# -t镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
# -f是dockerfile路径

==最后一个.,是当前目录,也就是构建上下文。第一个构建中,COPY . .就是当前目录到镜像的WORKDIR==

第一次可能会比较久,耐心等待即可。

存在镜像后,按照容器那样启动就行了。至于映射端口这个,自己随意。记得在服务器安全组添加就好。

nginx

实话说,nginx官方镜像的日志和debug模式不生效啊。难道是我弄错了?

至于逆向代理和负载均衡这些概念和配置,百度一下你就晓得。

废话不BB,直接上配置:

中文文档

英文文档

W3CSHCOOL

user  nginx;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes  auto;

error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;


events {
    # 理论上最大为65535连接数
    worker_connections  2048;
    #设置网路连接序列化,防止惊群现象发生,默认为on
    accept_mutex on;
    #设置一个进程是否同时接受多个网络连接,默认为off   
    multi_accept on;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    #charset utf-8;

    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_CORK socket 选择
    tcp_nodelay   on;    # 数据在传输的过程中不进缓存

    keepalive_timeout  65;
    
    gzip  on;            # 压缩资源
    gzip_min_length  1k;         # 允许压缩的对象的最小字节
    gzip_buffers  4 32k;         # 压缩缓冲区大小,表示申请4个单位为32k的内存作为压缩结果的缓存
    gzip_http_version  1.1;      # 压缩版本,用于设置识别HTTP协议版本 默认也是1.1.
    gzip_comp_level  9;          # 压缩级别,1级压缩比最小但处理速度最快,9级压缩比最高但处理速度最慢
    gzip_types  text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript application/json;    # 允许压缩的媒体类型
    gzip_vary  on;               # 该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用代理服务器缓存经过Nginx压缩的数据

    # 这个是配置代理的引入,但是我们没必要酱紫
    # include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;

        # 支持https
        #ssl on;  
        #指定PEM格式的证书文件   
        # ssl_certificate      /etc/nginx/test.pem;   
        #指定PEM格式的私钥文件  
        # ssl_certificate_key  /etc/nginx/test.key;  
        root   /usr/share/nginx/html; #注意构建镜像时静态文件路径
        index  /index.html index.htm;

        location / {
            try_files $uri $uri/ /index.html; #react-router404解决方案
        }

        location /wrong/url {
            return 404;
        }

        #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   /usr/share/nginx/html;
        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
            deny  all;
        }
    }
}

⚠️ **GitHub.com Fallback** ⚠️