首页 > 技术文章 > Dockerfile介绍和案例以及私有仓库搭建

jiangxianseng 2020-05-09 12:53 原文

一 什么是Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

1、对于开发人员:可以为开发团队提供一个完全一致的开发环境; 2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了; 3、对于运维人员:在部署时,可以实现应用的无缝移植。

二常用命令

命令作用
FROM image_name:tag 镜像名,定义了基于哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分,写需要执行的命令(可以写多条,注意命令不是凭空写的,在容器里一步一步执行后copy出来,并且执行过一遍后面也基本不需要改动了)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录(执行的命令都是在设置的路径下,不设置都在根路径下 /)
CMD [命令] 容器一运行,就会执行命令

 

三.案例

写一个Dockerfile,基于python3.6 搭建运行环境:django,drf,uwsgi

名字必须是 Dockerfile ,当你构建的时候,会在当前路径下找这个文件,自动构建

vim Dockerfile来书写构建命令

 

正常使用Dockerfile会在项目根目录下多出来下面三个文件

Dockerfile里面书写基本命令

requirement.txt里面存放着环境依赖

跑项目用uwsgi而不用manage.py,性能更好

 

 

 

 

 

 

 

先将文件上传到centos中


# 把示例项目做到容器内部
# 远程上传
# cd /User....
# open .
# 压缩一下
# scp untitled1.zip root@10.0.0.200:/home/s13/myprojiect (上传)

# 示例是本地的就直接rz过去了
[root@localhost myproject]# rz
[root@localhost myproject]# ls
untitled1.zip
[root@localhost myproject]# unzip untitled1.zip
[root@localhost myproject]# ls
untitled1  untitled1.zip
[root@localhost myproject]# tar -cvf untitled1.tar untitled1   # 压缩成tar文件可以ADD的 时候自动解压
[root@localhost myproject]# ls
untitled1  untitled1.tar  untitled1.zip

然后开始制作Dockerfile

vim Dockerfile

FROM python:3.6    #基于python3.6
   
MAINTAINER jxs     #作者姓名

ADD ./untitled1.tar /home     # 添加文件并解压到home目录
RUN pip install -r /home/untitled1.tar /requirement.txt -i https ://pypi.doubanio.com/simple     # 执行文件内部的requirement,txt的环境需求并使用豆瓣源
#CMD['python','home/untitled1/mange.py','runserver 0.0.0.0:8000']# 执行这个命令就会将上面的文件跑起来
CMD ["/bin/bash"]  # 这个命令执行后需要再次进入容器手动执行项目才能跑起来
# 保存一下

#基于docker file构建容器
docker build -t=‘django1.11.9’  # 后面就是该容器的名字

# 本地就会有一个基于dockerfile,构建的镜像
docker run -di --name=myproject -p 8080:8080 django1.11.9   # 将镜像端口和主机端口映射到一起
docker exec -it 48249937c530 /bin/bash  # 进入该容器
cd  /home/
ls
cd untitled1/
ls
python manage.py runserve 0.0.0.0:8080  # 手动直接跑起来

 

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


# 1 在项目路径下写Dockerfile
FROM python:3.6
MAINTAINER jxs
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,监听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 101.133.225.166:8080; # 要转发的服务器地址
server 101.133.225.166:8088;
}
   server {
       listen       80;
       server_name  localhost;
       location / {
         #负载均衡配置,随机转到上面的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
       
#7 访问http://101.133.225.166/, 会打到不通的docker容器内,即便有一个服务停了,也不会影响项目的运行

# 因为你django docker容器做了目录映射---》只需要修改代码,重启容器即可(git pull 即可)
# 不停服更新,停一半,更新,启动--在把另一半更新了
# 停服更新

 

五. 私有仓库搭建

# 镜像获取方式:
1)docker pull
2)dockerfile构建
3)拷贝tar文件,load过来

# 公司内部用的镜像,docker hub上没有,又担心泄露,所以建私服(私有服务器)

# 操作步骤
# 1 拉一个registry镜像 (本质是个什么?web服务(想像成 web项目在里面))
docker pull registry
# 2 跑起容器来
docker run -di --name=registry -p 5000:5000 registry
# 3 浏览器输入地址(此时已经算搭建了,只是目前是空的)
http://宿主机:5000/v2/_catalog
   

# 4 修改daemon.json  
vi /etc/docker/daemon.json (文件如果没有就创建出来),以后docker pull 先从自己配置的这个拉,再去远程拉
{"insecure-registries":["101.133.225.166:5000"]}

# 5 重启docker 服务
systemctl restart docker

# 6 启动容器
docker restart registry

# 7 标记本地的镜像tag+镜像名(可能是dockerfile构建的,也可能是通过容器打包成的)
docker tag django1.11.9 101.133.225.166:5000/django1.11.9
# docker tag redis 101.133.225.166:5000/myredis

# 8 把标记好的本地镜像,传到私服
docker push 101.133.225.166:5000/django1.11.9
#docker push 101.133.225.166:5000/myredis
 
# 9 再访问这个地址http://宿主机:5000/v2/_catalog
就能看到你上次的镜像再里面了

# 10 只要在etc/docker/daemon.json,配置了这个{"insecure-registries":["101.133.225.166:5000"]} 的所有小伙伴,都可以拉取我上传的镜像

docker pull 101.133.225.166:5000/myredis

# 公司可能没有私服,直接通过dockerfile构建
# 大一点的公司,搭建私有仓库,里面放了一些镜像(不让你去docker hub下了,直接只从私有仓库下载)

 

推荐阅读