基于Docker的工作流

這次我們創建一個Hello world的web服務器。

一 

mkdir -p identidock/app   #首先創建一個新的multiidentidock來存放我們的項目,在這個目錄下面,創建一個app目錄來存放Python代碼。
touch app/identidock.py  #在app目錄下創建identidock.py
# 編輯identidock.py的內容
from flask import Flask
app = Flask(__name__)  #初始化Flask和設置應用對象
@app.route('/')     #創建一個與URL關聯的路由,當這個URL被請求,它會調用hello_world函數。
def hello_world():
        return "Hello Docker!\n"
if __name__ == '__main__':
        app.run(debug=True,host='0.0.0.0')  #初始化Python web服務器,使用0.0.0.0作為主機參數綁定了所有的網絡接口

#現在我們需要一個存放Python代碼的容器然后運行它。在identidock目錄下面創建一個Dockerfile文件,并且編輯如下內容
FROM python:3.4
RUN pip install Flask==0.10.1
WORKDIR /app
COPY app /app
CMD ["python" "identidock.py"]

現在我們可以構建我們的簡單鏡像了

docker build -t identidock .
……
docker run -d -p 5000:5000 identidock
-d 代表在后臺運行容器
-p 代表我們想轉發主機的5000端口到容器的5000端口
curl localhost:5000    #進行測試
Hello World!

但是有一些問題存在:每次代碼的改變,我們都需要重新構建鏡像然后重啟這個容器

對此,有一個簡單的解決方案,我們可以綁定主機的源代碼文件夾到內部容器文件夾中。

docker stop $(docker ps -ql)  #停止最近創建的容器
docker rm $(docker ps -lq)    #刪除最近創建的容器
docker run -d -p 5000:5000 -v $(pwd)/app:/app identidock
-v $(pwd)/app:/app 參數綁定app目錄到容器的/app。 它會覆蓋容器內/app的內容,同時對于容器內部也是可寫的(你也可以掛載為只讀模式)-v 參數必須是絕對路徑。
curl localhost:5000  #測試
Hello world!

現在我們可以在主機上編輯文件看看

sed -i 's/World/Docker/' app/identidock.py  #使用sed快速替換World為Docker,你也可以使用正常的文本編輯器。
curl localhost:5000
Hello Docker!

現在除了容器內容封裝的一些依賴關系,我們就擁有了一個相對正常的開發環境了。然而這里還有一個問題,那就是我們不能在生產環境使用這個容器,因為它正在運行的是默認的Flask webserver,它只適用于開發者,在生產環境中則效率低下并且不安全。一個好的解決方法就是采納Docker減少開發環境和生產環境的區別,現在讓我們在看一下怎么處理吧。

uWSGI是一個為生產環境準備的應用服務器,它也可以位于類似于Nginx的web server后面。使用uWSGI代替Flask webserver會提供我們一個靈活的容器,方便我們進行設置。我們可以轉換這個容器到使用uwSGI容器只需要修改Dockerfile中的兩行。

FROM python:3.4
RUN pip install Flask==0.10.1 uWSGI==2.0.8 
WORKDIR /app
COPY app /app
CMD ["uwsgi", "--http", "0.0.0.0:9090", "--wsgi-file", "/app/identidock.py", \
     "--callable", "app", "--stats", "0.0.0.0:9191"]

docker build -t identidock  #構建這個鏡像,然后運行它我們可以看到其中的不同
……
docker run -d -p 9090:9090 -p 9191:9191 identidock
curl localhost:9090
Hello Docker!

你可以使用docker logs來看一下日志uWSGI的日志信息。當然我們也可以在http://localhost:9191中看到一些uWSGI暴露的狀態信息。

但是實際上,上面會提示一個安全問題,我們使用root來運行服務了。我們可以在Dockerfile中很容易的修復這個問題,同時我們在聲明一下容器監聽的端口。

FROM python:3.4
RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI==2.0.8
WORKDIR /app
COPY app /app
COPY cmd.sh /
EXPOSE 9090 9191
USER uwsgi
CMD ["uwsgi","--http","0.0.0.0:9090","--wsgi-file","/app/identidock.py", \
"--callable","app","--stats","0.0.0.0:9191"]
docker build -t identidock . #重建這個鏡像
...
docker run identidock whoami 
uwsgi

#你最好在你的所有的Dockerfile中設置用戶,或者在ENTRYPOINT或CMD腳本中改變用戶。

現在在容器呢把的命令不是以root來運行了,讓我們運行一下這個容器試試。。

docker run -d -P --name port-test identidock
#-P 讓Docker自動的映射一個大數字的本地主機端口到容器內部。

我們可以看下那個端口被映射了

docker port port-test 
9090/tcp -> 0.0.0.0:32769 
9191/tcp -> 0.0.0.0:32768
curl localhost:32769 #現在做個測試
Hello Docker!

現在還存在一個問題,那就是我們缺失了開發工具,例如調試輸出和實時的代碼重載。理想情況下,我們想要使用這個鏡像既可以作為開發環境又可以作為生產環境。我們可以使用環境變量和一個簡單的腳本來實現這個需求。

五 

在和Dockerfile相同的目錄下創建cmd.sh,然后編輯如下內容

#!/bin/bash set -e
if [ "$ENV" = 'DEV' ]; then
  echo "Running Development Server"
  exec python "identidock.py" 
else
  echo "Running Production Server"
  exec uwsgi --http 0.0.0.0:9090 --wsgi-file /app/identidock.py \
             --callable app --stats 0.0.0.0:9191 
fi
chmod +x cmd.sh
#編輯Dockerfile
FROM python:3.4
RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI==2.0.8
WORKDIR /app
COPY app /app
COPY cmd.sh /
EXPOSE 9090 9191
USER uwsgi
CMD ["/cmd.sh"]
docker stop $(docker ps -q)
docker rmr $(docker ps -aq)
docker build -t identidock .  #重建鏡像
docker run -e "ENV=DEV" -p 5000:5000 identidock
Running in development environment.
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 290-812-275
docker run -p 5000:5000 -v $(pwd)/app:/app -e "ENV=DEV" identidock #這時我們可以實時修改代碼了

然后再不加ENV=DEV的情況下運行就是成產環境了。

小結:

上面依次展示了一些Docker生產中可能會存在的問題。并且提供了最后的解決方案。

原創文章,作者:艾賀,如若轉載,請注明出處:http://www.www58058.com/11883

(1)
艾賀艾賀
上一篇 2016-03-01
下一篇 2016-03-03

相關推薦

  • 初識Linux

    1 硬件:cpu,內存,輸入輸出設備 功能:計算,存放cpu暫時計算的數據,接受輸入和輸出反應 2 Debian Ubuntu => mint knopix Slackware: S.u.S.E => OpenSUSE SLES RedHat: RedHat Enterprise Linux => CentOS FedoraCore 3 1…

    Linux干貨 2017-07-11
  • http特性

    一、何為http 什么是http?http是Hyper Text Mark Language的縮寫,超文本標記語言。Apache下的httpd是實現了這一功能的開源軟件。 二、http特性 http特性1:持久連接及MPM參數設置 KeepAlive {On|Off} #是否啟動持久連接 MaxKeepAliveRequests 100 …

    Linux干貨 2015-10-15
  • Tomcat詳解

    Tomcat詳解 1、tomcat安裝 tomcat的組件:<Server> <Service> <connector/> <connector/> <Engine> <Host /> <Host> <Context/> … </Host> &lt…

    2017-04-27
  • centos6.9的安裝

    先準備一個安裝虛擬機的的軟件VMware Workstation Pro和光盤centos6.9和光盤 然后打開該軟件,點擊創建新的虛擬機   然后會出現一個新建虛擬機向導,選擇典型,點下一步 繼續點下一步   把虛擬機名稱改成所裝的版本 然后新建一個文件夾,點擊瀏覽,接著點擊這個新建的文件夾,這個文件夾就是虛擬機所裝入的位置,…

    2017-07-15
  • 如何使用正則表達式

    正則表達式(Regular Expression)就是使用簡單的字符按照預先設定的規則來完成復雜的功能,說白了,正則表達式是一種字符串的匹配方式,就是用預先設定好的規則來描述我們想要表達的內容,它是由普通字符以及元字符組成的字符串,其中元字符不表示本身的意義,而是用于表達控制或通配等功能。 為什么要用這個東西那,我想,每一個學習計算機的人都應該明白,計算機就…

    Linux干貨 2015-10-27
  • 文件查找作業

    1、查找/var目錄下屬主為root,且屬組為mail的所有文件 [root@wzc ~]# find /var/ -user root -a -group mail /var/spool/mail /var/spool/mail/root 2、查找/var目錄下不屬于root、…

    Linux干貨 2016-08-15

評論列表(1條)

  • stanley
    stanley 2016-03-03 09:40

    ENV=DEV的情況下運行就是成產環境了。 ==> 看到文章中有思考的地方了 贊

欧美性久久久久