Docker 基於Dockerfile建立映象實踐
需求描述
簡單說,就是建立一個服務型的映象,即執行基於該映象建立的容器時,基於該容器自動開啟一個服務。具體來說,是建立一個部署了nginx
,uwsgi
,python
,django
專案程式碼的映象,執行基於該映象建立的容器時,自動開啟nginx
,uwsgi
等服務。簡單理解就是在容器內部,通過nginx
+uwsgi
部署Django專案
實踐環境
CentOS Linux release 7.9.2009
實踐過程
實踐過程1
Django
專案程式碼組織結構
env_setup.sh
#!/bin/bash yum install -y wget gcc make zlib* openssl-devel sqlite-devel wget http://nginx.org/download/nginx-1.10.3.tar.gz tar -xvzf nginx-1.10.3.tar.gz cd nginx-1.10.3 ./configure --prefix=/usr/local/nginx make && make install cp -f /opt/DjServer/docker/nginx.conf /usr/local/nginx/conf/nginx.conf chmod 755 /usr/local/nginx/conf/nginx.conf ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx cd .. && rm -rf nginx-1.10.3* wget http://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz tar -xvzf sqlite-autoconf-3280000.tar.gz cd sqlite-autoconf-3280000 ./configure --prefix=/usr/local/sqlite make && make install mv /usr/bin/sqlite3 /usr/bin/sqlite3_old ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3 echo "/usr/local/sqlite/lib" > /etc/ld.so.conf.d/sqlite3.conf ldconfig cd .. && rm -rf sqlite-autoconf-* wget https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tgz tar -xvzf Python-3.6.13.tgz cd Python-3.6.13 ./configure --prefix=/usr/local/python36 make && make install cd .. && rm -rf Python-3.6.13* ln -s /usr/local/python36/bin/python3 /usr/bin/python3 ln -s /usr/local/python36/bin/pip3 /usr/bin/pip3 ls pip3 install -r /opt/DjServer/requirements.txt ln -s /usr/local/python36/bin/uwsgi /usr/bin/uwsgi mkdir -p /var/log/uwsgi
start.sh
#!/bin/bash
`uwsgi --ini uwsgi.ini &` && nginx -c /usr/local/nginx/conf/nginx.conf -g "daemon off;"
nginx.conf
worker_processes 16; events { worker_connections 65535; } http { include mime.types; default_type application/octet-stream; keepalive_timeout 65; reset_timedout_connection on; server { listen 80; server_name localhost; charset utf-8; #access_log logs/access.log; access_log off; error_log logs/error.log; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location / { uwsgi_send_timeout 60; uwsgi_connect_timeout 60; uwsgi_read_timeout 600; include uwsgi_params; uwsgi_pass 127.0.0.1:8000; } } }
requirements.txt
Django==3.0.6
uwsgi==2.0.8
前置準備工作
如下,建立一個乾淨的目錄(例中為myworkspace
),用於建立映象,並將解壓後的Django
專案程式碼存放到該目錄,然後在該目錄下新建並編寫dockerfile
,.dockerignore
檔案。
# pwd
/root/myworkspace
# ls -a
. .. DjServer dockerfile .dockerignore
dockerfile
FROM centos:7.9.2009 WORKDIR /opt/DjServer COPY ./DjServer . RUN chmod 755 ./docker/env_setup.sh \ && sh ./docker/env_setup.sh \ && chmod 755 ./docker/start.sh EXPOSE 80 ENTRYPOINT ["./docker/start.sh"]
.dockerignore
*/__pycache__
建立服務映象
如下,建立djserver:v1.0
映象
# docker build -t djserver:v1.0 .
...略
Successfully tagged djserver:v1.0
建立容器
基於上述映象建立名為dj80
的容器,對映宿主主機80
埠到容器的80
埠,併為容器設定環境變數
# docker run --name dj9003 -p 9003:80 -e hostPort=10.1.66.163:9003 -d -it djserver:v1.0
測試驗證
# curl http://10.7.0.236:9003/loadapi/api/v1/ip_forward # 10.7.0.236為容器所在宿主機
實踐過程2
Django專案程式碼組織結構
注意:程式碼結構中的requirements.txt
暫時沒用到,對該檔案的定位是,存放建立基礎映象時新增requirements.txt檔案所包含依賴包除外的其它依賴包。
建立基礎映象前置準備工作
如下,建立一個乾淨的目錄(例中為env_build
),用於建立提供軟體執行環境的基礎映象,並在該目錄下新建並編寫dockerfile
,新建env_conf
目錄,然後在env_conf
目錄下新建env_setup.sh
, requirements.txt
# pwd
/root/env_build
# ls -aR
.:
. .. env_conf env_dockerfile
./env_conf:
. .. env_setup.sh requirements.txt
env_dockerfile
FROM centos:7.9.2009
COPY ./env_conf .
RUN chmod 755 env_setup.sh \
&& sh env_setup.sh \
&& rm -f env_setup.sh requirements.txt
env_setup.sh
#!/bin/bash
yum install -y wget gcc make zlib* openssl-devel sqlite-devel
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar -xvzf nginx-1.10.3.tar.gz
cd nginx-1.10.3
./configure --prefix=/usr/local/nginx
make && make install
cd .. && rm -rf nginx-1.10.3*
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
wget http://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz
tar -xvzf sqlite-autoconf-3280000.tar.gz
cd sqlite-autoconf-3280000
./configure --prefix=/usr/local/sqlite
make && make install
mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
echo "/usr/local/sqlite/lib" > /etc/ld.so.conf.d/sqlite3.conf
ldconfig
cd .. && rm -rf sqlite-autoconf-*
wget https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tgz
tar -xvzf Python-3.6.13.tgz
cd Python-3.6.13
./configure --prefix=/usr/local/python36
make && make install
cd .. && rm -rf Python-3.6.13*
ln -s /usr/local/python36/bin/python3 /usr/bin/python3
ln -s /usr/local/python36/bin/pip3 /usr/bin/pip3
pip3 install -r requirements.txt
ln -s /usr/local/python36/bin/uwsgi /usr/bin/uwsgi
mkdir -p /var/log/uwsgi
requirements.txt
Django==3.0.6
uwsgi==2.0.8
注意:這裡對requirements.txt
的定位是,用於存放一定需要安裝,並且極少改動(比如更換版本)的軟體依賴包
建立基礎映象
如下,建立djbase:v1.0
基礎映象,為執行Django
專案提供所需的軟體執行環境
# docker build --no-cache -t djbase:v1.0 -f env_dockerfile .
...略docker build --no-cache -t djbase:v1.0 -f env_dockerfile .
Successfully tagged djbase:v1.0
建立服務映象前置準備工作
建立一個乾淨的目錄(例中為server_build
),用於建立最終服務映象,並將解壓後的Django
專案程式碼存放到該目錄,然後在該目錄下新建並編寫dockerfile
,.dockerignore
檔案。
# pwd
/root/server_build
# ls -a
. .. DjServer dockerfile .dockerignore
dockerfile
FROM djbase:v1.0
WORKDIR /opt/DjServer
RUN mkdir -p /var/log/uwsgi
COPY ./DjServer/docker/nginx.conf .
RUN mv -f ./nginx.conf /usr/local/nginx/conf/nginx.conf && chmod 755 /usr/local/nginx/conf/nginx.conf
COPY ./DjServer .
RUN chmod 755 ./docker/start.sh
EXPOSE 80
ENTRYPOINT ["./docker/start.sh"]
.dockerignore
*/__pycache__
docker/start.sh
#!/bin/bash
`uwsgi --ini uwsgi.ini &` && nginx -c /usr/local/nginx/conf/nginx.conf -g "daemon off;"
docker/nginx.conf
同“實踐過程1”
建立服務映象
如下,建立djserver:v1.0
服務映象
# docker build -t djserver:v1.0 .
...略
Successfully tagged djserver:v1.0
建立容器
基於上述映象建立名為djserver
的容器,對映宿主主機80
埠到容器的80
埠
# docker run --name dj9003 -p 9003:80 -e hostPort=10.1.66.163:9003 -d -it djserver:v1.0
作者:授客
公眾號:授客的知識庫
QQ:1033553122
全國軟體測試QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支援將是我繼續創作的源動力,打賞後如有任何疑問,請聯絡我!!!
微信打賞
支付寶打賞授課的知識庫全國軟體測試交流QQ群