我有一个类似的模板,但不同之处在于它需要heroku中的3个应用程序。
由于每个容器都在单独的应用程序中运行,因此所有容器都暴露于外部世界。
该模板使用 travis 构建容器并将其部署到 heroku。
模板有 3 张图片
* 前端(Nginx - React)
* 后端(Nodejs - Express)
* 服务器(Nginx)
我在下面引用了我的模板的网址。
https://medium.com/@javierfernandes/continuous-deployment-con-docker-travis-heroku-c24042fb830b https://medium.com/@javierfernandes/continuous-deployment-con-docker-travis-heroku-c24042fb830b
Heroku (Docker) nginx 中的 PORT 环境变量 https://stackoverflow.com/questions/49147389/heroku-docker-port-environment-varibale-in-nginx
以下是存储库网址。
https://github.com/pramodramdas/heroku_multi_dockers https://github.com/pramodramdas/heroku_multi_dockers
Steps
- 在heroku中创建3个应用程序。
- 从heroku -> 帐户设置 -> Api Key 获取 api key
-
在travis中创建以下环境变量
HEROKU_USERNAME=_ //下划线
HEROKU_PASSWORD= //来自heroku的Api密钥
HEROKU_API_KEY= //与上面相同的 API 密钥
HEROKU_APP_BACKEND= //不带“.herokuapp.com”的heroku后端应用程序名称
HEROKU_APP_CLIENT= //不带“.herokuapp.com”的heroku前端应用程序名称
HEROKU_APP_NGINX= //不带“.herokuapp.com”的heroku nginx应用程序名称
DOCKER_USERNAME= //dockerhub用户名
DOCKER PASSWORD= //docker hub密码
-
在 nginx heroku 应用程序中创建以下环境变量
HEROKU_APP_BACKEND_URL= //heroku 后端应用程序 URL 示例:xxxxxx.herokuapp.com
HEROKU_APP_CLIENT_URL= //heroku 前端应用程序 URL 示例:xxxxxx.herokuapp.com
我的 nginx 服务器配置。
upstream client {
server $HEROKU_APP_CLIENT_URL;
}
upstream backend {
server $HEROKU_APP_BACKEND_URL;
}
server {
listen $PORT;
location / {
proxy_pass http://client;
proxy_set_header Host $HEROKU_APP_CLIENT_URL;
}
location /api {
proxy_pass http://backend;
proxy_set_header Host $HEROKU_APP_BACKEND_URL;
}
}
前端捆绑通过前端容器内的单独 nginx 服务器进行分割。下面是配置
server {
listen $PORT;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
Docker 文件应该包含将捆绑包复制到 nginx 的命令以及
CMD /bin/bash -c "envsubst '\$PORT \$HEROKU_APP_CLIENT_URL \$HEROKU_APP_BACKEND_URL' < /etc/nginx/conf.d/default.conf > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;'
在 docker 文件末尾以便选择环境变量。
以下是特拉维斯的配置
sudo: required
language: node_js
node_js:
- "9"
services:
- docker
before_install:
- wget -qO- https://toolbelt.heroku.com/install.sh | sh
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- echo "$HEROKU_PASSWORD" | docker login -u "$HEROKU_USERNAME" --password-stdin registry.heroku.com
script:
- docker build -t $DOCKER_USERNAME/docker_client ./frontend_heroku;
- docker tag $DOCKER_USERNAME/docker_client registry.heroku.com/$HEROKU_APP_CLIENT/web;
- docker build -t $DOCKER_USERNAME/docker_backend ./backend_heroku;
- docker tag $DOCKER_USERNAME/docker_backend registry.heroku.com/$HEROKU_APP_BACKEND/web;
- docker build -t $DOCKER_USERNAME/docker_nginx ./nginx_heroku;
- docker tag $DOCKER_USERNAME/docker_nginx registry.heroku.com/$HEROKU_APP_NGINX/web;
deploy:
provider: script
script:
# push to dockerhub & heroku
docker push $DOCKER_USERNAME/docker_client;
docker push registry.heroku.com/$HEROKU_APP_CLIENT/web;
heroku container:release web --app $HEROKU_APP_CLIENT;
docker push $DOCKER_USERNAME/docker_backend;
docker push registry.heroku.com/$HEROKU_APP_BACKEND/web;
heroku container:release web --app $HEROKU_APP_BACKEND;
docker push $DOCKER_USERNAME/docker_nginx;
docker push registry.heroku.com/$HEROKU_APP_NGINX/web;
heroku container:release web --app $HEROKU_APP_NGINX;
on:
branch: master