文章目录
Docker 镜像分层
->Dockerfile中的每个指令都会创建一个新的镜像层
->镜像层将被缓存和复用
->当 Dockerfile 指令修改了 , 复制的文件变化了,或者构建镜像是指定变量不同了,对应的镜像层缓存就会失效。
->某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效。
->镜像层是不可变的,如果在某一层中添加一个文件。然后在下一次层中删除它,则镜像中依然会包含该文件。
Docker 镜像的创建方法
######################################
1.基于已有的镜像创建
创建容器
[root@cz7-1 ~]# docker create -it centos:latest /bin/bash
005fe0ee75df3b4ed652bed3035fde0cc6f111d246835048df3e8248ebd3d4c9
[root@cz7-1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
005fe0ee75df centos:latest "/bin/bash" 8 seconds ago Created focused_lamarr
使用容器创建成为镜像
####################
语法格式:
docker commit [选项] 容器ID/名称 仓库名称:标签
选项:
-> -m:说明信息
-> -a:作者信息
-> -p:生成过程中停止容器的运行
[root@cz7-1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9576aa3ebca9 centos:latest "/bin/bash" 5 seconds ago Created heuristic_noether
docker commit -m "new" -a "liang" 9576aa3ebca9 centos:new
################
2.基于本地模板创建
####################
通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为wget http://openvz.org/Download/template/precreated.
下面是使用docker导入命令将下载的centos-6-x86_64-minimal.tar.gz模板压缩包导入为本地镜像的例子。
cat 镜像模板 | docker import - 新的镜像名:标签
################
3.基于Dockerfile 创建
Dockerfile 是由一组指令组成的文本配置文件,用户可以创建并编辑。其中每条指令对应linux中的一条命令
Docker 可以读取Dockerfile以决定如何生成一个镜像。
Dockerfile 结构的大致分为四个部分
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
Dockerfile 每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释。
FROM 镜像 指定新的镜像所基于的镜像
MAINTAINER 名字 说明新镜像的维护人
RUN 命令 在所基于的镜像上执行命令,并提交到新的镜像中。
CMD [“要运行的程序”,“参数1”,“参数2”] 指定启动容器时要运行命令或者脚本,只能有一条CMD命令。
EXPOSE 端口号 只当新镜像加载到Docker时要开启的端口。
ENV 环境变量 环境变量值 设置一个环境的值,会被后面的RUN使用
ADD 源文件 / 目录 目标文件 / 目录 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件 / 目录 目标文件 /目录 将本地主机上的源文件 / 目录复制到目标地点,源文件 / 目录要与Dockerfile在相同的目录中
VOLUME ["目录"] 在容器中创建一个挂载点
USER 用户名 /UID 指定运行容器时的用户
WORKDIR 路径 为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
^^^^^^^^^^^^^^^^^^^^^^^^^
4.创建 Dockerfile 工作目录
[root@cz7-1 /]# mkdir apache
[root@cz7-1 /]# cd apache/
5.创建并编写Dockerfile 配置文件
[root@cz7-1 apache]# vim Dockerfile
----------------------------------
## 基于的基础镜像
FROM centos
# 维护该镜像的用户信息
MAINTAINER The CentOS Project <cloud-pos@centos>
# 镜像操作指令安装apache软件包
RUN yum -y update
RUN yum -y install httpd
# 开启80端口
EXPOSE 80
# 复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本文件复制到镜像中
ADD run.sh /run.sh
RUN chmod 775 /run.sh
# 启动容器时执行脚本
CMD ["/run.sh"]
-----------------------------------
6.编写执行脚本文件内容
[root@cz7-1 apache]# vim run.sh
------------------------------------
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
----------------------------------
7.创建测试页面
[root@cz7-1 apache]# vim index.html
-------------------------------------
666 (自定义)
-------------------------------------
8.使用 Dockerfile 生成镜像
命令格式:docker build [选项] 路径
-> -t :指定镜像的标签信息
使用 Dockerfile 自动生成镜像
[root@cz7-1 apache]# docker build -t httpd:centos .
Successfully built 5aba0e543f7f
Successfully tagged httpd:centos
[root@cz7-1 apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos 5aba0e543f7f 45 seconds ago 375MB
9.基于新创建的镜像运行容器
将新生成的镜像加载到容器中运行
[root@cz7-1 apache]# docker run -d -p 6666:80 httpd:centos
[root@cz7-1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8348d7aacd9 httpd:centos "/run.sh" 6 minutes ago Up 6 minutes 0.0.0.0:6666->80/tcp lucid_ganguly
验证:
[root@cz7-1 apach]# curl 192.168.73.25:6666
666
其中 -q 选项 :实现从本地端口 6666 到容器中80端口的眏射。