Docker的學習(三)----使用Dockerfile部署一個Flask專案

weixin_34007886發表於2016-08-18

建立了一個基礎Ubuntu映象、Nginx映象及Python映象。

使用了docker-compose提供堆疊完成多容器的組裝,完成部署一個Flask專案。

專案的Github地址:https://github.com/kenhancoder/docker_repo

首先建立了基礎映象repo/ubuntu:16.04_64_Base,映象基於phusion/baseimage:0.9.22 Github地址

Python映象

Dockerfile如下

# 基礎映象資訊
FROM repo/ubuntu:16.04_64_Base

# 維護者資訊
MAINTAINER Ken ken.han.coder@aliyun.com

# 映象操作指令
COPY ./conf/pip.conf /root/.pip/pip.conf 
ADD requirements.txt requirements.txt

RUN pip install --upgrade pip
RUN pip install -r requirements.txt

RUN mkdir -p /var/www
COPY app.py /var/www/app.py

WORKDIR /var/www

EXPOSE 8765

Flask程式碼如下

# -*- coding: utf-8 -*-

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8765)

執行docker build -t="repo/flask_demo:0.1" .

host一定不要用預設的"127.0.0.1",不然容器啟動,即使對映了埠,在瀏覽器中也仍然是無法訪問服務的。
將host設定為"0.0.0.0",這樣Flask容器可以接受到宿主的請求。

nginx配置檔案如下

server {
    listen  8765;

    location / {
        proxy_set_header Access-Control-Allow-Origin *;
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://web:8765;
    }
}

proxy_pass中的'web'為docker-compose.yml中的links的web

Docker Compose

使用Docker Compose,可以用一個YAML檔案定義一組要啟動的容器,以及容器執行時的屬性。Docker Compose稱這些容器為“服務”,像這樣定義:容器通過某些方法並指定一些執行時的屬性來和其他容器產生互動

可以在一個檔案中定義一個多容器的應用,然後使用一條命令來啟動你的應用,然後所有相關的操作都會被自動完成

docker-compose.yml如下

server:
  restart: always
  image: repo/nginx:1.10.1_Base
  volumes:
    - ./conf/nginx_flask_demo.conf:/etc/nginx/conf.d/flask_demo.conf
  links:
    - web
  ports:
    - "8765:8765"

web:
  restart: always
  image: repo/flask_demo:0.1
  working_dir: /var/www
  expose:
    - "8765"
  command: python /var/www/app.py

可以將command中的啟動命令換成gunicorn來啟動。

啟動

在docker-compose.yml的同級目錄下執行docker-compose up -d

總結
Dockerfile
  • RUN和CMD都是執行命令,他們的差異在於RUN中定義的命令會在執行docker build命令建立映象時執行,而CMD中定義的命令會在執行docker run命令執行映象時執行,另外使用第一種語法也就是呼叫exec執行時,命令必須為絕對路徑。

  • 使用Docker build命令時,可以使用-f引數來選擇指定的Dockerfile。如docker build -t="repo/server_flask:local_0.1" -f="Dockerfile_local" .

Docker Compose
  • 我在YAML檔案大多使用已經建立好的映象,即使用image引數。Docker Compose也提供引數build,引數值為Dockerfile的目錄路徑,所以只能將Dockerfile檔案命名為"Dockerfile",缺少靈活性。

  • 使用-f引數可以選擇指定docker-compose.yml,例如docker-compose -f docker-compose-local.yml up -d,這將根據docker-compose-local.yml來啟動容器。

相關文章