详解制作各种docker镜像

做了一个星期的镜像,收货颇多,现在整理记录下来,当做工作笔记吧。把常用的几个镜像的Dockerfile分享下。
制作基础docker镜像

第一步:设置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 http://mirrors.aliyun.com/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 images ;这个是查看所有生成的镜像
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 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里面

代码如下:

cd centos6-images;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" rel="external nofollow" >http://blog.csdn.net/yuzhihui_no1</a> 

EXPOSE 80 #为Apache服务开启服务端口
RUN yum -y install httpd supervisor;chkconfig httpd on ; mkdir -p /var/log/supervisor
ADD supervisord.conf /etc/supervisord.conf #把本地的文件拷贝到镜像系统中
CMD ["/usr/bin/supervisord"] #执行supervisord.conf脚本文件
#End

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/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能很清楚的知道这个镜像中做了些什么操作),如果你够熟练了,那么就应该尝试一种升级版的新方法,用容器制作镜像;

用容器快速制作镜像

用容器制造镜像就是创建某个镜像的容器,比如制作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.jb51.net/LINUXjishu/10861.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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Docker镜像制作详解介绍

    最近由于工作原因,需要对Docker镜像进行制作,这里记录下,也许对大家也有一定帮助! 写在前面:本文docker镜像制作方法更适用于基于已有docker镜像一次性修改. 推荐用Docker File制作docker镜像. 原理是一样的,但是用docker file制作docker镜像能够记录下操作步骤,方便以后更改或者镜像丢失后重新创建. 本文以Ubuntu为基础镜像,预启动一个django项目和ssh服务,制作一个新的镜像. 1.基础镜像 我选用的是从Docker官网下载的ubuntu镜像.

  • CentOS 6.5 制作可以ssh登录的Docker镜像

    Docker使用系列一我们把镜像源改为了阿里云的,方便后续的操作. 执行这个命令就把源地址改为阿里的: 复制代码 代码如下: curl https://git.oschina.net/feedao/Docker_shell/raw/start/ali-centos.sh | sh 第一安装Docker: yum -y install docker-io 第二启动Docker: service docker start 第三安装制作CentOS镜像的工具: yum -y install feboo

  • 利用Docker制作Nginx+PHP镜像的步骤详解

    前言 这篇文章给大家介绍的是使用Docker制作nginx+php的镜像,本文里的镜像是centos + nginx 1.9.7 + php 5.6.14,下面话不多说,直接看实现的步骤吧. 1.首先下载到nginx和php: nginx-1.9.5.tar.gz 下载:http://nginx.org/en/download.html php-5.6.14.tar.gz   下载:>http://php.net/downloads.php 2.以及扩展包so: memcache-2.2.4.t

  • 详解制作各种docker镜像

    做了一个星期的镜像,收货颇多,现在整理记录下来,当做工作笔记吧.把常用的几个镜像的Dockerfile分享下. 制作基础docker镜像 第一步:设置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/rp

  • 详解六种减小Docker镜像大小的方法

    我从2017年做Vulhub开始,一直在和一个麻烦的问题做斗争:在编写Dockerfile的时候, 如何减小 docker build 生成的镜像大小 ?这篇文章就给大家总结一下我自己使用过的六种减小镜像大小的方法. 1. 使用Alpine Linux Alpine Linux是一个基于BusyBox和Musl Libc的Linux发行版,其最大的优势就是小.一个纯的基础Alpine Docker镜像在压缩后仅有2.67MB. 不少Docker官方镜像都有Alpine版本,比如PHP: 比较之下

  • 详解SpringBoot构建Docker镜像的3种方式

    本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2)使用 Google 的 jib-maven-plugin. (3)使用 dockerfle-maven-plugin. Spring Boot 应用 为了方便实践,需要一个 Spring Boot 项目. Demo 项目地址: https://github.com/davelms/medium-ar

  • 详解如何用alpine镜像做一个最小的镜像并运行c++程序

    需求 工作中我们如果要制作镜像,一般都是直接pull官方镜像,比如我们要运行一个c++程序我们可能直接pull一个gcc,或者ubuntu镜像就可以了,但是存在一个问题,我们只是要运行一个c++程序却要运行一个ubuntu系统,这是非常消耗资源的,所以就去网上搜了搜发现早期的docker都是使用alpine镜像来做基础镜像,所以就用alpile镜像来制作镜像 dockerfile FROM alpine:3.7 MAINTAINER Rethink #更新Alpine的软件源为国内(清华大学)的

  • 详解如何使用Docker部署Django+MySQL8开发环境

    前一段时间重装了系统,然后我还没有备份,导致电脑里的开发环境全都没有了. 一想到又要装 Python 环境,还要装数据库,然后安装过程中还可能报一堆错就头疼. 最近正在学习 Docker,这不正好解决了我当前的痛点了吗?而且,不止这次重装系统,以后再重装都不怕了,只要拿着 Dockerfile 和 docker-compose 文件,不管到什么环境,一条命令轻松跑起来. 之前部署 Python 开发环境,都是用的 virtualenv,或者是 Pipenv.这次使用 Docker 之后,对比下来

  • 详解复制备份docker容器数据的方法

    这里以jenkins容器为例,介绍三种方法. 方法一 将容器打包成镜像,这时数据就在镜像中了,im:1.0为容器名,可以随便取 docker commit <container id> im:1.0 重新运行镜像,-v将容器内tmp目录映射到宿主机上的tmp目录 docker run -itd -v /tmp:/tmp im:1.0 // 第一个tmp是宿主机目录,第二个是容器内目录 把 /var/jenkins_home的文件复制到tmp下,注意这里的container name是随机生成的

  • 详解SpringBoot项目docker环境运行时无限重启问题

    可能是我开始处理问题的思路不对,现在描述问题可能也有点乱,但是里面可能的处理方式希望能帮到遇到我这个坑的人 描述:springboot项目,docker镜像里面运行,看docker的日志,项目启动成功后,隔了一分钟左右他就自动重新启动,然后造成网站接口访问的时候nginx报502 gateway啥的,有两台服务器,一个是文件服务器,运行了很简单的上传下载文件的代码以及验证token,另一台运行了java应用,两台服务器都在一次更新项目的镜像,运行过后遇到了这个问题,很奇怪. 然后我将项目弄成ja

  • 详解Django+Vue+Docker搭建接口测试平台实战

    一. 开头说两句 大家好,我叫林宗霖,是一位测试工程师,也是全栈测开训练营中的一名学员. 在跟着训练营学习完Docker容器技术系列的课程后,理所应当需要通过实操来进行熟悉巩固.正好接口自动化测试平台需要迁移到新的测试服务器上,就想要体验一番Docker的"一次构建,处处运行".这篇文章简单介绍了下这次部署的过程,其中使用了Dockerfile定制镜像和Docker-Compose多容器编排. 二. 项目介绍 项目采用的是前后端分离技术来实现的,前端是Vue+ElementUI,后端是

  • 详解linux 使用docker安装mongodb方法

    1.xshell远程到一台安装了docker和docker-conpose的服务器(安装方法见其他学习文件) 2.到home目录下新建Mongotest文件夹,进入这个文件夹,执行vi docker-compose.yml,插入如下内容 ,退出并保存 3.执行docker-compose up -d 然后添加防火墙:firewall-cmd --add-port=27017/tcp --permanent 重启防火墙:firewall-cmd --reload 4.查看进程 docker ps

  • 详解如何使用Docker部署一个web项目并打包成镜像文件

    docker基本入门以后,可以试试打包docker镜像与dockerfile了 docker镜像 docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建的,顶层仓库由docker内部的人来管理的.仓库里存放的是镜像文件,那么问题来了 ,怎么去创建镜像呢? how to create image 构建docker镜像的有2种方法: 1.使用docker commit命令. 2.使用docker build 命令和Dockerfile文件.在这里并不推荐使用docke

随机推荐