docker知识补充连接
这里在一个容器上跑django服务,就不使用nginx进行代理了,当然你也可以不使用uwsgi。
首先把uwsgi+django容器跑起来
docker run -it -d --name test -p 1234:8080 -v /home/test:/home/test python:3.7.10
#-v /home/test:/home/test是将/home/test是将主机上的该目录挂载到容器内的home目录下(当然也可以使用docker cp命令)
然后进入到容器内
docker exec -it test bash
然后安装uwsgi和django
pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install django==1.11.28 -i https://pypi.tuna.tsinghua.edu.cn/simple
其中在test目录下有一个uwsgi.ini的uwsgi启动配置文件(给你们瞅瞅)
[uwsgi]
http= 0.0.0.0:8080
chdir = /home/test
wsgi-file = test/wsgi.py
processes = 1
threads = 4
然后使用uwsgi将将django项目启动
uwsgi -d --ini uwsgi.ini(uwsgi无挂断运行)
这里需要注意的是,**因为没有使用nginx,所以在uwsgi.ini的配置文件中,http= 0.0.0.0:8080(而不是socket=0.0.0.0:8080)**当然这里的0.0.0.0也可以修改为容器的IP号
#docker inspect [容器名或id]| grep "IPAddress"
docker inspect test| grep "IPAddress"
下面是dockerfile时间(区别于上面进入docker容器安装依赖,非常麻烦,所以就可以写个dockefile)
# 建立 python3.7 环境
FROM python:3.7.10
# 镜像作者菠菜
MAINTAINER bocai
# 设置容器内工作目录
WORKDIR /home
# 将项目文件拷贝到工作目录下(拷贝的主机内容,最好是相对路径,绝对路径会有报错 )
COPY ./demo /home/demo
# 在容器内安装django
RUN pip install Django==1.11.28 -i https://pypi.douban.com/simple/
# 在容器内安装uwsgi
RUN pip install uwsgi==2.0.19.1 -i https://pypi.douban.com/simple/
#用uwsgi运行django项目(这里运行的进程不要以后台运行比如nohup,uwsgi -d等)
#为什么不要用后台方式运行? 因为后台运行方式启动,容器会认为服务没起来,从而导致容器停止
ENTRYPOINT uwsgi /home/demo/uwsgi.ini
#开始构建镜像,先进入Dockerfile目录(注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。)
docker build -t demo:1.0 .
#docker build -t demo:1.0 -f /root/docker/Dockerfile .
#镜像构建好后运行镜像
docker run -it -d --name demo -p 1234:8080 demo:1.0
PS:补充命令
docker cp container:src_path dest_path #将容器内的文件复制到主机目录
docker cp dest_path container:src_path #将主机目录文件复制到容器目录
docker logs -f 容器id/容器名 查看容器日志
详情百度
这里,不使用uwsgi服务器,这里使用django自带的web服务器
docker run -it -d --name test -v /home/test:/home/test python:3.7.10
然后进入到容器内
docker exec -it test bash
启动django项目,cd到项目目录下
python manage.py runserver 0.0.0.0:8080
再把nginx容器跑起来
docker run --name nginx -d -p 7777:80 -v /home/nginx.conf:/etc/nginx/nginx.conf nginx
nginx的配置文件如下
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
# HTTPS server
server {
listen 80;
server_name localhost;
location /static {
alias /home/static;
}
location / {
proxy_pass http://172.17.0.2:8080;
}
}
}
这里需要注意的是,这里的nginx.conf配置文件与上面的nginx.conf不同,下面箭头标红修改为跑django服务的容器IP
对于上面这种多容器配合,如果一个一个容器启动就会很麻烦,并且上面nginx配置文件中还要指定容器IP,非常麻烦,如果使用使用docker-compose就可以让各个服务之间组网,使用域名的方式连接各个服务,所以这里就用到了docker-compose,至于怎么安装这里就不赘述了
下面是目录的大致结构
docker/
├── demo
│ ├── demo
│ │ ├── demo
│ │ ├── manage.py
│ │ ├── nothing
│ │ ├── start.sh
│ │ ├── static
│ │ ├── templates
│ │ ├── uwsgi.ini
│ │ └── uwsgi.log
│ └── Dockerfile
├── docker-compose.yml
└── nginx
├── Dockerfile
├── nginx.conf
└── static
├── css
├── dog_imgs
├── fei_hua
├── js
demo目录下的Dockerfile
// An highlighted block
# 建立 python3.7 环境
FROM python:3.7.10
# 镜像作者菠菜
MAINTAINER bocai
# 设置容器内工作目录
WORKDIR /home/demo
COPY ./demo /home/demo
# 在容器内安装django
RUN pip install Django==1.11.28 -i https://pypi.douban.com/simple/
nginx目录下的Dockerfile
// An highlighted block
# 下载nginx
FROM nginx:latest
# 镜像作者菠菜
MAINTAINER bocai
# 设置容器内工作目录
WORKDIR /home
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./static /home/static
nginx的配置文件(可以看见配置文件的代理服务这里使用的是proxy_pass http://demo:8080)
// An highlighted block
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
# HTTPS server
server {
listen 80;
server_name localhost;
location /static {
alias /home/static;
}
location / {
proxy_pass http://demo:8080;
}
}
}
docker-compose.yml配置文件
// An highlighted block
version: "3"
networks: # 自定义网络(默认桥接), 不使用links通信
demo_network:
driver: bridge
nginx_network:
driver: bridge
services:
demo:
build: /root/docker/demo
command: python manage.py runserver 0.0.0.0:8080 # 容器启动后启动web服务器
networks:
- demo_network
expose:
- "8080"
restart: always # always表容器运行发生错误时一直重启
nginx:
build: /root/docker/nginx
ports:
- "1234:80"
restart: always # always表容器运行发生错误时一直重启
networks:
- nginx_network
- demo_network #将nginx加入到demo的网络中
depends_on:
- demo
docker-compose up #启动,大功告成
PS 命令补充
docker-compose ps #列出项目中所有在运行的容器
docker-compose stop #停止正在运行的容器
docker-compose start #启动停止的容器
等等,还有许多的命令,为什么不写?
老子单纯的懒得抄而已
下面是我简单的画了一个图,小伙伴们可以简单的参考一下
传送门
这里nginx单独一个容器,uwsgi+django为一个容器。但然它们三个也可以部署在一个容器内,但是这样没啥意义(目的就是为了动静分离),其实配置也差不多,这种但容器的配置和我之前的个人视觉网站的搭建的配置差不多,只是没有用到docker,好,废话不多说
首先把uwsgi+django容器跑起来
docker run -it -d --name test python:3.7.10
然后进入到容器内
docker exec -it test bash
然后安装uwsgi和django
pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install django==1.11.28 -i https://pypi.tuna.tsinghua.edu.cn/simple
然后退出容器,将django项目复制到容器内(当然也可以通过目录挂载的方式)
docker cp /home/test test:/home/
#将主机/homw/test目录拷贝到容器test的/home目录下。
其中在test目录下有一个uwsgi.ini的uwsgi启动配置文件(给你们瞅瞅)
[uwsgi]
socket = 0.0.0.0:8080
chdir = /home/test
wsgi-file = test/wsgi.py
processes = 1
threads = 4
然后使用uwsgi将将django项目启动
uwsgi -d --ini uwsgi.ini(uwsgi无挂断运行)
这里需要注意的是,区别于上面不使用nginx代理django服务(即直接使用uwsgi),这里的uwsgi.ini的配置文件第二行是socket = 0.0.0.0:8080(也可以写为socket = 本机IP:8080,不知道为什么127.0.0.1不行),不使用nginx的uwsgi.ini的配置文件的第二行为http= 0.0.0.0:8080,其余都相同
至此,django服务已经使用uwsgi跑起来了,然后退出容器
再把nginx容器跑起来
docker run --name nginx -d -p 7777:80 -v /home/nginx.conf:/etc/nginx/nginx.conf nginx
这个端口映射一定要注意,这一端口并不是随便开的,因为某些浏览器是将某些端口禁用,我猜测这些端口被浏览器某些服务占了,当你使用了禁用端口后一般会报这个错误:[ERR_UNSAFE_PORT]
可以参考:传送门
上面有用到文件挂载,就是配置了nginx.conf文件(来瞅瞅)
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream django {
server 172.17.0.2:8080;
}
#gzip on;
# HTTPS server
server {
listen 80;
server_name localhost;
location /static {
alias /home/static;
}
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
}
这里就不详细接受文件配置含义了,其中需要注意的是在配置文件的第13行的ip和端口,这里的IP是你上面django容器对应的ip(该ip是docker给容器自动分配的),端口就是你uwsgi.ini配置文件中服务起的端口
那应该怎么查询容器的ip呢,命令如下:
#docker inspect [容器名或id]| grep "IPAddress"
docker inspect test| grep "IPAddress"
下面是docker-compose时间
demo目录下的Dockerfile
# 建立 python3.7 环境
FROM python:3.7.10
# 镜像作者菠菜
MAINTAINER bocai
# 设置容器内工作目录
WORKDIR /home
# 将项目文件拷贝到工作目录下(拷贝的主机内容,最好是相对路径,绝对路径会有报错 )
#COPY ./demo /home/demo
# 在容器内安装django
RUN pip install Django==1.11.28 -i https://pypi.douban.com/simple/
# 在容器内安装uwsgi
RUN pip install uwsgi==2.0.19.1 -i https://pypi.douban.com/simple/
因为这里使用了uwsgi,所以uwsgi的配置文件
[uwsgi]
socket= 0.0.0.0:8080
chdir = /home/demo
wsgi-file = demo/wsgi.py
processes = 1
threads = 4
这里nginx就直接用镜像了,主要就是一个配置文件,使用volumes进行挂载即可
nginx的配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
# HTTPS server
server {
listen 80;
server_name localhost;
location /static {
alias /home/static;
}
location / {
uwsgi_pass demo:8080;
include /etc/nginx/uwsgi_params;
}
}
}
docker-compose.yml
version: "3"
networks: # 自定义网络(默认桥接), 不使用links通信
demo_network:
driver: bridge
nginx_network:
driver: bridge
services:
demo:
build: /root/docker/demo
command: uwsgi /home/demo/uwsgi.ini # 容器启动后启动web服务器
networks:
- demo_network
expose:
- "8080"
volumes:
- /root/docker/demo/demo:/home/demo
restart: always # always表容器运行发生错误时一直重启
nginx:
image: nginx:latest
ports:
- "1234:80"
restart: always # always表容器运行发生错误时一直重启
volumes:
- /root/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- /root/docker/nginx/static:/home/static
networks:
- nginx_network
- demo_network #将nginx加入到demo的网络中
depends_on:
- demo
然后 docker-compose up,在浏览器输入url即可访问web服务
一定一定一定要注意,在使用docker镜像容器端口映射时,并不是主机上的所有端口你都可以映射,严格来说是可以映射的,但是某些端口被浏览器禁用了,导致你没办法用浏览器访问你的服务。最好使用80和443端口,我这里之所以没用,是因为我的服务器上的80和443端口被占了,哈哈,写的好像比较乱,That’s all