Docker篇章11:django+uwsgi+redis+nginx+mysql用docker部署构建多容器
1.docker构建mysql容器
-
根目录新建文件
mkdir -p /docker/mysql cd /docker/mysql
-
创建如下四个文件:
Dockerfile 为构建mysql镜像 privileges.sql 用于注册用户,授权 west_coast.sql 要导入的数据库及表 setup.sh 构建shell脚本
-
Dockerfile编写
FROM mysql:5.6 ENV MYSQL_ALLOW_EMPTY_PASSWORD yes#免密模式 COPY setup.sh /mysql/setup.sh#将setup.py复制到容器内 COPY west_coast.sql /mysql/west_coast.sql#将west_coast.sql复制到容器内 COPY privileges.sql /mysql/privileges.sql#将privileges.sql复制到容器内 CMD ["sh", "/mysql/setup.sh"]#执行脚本setup.sh
-
setup.sh
#!/bin/bash set -e#告诉bash如果任何语句的执行结果不是true则应该退出。 echo `service mysql status` echo '1.启动mysql....' #启动mysql service mysql start sleep 3 echo `service mysql status` echo '2.开始导入数据....' #导入数据 mysql < /mysql/west_coast.sql echo '3.导入数据完毕....' sleep 3 echo `service mysql status` #重新设置mysql密码 echo '4.开始修改密码....' mysql < /mysql/privileges.sql echo '5.修改密码完毕....' #sleep 3 echo `service mysql status` echo `mysql容器启动完毕,且数据导入成功` tail -f /dev/null
-
privileges.sql
use mysql;#切换数据库myql select host,user from user; create user root identified by '123456';#创建root用户 grant all on west_coast.* to root@'%' identified by '123456' with grant option;#授权root用户west_coast权限 flush privileges;
-
west_coast.sql 为mysqldump的表和数据
-
构建镜像
docker build -t ws/mysql5.6 .
-
启动容器
docker run -d -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 ws/mysql5.6
-
查看日志
docker logs 容器ID
2.docker构建redis容器
-
拉取基础镜像
docker pull redis:3.2
-
运行容器
docker run -p 6379:6379 -v /xujunkai/myredis/data:/data -v /xujunkai/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes # --appendonly yes 开启持久化
-
编辑redis配置
vim /xujunkai/myredis/conf/redis/conf/redis.conf
-
启动redis客户端
docker exec -it 容器id redis-cli
3.单容器下构建dajngo+uwsgi镜像
(centos下载docker以及配置可翻阅前面的随笔),这里直接从拉取镜像说了
-
拉取python3.6镜像
docker pull python:3.6
-
根目录新建文件
mkdir -p /docker/webapp cd /docker/webapp
-
目录下放置
west_coast__company_project.tar.gz #项目打包目录 Dockerfile #dockerfile编写 pip.conf # pip源配置 run.sh # 运行项目
-
这里我提前将项目相关配置已配置好
west_coast__company_project.tar.gz目录结构 west_coast__company_project |——————requirements.txt#依赖 |——————app |______.... |______west_coast__company_project |______settings.py |______uwsgi.ini |______....
settings更改
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "west_coast", "PORT": 连接数据库端口, "HOST": "10.0.0.131",#连接mysql容器ip "USER": "数据库用户名", "PASSWORD": "数据库密码", } } ALLOWED_HOSTS = ["*"] DEBUF=False CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://10.0.0.131:6379",#连接redis容器ip "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 1000} }, } }
uwsgi.ini
[uwsgi] # Django-related settings # the base directory (full path) # 指定项目的绝对路径的第一层路径(很重要) chdir = /opt/west_coast__company_project # Django's wsgi file # 指定项目的 wsgi.py文件 # 写入相对路径即可,这个参数是以chdir参数为相对路径 module = west_coast__company_project.wsgi master = true processes = 1 # 这里直接使用uwsgi做web服务器,使用http。如果使用nginx,需要使用socket沟通。 # socket = 0.0.0.0:9000 http = 0.0.0.0:9000 workers = 2 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true # daemonize = uwsgi.log #设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃 harakiri=60 #当一个请求被harakiri杀掉会,会输出一条日志 harakiri-verbose=true
-
pip.conf 阿里源配置
[global] index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com
-
run.sh
#!/bin/bash # 从第一行到最后一行分别表示: # 1. 生成数据库迁移文件 # 2. 根据数据库迁移文件来修改数据库 # 3. 用 uwsgi启动 django 服务, 不再使用python manage.py runserver python3 manage.py makemigrations && python3 manage.py migrate && uwsgi --ini /opt/west_coast__company_project/west_coast__company_project/uwsgi.ini
-
Dockerfile
FROM python:3.6#建立环境3.6 MAINTAINER xujunkai<xujunkaipy@163.com> ENV PYTHONUNBUFFERED 1#设置 python 环境变量 COPY pip.conf /root/.pip/pip.conf#将源拷贝到容器内 ADD west_coast__company_project.tar.gz /opt/#将项目拷贝并解压到容器内 COPY run.sh /opt/west_coast__company_project/run.sh#将执行脚本拷贝到容器内 RUN pip3 install -r /opt/west_coast__company_project/requirements.txt#依赖包下载 WORKDIR /opt/west_coast__company_project#转到工作目录 CMD ["sh","run.sh"]#执行run.sh脚本
-
构建镜像,在webapp目录下构建镜像
docker build -t django_uwsgi:v1 .
-
启动容器
docker run -d -p 8080:9000 django_uwsgi:v1
-
查看运行容器状态
docker ps
-
此时访问接口,成功
django+uwsgi+nginx+redis+mysql多容器部署
-
之前已经配置好django+uwsgi镜像,redis镜像,mysql镜像。现在只需构建nginx镜像
-
先更高uwsgi.ini
socket=0.0.0.0:9000 #再构建镜像,然后跑容器
-
创建文件夹
mkdir -p /docker/nginxdf cd /docker/nginxdf
-
拉取nginx基础镜像
docker pull nginx
-
当前目录下构建镜像准备如下文件
phone.tar.gz #vue打包静态文件 手机端 web.tar.gz #vue打包静态文件 pc端 nginx 为 nginx配置 Dockerfile 构建nginx镜像
-
Dockerfile信息
FROM nginx:latest RUN rm /etc/nginx/conf.d/default.conf# 删除原有配置文件 #将静态文件添加容器内,并解压 ADD phone.tar.gz /opt/ ADD web.tar.gz /opt/ # 添加配置文件 ADD nginx.conf /etc/nginx/conf.d/ # 关闭守护模式 CMD ["nginx","-g","daemon off;"]
-
nginx.conf配置
server { listen 80 default_server; listen [::]:80 default_server; server_name localhost; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { root /opt/web/dist; if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" ) { root /opt/phone/dist; } index index.html; try_files $uri $uri/ /index.html; } location ~.*(jpg|jpeg|png|gif|ico|css|js)$ { root /opt/web/dist; if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" ) { root /opt/phone/dist; } expires 365d; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 8000; #这里监听8000端口传172.17.0.4:9000 # 172.17.0.4是容器django-uwsgi对外暴漏的端口,不是宿主机的端口,通过 docker inspect 容器ID | grep "IPAddress" 可以查询ID server_name 172.17.0.4; location / { uwsgi_pass 172.17.0.4:9000;#转发请求 include uwsgi_params; } }
-
/docker/nginxdf目录下镜像构建
docker build -t ws/nginx:v1 .
-
运行容器
#80为本地静态路径前端展示,8000用于访问后端接口 docker run -d -p 80:80 -p 8000:8000 ws/nginx:v1
-
此时访问10.0.0.131就OK了
-
这样一个一个构建镜像,再一个一个去手动创建容器并记录和配置这些复杂的容器关系,不仅效率低下而且容易出错,下一期用docker-compose工具管理多容器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库