Docker构建nginx+uwsgi+flask镜像(二)

Dockerfile搭建环境并打包应用

在上一章Docker构建nginx+uwsgi+flask镜像(一)的学习中,我们学会用命令行一句一句在alpine环境中搭建nginx+uwsgi+flask服务,但这体现不了Docker为我们带来的便利,而本章,我们将通过Dockerfile来制作基础镜像和打包应用,因此会有两个Dockerfile文件。

我们先来写第一个Dockerfile文件,这个文件负责搭建运行环境,运行环境需要包括:nginx、uwsgi、Python3:

# 配置基础镜像
FROM alpine:3.8

# 添加标签说明
LABEL author="moshangguang" email="[email protected]"  purpose="nginx+uwsgi+Python3基础镜像"

# 配置清华镜像地址
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.8/main/" > /etc/apk/repositories

# 更新升级软件
RUN apk add --update --upgrade

# 安装软件
RUN apk add --no-cache nginx python3 uwsgi uwsgi-python3 

# 升级pip,这一步同时会在/usr/bin/目录下生成pip可执行文件
RUN pip3 install --no-cache-dir --upgrade pip

# 建立软链接
RUN ln -s /usr/bin/python3 /usr/bin/python

     

上面的安装软件相比之前少了个vim,因为之前我们是在容器内部编辑配置文件,所以需要这个命令,但现在我们的配置文件都是预先在容器之外编辑好在通过docker拷贝到容器内部,所以也就无需安装vim。另外建立软连接时,我们只建立了从python到python3的软连接,没有建立pip到pip3的软链接,因为/usr/bin/pip在安装软件时已经生成。

执行docker build命令,生成镜像,执行docker images命令可以看到生成nginx_uwsgi_py3镜像,标签为alpine3.8:

[[email protected] docker]# docker build -t nginx_uwsgi_py3:alpine3.8 .
Sending build context to Docker daemon 4.096 kB
……
Successfully built 63be35fe36ca
[[email protected] docker]# docker images
REPOSITORY                       TAG                   IMAGE ID            CREATED             SIZE
nginx_uwsgi_py3                  alpine3.8             63be35fe36ca        5 minutes ago       60 MB

  

于是,我们完成了第一个Dockerfile文件,这个Dockerfile文件可以为我们搭建我们所需要的运行环境镜像。

我们可以把构建好的基础镜像推送到我们的Docker hub仓库,先用docker login登录之后

[[email protected] docker]# docker login -u moshangguang -p 123456
Login Succeeded

  

tips:上面登录密码是假的哈。

然后为我们的镜像打上tag,之后推送镜像。

[[email protected] docker]# docker tag 687445ba4c7f moshangguang/nginx_uwsgi_py3:alpine3.8
[[email protected] docker]# docker images
REPOSITORY                       TAG                   IMAGE ID            CREATED             SIZE
moshangguang/nginx_uwsgi_py3     alpine3.8             63be35fe36ca        22 minutes ago      60 MB
nginx_uwsgi_py3                  alpine3.8             63be35fe36ca        22 minutes ago      60 MB
[[email protected] docker]# docker push moshangguang/nginx_uwsgi_py3:alpine3.8
The push refers to a repository [docker.io/moshangguang/nginx_uwsgi_py3]
……
alpine3.8: digest: sha256:412ec97c1c51dffeee6b924494bc size: 1154

  

有了基础镜像,我们就可以开始编写我们的应用了,这里先给出我们应用的目录结构(web_app在github上的地址):

[[email protected] docker]# tree web_app
web_app
├── app
│   ├── app.py
│   ├── requirements.txt
│   └── uwsgi.ini
├── Dockerfile
└── nginx.conf

1 directory, 5 files

  

最外层的web_app目录包含一个app目录,和两个文件,分别是Dockerfile、nginx.conf,注意,web_app下的Dockerfile文件和之前的Dockerfile文件不同,这里的Dockerfile文件是用来打包应用的。nginx.conf文件在打包应用时会拷贝到容器中,作为nginx启动的配置。

app目录下有三个文件,分别是:app.py、requirements.txt和uwsgi.ini。我们唯一不熟悉的就是requirements.txt,这个文件用来存放我们Python应用所需要的库,如flask、flask_sqlalchemy等等。在打包应用时会执行pip命令读取这个文件的内容,安装我们所需要的库。

这里,我们打印下requirements.txt的内容:

[[email protected] app]# cat requirements.txt
flask
flask_sqlalchemy

  

app.py文件也略做修改,新增两个路由/hello和/world:

from flask import Flask

app = Flask(__name__)

@app.route(‘/hello‘)
def hello():
    return ‘Hello!!!\n‘

@app.route(‘/world‘)
def world():
    return ‘World!!!\n‘

@app.route(‘/‘)
def hello_world():
    return ‘Hello World!!!\n‘

if __name__ == ‘__main__‘:
    app.run()

  

上一章中,我们在uwsgi.ini文件中将uwsgi-socket配置绑定到本机的9000端口,同时在nginx.conf文件中设置uwsgi_pass,将请求转发到9000端口,这样的做法显得有些累赘,如果以后我不想用9000端口,意味着我需要改两个地方。那么,有没有办法让uwsgi自动获取绑定到一个端口,而nginx.conf又能获取到uwsgi所绑定的端口呢?肯定是有的:

uwsgi.ini

[uwsgi]
uwsgi-socket    = /tmp/uwsgi.sock
chmod-socket    = 777
callable        = app
plugin          = python3
wsgi-file       = app.py
buffer-size     = 65535
processes       = %(%k * 2)
threads         = %(%k * 20)
disable-logging = true

    

上面的uwsgi.ini文件中,我们不再将uwsgi-socket这个配置项绑定到特定的一个端口,而是指定了一个文件,这个文件是Unix套接字,即通过文件系统(而非网络地址)进行寻址和访问的套接字。配置uwsgi-socket之后,还需要配置chmod-socket,Unix socket是个文件,所以会受到Unix系统的权限限制,可以配置成660或者777,使得uwsgi客户端能够访问这个Unix socket文件,这里配置为777。

这里新增两个优化参数:processes和threads,分别是开启的进程数和线程数,而%k是魔数变量,代表CPU核数,如果我们是双核CPU,那这里的processes和threads分别为4和40,即有4个进程,每个进程有40个线程。disable-logging的意思一目了然,代表不记录请求信息的日志,只记录错误以及uwsgi内部消息到日志中。

最后,我们再来看下nginx.conf需要做改动的地方,其实也就是http模块下的server:

server {
  listen 6666;
  charset utf-8;
  client_max_body_size 75M;
  location / {
	include uwsgi_params;
	uwsgi_pass unix:///tmp/uwsgi.sock;
        ……
  }
}

  

其实改动的地方也只有一个uwsgi_pass,原先我们是直接绑定在9000端口上,而现在我们要指向uwsgi-socket所指向的Unix套接字。这样,nginx就可以自动将请求转发给uwsgi所监听的套接字了。

这里给出nginx.conf全部的内容:

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 20480;

events {
  use epoll;
  worker_connections 20480;
  multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;
    #请求量级大建议关闭acccess_log
    #access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  300s;
    client_header_timeout 300s;
    client_body_timeout 300s;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_types text/html application/javascript application/json;

    include /etc/nginx/conf.d/*.conf;

    server {
      listen 6666;
      charset utf-8;
      client_max_body_size 75M;
      location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
        uwsgi_send_timeout 300;
        uwsgi_connect_timeout 300;
        uwsgi_read_timeout 300;
      }
    }
}

  

最后,我们来看下用于打包应用的Dockerfile:

# 使用基础镜像库
FROM moshangguang/nginx_uwsgi_py3:alpine3.8

# 创建工作路径
RUN mkdir /app

# 指定容器启动时执行的命令都在app目录下执行
WORKDIR /app

# 替换nginx的配置
COPY nginx.conf /etc/nginx/nginx.conf

# 将本地app目录下的内容拷贝到容器的app目录下
COPY ./app/ /app/

# pip读取requirements.txt内容安装所需的库
RUN pip install -r /app/requirements.txt -i  https://pypi.tuna.tsinghua.edu.cn/simple some-package --no-cache-dir

# 启动nginx和uwsgi
ENTRYPOINT nginx -g "daemon on;" && uwsgi --ini /app/uwsgi.ini

  

上面的每一条命令都有注释,这里就不再多作介绍了。

现在,让我们来打包web_app应用吧!将工作目录移到web_app目录下,执行docker build命令,创建镜像:

[[email protected] web_app]# docker build -t web_app .
Sending build context to Docker daemon 24.58 kB
……
Successfully built 88212eefb0b4

查看刚刚创建的web_app镜像:

[[email protected] web_app]# docker images
REPOSITORY                       TAG                   IMAGE ID            CREATED              SIZE
web_app                          latest                88212eefb0b4        About a minute ago   79.9 MB

  

根据镜像启动一个容器,容器内部的nginx监听的是6666端口,而宿主机则用9999端口接收请求,再转发到容器内部的6666端口:

[[email protected] web_app]# docker run -p 9999:6666 -d web_app
a8cd1104dfc994637011ebd9dd9160d62eab64b1c9bb6ceb9266c092eb425452

  

这里,测试容器内的应用是否能正常处理用户的请求:

到此为止,我们便完成了用Docker构建基础镜像,并打包应用了。

原文地址:https://www.cnblogs.com/beiluowuzheng/p/10220860.html

时间: 2024-10-14 22:02:04

Docker构建nginx+uwsgi+flask镜像(二)的相关文章

Ubuntu下nginx+uwsgi+flask的运行环境搭建

选择web framwork是个很艰难的事情, 主要分为轻量级和重量级框架. 由于没有搭建网站这种需要, 所以回避SSH, Django这种框架, 而选择一个轻量级框架. 自己也比较青睐python这门语言, 就选择了flask框架, nginx代理服务器享誉盛名, 所以拿来使用咯. 一. 开发环境搭建 采用离线安装方式, ubuntu开发环境(centos等环境类似) nginx 安装 $ wget http://nginx.org/download/nginx-1.6.0.tar.gz #仅

nginx+uwsgi+flask 服务器配置

注:每个机器,软件版本可能不一样,虽然网上有很多类似的帖子,但是我在搭建的时候遇到了不少的坑,此文仅供参考. 请求流程: 1.安装uwsgi uwsgi是一个应用服务器,非静态文件的网络请求就必须通过他完成,他也可以充当静态文件服务器,但不是他的强项.uwsgi是使用python编写的,因此通过`pip install uwsgi`就可以了.(uwsgi必须安装在系统级别的Python环境中,不要安装到虚拟环境中). pip install uwsgi 测试uwsgi是否安装正确:创建一个tes

Docker构建Nginx+Tomcat动静分离架构

随着主流Nginx WEB服务器的发展,现在基于Nginx的WEB服务器已广泛应用于各大互联网企业.今天我们来使用docker构建我们的Linux+Nginx+Tomcat动静分离服务器. 1)    启动docker镜像 查看当前系统存在的镜像,我这里为centos6.6,大家可以参考我第一篇文章进行下载相应的镜像文件,然后启动. 启动方式如下:   docker run -i -t  centos6.6:v2 /bin/bash 然后进入新的docker容器里,查看ip为172.17.0.6

使用Docker构建nginx静态网站

1. 建Dockerfile: FROM ubuntu:14.04 MAINTAINER Marc LAW "[email protected]" ENV REFRESHED_AT 2019-02-03 RUN apt-get -yqq update && apt-get -yqq install nginx RUN mkdir -p /var/www/html/website ADD nginx/global.conf /etc/nginx/conf.d/ ADD n

使用docker构建、运行jenkins镜像

目录: 1.基于docker官方的jenkins镜像启动容器 2.使用源码构建jenkins镜像并运行容器 3.使用csphere产品对容器.镜像.主机进行管理 docker近两年很火,最近在听cSphere希云主办的docker培训, 之前也参加过docker相关的技术沙龙(如docker meetup). 同时也使用Jenkins近两年,所以尝试使用docker构建jenkins镜像.运行基于镜像的容器. 因为听希云的docker培训获得了一张200元的腾讯云代金券, 所以用代金券在腾讯云上

nginx uwsgi flask相关配置

一.安装Nginx 在 /home/download下下载压缩包 wget https://nginx.org/download/nginx-1.12.2.tar.gz 解压缩 tar zxvf nginx-1.12.2.tar.gz 添加环境变量: vim ~/.bashrc //添加 #NGINX export NGINX_HOME=/usr/local/nginx export PATH=$PATH:$NGINX_HOME/sbin source ~/.bashrc//激活 一些nginx

Ubuntu+Nginx+uWSGI+Flask应用

Ubuntu 18.04,Nginx 1.14.0,uWSGI 2.0.17.1,Flask 1.0.2,Python 3.6.5, 多日未更新博客,就是在忙着把自己的Flask应用在Ubuntu上运行起来,额,是生产环境中运行起来,所以,需要用到uWSGI服务器,而不是Flask自带的开发用服务器. 另外,顺便学习Linux,比如,用户和用户组管理.环境变量的配置.各种配置文件修改.进程管理.服务随机启动配置等,只是,尚未精通,但对于目前部署自己的Flask应用时够了. 总之,先在Ubuntu

centos6.8 搭建nginx+uwsgi+Flask

1.安装 yum install nginx -y pip3 install uwsgipip3 install Flask 2.uwsgi配置(保存/etc/uwsgi.ini,run:uwsgi /etc/uwsgi.ini) [uwsgi] # uwsgi 启动时所使用的地址与端口 socket = 127.0.0.1:50000 # 指向网站目录 chdir = /app/db_cache_server/ # 处理器数 processes = 2 #查看uwsgi状态,类似nginx的s

nginx+uwsgi+flask搭建python-web应用程序

Flask本身就可以直接启动HTTP服务器,但是受限于管理.部署.性能等问题,在生产环境中,我们一般不会使用Flask自身所带的HTTP服务器. 从现在已有的实践来看,对于Flask,比较好的部署方式是使用uWSGI做WSGI容器,Nginx做前端服务器.这样做的好处在于: 1. uWSGI性能好,提供的功能也很多,运维方便.2. Nginx对于静态文件处理较好,而且默认支持uWSGI协议,在负载均衡和压力控制上都可以很方便的实现. 现在说一下具体的部署步骤: 因为本人比较喜欢Ubuntu Se