问题描述
服务A是一个静态博客网站,由Nginx提供HTTP服务(80端口),代码仓库为GitA。当向GitA中提交新的文件时,会触发Gitlab的Webhook的Push Events,向另一个端口8888提交一个POST请求。
服务B利用NodeJS,监听了8016端口,当收到webhook触发的POST请求后,会进行一些列的动作,拉取GitA中代码,清空文件夹,利用Hexo进行编译,将编译好的文件提供给服务A使用。
现在我的工作就是要将在传统服务器上的这两个服务迁移到Docker上来。由于这个博客的访问量很小,不用考虑太多优化的问题,所以只能算的上是Dokcer部署的“初步实践”。
如果保持原来的代码不做任何修改,也就是需要同时使用Nginx提供静态服务+NodeJS提供监听编译服务,有下面几种方案:
- 方案一:构建两个镜像,手动控制端口暴露
- 方案二:在同一个容器中,通过npm命令同时启动两个服务
- 方案三:构建两个容器,通过docker compose控制端口
如果对现有的代码进行修改,完全使用NodeJS提供静态服务和监听编译服务,那么就有方案四:完全使用NodeJS进程。
相应的代码在我的代码仓库里。
准备工作
准备.dockerignore
文件
.dockerignore
文件和.gitrignore
文件,也就是制作镜像时排除在外的文件
node_modules
.DS_Store
public
source/_posts
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
public
source/_posts
Win7下docker镜像的ip地址
我的工作电脑是Win7系统,使用的是Docker官方提供的ToolBox的工具,工具使用没有问题,但是遇到了一个小坑,开发完了镜像,通过localhost
访问指定端口,无论如何也连接不上。
后来发现是IP的问题,其实Docker一启动时就告诉了我暴露出来的地址了,奈何我自己眼瞎:
通过docker-machine env
这个命令也可以查看分配的IP,其中export DOCKER_HOST
就是docker镜像分配的IP
$ docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\zhouhao1\.docker\machine\machines\
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env)
所以,应该通过192.168.99.100
加上对应的端口号去访问镜像
准备好之后开始逐个方案进行介绍。
方案一:构建两个镜像,手动控制端口暴露
nginx容器
在Dockerfile中暴露出80端口,映射为本机IP的(http://192.168.99.100)的80端口。
同时在global.conf设定转发规则,将访问api
地址的请求转发到本机IP的8016端口。
最后,在nginx.conf中设定一些基本的nginx配置项,关键点是daemon off
,将nginx服务设定为前台方式运行,这是因为在docker中服务要以前台方式启动。
docker容器默认把容器内部第一个进程,也就是pid=1的进程作为docker容器是否正在运行的依据。如果此程序挂了ÿ