源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

详解制作各种docker镜像

  • 时间:2020-02-26 03:26 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:详解制作各种docker镜像
做了一个星期的镜像,收货颇多,现在整理记录下来,当做工作笔记吧。把常用的几个镜像的Dockerfile分享下。 制作基础docker镜像 [b]第一步:[/b]设置Docker镜像源
[url=http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm]http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm[/url] && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6  
[b]第二步:[/b]安装 docker-io febootstrap,用来制作centos镜像,到时候会生成个centos的镜像。
yum -y install docker-io;如果没有安装docker,则需要先安装docker 
service docker start ;启动docker 
yum -y install febootstrap;制作docker镜像工具 
[b]第三步:[/b]作CentOS镜像文件centos6-image目录
[url=http://mirrors.aliyun.com/centos/6/os/x86_64/]http://mirrors.aliyun.com/centos/6/os/x86_64/[/url] 
上一步执行后会生成一个centos6-image文件目录,上面命令中参数 -i 后面的都是基础镜像中安装的一些服务。如果你不想要这么多服务(因为把所有服务安装后镜像会变的非常大)可以只安装一些基本的,必不可少的服务。centos6是指版本,centos6-image是生成的目录名称。 [b]第四步:[/b]这时root目录下没有任何文件,也不没有隐藏的点文件,如:.bash_logout  .bash_profile  .bashrc如果这时制作出来的镜像使用ssh登录,会直接进入根目录下,而一般镜像都是进入root目录下的,所以可以在centos6-image目录的root目录把.bash_logout  .bash_profile  .bashrc这三个文件设置一下。
cd centos6-image && cp etc/skel/.bash* root/
[b]第五步:[/b]生成最基础的base镜像
cd centos6-image && tar -c .|docker import - centos6-base 
[b]第六步:[/b]查看镜像,也可以直接进入centos6-base查看
docker images ;这个是查看所有生成的镜像 
docker run -i -t centos:centos6 /bin/bash;进终端(没有ssh服务),-i 分配终端,-t表示在前台执行,-d表示在后台运行 
[b]根据基础镜像制作ssh的docker镜像 [/b] 制作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 required  pam_loginuid.so/#session required  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) 
EXPOSE 22 #表示开启哪个端口号,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有效 
#End 
根据Dockerfile文件生成镜像:docker build -t 生成镜像名称  Dockerfile位置;假设:镜像名为centos6-ssh,Dockerfile在/home/yzh/ssh里面
[url=http://blog.csdn.net/yuzhihui_no1]
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放在同一级目录下。 [b]制作Java镜像[/b] 本来Java镜像可以和基础镜像一样制作的,但是发现安装jdk包或者在线获取jdk包时总是报错,所以我就到官网上下载了个jdk放到服务器上,然后用ADD命令加入到镜像系统中,在系统里面解压,最后删除jdk包,配置环境就可以了。 Dockerfile文件:
#Dockerfile 
FROM centos6-ssh 
MAINTAINER yzh 
 
RUN mkdir -p /usr/java;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/profile ; echo 'export JRE_HOME=/usr/java/jdk1.8.0_25/jre'>> /etc/profile; echo 'export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin'>> /etc  /profile 
RUN echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib'>> /etc/profile; echo 'export JAVA_HOME JRE_HOME PATH CLASSPATH ' >> /etc/profile 
上面是配置jdk环境变量 
RUN source /etc/profile;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能很清楚的知道这个镜像中做了些什么操作),如果你够熟练了,那么就应该尝试一种升级版的新方法,用容器制作镜像; [b]用容器快速制作镜像[/b] 用容器制造镜像就是创建某个镜像的容器,比如制作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安装的步骤,可以参考下http://www.1sucai.cn/LINUXjishu/10861.html[/url] 5、就是修改开机启动了,因为这是个mysql镜像,开机启动的开始设置的是mysql的服务;可以进去修改下:vim  /etc/supervisord.conf中,把相关的启动命令修改下就可以了; 6、把容器打包成一个镜像:docker commit  xxx(容器的id)   xxxx(要制作成的镜像名) 通过上面的步骤就可以很快的制作成一个镜像,这种制作镜像的方法有很多好处: 第一就是可以步步为营。当你制作一个比较复杂点的镜像时,不可能一步就能做成功,所以当你觉得下面一步可能要出错时(不可逆的错误),可以先把该镜像打个包,如果接下来失误了,删掉这个容器,再用刚才打包好的镜像做个容器,继续前面的步骤。 第二就是不管你在容器中怎么折腾都没关系,大不了删除掉这个容器,如果你在物理服务器上就要相当注意了,要不然duang的一下,整个服务器就瘫痪了。 第三好处和第一个差不多,因为有些数据库不能测试的,你一测试就会产生很大的数据(日志,还有些默认的数据)(我做mongodb镜像时,测试了下打包后的镜像竟然达到4个多G,而没测试的就几百MB,相差太大了),因为docker镜像不能太大,否则不好上传。所以一般是做好了,先打个包成镜像,然后接着测试下,如果成功。那就可以了。 [b]把镜像拉到openstack中测试 [/b] 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中创建容器开始测试 [b]对docker镜像进行打包和解包[/b] 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
 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。      
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部