1)基于现有镜像的创建
先使用现有镜像创建容器 docker run
再进入容器进行内容更新 docker exec
最后提交成新的镜像 docker commit
2)基于模板创建
可以从本地容器导出模板文件 docker export
或者从网上下载现成的模板文件 http://openvz.org/Download/template/precreated
再将模板文件导入成镜像 docker import
3)dockerfile 构建
dockerfile 指令
FROM 指定基础镜像,dockerfile构建镜像的第一个指令
MAINTAINER 指定镜像维护人信息
RUN 指定linux命令,可以多个命令用;或&&连接 使用
ENV 设置镜像环境变量
EXPOSE 暴露容器端口
VOLUME 指定容器的匿名数据卷
ADD/COPY 复制本地文件/目录到镜像中
ADD 和 COPY 的区别
COPY只能复制本地文件/目录到镜像中
ADD不光可以复制本地文件/目录到镜像中,还可以通过URL下载文件复制到镜像中,还能将本地tar压缩包解压后复制到镜像中。(URL下载和tar包解压特性不能一起使用)
USER 指定容器的运行用户
WORKDIR 指定容器的工作目录
AGR 指定构建镜像时传入的参数 docker run --build-arg 变量=值
CMD/ENTRYPOINT 指定容器启动时执行的命令
ENTRYPOINT 和 CMD 的区别
ENTRYPOINT 指定的容器启动时运行命令优先级更高,如果 ENTRYPOINT 和 CMD 同时存在,那么 CMD 指定内容将作为 ENTRYPOINT 指定的命令的选项或参数去使用
容器启动时运行的命令优先级
docker run --entrypoint 命令 > 镜像里的 ENTRYPOINT ["命令"] > docker run ... 命令 > 镜像里的 CMD ["命令"]
如何缩小镜像的体积大小?
1、尽可能的使用体积小的额基础镜像
2、尽可能减少Dockerfile文件中的指令数量
3、构建镜像步骤最后添加清空系统和应用程序 的缓存的命令
4、使用多级构建 FROM AS 别名 COPY --from 别名
dockerfile实例
docker build -t apache:centos7 .
如果想要实时更新数据,可以用逻辑卷挂载到容器
docker run -itd -p 1314:80 -v index.html:/var/www/html/
镜像容量过大的解决方案
- 基础镜像尽量使用轻量级最小化的镜像。
- Dockerfile中尽量把RUN指令合并在一起,减少镜像的层数(因为每一个RUN指令就是一个镜像层)。
- 多级构建(拿Dockerfile构建好的镜像再构建一次)。
针对上面的镜像的创建进行基础镜像的进行多阶级构建 :
vim Dockerfile
#基层镜像
FROM centos:7 AS first
#镜像作者信息描述
MAINTAINER this is apache image <yh 2022-11-23 >
#指定的Linu执行脚本
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
#将源码编译的安装包安放到容器中并进行解压
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.tar.gz /opt/
ADD httpd-2.4.29.tar.bz2 /opt/
#进行源码编译安装
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util && cd /opt/httpd-2.4.29 && ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi && make -j 4 && make install
#二阶段构建
FROM centos:7
#将一阶段的已安装好的包安防到二阶端中,并舍弃一阶段的其他无用资源
COPY --from=first /usr/local/httpd /usr/local/httpd
#安装apache运行所需的环境依赖包,不再安装源码编译所需的依赖包
RUN yum install -y pcre pcre-devel expat-devel perl
EXPOSE 80
ENTRYPOINT ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
docker build -t apache2:centos7 .
总结
Dockerfile结构大致分为四个部分:基础镜像信息(用from指定)、维护者信息(maintainer、镜像操作指令和容器启动时执行指令。
1、第一行必须使用FROM指令指明所基于的镜像名称;
2、之后使用MAINTAINER 指令说明维护该镜像的用户信息;
3、然后是镜像操作相关指令,如RUN指令/EXPOSE/ADD/ENV/ARG等等。每运行一条指令,都会给基础镜像添加新的一层。(多条命令可以使用 ; 或 && 合并成一条命令,减少镜像的层数)
4、最后使用CMD或者ENTRYPOINT指令指定启动容器时要运行的命令操作。