Dockfile、用docker 和Dockerfile部署项目、nginx负载均衡
一、Dockfile的使用
1、什么是Dockerfile
Dockerfile是 由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。(用来构建镜像的)
2、作用:
01、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
02、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
03、对于运维人员:在部署时,可以实现应用的无缝移植。
3、镜像的由来:
方法一: docker pull 镜像
方法二: 通过容器---》打包成镜像--》压缩--》拿到任何位置
方法三: 通过Dockerfile构建镜像
4、提问 你在项目中有遇到过什么困难吗?
答:因为环境不统一导致的问题,例如:
json模块3.5之前 不支持loads bytes格式
json模块3.6以后,loads bytes格式就可以
同事写的代码,拉倒我本地,一运行,走到一个地方就报错,因为json loads的时候出了错,我装的是3.5环境,排查没发现问题,
去源码看,发现源码根本不支持loads bytes格式。他装的是3.6,点开源码看到是支持的,在他机器上没问题。
二、常用的命令

命令
1、FROM image_name:tag 定义了使用哪个基础镜像启动构建流程。# image_nam 表示:镜像名字(基于哪个镜像构建的)
例子:FROM python:3.6
2、MAINTAINER user_name 声明镜像的创建者
例子:MAINTAINER lqz
3、ENV key value 设置环境变量 (可以写多条)
4、RUN command 是Dockerfile的核心部分(可以写多条)
例子:
写要执行的命令(centos上装一个python3.6,原来在linux上装python,如何操作,就用命令一行一行写出来)
注:公司中给写好的
RUN wget http://www..../python.tar.gz
RUN tar -cvf python.tar.gz 表示 解压出python文件夹
RUN cd python 表示 切到python文件夹中
RUN make && make install 表示 安装 python
RUN pip3 install django==1.11.9 表示 在python中安装django
5、ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
例子:ADD 宿主机中某文件路径 容器中某文件路径
6、COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
例子:COPY 宿主机的文件路径 容器的文件路径
注意: ADD和COPY的区别?一个会解压,一个默认不会解压
7、WORKDIR path_dir 设置工作目录 (docker exec 进去,就在当前设置的路径下 。若不设置,docker exec 进去,就是根路径: /)
8、CMD [命令] 容器一运行,就会执行命令
三、一个写好的项目要部署
1、配置文件中

2、在项目中创建Dockerfile、requirement.txt或requirement.text 、uwsgi.ini 文件
在pycharm中 创建名字为 Dockerfile 。当你构建的时候,会在当前路径下找这个文件,自动构建


创建 名字为requirement的text文件


创建 名为uwsgi 的INI Config文件


或者直接 加上 .ini

3、把写好的项目传到远程
方法一:
01、copy这个项目的路径

02、打开虚拟机上的docker
命令:
方法二、
01、把本地项目压缩

02、安装 lrzsz

A、查看是否安装成功。

B、在根目录下 :上传文件的执行命令:


结果

注意:如果覆盖原文件,执行:
rz -y
下载文件

B、在根目录下的 home下的s13的myproject中上传本地文件



C、解压

结果

D、把untitled 文件压成 tar文件。因为tar文件在ADD中 可以自动解压

补充:删除文件夹是
4、基于上面的 写一个Dockerfile,基于python3.6 搭建运行环境:django,drf,uwsgi
1、 安装vim

2、执行以下命令:
vim Dockerfile
FROM python:3.6
MAINTAINER lqz
ADD ./untitled.tar /home
RUN pip install -r /home/untitled/requirement.txt -i https://pypi.doubanio.com/simple https://pypi.doubanio.com/simple 表示豆瓣源,换源。会更快
//CMD ["/bin/bash"] 容器一运行,就会执行命令 :/bin/bash 进入后再写其他命令
CMD["python","/home/untitled/manage.py","runserver 127.0.0.8000"]
实践

3、基于docker file构建 命令:docker build -t='xxxxx'.
例子:docker build -t='django1.11.9' . 创建镜像
4、跑起镜像成容器
docker run -di --name=myproject -p 8000:8080 django1.11.9 做端口映射,进入容器
5、启动项目:
python manage.py runserver 0.0.0.0:8080
问题:

问题

四、基于上面的
步骤1 在项目路径下写Dockerfile
FROM python:3.6
MAINTAINER lqz
ADD ./requirement.txt /home/
RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/
WORKDIR /home/django_test 表示 工作路径是什么
注意:此时还没有把django_test文件上传到远程的home下 ,解决:1、上传。或2、可以在跑项目时,做目录映射和端口映射:命令为:docker run -di --name=mydjango2 -v /home/s13/project:/home -p 8000:8080
EXPOSE 8080 表示 对外暴露的端口
VOLUME ["/home"] 表示数据卷 ,要让容器里放入home路径 对外做一个映射
CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"]
步骤 2 在项目路径下写一个uwsgi.ini
[uwsgi]
#也可以使用http
http=0.0.0.0:8080
#配置项目路径,项目的所在目录
chdir=/home/django_test
#配置wsgi接口模块文件路径
wsgi-file=django_test/wsgi.py
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
步骤3 传到git上(我们直接复制过去了)
在服务器上 从git上拉下来,解压开

或者步骤3 看上面的绿色的 B 和C和D
步骤4 查看,并进入项目文件中

步骤5 基于docker file构建镜像
docker build -t='django1.11.9' .
步骤6 运行起django的容器
docker run -di --name=mydjango1 -v /home/s13/myproject:/home -p 8080:8080 django1.11.9
docker run -di --name=mydjango2 -v /home/s13/myproject2:/home -p 8088:8080 django1.11.9

此时django服务已经部署好 就可以在浏览器里 访问项目了

注意:一停掉django服务 就不能访问了。若再启动django容器服务 就又可以访问项目了

五、基于上面的 做nginx负载均衡
步骤7 为了演示负载均衡,把liuliu项目所在文件夹project复制一下

再运行起一个django容器,把项目的端口随便改一下

查看跑的容器,发现有两个 django容器,就是跑了两个项目。访问8000或8088都有项目。

修改一下复制的项目的代码

步骤8 基于nginx镜像跑起一个容器来,做目录映射(在宿主机,修改nginx的配置文件)
用docker 拉取一个nginx镜像

在home下 创建几个文件夹:目的是做目录映射,然后可以在宿主机上修改nginx的配置文件。注意你也可以不在home 文件夹下创建
mkdir -p /home/nginx/conf /home/nginx/html /home/nginx/logs

nginx的配置文件 放在conf文件夹里,新建一个nginx.conf文件(vim nginx.conf)

vim /home/nginx/conf/nginx.conf
#写入
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream node { node 是随意起的名字
server 101.133.225.166:8080; 101.133.225.166:8080 表示你项目的ip地址及端口号
server 101.133.225.166:8088;
}
server {
listen 80;
server_name localhost;
location / { 表示 访问根路径时,随机达到server xx.xx.xx.xx上
#负载均衡配置
proxy_pass http://node; 这个node就是上面随意起的node
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
跑起nginx容器

既是,命令:
docker run --name nginx -id -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/etc/nginx/html -v /home/nginx/logs:/var/log/nginx nginx
原理:

思考:
当你 访问服务器(http://101.133.225.166/), 会打到不通的docker容器内,即便有一个服务停了,也不会影响项目的运行
# 因为你django docker容器做了目录映射---》只需要修改代码,重启容器即可(git pull 即可)
# 不停服更新,停一半,更新,启动--在把另一半更新了
# 停服更新

浙公网安备 33010602011771号