docker djangoプロジェクトパブリッシュミラーの構築

21764 ワード

説明
ベースミラーはcentos 7を採用する.5,dockerバージョンは19.03.8,シンクホストバージョンはUbuntu 18.04.1である.初めてdjangoプロジェクトのリリースを行い、dockerミラーでパッケージ化してみましたが、順調に成功しました.プロジェクトに関連するes、mysql、redisなどのコンポーネントはdocker配置を採用していません.プロジェクトパスは~/mywu/すべてのdockerfile、nginx構成、uwsgi構成、起動スクリプトがこのプロジェクトディレクトリの下に置かれ、パッケージ化が容易です.まずcentos+python+nginxパッケージベースミラーパッケージを構築します.後続のプロジェクトミラーパッケージこのミラーパッケージをベースミラーパッケージとします.
ベースミラーパッケージ
centos 7をダウンロードする.5ミラーパッケージdocker pull centos:centos 7.5.1804
(xm) pyvip@VIP:~/mywu$ docker pull centos:centos7.5.1804
centos7.5.1804: Pulling from library/centos
Digest: sha256:7a45e4a1efbaafc1d9aa89925b6fdb33288a96d35ea0581412316e2f0ad3720a
Status: Downloaded newer image for centos:centos7.5.1804
docker.io/library/centos:centos7.5.1804

ダウンロードnginxパッケージnginx-1.13.7.tar.gz.
(xm) pyvip@VIP:~/mywu/$ wget http://nginx.org/download/nginx-1.13.7.tar.gz
--2020-05-06 02:18:10--  http://nginx.org/download/nginx-1.13.7.tar.gz
       nginx.org (nginx.org)... 62.210.92.35, 95.211.80.227, 2001:1af8:4060:a004:21::e3
     nginx.org (nginx.org)|62.210.92.35|:80...    。
    HTTP   ,      ... 200 OK
  : 990836 (968K) [application/octet-stream]
     : “nginx-1.13.7.tar.gz”
nginx-1.13.7.tar.gz     100%[=================================================================================================================================================================>] 967.61K  29.3KB/s       29s
2020-05-06 02:18:40 (33.8 KB/s) -     “nginx-1.13.7.tar.gz” [990836/990836])

プロジェクトパスの下でdockerfile vim basedockerを記述する
vim basedocker
FROM centos:centos7.5.1804
#MAINTAINER      
MAINTAINER wu
#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
RUN yum install -y  python36 python3-devel gcc pcre-devel zlib-devel make net-tools
COPY nginx-1.13.7.tar.gz  /opt
#  nginx
RUN tar -zxf /opt/nginx-1.13.7.tar.gz -C /opt  && cd /opt/nginx-1.13.7 && ./configure --prefix=/usr/local/nginx && make && make install &
& ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

dockerパッケージdocker buildを構築します.-t centos7.5-nginx:v1.0 -f basedocker
(xm) pyvip@VIP:~/mywu/deploy$ docker build . -t centos7.5-nginx:v1.0 -f basedocker 
Sending build context to Docker daemon  994.3kB
Step 1/8 : FROM centos:centos7.5.1804
 ---> cf49811e3cdb
Step 2/8 : MAINTAINER wu
 ---> Running in f49add210551
Removing intermediate container f49add210551
 ---> 552e325d722f
Step 3/8 : ENV LANG en_US.UTF-8
 ---> Running in ccddd013a72d
Removing intermediate container ccddd013a72d
 ---> 58dc7eb0f88d
Step 4/8 : ENV LC_ALL en_US.UTF-8
 ---> Running in 7ba7aa8be90c
Removing intermediate container 7ba7aa8be90c
 ---> add9d0067325
Step 5/8 : RUN curl -so /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 ---> Running in a5671c21df3a
Removing intermediate container a5671c21df3a
 ---> fa4b94c50599
Step 6/8 : RUN yum install -y  python36 python3-devel gcc pcre-devel zlib-devel make net-tools
 ---> Running in d07bad00130e
Loaded plugins: fastestmirror, ovl
Repository base is listed more than once in the configuration
......
Removing intermediate container e483f4cec428
 ---> dd6609c08cfa
Successfully built dd6609c08cfa
Successfully tagged centos7.5-nginx:v1.0

ミラーの表示
(xm) pyvip@VIP:~/mywu/deploy$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
centos7.5-nginx           v1.0                dd6609c08cfa        14 seconds ago      449MB
nginx                     latest              6678c7c2e56c        2 months ago        127MB
centos                    centos7.5.1804      cf49811e3cdb        13 months ago       200MB
delron/fastdfs            latest              8487e86fc6ee        2 years ago         464MB
delron/elasticsearch-ik   2.4.6-1.0           095b6487fb77        2 years ago         689MB

プロジェクトミラーの構築
プロジェクトはnginx+uwsgi配置を用いてxshellにpipenvllを生成する.txtファイル(プロジェクトにインストールされているパッケージをpipenvll.txtファイルに保存)
(xm) pyvip@VIP:~/mywu/deploy$ pip freeze >pipenvll.txt
(xm) pyvip@VIP:~/mywu$ more pipenvll.txt 
asgiref==3.2.3
baidu-aip==2.2.18.0
bce-python-sdk==0.8.37
certifi==2019.11.28
chardet==3.0.4
Django==2.1.7
django-haystack==2.8.1
django-redis==4.11.0
elasticsearch==2.4.1
future==0.18.2
idna==2.8
Pillow==7.0.0
pycrypto==2.6.1
PyMySQL==0.9.3
pytz==2019.3
redis==3.4.1
requests==2.22.0
six==1.14.0
sqlparse==0.3.0
urllib3==1.25.8
uWSGI==2.0.18

プロジェクトの作成dockerfile mysitedockerf
(xm) pyvip@VIP:~/mywu$ more mysitedockerf 
FROM centos7.5-nginx:v1.0
#MAINTAINER      
LABEL maintainer="wu"
#    
WORKDIR /opt/mysite
#         
COPY . .
RUN cp mysite-nginx.conf /usr/local/nginx/conf/mysite.conf
#       
RUN pip3 install -i https://pypi.doubanio.com/simple -r pipenvll.txt
RUN chmod +x start.sh && rm -rf ~/.cache/pip
#EXPOSE     
EXPOSE 80
#         
CMD ["./start.sh"]


以下、dockerfileに関するドキュメントにnginxプロファイルを記述するmysite-nginxを記述する.conf
(xm) pyvip@VIP:~/mywu$ more mysite-nginx.conf 

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    server {
        listen       80;
        server_name  127.0.0.1;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
 location /media  {
        alias /opt/mysite/xmb1/media;
        }
       #     
  location /static {
        alias /opt/mysite/static;
        }

location / {
    uwsgi_pass  127.0.0.1:8001;
    include    /usr/local/nginx/conf/uwsgi_params;
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
      root   html;
        }
    }
}


uwsgiプロファイル
(xm) pyvip@VIP:~/mywu$ more uwsgi.ini 
[uwsgi]
#   nginx     ,Django         
#     IP   
socket=127.0.0.1:8001
#      
chdir=/opt/mysite
#   wsgi.py       
wsgi-file=xmb1/wsgi.py
#    
processes=2
#    
threads=2
# uwsgi      
master=True
#          
pidfile=uwsgi.pid
#     ,  uwsgi           ,     。   runserver      
daemonize=logs/uwsgi.log

プロファイルを開始するsh
(xm) pyvip@VIP:~/mywu$ more start.sh 
#!/bin/bash
python3 manage.py collectstatic
uwsgi --ini ./uwsgi.ini 
nginx -c /usr/local/nginx/conf/mysite.conf -g 'daemon off;'

最後のステップでは、プロジェクトミラーを構築します.最初のコンテナの構築に問題が発生し、その後、構成を変更して再構築しました.最終的に成功したミラーはmysite:v 1です.1バージョン.docker build . -t mysite:v1.1 -f mysitedockerf
Sending build context to Docker daemon  126.5MB
Step 1/9 : FROM centos7.5-nginx:v1.0
 ---> dd6609c08cfa
Step 2/9 : LABEL maintainer="wu"
 ---> Running in 3b8a0a621cb1
Removing intermediate container 3b8a0a621cb1
 ---> e3adf22c56da
Step 3/9 : WORKDIR /opt/mysite
 ---> Running in 3126416f7129
Removing intermediate container 3126416f7129
 ---> c1b6a38c8703
Step 4/9 : COPY . .
 ---> f895dd2917e6
Step 5/9 : RUN cp mysite-nginx.conf /usr/local/nginx/conf/mysite.conf
 ---> Running in 5f67e5d9c314
Removing intermediate container 5f67e5d9c314
 ---> 9d25fe83d066
Step 6/9 : RUN pip3 install -i https://pypi.doubanio.com/simple -r pipenvll.txt
 ---> Running in 332c05091602
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting asgiref==3.2.3 (from -r pipenvll.txt (line 1))
  Downloading https://pypi.doubanio.com/packages/a5/cb/5a235b605a9753ebcb2730c75e610fb51c8cab3f01230080a8229fa36adb/asgiref-3.2.3-py2.py3-none-any.whl
      Running setup.py install for uWSGI: finished with status 'done'
.4.1 requests-2.22.0 six-1.14.0 sqlparse-0.3.0 uWSGI-2.0.18 urllib3-1.25.8
Removing intermediate container 332c05091602
 ---> c84f013fb85a
Step 7/9 : RUN chmod +x start.sh && rm -rf ~/.cache/pip
 ---> Running in 5d4bc7ff6e9a
Removing intermediate container 5d4bc7ff6e9a
 ---> c96b1f194911
Step 8/9 : EXPOSE 80
 ---> Running in 1af335420466
Removing intermediate container 1af335420466
 ---> 145247f80859
Step 9/9 : CMD ["./start.sh"]
 ---> Running in 95f633ef1cf1
Removing intermediate container 95f633ef1cf1
 ---> d68a50415dca
Successfully built d68a50415dca
Successfully tagged mysite:v1.0
(xm) pyvip@VIP:~/mywu$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
mysite                    v1.1                7c3c6f2af288        12 hours ago        627MB
mysite                    v1.0                d68a50415dca        12 hours ago        627MB
centos7.5-nginx           v1.0                dd6609c08cfa        13 hours ago        449MB
nginx                     latest              6678c7c2e56c        2 months ago        127MB
centos                    centos7.5.1804      cf49811e3cdb        13 months ago       200MB
delron/fastdfs            latest              8487e86fc6ee        2 years ago         464MB
delron/elasticsearch-ik   2.4.6-1.0           095b6487fb77        2 years ago         689MB


最後にコンテナを起動し、サービスが正常であることを確認します.
(xm) pyvip@VIP:~/mywu$ docker run -dit --name mysite1 --net=host mysite:v1.1
a8a68ad874714bc96fa767a157e999d4bb4d604b09c163668dbb1244447374b4
(xm) pyvip@VIP:~/mywu$  
(xm) pyvip@VIP:~/mywu$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a8a68ad87471        mysite:v1.1         "./start.sh"        28 seconds ago      Up 27 seconds                           mysite1

私のプロジェクトで使用しているデータベースはすべて127.0.0.1に記入されています.コンテナ内部でシンクホストの127.0.0.1を呼び出すことができません.そのため、net=hostホストネットワークモードを使用してコンテナを起動します.後日K 8 Sプラットフォームでポートマッピングのモード配置を使用する必要があるため、コードの一部を修正する必要があります.まずDjangoのsettingプロファイルの各構成接続に環境変数設定を使用
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite',
        'USER': os.environ.get("MYSQL_USER", 'root'),
        'PASSWORD': os.environ.get("MYSQL_PASSWD", '123456'),
        'HOST': os.environ.get("MYSQL_HOST", '127.0.0.1'),
        'PORT': os.environ.get("MYSQL_PORT", '3306')
    }
}


次にコンテナを起動するときに環境変数を指定します.
docker run -dti -p 80:80 --name mysite -e MYSQL_HOST=10.0.2.15 -e MYSQL_USER=root -e MYSQL_PASSWD=123456  mysite:v1.2