设为首页 收藏本站
查看: 740|回复: 0

[经验分享] Docker探索系列2之镜像打包与DockerFile

[复制链接]
发表于 2017-12-6 22:12:54 | 显示全部楼层 |阅读模式
preface
  docker基本入门以后,可以试试打包docker镜像与dockerfile了

docker镜像
  docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建的,顶层仓库由docker内部的人来管理的。仓库里存放的是镜像文件,那么问题来了 ,怎么去创建镜像呢?

how to create image
  构建docker镜像的有2种方法:


  • 使用docker commit命令。
  • 使用docker build 命令和Dockerfile文件。  
    在这里并不推荐使用docker commit命令,而应该使用更灵活,更强大的Dockerfile来构建镜像
      
    但是还得介绍下如何使用docker commit。。

  notice:
  
you should remeber , we are not create new image from 0。而是基于一个已有的基础镜像,如CentOs来构建新镜像而已。如果真的想从0构建一个全新的镜像,可以参考: https://docs.docker.com/engine/userguide/eng-image/baseimages/

使用commit来创建一个新的镜像
  我们先启动一个container,然后安装个python3。
  

我们先启动一个container,然后安装个python3,  
[iyunv@salt docker]# docker run --name python3 -i -t centos /bin/bash
  
#省去安装py3步骤。。。。。。
  
[iyunv@cb6903f738e1 python3.5.2]# exit   #安装好后退出
  
[iyunv@salt docker_pratice]# docker commit -m="install python3" --author='Leo'  python3 1403208717:test
  

  参数解释:


  • -m: 用来指定新创建的镜像的提交信息  


  • --author选项用来列出镜像的作者信息
  • 标签: 我们在1403208717追加了一个test,表示冒号后面的是标签。
查看有刚才commit的信息
  

[iyunv@salt docker]# docker  images
  
REPOSITORY              TAG                 IMAGE>  
1403208717              latest              001d2ee1399c        12 minutes ago      840.4 MB
  

导入镜像
  docker通过load放来导入其他的镜像文件。
  

[iyunv@linux-node2 ~]# docker load < docker_httpd.iso  # docker_http.iso是一个标准的docker镜像文件  
[iyunv@linux-node2 ~]# docker images   # 导入成功

  
REPOSITORY          TAG                 IMAGE>  
httpd               latest              4f1d18bcf20b        7 weeks ago         531.5 MB
  

使用dockerfile构建镜像(基于DSL语法指令创建一个docker镜像)
  我们首先创建一个目录用来存放dockerfile,这个目录成为构建环境(base environment),docker称为这个为上下文或者构建上下文(build context)。docker会在构建镜像时将构建上下文和该上下文的文件和目录上传到Docker守护进程。这样docker守护进程就能直接访问你想在镜像中存储的任何代码,文件或者其他数据。
  
下面看看DockerFIle的样例:
  

[iyunv@salt docker_pratice]# mkdir /docker_pratice/  
[iyunv@salt ~]# cat /docker_pratice/Dockerfile
  
# this is a comment              # 注释
  
FROM 1403208717                #从哪个基础镜像开始
  
MAINTAINER Docker Newbee <newbee@docker.com>     #表明作者信息
  
RUN yum -y update                # 需要运行命令,运行成功后提交该镜像
  
RUN yum -y insall httpd           # 需要运行命令,运行成功后提交该镜像
  
RUN echo "Hi, i am in your container" >/var/www/html/index.html   #同上
  
EXPOSE 80
  

  流程讲解:
  
每条指令都会创建一个新的镜像层并对镜像进行提交。docker大体上按照如下流程执行DockerFile中的指令。


  • Docker从基础镜像运行一个容器。
  • 执行一条指令,对容器修改。
  • 执行类似与docker commit的操作,提交一个新的镜像层。
  • Docker再基于刚刚提交的镜像运行一个新的容器。
  • 执行Dockerfile中的下一条指令,直到所有的指令执行完毕。
  确认无误后,我们开始执行dockerfile文件:
  
[iyunv@salt docker_pratice]# docker build -t="test/run_httpd" .   --no-cache


  • -t 是指明到哪个repository下的哪个tag
  • . 表示当前目录下的dockerfile
  • --no-cache: 表示不使用缓存功能,在没有结束提交之前的镜像层,都看作缓存层,比如我们yum update后,再次执行dockefile是不会在yum update了,所以使用--no-cache后才会执行yum update。
基于构建缓存的DockerFile模版
  构建缓存带来的好处就是,我们可以实现简单的Dockerfile模版(比如在Dockerfile文件顶部增加包仓库或者更新包,从而尽可能确保缓存命中)。我们一般都会在自己的Dockerfile文件顶部使用相同的指令集模版,比如对Ubuntu,可以使用下面的代码:
  

FROM ubuntu:14.04,  
MAINTAINER James Turnbull "liaojiafa@qq.com"
  
ENV REFRESHED_AT 2016-12-05
  
RUN apt-get -qq update
  

  让我们一步步来分析一下这个新的Dockerfile。首先,我通过FROM指令为新镜像设置了一个基础镜像ubuntu:14.04。接着,我又使用MAINTANINER指令添加了自己的详细信息联系信息,之后我又使用了一个名为REFERSHED_AT的环境变量,这个环境变量用来表明该镜像模版最后的更新时间。最后,我使用run指令来运行apt-get -qq update。
  有了这个模版,如果想刷新一个构建,只需要修改ENV指令中的日期。这使DOcker在命令中ENV指令时开始重置这个缓存,并运行后续指令而无需依赖该缓存。也就是说,RUN apt-get update这条指令就会被再次执行,包缓存也会被刷新为最新内容。可以扩展此模版,比如适配到不同的平台或者添加额外的需求。比如像下面的的一样:
  

FROM centos  
MAINTAINER Leo liaojiafa@exmpale.com
  
ENV REFRESHED_AT 2016-12-09
  
RUN yum -y -q update
  

dockerfile常用命令:


  • workdir: 指令在从镜像创建一个新容器时,在容器内部设置一个工作目录,entrypoint 和 cmd指定的程序会在这个目录下执行。 如 WORKDIR /tmp
  • env : 在镜像构建过程中设置环境变量 。 ENV TEST /HOME/RMV
  • user: 指定该镜像用什么用户身份去运行 。 USER roo
  • volume: 指令用来向基于镜像创建的容器添加卷。一个卷是可以存在一个或者多个容器内的特订目录,这个目录可以绕过联合文件系统,并提供以下功能 :

  • 卷可以在容器间共享和重用。
  • 一个容器可以不是必须和其他容器共享卷。
  • 对卷的修改必须是修改不会对更新镜像产生影响。
  • 卷会一直存在直到没有任何容器再使用它。


  • add: 用来构建环境下的文件和目录复制到镜像中。如安装一个应用程序的时候,add指令需要源文件位置和目的文件位置两个参数。
端口映射
  

[iyunv@salt var]# docker run -tdi -p 80:80 --name apache_web basic_sys  -p : hostip :  host_port : docker_container's port
  


  • -p 从左往右的可以依次写成宿主机IP,宿主机端口,容器的端口。  
    经过上面的配置以后,此时访问宿主机的80端口就等于访问容器的80端口。

删除镜像:
  rmi紧接着后面镜像ID。
  

[iyunv@salt var]# docker rmi 1403208717  

本地部署repository

服务器端架器repository:
  

[iyunv@salt ~]#docker run -p 5000:5000 registry  

查看本地镜像信息
  

[iyunv@salt ~]#docker images test/run_httpd   

给需要上传的镜像打上tag
  

[iyunv@salt nginx]# docker tag 9d16dcc5a7a3  127.0.0.1:5000/test/run_httpd   

上传:
  

[iyunv@salt nginx]# docker push 127.0.0.1:5000/test/run_httpd  

docker内部容器互联
  首先创建一个redis容器
  

[iyunv@salt nginx]#docker -ti --name redis xxxx  

创建一个web容器,和redis容器互联。
  

[iyunv@salt ~]# docker run -ti -p 0.0.0.0:80:80 --name httpweb --link redis:db -v /var/www/html/:/var/www/html/:ro test/run_httpd  
[iyunv@d71914aabd87 redis-3.2.3]# redis-cli -h db -p 5555
  
db:5555> keys *
  
(empty list or set)
  

  我们可以查看/etc/hosts文件里面,可以看到和子容器对应的信息的。
  
此时能够访问http,也能够连接redis了。容器与容器,宿主机和容器的/var/www/html也是共享的。

参数解释:


  • -p 0.0.0.0:80:80 从左往右,表示把宿主机的80端口和 容器的80端口绑定到一块。
  • --link redis:db 表示连接到容器名为redis的这个容器,db是为这个子容器取个别名。
  • -v /var/www/html/:/var/www/html/:ro表示把本地宿主机的/var/www/html映射到容器的/var/www/html,ro表示为Only read,也可以为rw权限。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421488-1-1.html 上篇帖子: 001-docker安装【nginx、mysql】 下篇帖子: Docker Swarm 中最重要的概念- 每天5分钟玩转 Docker 容器技术(94)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表