有两种方式可以制作docker镜像。

一、使用docker commit命令制作docker镜像

1. pull一个centos6.6的基础镜像,并运行一个docker container,然后在其中进行定制化(安装、配置服务等);

[root@localhost ~]# docker pull centos:6.6          
Pulling repository centos            
8b44529354f3: Download complete            
f1b10cd84249: Download complete            
Status: Downloaded newer p_w_picpath for centos:6.6                   
[root@localhost ~]# docker p_w_picpaths            
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE            
centos              6.6                 8b44529354f3        4 days ago          202.6 MB            
centos              centos6.6           8b44529354f3        4 days ago          202.6 MB            
[root@localhost ~]# docker run -i -t centos:6.6 bash            
[root@b42c1ba929a9 /]# ls            
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var            
[root@b42c1ba929a9 /]# mkdir /tmp/test.txt            
[root@b42c1ba929a9 /]# exit            
exit

接下来,查看一下container的改动:

[root@localhost ~]# docker ps -a          
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES            
b42c1ba929a9        centos:6.6          "bash"              About a minute ago   Exited (0) 22 seconds ago                       berserk_mcclintock  
804a56ce8008        f1b10cd84249        "/bin/echo hello"   22 minutes ago                                                       test                
[root@localhost ~]# docker diff b42c1ba929a9            
C /tmp            
A /tmp/test.txt            
C /root            
A /root/.bash_history

 

2. 执行docker commit命令创建一个镜像:

[root@localhost ~]# docker commit -m "new container" b42c1ba929a9 yuanhuan/newcontainer1          
07b146e0be9e98c253122784c3837dd1604f7692e794f3601dad747d41901cd4            
[root@localhost ~]# docker p_w_picpaths            
REPOSITORY               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE            
yuanhuan/newcontainer1   latest              07b146e0be9e        43 seconds ago      202.6 MB            
centos                   6.6                 8b44529354f3        4 days ago          202.6 MB            
centos                   centos6.6           8b44529354f3        4 days ago          202.6 MB

 

3. 登录docker,并将该镜像push到docker仓库:

[root@localhost ~]# docker login          
Username: yuanhuan            
Password:            
Email: yuanhuan_2005@126.com            
Login Succeeded            
[root@localhost ~]# docker push yuanhuan/newcontainer1            
The push refers to a repository [yuanhuan/newcontainer1] (len: 1)            
Sending p_w_picpath list            
Pushing repository yuanhuan/newcontainer1 (1 tags)            
f1b10cd84249: Image already pushed, skipping            
8b44529354f3: Image already pushed, skipping            
07b146e0be9e: Image successfully pushed            
Pushing tag for rev [07b146e0be9e] on {https://cdn-registry-1.docker.io/v1/repositories/yuanhuan/newcontainer1/tags/latest}

 

成功之后,就可以登录docker页面,查看到刚刚制作的镜像了。

p_w_picpath

 

二、使用dockerfile制作镜像

创建dockerfile文件:dockerfile.txt,内容如下:

FROM centos          
MAINTAINER YH, http://yuanhuan.blog.51cto.com            
RUN yum install passwd openssl openssh-server -y            
RUN echo '123456' | passwd --stdin root            
RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''            
RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''            
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd            
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh            
EXPOSE 22            
CMD ip addr ls eth0 | awk '{print $2}' | egrep -o '([0-9]+\.){3}[0-9]+';/usr/sbin/sshd -D

简要说明:该dockerfile的主要目的是开启sshd服务,以便可以ssh登录,并且设置了root用户的密码。

然后执行下面的命令制作一个镜像:

docker build -t centos:autosshd - < dockerfile.txt

成功之后就可以用docker p_w_picpaths查看镜像列表了。

 

两种方式比较:

使用commit命令比较简单,相当于docker根据container内部执行的命令自动生成了dockerfile,并进行了build,比较适合对dockerfile不熟悉的用户;

而dockerfile的方式显得稍有点复杂,但是比较适合批量处理的场景。dockerfile一次写入,多次运行。