Jansiel Notes

Docker 发布前端包

创建项目配置

1. 新建项目或使用已有项目

项目的代码如果创建和架构如果不清楚,请自行百度

1	 mkdir my_project

2. 创建 "docker" 文件夹

1	cd my_project && mkdir docker

3. 进入 "docke" 文件夹

1	cd docker

4. 创建 "Dockerfile" 构建镜像的文本文件

a. 创建文件

1	vim Dockerfile  or vi Dockerfile

b. 文件内容

1	FROM nginx:1.17-alpine
2
3	ADD ./html /usr/share/nginx/html
4	ADD nginx.conf /etc/nginx/nginx.conf
5
6	EXPOSE 80
7
8	CMD ["nginx", "-g", "daemon off;"]

5. 创建 项目 "nginx" 配置文件

a. 创建文件

1	vim nginx.conf  or vi nginx.conf

b. 文件内容

nginx 配置就不做代码注释了,如果不清楚请自行百度

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
	worker_connections  1024;
}
http {
	include       /etc/nginx/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  /var/log/nginx/access.log  main;
	sendfile        on;
	keepalive_timeout  65;
    client_max_body_size 20m;
    
	upstream proxy-service {
		server ipcdc.pdcts.com.cn;
	}

	server {
		listen       80;
		server_name  localhost;

		location / {
			root   /usr/share/nginx/html;
			try_files $uri $uri/ /index.html;
			add_header Cache-Control "no-cache";
		}
		location /login/ {
			root   /usr/share/nginx/html;
			try_files $uri $uri/ /login/index.html;
			add_header Cache-Control "no-cache";
		}
		location /catalogue/ {
			root   /usr/share/nginx/html;
			try_files $uri $uri/ /catalogue/index.html;
			add_header Cache-Control "no-cache";
		}
		location /api/ {
			proxy_pass http://proxy-service;
		}
				error_page   500 502 503 504  /50x.html;
		location = /50x.html {
			root   /usr/share/nginx/html;
		}
	}
}

6. 回到项目跟目录创建 "scripts" 文件夹

1		mkdir scripts

7. 进入 "scripts" 目录

1		cd scripts

8. 创建 build-deploy.sh 文件

本文件是用于打包前端项目与把 docker 一些文件输入 景象中
TODO: dist 目录是项目打包后的目录,如果打包目录不是dist可以吧本文件中的所有dist 修改为对应的目录
TODO: 如果打包目录是build 需要吧本文件中的build 修改一下名称,因为本文件会吧打包后的文件移动到build目录中,还有一下其他的操作
TODO: 上面的两条TODO说明的大概意思是,代码打包目录不是dist 修改本文件中的dist 为打包目录名称,如果打包目录是build,就需要修改 本文件的build 为其他名字

a. 创建文件

1	vim build-deploy.sh  or vi build-deploy.sh

b. 文件内容

 1#!/bin/bash
 2# Create a zip package which contains all the files to build the docker image
 3# 获取包版本 ---package.json文件中的 version
 4pkgVersion=$(grep -oE '"version":\s*"[^"]+' -m 1 ./package.json | grep -oE '[^"]+$')
 5# 获取包名称 ---package.json文件中的 name 
 6pkgName=$(grep -oE '"name":\s*"[^"]+' -m 1 ./package.json | grep -oE '[^"]+$')
 7deployDir=$pkgName
 8echo Building deployment $pkgName@$pkgVersion.
 9
10rm -rf ./build
11
12npm run build
13#打包完成后创建 ./build/html/ 目录
14mkdir -p ./build/html/
15# 把dist目录中的内容 移动到 ./build/html/ 目录
16mv ./dist/* ./build/html/
17# 把docker目录中的内容 移动到 ./build/目录
18cp -r docker/* ./build/
19# 把./package.json 移动到 ./build/目录
20cp ./package.json ./build/
21#创建 ./build/scripts 目录
22mkdir -p ./build/scripts/
23# 把 ./scripts/build-docker.sh 移动到 ./build/scripts 目录
24cp ./scripts/build-docker.sh ./build/scripts
25# 把 ./scripts/build-docker.sh 移动到 ./build/scripts 目录
26cp ./scripts/run-docker.sh ./build/scripts
27
28echo deployDir: $deployDir
29rm -rf $deployDir
30mv ./build/ $deployDir
31zip -r $deployDir.zip ./$deployDir
32mv $deployDir ./build
33
34## 删除dist目录
35rm -rf ./build
36rm -rf ./dist
37
38echo "The deployment package is at ${deployDir}.zip, it's ready to be uploaded to the server."
39
40# git commit -m 'ci: version '$pkgVersion
41# git tag -f $pkgVersion
42# echo "Git tag $pkgVersion is created. please push it to your remote repo."

9. 创建 build-docker.sh 文件

这个文件主要是用于上传服务器或在本级运行 docker 时把前端项目给注入到 docker中的

a. 创建文件

1	vim build-docker.sh  or vi build-docker.sh

b. 文件内容

 1#!/bin/bash
 2
 3pkgVersion=$(grep -oE '"version":\s*"[^"]+' -m 1 ./package.json | grep -oE '[^"]+$')
 4
 5pkgName=$(grep -oE '"name":\s*"[^"]+' -m 1 ./package.json | grep -oE '[^"]+$')
 6
 7echo "Attention: This script should only be executed in generated deploy folder."
 8
 9docker build -t $pkgName:$pkgVersion ./
10

10. 创建 run-docker.sh 文件

本文件用于 启动本项目的 docker 服务

a. 创建文件

1	vim run-docker.sh  or vi run-docker.sh

b. 文件内容

 1#!/bin/bash
 2# 获取项目版本信息
 3pkgVersion=$(grep -oE '"version":\s*"[^"]+' -m 1 ./package.json | grep -oE '[^"]+$')
 4# 获取项目包名
 5pkgName=$(grep -oE '"name":\s*"[^"]+' -m 1 ./package.json | grep -oE '[^"]+$')
 6
 7if [ -z $pkgName ]; then
 8echo Package name not found.
 9exit 1
10fi
11
12# 停止当前的Docker容器
13runningContainerId=$(docker container inspect $pkgName -f '{{.Id}}')
14if [ ! -z "$runningContainerId" ]; then
15    echo Found existing container $runningContainerId
16    echo Stopping
17    docker container stop $runningContainerId
18    echo Removing
19    docker container rm $runningContainerId
20fi
21
22# 创建bridge网络, mgmt-net可以修改,为什么要使用NetWork?由于在Dockerfile的文件配置需要设置网络参数
23docker network create mgmt-net
24
25# 启动Docker容器 ,注意如果上边的创建bridge网络名有修改,启动命令的名称也需要同步修改
26echo Starting cotnainer with image $pkgName:$pkgVersion
27docker run -p 7123:80 --restart on-failure -d --network weapps-net --name $pkgName $pkgName:$pkgVersion
28
29# 本地部署
30#docker run -p 7123:80 -v /data/weapps-deploy/web-config/nginx.conf:/etc/nginx/nginx.conf --restart on-failure -d --network mgmt-net --name $pkgName $pkgName:$pkgVersion

项目打包

1. 拉取项目依赖

具体使用什么工具需要看 项目需要

1	gnpm install 
2	or
3	gnpm i

2. 打包前端项目

项目打包后为压缩文件,文件名是package.json的name名称

1	sh scripts/build-deploy.sh

3. 上传前端项目到服务器

name: 是package.json的name名称
serverIP: 服务器链接IP
path: 上传服务器的目录
如果本地可以不执行 此项

1	ssh ./${name}.zip root@${serverIP}:/${path}

4. 解压打包后的项目

name: 是package.json的name名称

1	unzip ./${name}.zip

5. 进入项目文件夹

name: 是package.json的name名称

1	cd ./${name}

6. 向docker注入项目镜象

1	sh scripts/build-docker.sh

7. 查看docker中有没有项目镜象

1	docker images

8. 启动前端项目

1	sh scripts/run-docker.sh

9. 查看前端项目状态

多执行几次,有时候启动速度没那么快

1	docker ps

补充

1. docker 启动没有成功,查看日志

projectID:docker ps 中查找项目ID

1	docker logs ${projectID}

2. docker查看网络内部信息

1	docker network inspect default_network

3. 列所有列表的网络

1	docker network  ls

4. 移除指定的网络

1	docker network rm default_network

5. docker进入容器内部执行命令

projectID:docker ps 中查找项目ID
退出docker容器内部:"exit"

1	docker exec -it ${projectID} sh

7. 停止docker项目

projectID:docker ps 中查找项目ID

1	docker stop ${projectID}

8. 默认显示正在运行中的container

-a : 包括未运行的
-l : 运行中的

1	docker ps
2	or 
3	docker ps -a

9. 删除一个或多个container

projectID:docker ps 中查找项目ID

1	docker rm ${projectID}

10. 删除所有的container

1	docker rm `docker ps -a -q`
2	or
3	docker ps -a -q | xargs docker rm 

11. 删除docker镜像

mirrorID : docker images中查找

1	docker rmi ${mirrorID}

12. 开启/停止/重启container

projectID:docker ps 中查找项目ID

1	docker start/stop/restart ${projectID}

13. 清空不被使用的虚悬镜像

1	docker image prune -f