{"title": "Docker\u7684\u955c\u50cf\u5236\u4f5c", "update_time": "2015-01-08 12:48:07", "tags": "images docker", "pid": "315", "icon": "linux.png"}
### 镜像是Docker的灵魂 Docker的镜像是Docker容器运行的基础。学习Docker很重要的一点是镜像的使用。 使用默认docker命令下载的镜像是外部制作好的,而我希望从头做一个镜像,并自己管理。 本文在CentOS 6下使用Docker制作镜像,对这个过程做详细的记录。 ### 理解镜像和容器 镜像(image)和容器(container)是什么关系? * 镜像是静态的,容器是动态的 * 容器是镜像运行起来后的体现 ### 镜像常用命令 查看镜像 ``` docker images ``` 将镜像保存为tar包 ``` docker save centos6-mytest > centos6-mytest.tar ``` 将导出的tar包加载为镜像 ``` docker load < centos6-mytest.tar ``` ### 制作基础镜像 下载镜像制作工具 febootstrap ``` yum -y install febootstrap ``` 使用febootstrap制作镜像(CentOS6的镜像),完成后镜像目录是centos6-image。大概是335MB ``` #febootstrap 基本用法是febootstrap [--options] REPO TARGET [MIRROR] ,后面可根据实际情况安装相应的包 -i 包名 febootstrap -i bash \ -i wget -i yum -i iputils -i iproute -i man -i vim-minimal \ -i openssh-server -i openssh-clients -i cronie-anacron -i crontabs -i rsyslog \ centos6 centos6-image http://mirrors.aliyun.com/centos/6/os/x86_64/ ``` 将镜像导入到docker ``` cd centos6-image && tar -c . | docker import - centos6-base ``` 验证镜像可用 ``` docker images #可以看到刚才制作好的centos6-base docker run -t -i centos6-base /bin/bash #可创建容器,进入bash命令行 ``` ### 制作应用镜像 基础镜像只包含了基础的系统,但是它没有包含实际的应用程序,不能产生实际的作用。 我们需要在base系统上增加应用,并生成新的镜像。有两种方法,一种是Docker File的方式。 ### 使用Docker File的方式制作新镜像 编写Docker文件。vim Dockerfile ``` #Dockerfile FROM centos6-base MAINTAINER Yonghua 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 EXPOSE 22 RUN echo 'root:123456' | chpasswd ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8 CMD /usr/sbin/sshd -D #End ``` 使用docker build产生新镜像 ``` docker build -t centos6-ssh . #最后的.表示Dockerfile文件所在的路径 ``` 好了,通过docker images 命令可以看到新制作好的镜像centos6-ssh ``` docker images #可以看到镜像了 ``` ### 将Container直接commit成镜像 DockerFile 使用定义的方式来创建镜像,而有时候我们期望通过将Container转化为镜像的方式来获得镜像。 首先创建一个container,进入bash 进行我们的定制 ``` docker run -t -i centos6-base /bin/bash ``` 然后通过commit命令将container变成镜像 ``` #docker commit CONTAINER_ID IMAGE_NAME docker commit 83a9fb9eeefd centos6-mytest ``` ### 参考文档 * http://my.oschina.net/feedao/blog/223795 * http://dockerpool.com/static/books/docker_practice/container/import_export.html * http://www.cnblogs.com/feisky/p/4106212.html * http://tuhrig.de/flatten-a-docker-container-or-image/ * http://developerblog.redhat.com/2014/09/30/overview-storage-scalability-docker/ * https://www.centos.org/docs/5/html/Cluster_Logical_Volume_Manager/LV_create.html * http://failshell.io/docker/running-nginx-inside-a-docker-container/