一、docker镜像的创建方法

1、基于已有镜像创建

2、基于本地模板创建

3、基于dockerfile创建

4、使用dockerfile创建apache镜像并在容器中运行

5、使用dockerfile创建Tomcat镜像并在容器中运行

一、docker镜像的创建方法

docker镜像是除了docker的核心技术之外,也是应用发布的标准格式。一个完整的docker镜像可以支撑一个docker容器的运行,在docker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果要把已经安装的服务进行迁移,就需要把环境及搭建的服务生成新的镜像。

创建镜像的方法有三种,分别是基于已有镜像创建、基于本地模板创建及基于dockerfile创建。接下来会将这几种方法依次写下来。

1、基于已有镜像创建

基于已有镜像创建主要是使用docker commit命令,本质上就是把一个容器里面运行的程序及该程序的运行环境打包起来生成新的镜像。

命令格式如下:

docker  commit  [选项]  容器ID/名称  仓库名称:[标签]

常用选项如下:

-m:说明信息;

-a:作者信息;

-p:生成过程中停止容器的运行

基于已有镜像创建新的镜像举例:

1)启动一个镜像,在容器里做修改,然后将修改后的容器提交为新的镜像,需要记住该容器的ID号,如下:

[root@centos01 ~]# docker images  
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
hub.c.163.com/public/centos   6.7-tools           b2ab0ed558bb        3 years ago         602 MB
[root@centos01 ~]# docker run -it -d --name centos6.7 hub.c.163.com/public/centos:6.7-tools  
     
e70418f794378109bb583e2d9171b55d7fd747460cff2819f1dffb9df04dac4c
[root@centos01 ~]# docker ps   
CONTAINER ID        IMAGE                                   COMMAND                  CREATED              STATUS              PORTS               NAMES
e70418f79437        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   About a minute ago   Up About a minute   22/tcp              centos6.7
[root@centos01 ~]# docker exec -it centos6.7 /bin/bash  
[root@e70418f79437 /]# echo "lyx" > /etc/lyx.txt  
[root@e70418f79437 /]# exit   
exit
[root@centos01 ~]# docker commit -m "newnamed" -a "lyx" centos6.7 centos6.701 
               
sha256:305f99b50a1e8844ea21a2411649108f662ad5d42c35fa9ff2cf3608172d1590
[root@centos01 ~]# docker images  
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
centos6.701                   latest              305f99b50a1e        32 seconds ago      602 MB
hub.c.163.com/public/centos   6.7-tools           b2ab0ed558bb        3 years ago         602 MB
[root@centos01 ~]# docker create -it centos6.701 /bin/bash 
eb6522ec046e9b3c7bfcb1edb5c84545aa8264f27075c019ee89da9150039e2f
[root@centos01 ~]# docker ps  
[root@centos01 ~]# docker ps -a
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS               NAMES
eb6522ec046e        centos6.701                             "/bin/bash"              55 seconds ago      Created                                 condescending_darwin
e70418f79437        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   9 minutes ago       Up 9 minutes        22/tcp              centos6.7
[root@centos01 ~]# docker start eb6522ec046e 
eb6522ec046e
[root@centos01 ~]# docker exec -it eb6 /bin/bash  
[root@eb6522ec046e /]# cat /etc/lyx.txt  
lyx
[root@eb6522ec046e /]# exit   
exit

2、基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目,或者 https://wiki.openvz.org/Download/template/precreated ,优先使用OPENVZ开源项目那个链接;

基于本地模板创建举例:

1)下载centos 7的迷你版系统模板,使用docker导入命令导入为本地镜像:

[root@centos01 ~]# wget https://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz   
................
[root@centos01 ~]# ls | grep centos   
centos-7-x86_64-minimal.tar.gz
[root@centos01 ~]# cat centos-7-x86_64-minimal.tar.gz |docker import - docker:new 
             
sha256:6d662f735ee8efbd53f23e017fdb5c777303aaab93a085ee6c10d9fcb71b4ba8
[root@centos01 ~]# docker images | grep new      
docker                        new                 6d662f735ee8        27 seconds ago      435 MB

[root@centos01 ~]# docker run -it -d docker:new /bin/bash 
0c10ee4230983b020a0268f40d4523685226ee570271e71a5b5d24ec57e8f46a
[root@centos01 ~]# docker ps |grep new  
0c10ee423098        docker:new                              "/bin/bash"              About a minute ago   Up About a minute                       nostalgic_wescoff
[root@centos01 ~]# docker exec -it 0c1 /bin/bash   
[root@0c10ee423098 /]# ls 
bin  boot  dev  etc  fastboot  home  lib  lib64  ......  
[root@0c10ee423098 /]# exit     
exit

3、基于dockerfile创建

dockerfile是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,docker程序将读取dockerfile中的指令生成指定镜像。

dockerfile结构大致分为四个部分:

基础镜像信息;

维护者信息;

镜像操作指令;

容器启动时执行指令;

dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用“#”号开头的注释;

dockerfile中的配置项介绍:

[root@centos01 ~]# docker tag docker:new centos7.lyx
[root@centos01 ~]# docker images | grep lyx
centos7.lyx                   latest              6d662f735ee8        9 minutes ago       435 MB
[root@centos01 ~]# vim Dockerfile
FROM centos           
MAINTAINER The centos project     

RUN yum -y update
RUN yum -y install openssh-server
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
EXPOSE 22       
CMD ["/usr/sbin/sshd","-D"]     

在编写dockerfile时,有严格的格式需要遵循:第一行必须使用FROM指令指明所基于的镜像名称;之后使用MAINTAINER指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如RUN指令,每运行一条指令,都会给基础镜像添加新的一层;最后使用CMD指令来指定启动容器时要运行的命令操作。

dockerfile有十几条命令可用于构建镜像,其中常见的指令如下:
Docker镜像的创建和Dockerfile创建镜像运行容器_第1张图片

4、使用dockerfile创建apache镜像并在容器中运行

1)创建镜像并加载到容器中运行:

[root@centos01 ~]# mkdir apache               
[root@centos01 ~]# cd apache/                
[root@centos01 apache]# vim Dockerfile             

FROM centos                
MAINTAINER [email protected]     
RUN rpm --rebuilddb && yum -y update            
RUN rpm --rebuilddb && yum -y install httpd        
EXPOSE 80                         
ADD index.html /var/www/html/index.html 
ADD run.sh /run.sh      
RUN chmod 775 /run.sh       
RUN systemctl disable httpd             
CMD ["/run.sh"]             

[root@centos01 apache]# docker images | grep centos     

centos7                       system              c065d5c0571d        About an hour ago   435 MB
[root@centos01 apache]# vim run.sh               
#!/bin/bash
rm -rf /run/httpd/*              
exec /usr/sbin/apachectl -D FOREGROUND           
[root@centos01 apache]# echo "www.dockerfile.com" >index.html
[root@centos01 apache]# ls               
Dockerfile  index.html  run.sh

[root@centos01 apache]# docker build -t httpd:centos .     


Sending build context to Docker daemon 4.096 kB
Step 1/10 : FROM centos
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
  .................. 
    
Removing intermediate container 81a3d6c9d3db
Step 10/10 : CMD /run.sh
 ---> Running in 5cdc467fd874
 ---> 5d56b826432d
Removing intermediate container 5cdc467fd874
Successfully built 5d56b826432d


[root@centos01 apache]# docker run -d -p 80:80 httpd:centos  


192cd783028dcb3013ebb40b65ba8450e695e424e700a13cb8a44bb84af3e71a
[root@centos01 apache]# docker ps -a         
CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS              PORTS                       NAMES
192cd783028d        httpd:centos               "/run.sh"                About a minute ago   Up About a minute   0.0.0.0:80->80/tcp          gallant_khorana
                  

至此,可以看到新生成的镜像已经在容器中加载运行了,本机(宿主机,不是docker容器)的IP地址为192.168.100.10,此时client访问192.168.100.10的80端口,就相当于访问了刚运行的容器的80端口,如下:
Docker镜像的创建和Dockerfile创建镜像运行容器_第2张图片

5、使用dockerfile创建Tomcat镜像并在容器中运行

1)创建镜像并加载到容器中运行:

[root@centos01 ~]# mkdir tomcat   
[root@centos01 ~]# cp /mnt/apache-tomcat-7.0.54.tar.gz ./tomcat/ 
[root@centos01 ~]# cp /mnt/jdk-7u65-linux-x64.gz ./tomcat/ 
[root@centos01 tomcat]# tar zxvf apache-tomcat-7.0.54.tar.gz 

[root@centos01 tomcat]# tar zxvf jdk-7u65-linux-x64.gz 
[root@centos01 tomcat]# vim Dockerfile 
#基础镜像centos6.7系统
FROM    centos7
#作者联系方式
MAINTAINER      [email protected] 
#解压缩tomcat和解压缩JDK
ADD     apache-tomcat-7.0.54.tar.gz /usr/src/ 
ADD     jdk-7u65-linux-x64.gz /usr/src/ 
#设置环境变量
ENV     JAVA_HOME /usr/src/jdk1.7.0_65
ENV     PATH $JAVA_HOME/bin/$PATH
#监听8080端口
EXPOSE  8080 
#启动tomcat服务,报错docker容器运行
ENTRYPOINT      /usr/src/apache-tomcat-7.0.54/bin/startup.sh && tailf /usr/src/apache-tomcat-7.0.54/logs/catalina.out 
[root@centos01 tomcat]# docker images |grep centos7 
                 
centos7                       latest              699a07e742fe        20 minutes ago      435 MB
[root@centos01 tomcat]# docker build -t tomcat:v1.0 . 
    
Sending build context to Docker daemon 459.7 MB
Step 1/8 : FROM hub.c.163.com/public/centos:6.7-tools
……………  #此处省略部分内容
Removing intermediate container aa619596db96
Successfully built 66675674563d
[root@centos01 tomcat]# docker images 
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
tomcat                        v1.0                79a704c87a2b        6 seconds ago       740 MB
httpd                         001                 4305f4980dd8        15 minutes ago      992 MB
centos7                       latest              699a07e742fe        21 minutes ago      435 MB
hub.c.163.com/public/centos   6.7-tools           b2ab0ed558bb        3 years ago         602MB
[root@centos01 tomcat]# docker run -it -d --name tomcat01 -p 
192.168.100.10:8080:8080/tcp tomcat:v1.0  
   
5ac02aca9f238344598040609f5a4c770e45ad0857168b0c2fdb35927b47ab4f
[root@centos01 tomcat]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS    PORTS                           NAMES
5ac02aca9f23        tomcat:v1.0         "/bin/sh -c '/usr/..."   3 seconds ago       Up 2 seconds    192.168.100.10:8080->8080/tcp   tomcat01
c8b4b457e80a        httpd:001           "/run.sh"                14 minutes ago      Up 14 minutes       192.168.100.10:80->80/tcp       apache01
[root@centos01 tomcat]# netstat -anptu |grep 8080 
tcp        0      0 192.168.100.10:8080     0.0.0.0:*               LISTEN      6122/docker-proxy-c 

2)通过客户端访问tomcat01容器中的tomcat服务

Docker镜像的创建和Dockerfile创建镜像运行容器_第3张图片

———————— 本文至此结束,感谢阅读 ————————