docker 制作镜像

一、docker commit


启动一个容器

[root@foundation12 docker]# docker run -it --name web ubuntu
docker 制作镜像_制作


docker commit 进行提交

[root@foundation12 docker]# docker commit -m "add files" web addweb

查看当前docker的镜像列表,发现刚才创建的镜像已经显示出来了

[root@foundation12 docker]# docker images

docker 制作镜像_镜像_02


然后查看刚才提交的镜像的详细信息

docker 制作镜像_制作_03

删除已启动的容器

docker 制作镜像_镜像_04


用刚提交的镜像,重新启动一个容器

[root@foundation12 docker]# docker run -it addweb

可以看到,新的容器保留了之前的修改。

虽然镜像是可读的,但我们可以通过启动容器对镜像进行修改。



二、docker build


除了上述的方式docker commit可以将容器导成镜像之外,还可以通过docker build进行操作,不过两者有如下区别:

(1)docker commit 是往版本控制系统里提交一次变更。使用这种方式制作镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。
(2)使用docker build创建镜像需要编写Dockerfile.这个相当于是自己编写策略,相当于是docker里的脚本,它具有可重复性、透明性。而且构建时是以层级进行构建的。非常方便。


下面就以Dockerfile的形式来编写构建脚本


首先创建一个目录来存放配置镜像所需的信息

[root@foundation12 docker]# pwd
/tmp/docker
[root@foundation12 docker]# mkdir Dockerfile
[root@foundation12 docker]# cd Dockerfile


首先我们查看下从那个已有的镜像进行拓展

docker 制作镜像_镜像_05


选择最后一个richxsl/rhel7,下面编写Dockerfile文件

首先了解Dockerfile的语法

ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

ENV 

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

EXPOSE

EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。


注:COPY与ADD的区别

Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的。

COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。


[root@foundation12 Dockerfile]# vim Dockerfile

FROM richxsl/rhel7
MAINTAINER cara@huanzi.org
ENV HOSTNAME server1
EXPOSE 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN yum install -y openssh-clients openssh-server && yum clean all && ssh-keygen -t rsa -f "/etc/ssh/ssh_host_ecdsa_key" -q -N "" && ssh-keygen -t ed25519 -f "/etc/ssh/ssh_host_ed25519_key" -q -N "" && echo root:redhat | chpasswd
CMD ["/usr/sbin/sshd","-D"]


(1)在Dockerfile中,#开头的被认作是注释;
(2)FROM代表这从哪个指定的镜像为基础处理接下来的命令,如果该镜像不在本地,则docker会从dockerhub上进行下载。
(3)RUN代表着所需要执行的命令。
(4)COPY可以把指定的文件或者目录在创建镜像的时候拷贝到镜像的指定位置。


[root@foundation12 Dockerfile]# vim dvd.repo

[dvd]
name=rhel7.3
baseurl=http://172.25.12.250/rhel7.3
gpgcheck=0


接下来执行Dockerfile脚本内容,[root@foundation12 Dockerfile]# docker build -t rhel7:v1 .

docker 制作镜像_docker_06

docker 制作镜像_docker_07


可以看到docker build的执行是按照步骤分步执行的,这种创建镜像的方式非常的快捷,而且一旦出错可以快速定位有问题的步骤

执行完成后,在镜像列表中可以看到新创建的镜像(第一个):

docker 制作镜像_制作_08


以新创建的镜像去启动一个容器:

[root@foundation12 Dockerfile]# docker run -d --name vm1 rhel7:v1
[root@foundation12 Dockerfile]# docker inspect vm1
docker 制作镜像_制作_09


连接新的容器

[root@foundation12 Dockerfile]# ssh root@172.17.0.2
docker 制作镜像_docker_10