dockerfile项目部署

一、 部署应用映射外部目录
   -1 部署redis,把配置文件和数据目录映射出来
   -2 操作步骤
        -1 mkdir /reids /redis/conf /redis/data
        -2 vim /redis/conf/redis.conf

            # 在redis.conf配置文件:
              bind 0.0.0.0
              daemonize NO
              protected-mode no
              requirepass 123456                     #设置密码

      -3 创建并运行容器
        docker run -p 6378:6379 --name redis_6379 -v /redis/conf/redis.conf:/etc/redis/redis.conf -v /redis/data:/data -di redis redis-server /etc/redis/redis.conf

      -4 本地window机器上远程连接到了docker里的redis

        cmd窗口下
            redis-cli -h 101.133.225.166 -p 6378          #-p后面是端口

        认证
            auth 123456

        写入数据
            set name wmt

        保存数据
            save或者是bgsave

         在宿主机的/redis/data路径下就能看到一个文件

      -6 不管多少次重启redis容器,数据都还在

      -7 原来的redis容器如果没了,按照第三步再启动一遍,数据都还在


二、迁移与备份

  2.0 其他操作(谨慎操作)
    # 删除所有容器()
      docker rm `docker ps -a -q`
    # 删除所有镜像
      docker rmi `docker images -q`
    # 通过自己构建的image启动容器
      docker run -id --name=mydjango -p 8088:8088  mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088
    # 查看容器运行日志
      docker logs 容器id

    # 以上具体操作步骤
        1 启动一个python容器
            docker run -di --name=lqz python:3.6

        2 进入装软件
            docker exec -it lqz /bin/bash
            mkdir /project
            pip install django==1.11.1 
            退出

        3 把项目拷贝到容器内部
            docker cp /opt/lqz/django_test lqz:/project

        4 把容器做成镜像
            docker commit lqz mydjango

        5 基于自己做的镜像运行容器
          docker run -id --name=mydjango -p 8088:8088  mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088


  2.1 容器保存为镜像
    docker commit 容器名字 镜像名字
      如:docker commit 19b mydjango
    pip install django==1.11.11 -i https://pypi.douban.com/simple/

  2.2 把镜像打包成压缩包
    docker save -o mydjango.tar mydjango             压缩包名字   镜像名字

  2.3 把压缩包恢复为镜像
    docker load -i mydjango.tar


三、 dockerfile(重要)

  1 dockerfile是什么
      一个文件,里面一堆指令,通过这个文件可以生成镜像
  2 dockerfile指令
      命令                                                             作用
      FROM image_name:tag                              定义了使用哪个基础镜像启动构建流程
      MAINTAINER user_name                           声明镜像的创建者
      ENV key value                                            设置环境变量 (可以写多条)
      RUN command                                           是Dockerfile的核心部分(可以写多条)
      ADD source_dir/file dest_dir/file                 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
      COPY source_dir/file dest_dir/file               和ADD相似,但是如果有压缩文件并不能解压
      WORKDIR path_dir                                    设置工作目录
    
  3 写一个dockerfile(文件名字必须为dockerfile)

    vim dockerfile
        FROM                  python:3.6
        MAINTAINER       wmt
        EXPOSE              8080
        ADD                     ./requirement.txt /home/
        RUN                     pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/ 
        RUN                     pip install uwsgi -i https://pypi.douban.com/simple/
        VOLUME              ["/home"]
        WORKDIR           /home/django_test
        CMD                     ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"] 

    #先将项目里面必须新建有dockerfile、requirment.txt、uwsgi.ini并有相应配置。再把文件提交给gitee上,

    #再去拉取项目文件 git clone url路径

  4 通过dockerfile构建出镜像
      docker build -t='django_1.11.11' .           #最后面的 . 表示在当前路径下创建此镜像

   ##########如果上面的项目跑起来之后,又重新改了项目文件,当再次提交上去后,再重新拉取最新的:git pull origin master. 然后载重启镜像:docker restart 镜像名(如第六步的mydjango2)
  5 查看镜像
      docker images 
    
  6 启动容器
    docker run -di --name=mydjango2 -v /opt/lqz/:/home -p 8080:8080 django_1.11.11

  7 在外部访问即可

  8 配置nginx转发
    # 创建文件夹
      mkdir -p /opt/nginx/conf /opt/nginx/html /opt/nginx/logs
    # 新建配置文件
      vim 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   {
        server  101.133.225.166:8080;
        server  101.133.225.166:8081;
        server  101.133.225.166:8082;
    }
    server {
        listen       80;
        server_name  localhost;
        location / {
          #proxy_pass http://101.133.225.166:8080;
          #负载均衡配置
          proxy_pass http://node;
        }  
    }
}

    #docker 中运行nginx
      docker run --name nginx -id -p 8888:80 -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/html:/etc/nginx/html -v /opt/nginx/logs:/var/log/nginx nginx
                
  9 配置负载均衡
    # 修改nginx配置文件

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream node   {
        server  101.133.225.166:8080;
        server  101.133.225.166:8081;
        server  101.133.225.166:8082;
    }
    server {
        listen       80;
        server_name  localhost;
        location / {
          #proxy_pass http://101.133.225.166:8080;
          #负载均衡配置
          proxy_pass http://node;
        }  
    }
}

    # 多启动几个docker容器(如果其他几个服务器没了,但只要还有一个容器,都能正常服务)
      docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8081:8080 django_1.11.11
      docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8082:8080 django_1.11.11
        
    # 重启nginx
    # 假设8081的容器挂了,8080的容器挂了,正常提供服务,
    # 再把docker容器启动起来即可

 

# 公司如果使用docker
# 在你项目路径下:requirement.txt,Dockerfile,uwsgi.ini
# 代码写完,提交到git上
# 部署测试环境/真实环境---远程连接到服务器
# git clone https://gitee.com/liuqingzheng/django_test.git
# 基于Dockerfile制作镜像
    docker build -t='django_1.11.11' .
# 运行容器
docker run -di --name=mydjango -v /root/lqz/django_test/:/home/django_test/ -p 8080:8080 django_1.11.11
# 配置nginx转发

四、私有仓库

  1、自己制作镜像上传到docker hub(了解)

        -docker login  输入用户名密码
        -给你要上传的image打个标签docker tag 5452fa6715c0 登录名/django1.11.9:v1
        -docker images
        -docker push 登录名/django1.11.9:v1

  私有仓库建设步骤
  1 拉取私有仓库镜像
      docker pull registry
  2 启动容器
      docker run -di --name=registry -p 5000:5000 registry
  3 打开浏览器 输入地址(跑项目本身机器的地址)http://101.133.225.166:5000/v2/_catalog             看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
  4 配置
      修改daemon.json
        vi /etc/docker/daemon.json
        添加以下内容,保存退出。
          {"insecure-registries":["101.133.225.166:5000"]} 
        此步用于让 docker信任私有仓库地址
  5 重启docker 服务
      systemctl restart docker
  6 重启容器
      docker start registry
  7 打标签
      docker tag 容器id 101.133.225.166:5000/django1.11.11
  8 上传到私有仓库
    docker push 101.133.225.166:5000/django1.11.11
  9 从私有仓库拉取镜像
    docker pull 101.133.225.166:5000/django1.11.11


五、docker-compose
  1 docker-compose是一个单机情况下容器编排的工具

  2 通过yml文件定义多个容器

  3 默认名字docker-compose.yml

  4 三个概念,Service  Networks ,Volumes
      一个service代表一个container,这个container可以从docker hub的image来创建,或者从本地dockerfile build的image来创建

  5 version:有1,2,3版本,目前都用"3"

  6 安装
    curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose              #加这句话,该文件就可以执行

  7 验证安装成功
      docker-compose -v

  5.1 部署多应用
    # 部署flask redis
    1 创建Dockerfile
      vim Dockerfile
        FROM python:3.6
        COPY . /app
        WORKDIR /app
        RUN pip install flask redis
        EXPOSE 5000
        CMD [ "python", "app.py" ]

    2 创建docker-compose文件
      vim docker-compose.yml

      配置写入:
        version: "3"
        services:
           redis:
                                  image: redis
                                   web:
                                    build:
                                  context: .
                                  dockerfile: Dockerfile
              ports:
                 - 8080:5000
              environment:
                                             REDIS_HOST: redis

    补充:docker-compose.yml 如何写

version: '3'
services:
  redis:       
    image:redis
  
  web:
    build:
      context: .
      dockerfile: Dockerfile      #build的固定写法,代表以当前的dockerfile文件构建镜像
    ports:
      - 8080:80             #端口映射
    environment:          #环境配置
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    volumes:                #路径映射
      - mysql-data:/var/lib/mysql        

    3 创建app.py(就在cmd里面写)
      vim app.py

from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
    redis.incr('hits')
    return '你好! 查看 %s 次, hostname 是 %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

    4 启动--运行
      docker-compose up


六、docker-compose水平扩展

三个文件:

  1.Dockerfile文件

FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]

 

  2.app.py文件

from flask import Flask
from redis import Redis
import os
import socket
 
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
 
 
@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
 
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

  3.docker-compose.yaml文件

version: "3"

services:

  redis:
    image: redis

  web:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      REDIS_HOST: redis

  lb:                  #此为负载均衡
    image: dockercloud/haproxy
    links:
      - web
    ports:
      - 8080:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  4.执行:  

    当流量高峰时:                                                             docker-compose up --scale web=3 -d          #此时在web容器中再开镜像,也是属于其管理,那么此时访问的都是一个资源,但是是多个容器

     当流量高峰过了,为了减小资源消耗,可以减小:      docker-compose up --scale web=2 -d          #web后的数值变小即可  


七、多个容器直接通信方式(三种

  1 端口映射到宿主机,直接访问宿主机
  2 通过ip地址访问
  3 run的时候指定 --link 容器 
    docker run -di --name=centos1 centos:centos7
    docker run -di --name=centos2 --link centos1 centos:centos7
    
    进入到centos2中 ping centos1 可以ping同


  # 跨主机的容器通信
      -端口映射

posted @ 2022-03-24 15:48  新入世界的小白  阅读(1545)  评论(0)    收藏  举报