• docker3 Dockerfile编写;容器部署项目,用nginx做负载均衡;私有仓库搭建


    1 Dockerfile编写

    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像,用来构建镜像的
    # docker pull 
    # 通过容器---》打包成镜像--》压缩--》拿到任何位置
    # 通过Dockerfile构建镜像
    
    1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
    2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
    3、对于运维人员:在部署时,可以实现应用的无缝移植。
    
    命令                            作用
    FROM image_name:tag           定义了使用哪个基础镜像启动构建流程
    # 镜像名字,基于哪个镜像构建的,比如python3.6,centos7
    MAINTAINER user_name         声明镜像的创建者
    ENV key value                 设置环境变量 (可以写多条)
    RUN command                   是Dockerfile的核心部分(可以写多条)
    # 写要执行的命令(centos上装一个python3.6,原来在linux上装python,如何操作,就用命令一行一行写出来)
    
    RUN wget http://www..../python.tar.gz   # 下载python
    RUN tar -cvf python.tar.gz                # 解压
    RUN cd python
    RUN make && make install                # 安装
    RUN pip3 install django==1.11.9
    
    ADD source_dir/file dest_dir/file    将宿主机的文件复制到容器内,如果是一个压缩文件(tar文件),将会在复制后自动解压
    COPY source_dir/file dest_dir/file    和ADD相似,但是如果有压缩文件并不能解压
    WORKDIR path_dir    设置工作目录[容器内部路径](docker exec 进去,就在当前设置的路径下   不写默认为/ )
    
    CMD [命令]    容器一运行,就会执行命令
    # ADD和COPY的区别?一个会解压,一个默认不会解压
    
    
    
    # 写一个Dockerfile,基于python3.6 搭建运行环境:django,drf,uwsgi
    # 名字必须交 Dockerfile ,当你构建的时候,会在当前路径下找这个文件,自动构建
    '''[
    # 前戏,自己压缩项目(内含requirement.txt),并传给宿主机
    unzip django_test.zip     # 解压
    tar -cvf django_test.tar django_test    # 压缩成tar文件,咋样add直接可以解压
    ]'''
    
    vim Dockerfile        # 写入下方命令,写的时候把注释删掉
    
    FROM python:3.6        # 基于python3.6构建,如果本地没有,从远端拉下来再构建
    MAINTAINER lqz      # 可以不写
    ADD ./django_test.tar /home   # 放到容器home路径下,并解压
    RUN pip install -r /home/django_test/requirement.txt -i https://pypi.doubanio.com/simple     # 安装依赖,改为豆瓣源
    CMD ["/bin/bash"]
    #或者直接写
    #CMD ["python","/home/django_test/manage.py","runserver 0.0.0.0:8080"] #是一条命令,逗号分隔代表空格,这句话有问题...这个镜像就永远也跑不起来,docker logs myproject查原因
    
    # 基于docker file构建    注意命令结尾.代表根据当前路径下的dockerfile
    docker build -t='django1.11.9' .    # django1.11.9为构建的镜像名字
    
    # 本地就会有一个基于dockerfile,构建的镜像
    docker run -di --name=myproject -p 8080:8080 django1.11.9
    
    # 如果报错,可以用此命令查原因
    docker logs myproject(这是容器名字)
        
    # docker exec -it 380a1429d612 /bin/bash  进入
    进入到容器,启动项目:python manage.py runserver 0.0.0.0:8080    # 8080端口启动
      
      
      
    json模块3.5之前 不支持loads  bytes格式
    json模块3.6以后,loads bytes格式就可以
    
    你同事写的代码,拉倒你本地,一运行,走到一个地方就报错,因为json loads的时候出了错,3.5环境,排查没发现问题,
    去源码看,发现源码根本不支持loads bytes格式,他点开源码看到是支持的,在他机器上没问题,  3.6 ,3.5 

    2 容器部署项目,用nginx做负载均衡

    nginx峰值为10万并发

    公司项目,一般在根路径下,requirement.txt必须有;如果用docker构建,要有Dockerfile;uwsgi.ini一定有,提升django性能(并发量),峰值300左右,连接mysql等可能在100多

    # 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    # 到时运行会映射文件夹,所以home下有此文件夹
    EXPOSE 8080        # 对外暴露哪个端口,这样就可以做映射
    VOLUME ["/home"]    # 容器内路径对外做映射
    CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"]
    
    # 2 在项目路径下写一个uwsgi.ini   注意# 不可以写在赋值行中
    
    [uwsgi] 
    #配置和nginx连接的socket连接 # 可以配置socket连接或者http连接
    #socket=0.0.0.0:8080
    #也可以使用http # 监听端口8080 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上拉下来,解压开 # 4 基于docker file构建镜像 docker build -t='django1.11.9' . #5 运行起django+uwsgi的容器 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 # 6 基于ngixn镜像跑起一个容器来,做目录映射(在宿主机,修改nginx的配置文件)修改方便 # 创建几个文件夹 mkdir -p /home/nginx/conf /home/nginx/html /home/nginx/logs 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 { # 做负载均衡要加upstream标签,node(任意起个名字) server 10.0.0.200:8080; # 要转发的服务器地址,后面不要跟路径 server 10.0.0.200:8088; } server { listen 80; # 监听80端口 server_name localhost; location / {
          # 方式一(uwsgi协议,此处用http协议,不能用)
          # include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
          # uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
      
          # uwsgi_pass 10.0.0.200:8080; # 如果此处配置成前面uwsgi协议,uwsgi的配置里要用socket=0.0.0.0:8080,不是http
          # 方式二

          # 访问根路径的时候,转移到node对应的地址 #负载均衡配置 后面的node为上面定义的名字 proxy_pass http://node; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } 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 #测试:两服务器都是在10.0.0.200:端口号/index下,输入http://10.0.0.200/index/自动随机跳转 #7 访问http://10.0.0.200/, 会打到不通的docker容器内,即便有一个服务停了,也不会影响项目的运行 # 因为你django docker容器做了目录映射---》只需要修改代码,重启容器即可(git pull 即可) # 不停服更新,停一半,更新,启动--在把另一半更新了 # 停服更新

    3 私有仓库搭建

    # 镜像获取:
    docker pull
    dockerfile构建
    拷贝tar文件,load过来
    
    # 公司内部用的镜像,docker hub上没有,私服(私有服务器)
    
    # 操作步骤
    # 1 拉一个registry镜像  (本质是个什么?web服务(想像成 web项目在里面))
    docker pull registry    # 拉取私有仓库镜像
    # 2 跑起容器来     启动私有仓库容器
    docker run -di --name=registry -p 5000:5000 registry
    # 3 浏览器输入地址(目前是空的)  看到{"repositories":[]}表示私有仓库搭建成功并且内容为空
    http://宿主机:5000/v2/_catalog  # 例如http://10.0.0.200:5000/v2/_catalog
        
    # 4 vi /etc/docker/daemon.json (文件如果没有就创建出来),以后docker pull 先从自己配置的这个拉,没有再去远程拉           这个文件中registry-mirrors可以换源
    {"insecure-registries":["10.0.0.200:5000"]}     # 相当于加了仓库的地址
    
    # 5 重启docker 服务    上面的正在运行的容器也全部停止
    systemctl restart docker
    
    # 6 启动容器
    docker restart registry
    
    # 7 标记本地的镜像(可能是dockerfile构建的,也可能是通过容器打包成的)
    docker tag django1.11.9 10.0.0.200:5000/django1.11.9   # 第一个django1.11.9镜像名字  第二个django1.11.9是仓库显示的镜像名
    # docker tag redis 10.0.0.200:5000/myredis
    # 注意这一步后,docker images会出现一个10.0.0.200:5000/django1.11.9文件,id号和原来的一样,是同一个文件。当你 rmi 这个 name 的时候,只是把这个 name 删掉,而不是把这个镜像删掉(除非就是最后一个 name),而直接 rmi id,就是把这个镜像删掉。
    
    # 8 把标记好的本地镜像,传到私服     (注意只要传到一半,仓库就能看到该文件)
    docker push 10.0.0.200:5000/django1.11.9
    #docker push 10.0.0.200:5000/myredis
      
    # 9 再访问这个地址http://宿主机:5000/v2/_catalog
    就能看到你上次的镜像再里面了
    
    # 10 只要在etc/docker/daemon.json,配置了这个{"insecure-registries":["10.0.0.200:5000"]} 的所有小伙伴,都可以拉取我上传的镜像
    
    docker pull 10.0.0.200:5000/myredis
    
    # 公司可能没有私服,直接通过dockerfile构建
    # 大一点的公司,搭建私有仓库,里面放了一些镜像(不让你去docker hub下了,直接只从私有仓库下载)
     
    
    私服传奇  大哥传奇,一刀传奇
    现成的代码,只需要买台服务器,部署上就行了(只要有用户,充钱,就冲在你那里),利润非常非常高,请到一些明星代言
    
    安卓修改器,apk解压,修改源代码,把原来的服务器地址,改成你的就可以了
    安卓的破解软件多,安卓逆向
  • 相关阅读:
    poj1703--Find them, Catch them
    poj2828--Buy Tickets
    POJ 2594 Treasure Exploration(Floyd+最小路径覆盖)
    HDU
    二分图的一些性质
    HDU
    POJ 1659 Frogs' Neighborhood (Havel定理构造图)
    HDU
    HDU
    2018 Multi-University Training Contest 1
  • 原文地址:https://www.cnblogs.com/ludingchao/p/12806100.html
Copyright © 2020-2023  润新知