一、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
<!--基于docker宿主机镜像运行一个容器-->
e70418f794378109bb583e2d9171b55d7fd747460cff2819f1dffb9df04dac4c
[root@centos01 ~]# docker ps <!--查看正在运行的容器 加-a参数是查看所有容器-->
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
<!--使用docker commit命令创建一个新的镜像-->
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 <!--查看所有容器,获取刚创建的容器ID-->
[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 <!--确认已经下载centos7的模板压缩包-->
centos-7-x86_64-minimal.tar.gz
[root@centos01 ~]# cat centos-7-x86_64-minimal.tar.gz |docker import - docker:new
<!--使用docker导入命令导入为本地镜像-->
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 <!--查看刚运行的容器ID-->
0c10ee423098 docker:new "/bin/bash" About a minute ago Up About a minute nostalgic_wescoff
[root@centos01 ~]# docker exec -it 0c1 /bin/bash <!--使用ID前三位登录刚运行的容器-->
[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 <lyx@centos.org> <!--维护该镜像的用户信息-->
<!--以下是镜像的操作指令-->
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 <!--开启22端口-->
CMD ["/usr/sbin/sshd","-D"] <!--启动容器时执行指令-->
在编写dockerfile时,有严格的格式需要遵循:第一行必须使用FROM指令指明所基于的镜像名称;之后使用MAINTAINER指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如RUN指令,每运行一条指令,都会给基础镜像添加新的一层;最后使用CMD指令来指定启动容器时要运行的命令操作。
dockerfile有十几条命令可用于构建镜像,其中常见的指令如下:
4、使用dockerfile创建apache镜像并在容器中运行
1)创建镜像并加载到容器中运行:
[root@centos01 ~]# mkdir apache <!--建立工作目录-->
[root@centos01 ~]# cd apache/ <!--切换至新建的目录-->
[root@centos01 apache]# vim Dockerfile <!--编写dockerfile文件-->
FROM centos <!--基于的基础镜像centos-->
MAINTAINER lyx@163.com <!--维护该镜像的用户信息-->
RUN rpm --rebuilddb && yum -y update <!--使用yum进行更新-->
RUN rpm --rebuilddb && yum -y install httpd <!--镜像操作指令安装apache软件包-->
EXPOSE 80 <!--开启80端口-->
ADD index.html /var/www/html/index.html <!--将本地的首页文件index.html复制到镜像中-->
ADD run.sh /run.sh <!--将本地的运行脚本run.sh复制到镜像中-->
RUN chmod 775 /run.sh <!--赋予脚本执行权限-->
RUN systemctl disable httpd <!--设置apache服务不自行启动-->
CMD ["/run.sh"] <!--启动容器时执行脚本-->
<!--输入上述信息后,保存退出-->
[root@centos01 apache]# docker images | grep centos
<!--确保本地有centos的基础镜像,因为在dockerfile文件中指定了该镜像-->
centos7 system c065d5c0571d About an hour ago 435 MB
[root@centos01 apache]# vim run.sh <!--编写执行脚本内容-->
#!/bin/bash
rm -rf /run/httpd/* <!--清理httpd的缓存-->
exec /usr/sbin/apachectl -D FOREGROUND <!--启动apache服务-->
[root@centos01 apache]# echo "www.dockerfile.com" >index.html<!--编写一个首页文件-->
[root@centos01 apache]# ls <!--确保当前目录下的文件有以下三个-->
Dockerfile index.html run.sh
<!--当以上准备完成后,就可以使用docker build命令来创建镜像,如下:-->
[root@centos01 apache]# docker build -t httpd:centos .
<!--注意上面命令的末尾有个“.”,表示当前路径,若不加则会报错。-->
<!--其中“-t”选项用来指定镜像的标签信息-->
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
.................. <!--省略部分内容,此处需要静等几分钟,此时系统在执行dockerfile文件中的指令-->
<!--若在显示信息中有报红的信息,只要配置文件无误,一般属于正常(是有关yum的信息)-->
Removing intermediate container 81a3d6c9d3db
Step 10/10 : CMD /run.sh
---> Running in 5cdc467fd874
---> 5d56b826432d
Removing intermediate container 5cdc467fd874
Successfully built 5d56b826432d
<!--当出现以上提示,则表示新的镜像已经创建成功了-->
<!--在整个创建过程中,可以看到每运行一次dockerfile中的指令,都会以给初始镜像加上新的一层-->
[root@centos01 apache]# docker run -d -p 80:80 httpd:centos
<!--将新生成的镜像加载到容器中运行-->
<!--其中“-p”选项实现从本地端口80到容器中80端口的映射-->
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端口,如下:
5、使用dockerfile创建Tomcat镜像并在容器中运行
1)创建镜像并加载到容器中运行:
[root@centos01 ~]# mkdir tomcat <!--创建tomcat目录-->
[root@centos01 ~]# cp /mnt/apache-tomcat-7.0.54.tar.gz ./tomcat/ <!--拷贝tomcat压缩包到tomcat目录-->
[root@centos01 ~]# cp /mnt/jdk-7u65-linux-x64.gz ./tomcat/ <!--拷贝jdk压缩包到tomcat目录-->
[root@centos01 tomcat]# tar zxvf apache-tomcat-7.0.54.tar.gz
<!--解压缩tomcat和jdk(测试用,一会还会将其删除)-->
[root@centos01 tomcat]# tar zxvf jdk-7u65-linux-x64.gz
[root@centos01 tomcat]# vim Dockerfile <!--编写Dockerfile文件-->
#基础镜像centos6.7系统
FROM centos7
#作者联系方式
MAINTAINER 18232013151@163.com
#解压缩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
<!--验证docker宿主机是否有基础镜像-->
centos7 latest 699a07e742fe 20 minutes ago 435 MB
[root@centos01 tomcat]# docker build -t tomcat:v1.0 .
<!--通过dockerfile生成镜像,镜像的名字是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 <!--查看docker宿主机是否生成tomcat:v1.0镜像-->
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
<!--通过tomcat:v1.0镜像运行容器并发布服务,容器名字为tomcat01-->
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 <!--监听8080端口-->
tcp 0 0 192.168.100.10:8080 0.0.0.0:* LISTEN 6122/docker-proxy-c
2)通过客户端访问tomcat01容器中的tomcat服务
———————— 本文至此结束,感谢阅读 ————————