根目录新建 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