lab0. 变动nginx.conf的注意事项
- 与本机nginx不同,nginx编辑default.conf就可以完成nginx配置。
- default.conf的位置:etc/nginx/conf.d/default.conf
- 重启:记得更改nginx配置后需要重启container!记得更改nginx配置后需要重启container!记得更改nginx配置后需要重启container!
lab1:HTTP服务器访问本地的资源
Nginx超级简单入门:https://blog.csdn.net/huangliequan/article/details/77214595
效果:访问http://localhost:8020/显示d:images/index.html
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8020;
server_name localhost;
location / {
root d:images;
index index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
lab2:反向代理
Nginx超级简单入门:https://blog.csdn.net/huangliequan/article/details/77214595
效果:当我们访问localhost:8020的时候,就相当于访问localhost:8000
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8020;
server_name localhost;
location / {
proxy_pass http://localhost:8080;
proxy_set_header host $host;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
lab3:静态服务器
Nginx超级简单入门:https://blog.csdn.net/huangliequan/article/details/77214595
效果:文件会从不同的目录中映射(取决于请求):/data/www(放置 HTML 文件)和 /data/images(放置图片)。当接收到 http://localhost/images/example.png 的请求响应时,nginx 会返回 d:/data/images/example.png 文件。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8020;
server_name localhost;
location / {
root d:/data/www;
}
location /images/ {
root d:/data/;
}
}
}
lab4:搭建一个简易的代理服务
Nginx超级简单入门:https://blog.csdn.net/huangliequan/article/details/77214595
效果1:访问localhost:8020,nginx 相当于访问localhost:8000。
效果2:当接收到后缀为png、gif、jpg时,nginx 会映射到d:/data/images/。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8020;
server_name localhost;
location / {
proxy_pass http://localhost:8000;
}
location ~ \.(gif|jpg|png)$ {
root d:/data/images;
}
}
}
效果1截图
效果2截图
lab5:location基本语法
nginx系列之五: 负载均衡:https://blog.csdn.net/qq_29677867/article/details/90114076
效果1:访问http://localhost:8020/index.html,显示401
效果2:访问http://localhost:8020/,显示402
效果3:访问http://localhost:8020/documents/document.html,显示403
效果4:访问http://localhost:8020/images/1.gif,显示404
效果5:访问http://localhost:8020/dddd/1.gif,显示500
-
= 精确匹配,如果找到匹配=号的内容,立即停止搜索,并立即处理请求(优先级最高)
-
区分大小写
~* 不区分大小写
^~ 只匹配字符串,不匹配正则表达式
@ 指定一个命名的location,一般用于内部重定义请求,location @name {…}
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8020;
server_name localhost;
location / {
return 401;
}
location = / {
return 402;
}
location /documents/ {
return 403;
}
location ^~ /images/ {
return 404;
}
location ~* \.(gif|jpg|png|jpeg)$ {
return 500;
}
}
}
lab6:负载均衡
nginx系列之五: 负载均衡:https://blog.csdn.net/qq_29677867/article/details/90114076
负载均衡依赖于upstream模块来实现。upstream来定义虚拟主机static_pools,并可定义多个server(下方只显示一个server localhost:8000)。
同时注意添加proxy_set_header host $host; 这是节点服务器多虚拟主机时的关键配置。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream static_pools {
server localhost:8000;
}
server {
listen 8020;
server_name localhost;
location / {
proxy_pass http://static_pools;
proxy_set_header host $host;#在代理向后端服务器发送的http请求头中加入host字段信息,用于当后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机。这是节点服务器多虚拟主机时的关键配置 } }}注:这里是代理服务器
}
location /images/ {
root d:/data/;
}
}
}
效果:访问动态网站时的截图
效果:访问静态图片时的截图
lab7:反向代理实现使用域名访问本地项目
nginx_反向代理实现使用域名访问本地项目:https://blog.csdn.net/qq3399013670/article/details/100971283
效果:访问manage.enjoyment.com:80,可以转发给127.0.0.1:8000
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8020;
server_name manage.enjoyment.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header host $host;#在代理向后端服务器发送的http请求头中加入host字段信息,用于当后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机。这是节点服务器多虚拟主机时的关键配置 } }}注:这里是代理服务器
}
location /images/ {
root d:/data/;
}
}
}
lab8:将docker container的nginx的文件拷贝到windows桌面
docker 文件操作:https://blog.csdn.net/henryhu712/article/details/82084160
以管理员权限来执行cp命令。docker cp :/file/path/within/container /host/path/target
效果:windows桌面可以看到docker container的nginx的文件
docker cp 30455a37c745:/ C:/Users/Z13073219/Desktop/new
lab9:将windows桌面txt文件拷贝到docker container中
docker 文件操作:https://blog.csdn.net/henryhu712/article/details/82084160
以管理员权限来执行cp命令。docker cp filename :/file/path/within/container
效果:docker container可以看到test.txt
docker cp C:/Users/Z13073219/Desktop/new/test.txt 30455a37c745:/
lab10:nginx安装到docker
效果:打开localhost:81,默认链接到容器的80端口,从而打开nginx默认页面。
注意-p 81:80是关键点,80不能更改,81可以更改。
docker pull nginx
docker run --name nginx-test81 -p 81:80 -d nginx
lab11:nginx在docker中设置反向代理成功(可使用vscode IDE来直接修改docker中的文件)
记得更改nginx配置后需要重启container!记得更改nginx配置后需要重启container!记得更改nginx配置后需要重启container!
效果:打开宿主机的IP:端口(http://192.168.1.5:81/),就可以打开反向代理的网址(http://192.168.1.5:8095/)。
docker 安装 nginx 并配置反向代理https://blog.csdn.net/weixin_40461281/article/details/92586378
nginx反向代理–以docker容器为例:https://blog.csdn.net/weixin_43283513/article/details/112724535
关键:以下设定的反向代理无法成功。proxy_pass http://127.0.0.1:8095;
这是错误写法,使用docker容器反向代理的时候,proxy_pass中不能使用127.0.0.1和localhost,因为实际要指向宿主机的8095端口,但是这里使用127.0.0.1和localhost指向的是容器内的8095,故此无法代理。如果不使用docker而是直接安装的,可以使用127.0.0.1或localhost
server {
listen 80;
listen [::]:80;
server_name 192.168.1.5;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://192.168.1.5:8095;
proxy_redirect default;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
- 打开http://192.168.1.5:81/相当于打开http://192.168.1.5:8095/
lab12:nginx在docker中设置反向代理(运用命令行cp操作)
效果:打开宿主机的IP:端口(http://192.168.50.124:81/),就可以打开反向代理的网址(http://localhost:8000/)。
很多时候没有vscode的IDE,所以必须通过命令行来启动nignx,并nginx容器中设定lab11的反向代理。
nginx反向代理–以docker容器为例:https://blog.csdn.net/weixin_43283513/article/details/112724535
关键:命令行的语句要熟悉。尽量以文件取代文件避免位置错误。以文件夹取代文件夹容易出现位置错误。
过程如下:
docker run --name nignx82 -p 82:80 -d nginx #启动容器
docker container exec -it nignx82 /bin/bash #进入容器内部查看结构
docker container cp nignx82:/ C:/Users/Z13073219/Desktop/nginx82 #copy容器的文件夹到指定路径
docker container cp C:/Users/Z13073219/Desktop/nginx82/etc/nginx/conf.d/default.conf nignx82:/etc/nginx/conf.d/default.conf # 将修改后的文件copy回容器里面
docker restart nignx82 # 重启容器
其他可能用到的命令行语句
docker stop nignx82
docker start nignx82
删除文件夹:
例如:删除/etc/nginx/log目录以及其下所有文件、文件夹
rm -rf /etc/nginx/log
删除文件:
例如:强制删除/etc/nginx/log/access.log文件
rm -f /etc/nginx/log/access.log
呈现效果类似于lab11。
lab13:利用commit来生成属于自己的images(以lab12的nignx82为基础)
效果:lab12已在docker内部修改完default.conf,为了便于迁移,我生成一个新的images来保存这次修改。
https://blog.csdn.net/leo15561050003/article/details/71274718
docker commit -m "nginx82_modified_ip" nignx82 nignx:v2 #利用commit生成新的images
docker run --name nignx82_v2 -p 83:80 -d nignx:v2 #利用新的images来生成容器
这次生成容器后,就可以直接访问代理的网址了。
lab14:django项目生成属于自己的images
效果:编写dockerfile来生成属于自己的images,并成功运行。
【Docker】第一次用docker来部署django项目-20220209:https://blog.csdn.net/m0_46629123/article/details/122848644
lab15:在nginx中建立挂volume
效果:创建数据卷container-vol,并挂在nginx容器的volume_opt路径下。
06-Docker数据管理实践:https://yutian.blog.csdn.net/article/details/119707376
#建立数据卷
docker volume create container-vol
#查看数据卷位置方便挂靠到容器
docker volume ls
docker volume inspect container-vol
[
{
"CreatedAt": "2022-02-24T23:18:29Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/container-vol/_data",
"Name": "container-vol",
"Options": {},
"Scope": "local"
}
]
#将数据卷挂靠到容器
docker run --name nginx_vol_container -dit -p 82:80 -v container-vol:/volume_opt/vol nginx bash
#进入容器进行查看
docker exec -it 8a16339b66e3 bin/bash
ls
最后可以看到volume_opt被挂靠进来
lab16:本机文件夹运用-v参数挂给container(bind mount)
效果:桌面的test_vol可以在nginx container中找到。
docker $PWD路径_Docker常用操作:https://blog.csdn.net/weixin_39681058/article/details/110088896
Docker Data Volume 之 bind mount:https://blog.csdn.net/qq_34556414/article/details/109298133
docker run -p 89:80 --name test89 -d -v C:/Users/Z13073219/Desktop/test_vol:/usr/share/nginx/html nginx
本机的文件夹:
容器中的文件夹:
lab17:通过volume来持久化保存数据
volume更像是一种对应关系,不是一个文件夹。
效果:test90(container)的html文件夹保存在container-vol2(volume)中,然后test91(container)也是挂container-vol2(volume),你就会发现html文件夹被同步过来。
- 新建container-vol2(volume)
docker volume create container-vol
- 将container-vol2(volume)挂到test90(container)中
docker run -p 90:80 --name test90 -d -v container-vol2:/usr/share/nginx/html nginx
- 用vscode修改html文件夹的文件
- 将container-vol2(volume)挂到test91(container)中
docker run -p 91:80 --name test91 -d -v container-vol2:/usr/share/nginx/html nginx
- 查看test91(container)的html文件夹是否被同步过来
lab18:持久化保存django的SQLite数据库(bind mount -v)
效果:A网站维护的信息,通过bind mount存在C盘,B网站可以读取。
Docker Data Volume 之 bind mount:https://blog.csdn.net/qq_34556414/article/details/109298133
- 建立A网站localhosts:8000,B网站localhosts:8002
docker run -p 8000:8000 --name pp_test_for_bind_mount -d -v C:/Users/Z13073219/Desktop/SQL/db.sqlite3:/code/package/db.sqlite3 pp4_slim
docker run -p 8002:8000 --name pp_test_for_bind_mount2 -d -v C:/Users/Z13073219/Desktop/SQL/db.sqlite3:/code/package/db.sqlite3 pp4_slim
-
在A网站中修改Z13的数据。
-
在B网站上查看Z13数据是否被修改。
-
在C盘上看SQLite。
lab19:保存volume的办法
最有效的办法,是通过cp来拷贝容器的内容,从而将容器中被volume挂的数据卷一并保存。
docker cp nginx_vol_container:\ C:\Users\Z13073219\Desktop\test1234
lab20:如何在容器启动后再挂volume(暂时找不到策略)
建议是容器启动run时就挂好了volume。
docker run -p 8000:8000 --name pp_test_for_bind_mount -d -v C:/Users/Z13073219/Desktop/SQL/db.sqlite3:/code/package/db.sqlite3 pp4_slim
lab21:volume抓文件,也可以抓文件夹
参考前面lab
lab22:容器内部启动测试服务器python manage.py runserver
container启动后,可以exec进入容器,输入python manage.py runserver启动测试服务器
lab23:单容器部署Django + Uwsgi
请见我的文章https://blog.csdn.net/m0_46629123/article/details/123607272
效果:出现“getting INI configuration from uwsgi.ini”—读取到配置文件。
做法:启动容器后,在bash中运用copy指令,将uwsgi.ini拷贝到容器文件夹中(也可以在封装容器时候就提前将uwsgi.ini拷贝进去)。使用uwsgi --ini uwsgi.ini来读取uwsgi.ini的配置。
参考文档如下:
- Docker-compose 八步部署Django + Uwsgi + Nginx + MySQL + Redis升级篇链接
- 如何在阿里云Ubuntu服务器通过uWSGI和Nginx部署Django项目教程-大江狗原创出品链接
- 解决“The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting”:STATIC_ROOT=os.path.join(BASE_DIR,“/static/”)#正确
链接 - getting INI configuration from uwsgi.ini:是正常的日志输出呀,意思是读取到这个配置文件里面的信息了
链接
lab23:双容器部署Django + Uwsgi + Nginx(不用docker-compose)
先完成lab23:单容器部署Django + Uwsgi
再完成lab11:nginx在docker中设置反向代理成功
lab24:uwsgi配置好后,出现Internal Server Error(还没解决)
uwsgi配置好后,浏览器输入自己设置的IP地址加端口号出现Internal Server Error
https://blog.csdn.net/m0_46077151/article/details/108071004
lab25:单容器部署Django (python manage.py runserver)
效果:安装必要的linux环境后,打包进镜像,然后用runserver来启动服务。其实也可以不安装linux必要环境的,练习打包也是目标之一。
- dockerfile
FROM python:3.8-slim
RUN apt-get update -y && apt-get install gcc -y
COPY ./Django /code
WORKDIR /code/package
RUN pip install -r requirements.txt
RUN pip install uwsgi
EXPOSE 8000
RUN chmod 777 /code/package/runserver-docker.sh
RUN chmod 777 /code/package/start.sh
# Windows环境下编写的start.sh每行命令结尾有多余的\r字符,需移除。
RUN sed -i 's/\r//' ./start.sh
# 设置start.sh文件可执行权限
RUN chmod +x ./start.sh
CMD ["/bin/sh","/code/package/start.sh"]
- settings.py注意变动STATIC_ROO
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
STATIC_ROOT = os.path.join(BASE_DIR, "/static/")
- start.sh
#!/bin/bash
# 从第一行到最后一行分别表示:
# 0. 收集静态文件
# 1. 生成数据库迁移文件
# 2. 根据数据库迁移文件来修改数据库
# 3. 用 uwsgi启动 django 服务, 不再使用python manage.py runserver
python manage.py collectstatic --noinput&&
python manage.py makemigrations&&
python manage.py migrate&&
#uwsgi --ini /code/package/uwsgi.ini
#uwsgi --ini uwsgi.ini
python manage.py runserver 0.0.0.0:8000
- requirements.txt
Django==3.2.7
django-bootstrap4==21.2
django-grappelli==2.15.3
djangorestframework==3.12.4
openpyxl==3.0.9
matplotlib==3.4.3
matplotlib-inline==0.1.3
pyecharts==1.9.0
pandas==1.3.3
simplejson==3.17.5
- 文件大致结构
- 打包镜像images
docker build -t training_dashboard_v1b_auto_runserver .
lab26:docker-compose
docker-compose 配置参数:https://blog.csdn.net/qq_38829069/article/details/120145269
services:
#服务名称,不可重复
web:
#服务的镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像
image: dockercloud/hello-world
#基于一份 Dockerfile构建镜像,指定 Dockerfile 所在文件夹的路径
#如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字
#build: /path/to/build/dir
#也可以是相对路径,建议使用
#build: ./dir
#设定上下文根目录,然后以该目录为准指定 Dockerfile,不建议用
build:
context: ../
dockerfile: path/of/Dockerfile
#Dockerfile 中的 ARG 指令,和ENV不同,ARG允许空值
args:
- buildno=
- password=secret
#不建议这种写法
#args:
# buildno: 1
# password: secret
#command 可以覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
#也可以写成类似 Dockerfile 中的格式:
# command: [bundle, exec, thin, -p, 3000]
#容器名称,不写则默认为 项目名称_服务名称_序号
container_name: app
#控制容器启动的顺序,先启动 redis 和 db 两个服务,最后才启动 web 服务:
depends_on:
- db
- redis
#和docker的启动参数 --dns 一样用途
dns: 8.8.8.8
#多个配置
#dns:
# - 8.8.8.8
# - 9.9.9.9
#同理搜索域 dns_search
#挂载临时目录到容器内部的tmpfs
#env_file可以定义一个专门存放变量的文件
#expose与Dockerfile中的EXPOSE指令一样,用于指定暴露的端口,没啥用
#都是类似的语法
dns_search: example.com
tmpfs: /run
env_file: .env
expose: 3000
#ENTRYPOINT 指令,用于指定接入点
entrypoint: /code/entrypoint.sh
#同样可以写成这样,注意参数 -d 是另起一行
#entrypoint:
# - php
# - -d
# - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
# - -d
# - memory_limit=-1
# - vendor/bin/phpunit
#env_file可以定义一个专门存放变量的文件
#arg 标签的变量仅用在构建过程中。而 environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中
# environment:
# RACK_ENV: development
# SHOW: 'true'
# SESSION_SECRET:
#建议写法
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
#external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)
external_links:
- redis_1
#冒号后面是别名
- project_db_1:mysql
- project_db_1:postgresql
#extra_hosts就是往容器/etc/hosts文件中添加一些记录,与Docker client的--add-host类似:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
#labels向容器添加元数据,和Dockerfile的LABEL指令一个意思
#labels:
# com.example.description: "Accounting webapp"
# com.example.department: "Finance"
# com.example.label-with-empty-value: ""
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
#links标签解决的是容器连接问题,与Docker client的--link一样效果,会连接到其它服务中的容器。使用的别名将会自动在容器中的/etc/hosts里创建
links:
- db
- db:database
- redis
#logging这个标签用于配置日志服务
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
#pid 容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间。不建议使用
pid: "host"
#ports映射端口的标签
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
#security_opt为每个容器覆盖默认的标签
security_opt:
- label:user:USER
- label:role:ROLE
#stop_signal设置另一个信号来停止容器。在默认情况下使用的是SIGTERM停止容器。设置另一个信号可以使用stop_signal标签。
stop_signal: SIGUSR1
#volumes挂载一个目录或者一个已存在的数据卷容器
volumes:
#只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
- /var/lib/mysql
#使用绝对路径挂载数据卷
- /opt/data:/var/lib/mysql
#以docker-compose.yml配置文件为中心的相对路径作为数据卷挂载到容器。
- ./cache:/tmp/cache
#使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。不建议使用,大坑。:ro代表只读,默认为读写:rw
- ~/configs:/etc/configs/:ro
# 已经存在的命名的数据卷。
- datavolume:/var/lib/mysql
# volumes_from从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
#devices设备映射列表。与Docker client的--device参数类似。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
docker-compose up -d
sample如下:非完整
version: '3.3'
services:
db:
image: mysql:5.7
ports:
- "4000:3306"
environment:
MYSQL_ROOT_PASSWORD: Password@123
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
restart: always
volumes:
- db_data:/var/lib/mysql
networks:
- my_bridge_network
wordpress:
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
restart: always
depends_on:
- db
networks:
- my_bridge_network
volumes:
db_data: {}
networks:
my_bridge_network:
第二个sample如下:
version: '3.2'
services:
mysql:
#如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字
image: mysql:5.7
container_name: mysql
environment:
- "MYSQL_ROOT_PASSWORD=password"
ports:
- "3306:3306"
redis:
image: redis
container_name: redis
ports:
- "6379:6379"
web:
image: py-red-sql
container_name: web
build:
context: .
ports:
- "5000:5000"
restart: unless-stopped
depends_on:
- mysql
- redis