从docker到docker-compose部署一个nginx+flask+mysql+redis应用
目的是把一个flask项目的mysql数据库、redis数据库、flask应用、nginx服务分别装到四个容器中,然后用docker-compose命令同时启动与关闭
一、安装docker
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。通过 uname -r 命令查看当前的内核版本
更新yum
sudo yum update
移除旧版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
安装系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum缓存
sudo yum makecache fast
安装docker-ce,对所有选项选y
sudo yum -y install docker-ce
查看docker版本
docker --version
启动docker
sudo systemctl start docker
二、只用docker部署
注意区分:docker镜像是一个模版,docker容器是一个实例,它可以被启动与关闭。
1、首先先把mysql和redis数据库跑起来
拉镜像
docker pull mysql
docker pull redis:3.2
运行,redis并不需要把端口暴露出来,因为只有flask应用需要访问它,直接在启动flask应用容器的时候link到redis就可以了
docker run --name mysql -p : -e MYSQL_ROOT_PASSWORD=*** -d mysql
docker run --name redis -d redis:3.2 redis-server --appendonly yes
2、部署flask应用
一开始我直接拉了一个centos镜像,然后再装python3、requirement.txt,但是后来发现直接用python:3.6的镜像会简单一点。
首先,把项目复制到服务器
scp -r 本地文件夹 root@服务器公网ip:服务器目标文件夹
然后,创建一个Dockerfile,用于将应用build成镜像
目录结构如下

Dockerfile的内容
FROM python:3.6
ADD ./my-chat-server /app
WORKDIR /app
RUN pip install -r requirement.txt
CMD ["python", "run.py"]
RUN与CMD的区别在于,RUN是在创建镜像的时候执行的,而CMD在这个镜像创建的容器每次启动时都会执行
ADD与COPY的区别在于,ADD可以写成 ADD http://foo.com/bar.go /tmp/main.go 或 ADD /foo.tar.gz /tmp/ 用于下载一个文件到容器中或者将一个压缩文件解压到容器中。
然后,在flask目录执行
docker build -t flask .
这会创建一个名为flask的镜像
然后启动这个镜像
docker run --name flask -p 5000:5000 --link mysql:mysql --link redis:redis-server -d flask
注意应用中mysql和redis的host都要相应改变,改成数据库容器在flask容器中的别名
--link 容器名:容器别名 可以实现容器间的通信
如无意外现在可以从服务器的5000端口访问到flask应用了
3、部署nginx
先拉一个镜像
docker pull nginx
然后启动
docker run --name nginx -p : -d nginx
将里面的nginx.conf文件内容拿出来
docker exec -it nginx cat /etc/nginx/nginx.conf
然后创建一个nginx.conf,把这些内容复制进去,在http里加上
server {
listen ;
server_name 服务器公网ip;
location / {
proxy_pass http://flask:5000;
}
access_log /var/log/access_unicom.log main;
}
然后把刚创的nginx镜像删掉,注意删除容器是docker rm;删除镜像是docker rmi
创建一个以刚才创建的nginx.conf为配置的nginx容器
docker run --name nginx -p : -v /root/nginx.conf:/etc/nginx/nginx.conf --link flask -d nginx
现在通过服务器的80端口就可以访问到flask应用了
只使用docker的部署完成,下面我们来用docker-compose实现更方便的部署
三、docker-compose部署
docker-compose可以很方便地通过一个文件构建多个镜像、启动多个容器。
安装docker-compose(最新版
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
要使用docker-compose,首先要把每个部分的Dockerfile写好,然后在docker-compose.yml文件中统一构建和启动
整个docker-compose项目的目录结构为

三个目录下分别有它们的Dockerfile和相关的配置文件或代码
flask目录的目录结构和Dockerfile和之前是一样的
mysql的Dockerfile
FROM mysql
COPY ./init.sql /docker-entrypoint-initdb.d
init.sql是数据库初始化文件,它会把flask应用需要用到的库和表创建出来。在mysql官方镜像中提供了容器启动时自动执行/docker-entrypoint-initdb.d文件夹下的脚本的功能(包括shell脚本和sql脚本) 。因此我们只要把初始化文件在镜像启动时复制到/docker-entrypoint-initdb.d文件夹就可以了
nginx的Dockerfile
FROM nginx
COPY ./nginx.conf /etc/nginx/nginx.conf
在之前,我使用挂载的方式将nginx.conf导入nginx容器,这个方法有一个问题就是如果我要把这一套生产环境打包到另一个系统,docker export并不会将挂载的内容一起打包,因此,最好还是在构建镜像的时候就把相关配置加到镜像里。
redis没有需要导入的配置,因此没有它的Dockerfile
docker-compose.yml文件的内容
version: '3'
services:
mysql:
build: ./mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=***
restart: always
redis:
image: redis:3.2
restart: always
flask:
build: ./flask
ports:
- "5000:5000"
links:
- mysql:mysql
- redis:redis-server
restart: always
nginx:
build: ./nginx
ports:
- "80:80"
links:
- flask
docker-compose会先从每个服务的build目录下找到Dockerfile,然后依次镜像。所有镜像创建完毕后,再根据yml文件中其他配置依次启动镜像的容器。
当docker-compose启动一次后,只要不更改它自动生成的容器和镜像,再次启动,它就不会再创建镜像,而是启动之前生成的容器。
如果想要更改单个服务的内容,修改Dockerfile的内容、或者删除docker-compose自动生成的容器和镜像,再次启动docker-compose的时候,它会重新构建修改后服务的容器,而其他没有做过修改的服务不变
执行docker-compose up启动所有服务

你的应用已经可以在80端口访问了,enjoy!
从docker到docker-compose部署一个nginx+flask+mysql+redis应用的更多相关文章
- 如何在tomcat前部署一个nginx
在tomcat应用已经发布后,如何在tomcat前部署一个nginx,可以正常访问jsp,静态资源(html,css,js) 这里tomcat的端口号是8888 upstream morris { s ...
- docker - 从安装到部署一个web应用(go、java)
一:安装docker 1.https://docs.docker.com/engine/installation/binaries/ 下载docker最新版二进制tar.gz linux下: wget ...
- Docker 使用入门,创建一个Nginx服务器
运行环境: MAC Docker 版本: Docker version 17.12.0-ce, build c97c6d6 一.启动Nginx 服务器 启动Nginx 服务器,并进入模拟终端 dock ...
- Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)
转载地址:https://www.cnblogs.com/spec-dog/p/11320513.html 开发中经常需要安装一些常用的服务软件,如Nginx.MySql.Redis等,如果按照普通的 ...
- Flask+MySQL+Redis的Docker配置
Docker配置了好多天,昨天晚上终于把碎遮项目的Docker打包完成了,后面会继续完善项目代码,把稳定版本打包后推送到DockerHub上. 网上关于Docker配置的文章很多,但大部分都是复制粘贴 ...
- nginx lua mysql redis设置
最近公司网站改版,程序和数据库全部用新版,旧版的数据要导入,旧网站的30万条数据url要全部重定向到新版网站,正好前段时间在学习nginx+lua+mysql+memcache(redis),找资料真 ...
- windows本地搭建nginx+php+mysql+redis环境详细步骤
1.mysql的下载和安装 这个可参考我另外一篇文章:http://www.cnblogs.com/myIvan/p/9265645.html 2.php的下载和配置修改 下载地址:https://w ...
- Nginx+Lua+MySQL/Redis实现高性能动态网页展现
Nginx结合Lua脚本,直接绕过Tomcat应用服务器,连接MySQL/Redis直接获取数据,再结合Lua中Template组件,直接写入动态数据,渲染成页面,响应前端,一次请求响应过程结束.最终 ...
- CentOS 傻瓜式部署uWSGI + nginx + flask
交代背景 这篇帖子是为了提供我自己的July Novel站点的小说数据支撑.解决分布式部署爬虫程序的繁琐过程,由于本人对shell编程并不熟悉,故而先逐步记录操作步骤,通过以下操作达到节省时间的方式. ...
随机推荐
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-7
一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 进一步优化功能与完善服务器. 明天计划完成的工作: 服务器是需要完善,后端的配置还需要修改. 工作中遇到的困难: 今日遇到的困难是服务器后端 ...
- IDEA配置Java Web项目
IDEA部署maven tomcat的java web项目的关键配置:
- 【php】header下载文件后,文件变大的问题;(ob_clean()清空缓存)
事由: 按照常理,为了下载一个生产的文件,都是使用header函数,指定下文件信息,然后开始下载,但是下载后发现,文件体积总是比源文件要大2个字节,源文件是24字节,下载后是26字节,查看服务器返回的 ...
- xheditor在线编辑器在.netMVC4中的使用
在线编辑器xheditor,测试感觉不错,特把使用方法记录如下 : 先看看基本使用方法,然后用实例来操作 1.xheditor 地址 http://xheditor.com/ 2.下载最新编辑器源码 ...
- 用PS做PNG格式底色是透明的logo
有时我们需要底色为透明色的logo图片,但是一般的图片底色都是白色的,覆盖在其它图片上会显示白色. 本文介绍如何用PS CS6制作透明底色的图片. 1.首先我们确定所选图片的大小(即分辨率大小),在资 ...
- HDU4822-Tri-War
题目 给出一颗树,\(m\)次询问树上不相同的三个点\(A,B,C\).我们称一个点\(x\)被\(A\)占领当且仅当\(dist(A,x)>dist(B,x),dist(A,x)>dis ...
- 题解 P5015 【标题统计】
既然这个题这么水 大家不如来盘点一下算法呗 首先说一个事:逗号表达式 这玩意的值是最后一个表达式的值 那么我们就可以愉快的放进循环条件里摩擦 话说这个应该是基础吧,大多数代码都可以这样干 具体可以后面 ...
- 二分图匹配模板(dfs+bfs)
dfs版: bool dfs(int u) { for(int i = head[u]; ~i; i = e[i].next) { int v = e[i].v; if(!vis[v]) { vis[ ...
- 【刷题】洛谷 P3796 【模板】AC自动机(加强版)
题目描述 有 \(N\) 个由小写字母组成的模式串以及一个文本串 \(T\) .每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串 \(T\) 中出现的次数最多. 输入输出格式 输入格式 ...
- 流媒体协议之RTSP客户端的实现20171014
RtspClient是基于jrtplib实现的,目前仅支持h264格式,后续将不断迭代优化,加入对其他格式的支持,并且将实现RTSP的服务端. RtspClient的功能是接收服务端过来流,然后写入到 ...