Dockerfile编写、容器部署项目nginx负载均衡、私有仓库搭建
Dockerfile编写、容器部署项目nginx负载均衡、私有仓库搭建
1. Dockerfile编写
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像,用来构建镜像的
1. 构建镜像的三种方式:
1. 从远程拉取,docker pull
2. 通过容器打包成镜像,压缩后可以拿到任意位置
3. 通过 dockerfile 构建镜像
2. dockerfile 构建镜像的作用:
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
3. 常用命令
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建的 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条)写要执行的命令,如:RUN pip3 install django==1.11.9 |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录(如果不写默认是docker exec进去后当前的路径下) |
CMD | [" "]容器一运行就会执行命令,CMD ["/bin/bash"] |
ADD与COPY的区别:ADD会自动解压,COPY不会自动解压
2. 容器部署项目nginx做负载均衡
Dockerfile基于python3.6搭建环境:Django,uwsgi
requirement.txt文件中写所有的依赖
1. 在项目目录下写dockerfile文件
EXPOSE 8080 # 对外暴露的哪个端口
VOLUME ["/home"] # 映射到容器中的home路径
FROM python:3.6 MAINTAINER Mr.shen ADD ./requirement.txt /home/ RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/ WORKDIR /home/django_test EXPOSE 8080 VOLUME ["/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上拉下来,解压
4. 基于dockerfile构建镜像(进入上传的Django_test路径下)
docker build -t='django1.11.9' .
5. 运行Django+uwsgi的容器
docker run -di --name=mydjango1 -v /home/myproject:/home -p 8080:8080 django1.11.9
6. 基于nginx镜像跑起来一个容器,做目录映射(在宿主机修改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 { server 101.133.225.166:8080; server 101.133.225.166:8088; } server { listen 80; # 宿主机暴露的端口 server_name localhost; location / { #负载均衡配置 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
访问http://101.133.225.166/, 会打到不通的docker容器内,即便有一个服务停了,也不会影响项目的运行
不停服更新,停一半,更新,启动--在把另一半更新了,因为你django docker容器做了目录映射---》只需要修改代码,重启容器即可(git pull 即可)
3. 私有仓库搭建
公司内部用的镜像,docker hub上没有,私服(私有服务器)
# 操作步骤 # 1 拉一个registry镜像 (本质是个什么?web服务(想像成 web项目在里面)) docker pull registry # 2 跑起容器来 docker run -di --name=registry -p 5000:5000 registry # 3 浏览器输入地址(目前是空的) http://宿主机ip:5000/v2/_catalog # 4 vi /etc/docker/daemon.json (文件如果没有就创建出来),以后docker pull 先从自己配置的这个拉,再去远程拉 {"insecure-registries":["宿主机ip:5000"]} # 5 重启docker 服务 systemctl restart docker # 6 启动容器 docker restart registry # 7 标记本地的镜像(可能是dockerfile构建的,也可能是通过容器打包成的) docker tag django1.11.9 宿主机ip:5000/mydjango1.11.9 # docker tag redis 宿主机ip:5000/myredis # 8 把标记好的本地镜像,传到私服 docker push 宿主机ip:5000/django1.11.9 #docker push 宿主机ip:5000/myredis # 9 再访问这个地址http://宿主机:5000/v2/_catalog 就能看到你上传的镜像再里面了 # 10 只要在etc/docker/daemon.json,配置了这个{"insecure-registries":["搭建私服宿主机ip:5000"]} 的所有小伙伴,都可以拉取我上传的镜像 别人可以使用 docker pull 我搭建私服宿主机ip:5000/myredis