1. 程式人生 > 實用技巧 >Django應用容器化實踐

Django應用容器化實踐

Django應用容器化實踐

django專案介紹

$ git clone https://gitee.com/agagin/python-demo.git
$ cd python-demo/
$ ll
total 20
drwxr-xr-x 4 root root  160 Sep 13 00:24 blog
drwxr-xr-x 2 root root   22 Sep 13 00:24 log
-rw-r--r-- 1 root root  804 Sep 13 00:24 manage.py
drwxr-xr-x 2 root root   74 Sep 13 00:24 myblog
-rw-r--r-- 1 root root 1228 Sep 13 00:24 myblog.conf
-rw-r--r-- 1 root root   44 Sep 13 00:24 requirements.txt
drwxr-xr-x 4 root root   74 Sep 13 00:24 resources
-rw-r--r-- 1 root root   84 Sep 13 00:24 run.sh
drwxr-xr-x 3 root root   19 Sep 13 00:24 static
-rw-r--r-- 1 root root  239 Sep 13 00:24 uwsgi.ini

  • python3 + django + uwsgi + nginx + mysql

  • 內部服務埠8002

構建命令

$ docker build . -t ImageName:ImageTag -f Dockerfile

如何理解構建映象的過程?

Dockerfile是一堆指令,在docker build的時候,按照該指令進行操作,最終生成我們期望的映象

  • FROM 指定基礎映象,必須為第一個命令
格式:
    FROM <image>
    FROM <image>:<tag>
示例:
    FROM mysql:5.7
注意:
    tag是可選的,如果不使用tag時,會使用latest版本的基礎映象
  • MAINTAINER 映象維護者的資訊
格式:
    MAINTAINER <name>
示例:
    MAINTAINER Yongxin Li
    MAINTAINER [email protected]
    MAINTAINER Yongxin Li <[email protected]>
  • COPY|ADD 新增本地檔案到映象中
格式:
	COPY <src>... <dest>
示例:
    ADD hom* /mydir/          # 新增所有以"hom"開頭的檔案
    ADD test relativeDir/     # 新增 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 新增 "test" 到 /absoluteDir/
  • WORKDIR 工作目錄
格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (這時工作目錄為/a)
注意:
    通過WORKDIR設定工作目錄後,Dockerfile中其後的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執行
  • RUN 構建映象過程中執行命令
格式:
    RUN <command>
示例:
    RUN yum install nginx
    RUN pip install django
    RUN mkdir test && rm -rf /var/lib/unusedfiles
注意:
    RUN指令建立的中間映象會被快取,並會在下次構建中使用。如果不想使用這些快取映象,可以在構建時指定--no-cache引數,如:docker build --no-cache
  • CMD 構建容器後呼叫,也就是在容器啟動時才進行呼叫
格式:
    CMD ["executable","param1","param2"] (執行可執行檔案,優先)
    CMD ["param1","param2"] (設定了ENTRYPOINT,則直接呼叫ENTRYPOINT新增引數)
    CMD command param1 param2 (執行shell內部命令)
示例:
    CMD ["/usr/bin/wc","--help"]
    CMD ping www.baidu.com
注意:
    CMD不同於RUN,CMD用於指定在容器啟動時所要執行的命令,而RUN用於指定映象構建時所要執行的命令。
  • ENTRYPOINT 設定容器初始化命令,使其可執行化
格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可執行檔案, 優先)
    ENTRYPOINT command param1 param2 (shell內部命令)
示例:
    ENTRYPOINT ["/usr/bin/wc","--help"]
注意:
    ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的命令不會覆蓋ENTRYPOINT,而docker run命令中指定的任何引數,都會被當做引數再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設定,而只執行最後的ENTRYPOINT指令
  • ENV
格式:
    ENV <key> <value>
    ENV <key>=<value>
示例:
    ENV myName John
    ENV myCat=fluffy
  • EXPOSE
格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
注意:
    EXPOSE並不會讓容器的埠訪問到主機。要使其可訪問,需要在docker run執行容器時通過-p來發布這些埠,或通過-P引數來發布EXPOSE匯出的所有埠

Dockerfile

dockerfiles/myblog/Dockerfile

# This my first django Dockerfile
# Version 1.0

# Base images 基礎映象
FROM centos:centos7.5.1804

#MAINTAINER 維護者資訊
LABEL maintainer="[email protected]"

#ENV 設定環境變數
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8

#RUN 執行以下命令
RUN curl -so /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo && rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum install -y  python36 python3-devel gcc pcre-devel zlib-devel make net-tools nginx

#工作目錄
WORKDIR /opt/myblog

#拷貝檔案至工作目錄
COPY . .

# 拷貝nginx配置檔案
COPY myblog.conf /etc/nginx

#安裝依賴的外掛
RUN pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt

RUN chmod +x run.sh && rm -rf ~/.cache/pip

#EXPOSE 對映埠
EXPOSE 8002

#容器啟動時執行命令
CMD ["./run.sh"]

執行構建:

$ docker build . -t myblog:v1 -f Dockerfile

執行mysql

$ docker run -d -p 3306:3306 --name mysql -v /opt/mysql/:/var/lib/mysql -e MYSQL_DATABASE=myblog -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

## 檢視資料庫
$ docker exec -ti mysql bash
#/ mysql -uroot -p123456
#/ show databases;

## navicator連線

啟動Django應用

## 啟動容器
$ docker run -d -p 8002:8002 --name myblog -e MYSQL_HOST=10.2.2.10 -e MYSQL_USER=root -e MYSQL_PASSWD=123456  myblog:v1

GRANT ALL ON . TO 'root'@'%' IDENTIFIED BY '123456';