最小化一个可持续交付的项目
本文主要阐述,如何基于 Docker 和 Github 配置一个最小化的、可持续交付的项目。此项目前端由 Angular 编写,后端由 Flask 编写,服务器为 Nginx,运行系统为 Centos。主要分为以下几部分:开发环境中的 Docker 准备,生产环境中的 Docker 准备。本文主要关注于整体实现流程,有需要可翻阅其他资料比对阅读。
主要版本信息如下:
- Docker Server Version: 18.09.2
- Angular
- Flask
- Centos7.4
- macOS Mojave 10.14.3
- nginx
一、项目背景
项目主要从以下几个因素考虑:
- 开发环境和生产环境达到一致性;尽量避免产生 ”在我的电脑上是好的“ 的世纪问题
- 项目整体的可迁移和可扩展性;
- 项目持续化的集成与部署;尽量避免人工干预
为此,利用 Docker 和 Github 完成项目后,能实现如下流程:代码提交至 Github 后,经过审阅合并代码后,会自动同步至开发服务器,开发服务器拉取代码后,自动编译并更新项目。项目的大致结构如下:
一、从开发环境出发
关于 Docker 的安装和使用可参考 Docker — 从入门到实践。
1.1 搭建 nginx 服务器
使用 docker pull nginx
拉取 nginx 的 image 到本地。当准备使用 Docker 搭建 nginx 服务器时,可能会遇到一个选择,有些文章会介绍拉取并生成 nginx 的 container 后,直接进入 container 内修改相关配置属性,然后重新打包。这种方法在这里不利于项目的维护,所以我们还是选择使用配置挂载的方式对 nginx 的属性进行配置。参考文章Docker中运行nginx并挂载本地目录到镜像中 实现配置挂载。
1 | docker run --name nginx \ |
可是,这样实现的属性挂载也存在一些问题,首先是需要手工启动,假如存在多个需要启动的服务会十分繁琐,其次是命令行后一串代码不利于维护,所以,我们选择使用 docker-compose
一般我们都将项目放置于云服务器上,万一项目需要迁移至另一云服务器或者自建服务器时,使用传统部署方法的项目可能存在较大
1.2 Flask 的部署
如 Flask 官网 所示,先在本地搭建一个 Flask 项目。但是,在生产环境上,直接使用 FLASK_APP=hello.py flask run
是不恰当的。所以
配置一个可持续交付的
一个flask项目的mysql数据库、redis数据库、flask应用、nginx服务分别装到四个容器中,然后用docker-compose命令同时启动与关闭
1.3 在docker centos 容器中使用docker
1 | Is the docker daemon running? |
1 | Failed to get D-Bus connection: Operation not permitted |
解决方法 使用官网教程创建
centos 安装docker
git
强制拉取项目覆盖本地 git fetch –all && git reset –hard origin/master && git pull
问题小结
- nginx 挂载目录出错,导致 include 时候找不到对应的文件,通过进入 nginx 容器内部定位发现错误
- macos下建立docker centos 失败 ,未解决, 官网解决办法,无效
- git 无法 pull 项目,先进行 git init 或者直接使用 git clone
查看文件夹权限 ls -lash 配置文件夹权限 chmod 777
解决服务器上因为权限问题导致的 gunicorn log 日志不能写入的问题
5.1 尝试过直接单独构建 flask 容器,然后在 docker run 命令挂载volume,还是会出现权限不匹配问题
5.2 需要尝试copy的方式验证文件的所有者
5.3 需要查看服务器配置和本地配置区别
5.4 归根结底是验证容器挂载后文件的权限拥有者
volumes are runtime, dockerfile is build-time, adding a chmod step in the entrypoint script is an option tho (the entrypoint command is defined in the dockerfile but executes at runtime.
关于 volume 和 dockerfile 的生命周期,RUN 是 build-time CMD 是 runtime,所以,如果需要配置权限就需要 You could always create or modify the entrypoint script which runs at container start to do the permission change
chown 命令
chown -R1
2# 权限配置
RUN chown -R flaskuser:flaskgroup /home/flask
服务器用户配置
新增用户1
2useradd -m -d /home/product -s /bin/bash -c "product environment" -U product
passwd product eglv
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
使用docker 命令遇到权限问题,将当前用户添加到 docker 用户组
1 | sudo usermod -a -G docker $USER |
1 | ``` |
echo product:231072:65536 > /etc/subuid1
2
3
4https://segmentfault.com/q/1010000010909708
echo 2147483647 > /proc/sys/user/max_user_namespaces # 原来是0 cat /proc/sys/user/max_user_namespaces 0
https://forums.docker.com/t/cant-configure-a-user-namespace-on-centos-7/56766
$ sudo echo “user.max_user_namespaces=15000” >> /etc/sysctl.conf1
2
3
按此方法新增了 /etc/default/docker:
http://www.it1352.com/646505.html
systemctl daemon-reload
systemctl restart docker1
2
3
4
5
查看是否支持命名空间,开启或者关闭命名空间
https://www.cnblogs.com/sammyliu/p/5878973.html
[检查 linux 操作系统是否启用了 user namespace](https://www.cnblogs.com/sammyliu/p/5878973.html)
CentOS 7系统,Docker想启用userns-remap,傻了吧?
centos 使用 namespace 讨论
最终官方解决方案
https://success.docker.com/article/user-namespace-runtime-error`
id dockremap
docker run -it –rm –volume $(pwd):/source –workdir /source ubuntu
停止docker 服务 https://blog.csdn.net/tz_gg/article/details/77371008
简单的 docker-compose 多步构建 angular 应用
问题
Dockerfile 是在用于创建 image docker-compose 用于运行 container,volume 只会在首次 运行 container 时候挂载 volume
除非将其删除,否则无法更新
https://stackoverflow.com/questions/38441159/docker-named-volume-not-updating
named docker volume not updating using docker-compose
使用 name-volume
Copy File ( To | From ) Container
项目备注
- nginx 配置
docker pull nginx
docker run –name nginx -d -p 80:80 nginx
mac 上设置共享盘 is not shared from OS X and is not known to Docker.
docker 命令备忘:
docker exec -it nginx cat /etc/nginx/nginx.conf > nginx.conf
// 复制镜像内容
docker cp 95e2b70fdf49:/etc/nginx/nginx.conf $PWD/conf/nginx.conf #使用id或names【mynginx】
/etc/nginx/nginx.conf
https://www.cnblogs.com/bingo1024/p/9022890.html
请问配置里面 listen:80和 [::]:80 有什么区别
https://www.baidu.com/link?url=I-QD3XaV39DGLw3XOo_fFzy1Xdszr92Sc-ftolRnyS9BFgr-y4B8o5tMPnN0_t2f&wd=&eqid=fc9028c900020813000000065c701f4c
批量停止
docker stop $(docker container ls -q -f=name=nginx)
UseAge: [03]
参考引用
How to use Docker and Docker Compose to Create a Flask Application | 基本引用文章
1. CentOS7 上学习使用docker
Docker nginx安装与配置挂载
Docker中运行nginx并挂载本地目录到镜像中
Docker: Mounts denied. The paths … are not shared from OS X and are not known to Docker
从docker到docker-compose部署一个nginx+flask+mysql+redis应用
深入理解Docker Volume(一) | -v 命令的用法是特别的,可以将宿主文件和容器文件关联
docker volume 挂载设置 | 设置挂载点,共享数据目录
gunicorn 的相关配置
gunicorn 的详细配置
gunicorn 的参数