Django應用容器化實踐
阿新 • • 發佈:2020-09-13
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';