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同
# 跨主机的容器通信
-端口映射