基于centos7.4的docker化nignx前端部署笔记 - IAMSBLOL/RecordOfApplicationLayer GitHub Wiki
本笔记包括docker、DockerFile、nginx相关知识。 基本上是docker化部署nginx的完整例子与相关知识摘要。 注意:这是基于centos7.4的例子
宿主机->镜像->容器。简单来说,就是电脑上的一个进程。
宿主机就是你的电脑,镜像一般都是在docker.hub上找的官方镜像,然后使用dockerFile定制自己的镜像。
镜像是分层的,使用dockerfile的时候,命令尽量用&&连接起来,尽量想办法操作更少写,不然会一层一层的叠加,导致镜像体积增大。
创建完镜像后,需要docker run镜像生成容器。
可以使用docker命令操作容器,比如使用”卷“关联宿主机与容器内部文件关联。宿主机文件更改会同步到容器。
基本简述完毕。
==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前几位,自己会匹配的
这个放到最后介绍,走路得一步一步走,步子迈大了容易扯蛋。
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
一般不会直接使用官方镜像,会经过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 .
==重点==:需要理解构建镜像的上下文。
使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。
docker build -t cjefd:v1 -f /docker/Dockerfile .
# -t镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
# -f是dockerfile路径
==最后一个.,是当前目录,也就是构建上下文。第一个构建中,COPY . .就是当前目录到镜像的WORKDIR==
第一次可能会比较久,耐心等待即可。
存在镜像后,按照容器那样启动就行了。至于映射端口这个,自己随意。记得在服务器安全组添加就好。
实话说,nginx官方镜像的日志和debug模式不生效啊。难道是我弄错了?
至于逆向代理和负载均衡这些概念和配置,百度一下你就晓得。
废话不BB,直接上配置:
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;
}
}
}