East's Blog

Docker 部署

根目录新建 Dockerfile 文件

# Dockerfile

FROM node:latest

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "index.js"]

为了避免将现有的 node_modules 复制进去, 所以在根目录新增一个 .dockerignore 文件

# .dockerignore

node_modules
npm-debug.log

打开 terminal,将项目打包成一个 Docker 镜像

docker build . -t eastxiyeah/test.dev

然后用 docker run 运行测试一下

docker run -p 3000:3000 -d eastxiyeah/test.dev

使用浏览器,查看项目情况,简单测试一下,大致可以后,将这个 Docker 容器停止运行。

然后通过 SSH 连上服务器

ssh -A -i ~/.ssh/id_rsa####### [email protected]

这里使用了 -A ,目的是将本机的 SSH Agent 传递到服务器上,那么在服务器上,也能使用自己的 SSH 密钥进行操作。

所以我可以直接在服务器上运行 git clone ,将 GitHub 上的仓库下载下来,然后运行 docker build 生成 Docker 镜像,再运行 docker run 启动容器

git clone [email protected]:eastxiyeah/test.dev.git

cd test.dev/

docker build . -t eastxiyeah/test.dev

docker run -p 3000:3000 -d eastxiyeah/test.dev

docker ps

可以看到 Docker 容器已经在运行当中,curl 测试一些路由,看是否能够拿到正常的响应

curl http://127.0.0.1:3000

好了,现在这个网页应用运行在 3000 端口,正常的 HTTP 端口是 80,HTTPS 端口是 443,可以通过 nginx 网页服务器使用反向代理的方式,将 80/443 端口的请求导向至 3000 端口。新增一个 nginx 的配置文件

sudo su

cd /etc/nginx/sidet-available/

vim test.dev
server {
	server_name test.dev www.test.dev; # 设定域名,包括www的版本
	location / {
		proxy_pass http://172.20.0.30:3000;
		proxy_buffering off;
		proxy_set_header Host $host;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Real-IP $remote_addr;
	}
}
cd ..
cd sites-enabled/
ln -s /etc/nginx/sites-available/test.dev test.dev

nginx -t

nginx -t 指令检查一下设定有没有问题,没有问题,运行 service nginx reload 重新载入一下设定。在浏览器测试一下。

刚才我只配置了 nginx 80 端口的反向代理,为什么现在可以通过 https 访问呢,这是因为在 Cloudflare 中启动了 https 的功能,而 Cloudflare 本身又会通过反向代理将请求至我们服务器的 80 端口上,这让我们不需要在自己的服务器上安装 SSL 证书都可以启用到 https 的功能。

之后如果代码有修改,需要重新部署:

docker stop 454 && docker rm 454 # 停止和删除原来的容器
cd test.dev/
git pull # 获取最新的代码

docker build . -t eastxiyeah/test.dev # 生成新版本的Docker镜像
docker run -p 3000:3000 -d --net project_sd-net --ip 172.20.0.30 eastxiyeah/test.dev