如何使用docker 基础镜像制作来制作我现在正在使用的系统的镜像

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
Docker版本:1.7
宿主机系统版本:Ubuntu14/CentOS7(build),
MAC/Windos7/8/10(使用)
需求场景:用做集成开发环境,测试环境,演示环境快速部署(一般是虚拟机单机);
基础环境:CentOS
环境依赖:SSH,MySQL,Redis,PHP(有版本要求,扩展较多含私有扩展),Nginx(含第三方模块),Memcache,Elasticsearch等;
服务要求:各个服务都需要开机启动(目前我在启动命令后加/sbin/init实现,使用原生方式启动)
配置要求:配置文件中可能需要修改:路径、域名、优化配置等(我目前思路是启动时通过常量传递,然后运行 CMD定义的脚本执行替换配置文件中相关配置);
因为环境必要复杂,仓库里已有的镜像都不能直接拿来使用,需要自己build;
刚接触Docker不就,目前写Dockerfile,build镜像都没有问题了,还有几个问题没有解决,向各路大神请教:
容器间通信:目前是link方式,后期单主机可能会起多个Docker容器,以及跨宿主机的容期间通信,目前方案无法满足,为容器配置固定ip是最好的方案,参考网上文档操作未成功;/sbin/init 启动同时使用CMD脚本:后来通过查看官方文档和inspect信息发现会覆盖掉,启动命令/sinb/init 会覆盖掉Dockerfile里的CMD以及encrp.sh,这种方法走不通,这样通过启动参数获取常量修改配置的需求就无法满足;镜像大小:做好的镜像非常大,这样维护和共享就很麻烦,因为Docker会吧dockerfile里的每一层都记录收集并提交,目前我的做法,是提前写好各个服务的部署脚本,然后Dockfile中COPY,然后在执行,完成后在清理软件包和yum/apt-get缓存,单nginx镜像来说比之前节省了100M空间,请教其他更想系的Docker瘦身妙招;Registry认证:因为都是私有镜像,目前提交到内网Registry中,但是有其他地区同事要用,可能需要开房端口,Resitry认证没找到台详细的资料;
再补充吧。。。
问题比较多,有的我也不是很清楚,就知道的谈一下
可以尝试使用 host 模式,这样容器和主机共享地址,网络的配置会简单一些,同样也牺牲了隔离性但是如果做内部开发和演示,应该还 ok。如果想保留隔离性的同时跨主机通信目前没有什么太轻量级的方法,我们自己的平台倒是实现了跨主机容器通信,但是方法也很重,涉及了很多网络改造的工作。如果可以还是建议使用 Dockerfile 中使用的 cmd 或者 entrypoint 方法,自己写脚本来管理应用的启动,可以一个容器里只放一个服务,用微服务的思想制作镜像会容易一些。然后通过 link 相互传递环境变量,应该可以满足你的需求。大小的问题需要在 run 的命令中一行完成安装和清理删除,分到多句删除并不会减小镜像体积。另一方面可以考虑用一些小的 base image 来减小镜像体积比如 alpine,具体的还要看你现在 dockerfile 怎么写才能给出更多建议。不知道你用的是新版还是旧版 registry,v2 的 registry 提供了很多种鉴权方式, 你可以尝试 htpasswd 的方式,相对容易一些,token 的方式需要自己开发认证系统。或者你也可以在我们的平台开个用户把镜像设置为私有,然后开个 organization 把你的同事拉进来也能完成同样的功能。
执行run命令的时候加入参数-e 设置环境变量, 比如-e 'port=3306'
在容器里面即可直接使用参数$port。
非常感谢!
1. 先按您的方式处理下,网络改造目前来不及,以后再处理;
2. 一个容器里放一个服务目前业务上不太现实,业务太复杂,拆开的话感觉会更麻烦;
3. 目前是在按以下思路处理的:
将所有需要部署的东西写成shell脚本;
Dockfile里,COPY xx.sh
/root/xx.sh, 然后 RUN /root/xx.
部署完以后,执行以下命令清理的:
rm -rf /usr/local/src/*;
安装过程中还安装了一些工具,编译器,依赖包之类的东西;
方便的话加下你QQ或者微信直接跟您请教下
目前用的Resitryv2,我研究下您的方案;非常感谢!
容器ip问题,目前官方还没有简便的方法,不推荐研究Optional:挂载一个环境变量的文件,run.sh运行的时候去读取 OR 参考 Registry还未找到解决办法
要回复问题请先或
teachmyself
浏览: 2954
关注: 9 人7202人阅读
& & & & 做了一个星期的镜像,收货颇多,现在整理记录下来,当做工作笔记吧。把常用的几个镜像的Dockerfile分享下。
& & & & 制作基础docker镜像
& & & & 制作基础镜像网上有很多实例,可以参考下开源中国的这篇文章:和51博客中的这篇文章:;下面的基础镜像制作大部分就是参考了上面的文章。非常感谢他们,转载时请保存这两篇文章的完整信息。
& & & & 第一步:设置docker镜像源
yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6& & & & 第二步:安装 docker-io febootstrap,用来制作centos镜像,到时候会生成个centos的镜像。yum -y install docker-io;如果没有安装docker,则需要先安装docker
service docker start ;启动docker
yum -y install febootstrap;制作docker镜像工具& & & & 第三步:作CentOS镜像文件centos6-image目录febootstrap -i bash -i wget -i yum -i iputils -i iproute -i man -i vim -i openssh-server -i openssh-clients -i tar -i gzip centos6 centos6-image /centos/6/os/x86_64/
& & &&上一步执行后会生成一个centos6-image文件目录,上面命令中参数 -i 后面的都是基础镜像中安装的一些服务。如果你不想要这么多服务(因为把所有服务安装后镜像会变的非常大)可以只安装一些基本的,必不可少的服务。centos6是指版本,centos6-image是生成的目录名称。
& & & & 第四步:这时root目录下没有任何文件,也不没有隐藏的点文件,如:.bash_logout &.bash_profile &.bashrc如果这时制作出来的镜像使用ssh登录,会直接进入根目录下,而一般镜像都是进入root目录下的,所以可以在centos6-image目录的root目录把.bash_logout &.bash_profile &.bashrc这三个文件设置一下。
cd centos6-image && cp etc/skel/.bash* root/
& & & & 第五步:生成最基础的base镜像
cd centos6-image && tar -c .|docker import - centos6-base
& & & &第六步:查看镜像,也可以直接进入centos6-base查看
这个是查看所有生成的镜像
docker run -i -t centos:centos6 /bin/bash;进终端(没有ssh服务),-i 分配终端,-t表示在前台执行,-d表示在后台运行
&根据基础镜像制作ssh的docker镜像
& & & & 制作ssh登录镜像,最主要的就是Dockerfile(当然这里说的就是Dockerfile这种方法),在某个目录中新建一个Dockerfile文件(命名一定要为Dockerfile)。
& & & & 下面来分析下Dockerfile文件:
#Dockerfile
FROM centos6-base
#表示把某个镜像作为基础镜像,相当于面向对象语言中继承,表示生成的镜像里面包含了基础镜像的一些服务
MAINTAINER yzh #这是个镜像作者信息
RUN ssh-keygen -q -N && -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -q -N && -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN sed -ri 's/session
pam_loginuid.so/#session
pam_loginuid.so/g' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
#上面几行都是配置ssh登录目录和登录验证的,而ssh的安装是在基础镜像centos6-base中完成的(-i openssh-server -i openssh-clients)
#表示开启哪个端口号,22号端口是给ssh服务使用的;如果不需要端口号可以注释掉这行
RUN echo 'root:redhat' | chpasswd
#这是修改root密码,其实这种方法不是很好,因为这是设置root密码,不是更改
RUN yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
RUN yum install tar gzip gcc vim wget -y
#上面是安装些工具和源
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
CMD /usr/sbin/sshd -D
#设置开启的服务,每个镜像只能有一个CMD有效
& & & & 根据Dockerfile文件生成镜像:docker build -t 生成镜像名称 &Dockerfile位置;假设:镜像名为centos6-ssh,Dockerfile在/home/yzh/ssh里面
cd centos6-docker build -t centos6-ssh
/home/yzh/ssh #就可以生成一个centos6-ssh镜像了
& & & & 用docker images查看下所有镜像,你会看到两个镜像:centos6-base和centos6-ssh。这样centos6-ssh就是ssh登录的docker镜像了。
& & & & 镜像的测试步骤命令
& & & & 当制作完一个镜像后紧接着就要测试下这个镜像是否正确,里面的一些服务是否可用。上面提到的两篇文章中有比较详细的测试说明,还有数据存储,迁移备份,可以参考下他们的文章。我目前没有用到数据存储及迁移备份,所以就用简单的步骤测试下:
& & & & 第一步:查看镜像信息,可以看到有镜像名称和镜像的id以及生成的时间。
& & & & docker images
& & & & 第二步:用测试镜像生成一个容器,可以根据镜像名称或者镜像id来生成。最后会得到一连串数字和字母组成的信息,应该就是容器标识ID。
& & & & docker run -d xxx(镜像名或者id)
& & & & 第三步:利用上一步生成的容器ID,来查看测试镜像生成的容器信息。这一步会得到有关容器的详细信息,其中包括iP地址。
& & & & docker inspect xxxx(容器id)
& & & & 第四步:利用上一步中得到的ip地址,ssh登陆。
& & & & ssh root@xxxx(容器ip)
& & & & 第五步:测试服务,这里ssh服务在登陆时已经测试完了。如果是其他镜像,比如mysql:那么这一步就是进入镜像测试MySQL服务了,不同服务用不同方法测试。
& & & & 镜像和容器的删除 & &&
& & & & 每测试完一个镜像都要删除掉所有的容器,避免占用的空间过大。
& & & & 删除单个容器(指定容器):
& & & & 首先要查看下当前有哪些容器在运行:docker ps -a
& & & & 找出需要删除的容器,让它停止:docker stop xxx(CONTAINER ID)
& & & & 删除该容器:docker &rm &xxx(CONTAINER ID)
& & & &&删除所有容器:
& & & & 如果你要删除所有的容器就可以不用那么麻烦了,直接停止所有容器的运行:docker stop $(docker ps -a -q);然后删除所有容器:docker rm $(docker ps -a -q);
& & & & 删除镜像:
& & & & 如果制作镜像失败,或者想重新添加功能,需要删除原来镜像,则用:docker images查看所有镜像;然后用:docker rmi xxx(镜像名或镜像id)
& & & & 制作Apache镜像
& & & & 分享下Apache镜像的制作,这个镜像稍微和基础镜像的制作不太一样。因为这个镜像起来以后要同时开启两个服务:ssh服务(必须的)和Apache服务,而Dockerfile中CMD只能有一句有效。所以要借助另外一种方法:supervisord;其他步骤一样,唯一不同的就是Dockerfile文件,这个Dockerfile是在ssh镜像为基础制造的(一般都是以ssh镜像为基础镜像,因为不管哪个镜像都需要ssh登陆的)
& & & & Dockerfile文件:
#Dockerfile
FROM centos6-ssh
MAINTAINER &a target=_blank href=&http://blog.csdn.net/yuzhihui_no1&&http://blog.csdn.net/yuzhihui_no1&/a&
EXPOSE 80 #为Apache服务开启服务端口
RUN yum -y inst mkdir -p /var/log/supervisor
ADD supervisord.conf /etc/supervisord.conf
#把本地的文件拷贝到镜像系统中
CMD [&/usr/bin/supervisord&]
#执行supervisord.conf脚本文件
& & & &&RUN & &xxx ;后面是跟着要执行的命令,这些命令就是在Linux中安装某个工具/软件/服务的命令了。这里引入了supervisord.conf文件:
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:httpd]
command=/sbin/service httpd start
& & & & 这样就可以同时启动两个服务了。其他步骤和基础镜像制作一样,但要记住supervisord.conf要和Dockerfile放在同一级目录下。
& & & & 制作Java镜像
& & & & 本来Java镜像可以和基础镜像一样制作的,但是发现安装jdk包或者在线获取jdk包时总是报错,所以我就到官网上下载了个jdk放到服务器上,然后用ADD命令加入到镜像系统中,在系统里面解压,最后删除jdk包,配置环境就可以了。
& & & & &Dockerfile文件:
#Dockerfile
FROM centos6-ssh
MAINTAINER yzh
RUN mkdir -p /usr/yum install -y tar
ADD jdk-8u25-linux-x64.tar.gz
/usr/java/ #把本地的jdk加到镜像系统中
RUN echo 'export JAVA_HOME=/usr/java/jdk1.8.0_25'&& /etc/ echo 'export JRE_HOME=/usr/java/jdk1.8.0_25/jre'&& /etc/ echo 'export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin'&& /etc
RUN echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib'&& /etc/ echo 'export JAVA_HOME JRE_HOME PATH CLASSPATH ' && /etc/profile
#上面是配置jdk环境变量
RUN source /etc/yum clean all
#使环境变量生效
ADD HelloWorld.java
/home/java/HelloWorld.java #加入一个简单的Java测试程序
CMD /usr/sbin/sshd -D
#End& & & & 要通过ADD命令添加到镜像系统中的文件必须和Dockerfile在同一级目录,比如Java镜像中的Dockerfile同级目录下有:HelloWorld.java &jdk-8u25-linux-x64.tar.gz文件。还有点Dockerfile中ADD命令还会解压一些基本的压缩包,像上面的添加jdk时,可以不需要自己去解压,只需要安装tar解压命令就可以了。
& & & & 转载请注明作者和原文出处,原文地址:
& & & & 若有不正确之处,望大家指正,共同学习!谢谢!!!
& & & & ---------------------------------------------------------------------补充---------------------------------------------------------------------
& & & & 最近又做了几个比较复杂的docker镜像,这里总结下:拿postgresql镜像来说吧。如果按照以往的做法当然是先在实验机上做些安装操作,等到安装成功,测试没问题后,就把这些步骤写到dockerfile中。当然因为是数据库,需要开机自启动,所以要用到supervisord.conf把两种服务都写到这个配置中去。然后把这些写好的文件放到服务器上开始制作镜像了。
& & & & 但是你会发现这样的制作方法会很慢(这种方法也有个优点,就是根据dockerfile能很清楚的知道这个镜像中做了些什么操作),如果你够熟练了,那么就应该尝试一种升级版的新方法,用容器制作镜像;
& & & & 用容器快速制作镜像
& & & & 用容器制造镜像就是创建某个镜像的容器,比如制作postgresql镜像时,因为它也是一个数据库,所以就用mysql的容器来制作。得到mysql的镜像,然后进入该镜像,开始安装postgresql了,安装完后测试下,如果可以,就把该容器打包成一个镜像,就可以了;下面看下简单的操作步骤:
& & & & 1、开始制作postgresql镜像时,先用mysql得到一个容器:docker run -d &xxx_mysql_xxx
& & & & 2、省略些步骤(有关创建容器,登录容器之类的命令,请参考本blog中的 “镜像的测试步骤命令“ )
& & & & 3、当进入到容器中时,首先是卸载掉mysql,查看下有多少个mysql软件包:rpm -qa | grep 'mysql';然后根据显示的软件包一一卸载掉:yum remove xxx;
& & & & 4、对于postgresql安装的步骤,可以参考下/pgsql/1520.html
& & & & 5、就是修改开机启动了,因为这是个mysql镜像,开机启动的开始设置的是mysql的服务;可以进去修改下:vim &/etc/supervisord.conf中,把相关的启动命令修改下就可以了;
& & & & 6、把容器打包成一个镜像:docker commit &xxx(容器的id) & xxxx(要制作成的镜像名)
& & & & 通过上面的步骤就可以很快的制作成一个镜像,这种制作镜像的方法有很多好处:
& & & & 第一就是可以步步为营。当你制作一个比较复杂点的镜像时,不可能一步就能做成功,所以当你觉得下面一步可能要出错时(不可逆的错误),可以先把该镜像打个包,如果接下来失误了,删掉这个容器,再用刚才打包好的镜像做个容器,继续前面的步骤。
& & & & 第二就是不管你在容器中怎么折腾都没关系,大不了删除掉这个容器,如果你在物理服务器上就要相当注意了,要不然duang的一下,整个服务器就瘫痪了。
& & & & 第三好处和第一个差不多,因为有些数据库不能测试的,你一测试就会产生很大的数据(日志,还有些默认的数据)(我做mongodb镜像时,测试了下打包后的镜像竟然达到4个多G,而没测试的就几百MB,相差太大了),因为docker镜像不能太大,否则不好上传。所以一般是做好了,先打个包成镜像,然后接着测试下,如果成功。那就可以了。
& & & & 把镜像拉到openstack中测试
& & & & 1、先找到keystone_admin,运行命令:source keystonerc_admin &
& & & & 2、把制作的镜像放到openstack中,命令: docker&save&centos(centos为镜像名称) |&glance&image-create&--is-public=True&--container-format=docker&--disk-format=raw&--name&centos(centos为镜像名称) & 验证操作是否成功:echo $? &如果为0,应该就成功了。
& & & & 3、登录到openstack中,到镜像那一栏看看是否有你上传的镜像
& & & & 4、在openstack中创建容器开始测试
& & & & 对docker镜像进行打包和解包
& & & & 1、打包:docker&save&IMAGENAME(镜像名称) |&bzip2&-9&-c&img.tar.bz2(打包后的名称)
& & & & 2、解包:bzip2 -d -c &img.tar.bz2(打包后的名称) | docker load
& & & & 利用端口号进入docker容器中:ssh -p port(端口号) &root@IP &
& & & & glance命令:
& & & &&glance image-list
& & & & glance image-delete
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:159167次
积分:3143
积分:3143
排名:第8095名
原创:142篇
转载:55篇
评论:56条
文章:25篇
阅读:15393
文章:12篇
阅读:40993
阅读:7147
(3)(3)(2)(4)(3)(11)(1)(3)(3)(11)(13)(18)(5)(17)(14)(9)(19)(5)(6)(5)(7)(34)(1)如何使用AlaudaCloud的Docker镜像服务_百度知道如何让你的 Docker 镜像更小_服务器应用_Linux公社-Linux系统门户网站
你好,游客
如何让你的 Docker 镜像更小
来源:dockone.io&
作者:Linux
Docker是个好东西毋庸置疑,甚至可以称其为万金油,什么场合都看到他的身影。自14年底开始,小到防污染的DNS、CoreOS的socks5代理,大点到开发团队的CI系统,一些Web项目等等,都有在用,并且稳定性非常好,使用起来也方便,但是最近经常发现各大论坛、网站、文档在使用Docker镜像的时候常常发现的一个误区,谨以此文抛砖引玉。
让我们从一个dockerfile说起,缘起我5月写的一个2048的Docker镜像,当时是在csphere的群里,以游戏的形式,教人快速的集成Web服务,提供服务。我们首先来看一个传统的镜像写法:
FROM&:12.04
RUN&apt-get&update
RUN&apt-get&install&-y&nginx&zip&curl
RUN&echo&"daemon&"&&&&/etc/nginx/nginx.conf
RUN&curl&-o&/usr/share/nginx/www/master.zip&-L&https:///gabrielecirulli/2048/zip/master
RUN&cd&/usr/share/nginx/www/&&&&unzip&master.zip&&&&mv&2048-master/*&.&&&&rm&-rf&2048-master&master.zip
CMD&["/usr/sbin/nginx",&"-c",&"/etc/nginx/nginx.conf"]
解读一下:
基于ubuntu12.04,先来一个更新,然后安装nginx、zip、curl,配置nginx,下载2048代码,解压再放到指定位置,删除原始文件,抛出80端口,最后是执行命令。
这样的dockerfile再熟悉不过了吧,随便docker hub或者其他教学文档都是这样,接下来,我们来谈谈中间的毛病。
pull一个ubuntu需要多少时间,占多大的空间?(初学者好多在这一步就头痛)
ubuntu在没有添加中国镜像源的情况,更新是个多么痛苦的事?(灯,等等等等)
配置啰嗦(麻烦,麻烦)
整个生成的镜像硕大无比,玩个2048不需要这么复杂。
光提问题,不给解决方案就是耍流氓,还是看dockerfile:
FROM&alpine:latest
MAINTAINER&alex&alexwhen@gmail.com
RUN&apk&--update&add&nginx
COPY&.&/usr/share/nginx/html
CMD&[&nginx&,&&-g&,&&daemon&off;&]
极简化的利用dockerfile和base镜像和github的特性,能少一句就少一句,动动手试一下,这样build出来,整个镜像不超过10M,回过头来看看前面的镜像,光一个ubuntu得多大啊,实在是居家必备。
屏幕快照__上午10.14_.23_.png
Docker是个好东西,应用的时候充分考虑自己的使用环境,不要动不动就FROM ubuntu、debian、。alpine是一个非常好的base,包管理系统比较完善,神器啊。
本人的docker-2048,可以从以下方式获得:
github:注:你可以在此基础上玩出更多你想要的东西
直接运行: docker run -d -p 80:80 alexwhen/docker-2048 (本机80端口有占用的请换端口),然后打开浏览器输入127.0.0.1,你就可以愉快的玩了。
本镜像同样存在于alauda和daocloud。
写在最后,写这个本来是教一个新人学写Dockerfile和快速的利用Docker云服务快速的构建出自己的应用。
配置 Docker 镜像下载的本地 mirror 服务&
Docker安装应用(CentOS 6.5_x64) &
在 Docker 中使用 MySQL
在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker &
Docker安装应用(CentOS 6.5_x64) &
Ubuntu 14.04安装Docker& &
阿里云CentOS 6.5 模板上安装 Docker &
Docker 的详细介绍:Docker 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
& (08/25/:53)
& (05/30/:26)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款

我要回帖

更多关于 docker制作centos镜像 的文章

 

随机推荐