Dockerfile
1. Dockerfile的介绍
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
Docker分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时默认要执行的指令
2. 指令
指令 | 描述 |
---|---|
FROM | 指定构建新lmage时使用的基础lmage,通常必须是Dockerfile的第一个有效指令,但其前面也可以出现ARG指令 |
LABEL | 附加到Image之上的元数据,键值格式;一般后面加MAINTAINER 用来描述作者信息 |
ENV | 以键值格式设定环境变量,可被其后的指令所调用,且基于新生成的Ilmage运行的Container中也会存在这些变量 |
ARG | 定义专用于build过程中的变量,但仅对该指标之后的调用生效,其值可由命令行选项" --build-arg"进行传递 |
RUN | 以FROM中定义的lmage为基础环境运行指定命令,生成结果将作为新Image的一个镜像层,并可由后续指令所使用 |
CMD | 基于该Dockerfile生成的lmage运行Container时,CMD能够指定容器中默认运行的程序,因而其只应该定义一次 |
ENTRYPONT | 类似于CMD指令的功能,但不能被命令行指定要运行的应用程序覆盖,且与CMD共存时CMD的内容将作为该指令中定义的程序的参数 |
WORKDIR | 为RUN、CMD、ENTRPOINT、COPY和ADD等指令设定工作目录 |
COPY | 复制主机上或者前一阶段构建结果中(需要使用–from选项)文件或目录生成新的镜像层 |
ADD | 与COPY指令的功能相似,但ADD额外也支持使用URL指定的资源作为源文件 |
VOLUME | 指定基于新生成的Image运行Container时期望作为Volume使用的目录 |
EXPOSE | 指定基于新生成的Image运行Container时期望暴露的端口,但实际暴露与否取决于"docket run"命令的选项,支持TCP和UDP协议 |
USER | 为Dockerfile中该指令后面的RUN、CMD和ENTRYPOING指令中要运行的应用程序指定运行者身份UID,以及一个可选的GID |
ONBUILD | 触发器,生效于由该Dockerfile构建出的新lmage被用于另一个Dockerfile中的FROM指令作为基础镜像时 |
实验步骤:
要求: 用podman进行dockerfile做一个httpd编译安装的镜像,要求要控制版本号,要用到dockerfile中所有指令及用脚本方式启动程序,传到官方仓库并提交镜像的名称:版本
1. 准备源码包存放在目录,以便Dockerfile的ADD指令的运用
[root@master ~]# mkdir httpd
[root@master httpd]# mkdir tools/
[root@master httpd]# cd tools/
[root@master tools]# ls
apr-1.7.0.tar.gz apr-util-1.6.1.tar.gz httpd-2.4.54.tar.gz
2. 编写entrypoint.sh脚本
[root@master httpd]# vim entrypoint.sh
#!bin/bash
sed -i '/^#ServerName/s/#//g' /usr/local/apache/conf/httpd.conf
exec "$@"
[root@master httpd]# chmod +x entrypoint.sh
3. 编写dockerfile文件
[root@master ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/nginx latest 605c77e624dd 8 months ago 146 MB
docker.io/library/httpd latest dabbfbe0c57b 8 months ago 148 MB
docker.io/library/registry latest b8604a3fe854 9 months ago 26.8 MB
quay.io/centos/centos 8 5d0da3dc9764 11 months ago 239 MB
docker.io/library/centos latest 5d0da3dc9764 11 months ago 239 MB
[root@master httpd]# vim Dockerfile
# 指定镜像
FROM centos:8
# 指定维护者信息
LABEL MAINTAINER='yxt 2237966451@qq.com'
# 指定环境变量
ENV apache_version=2.4.54
ENV PATH /usr/local/apache/bin:$PATH
#复制指定的<src>到容器中的<dest>。其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(会自动解压为目录)
ADD tools/apr-1.7.0.tar.gz /usr/src/
ADD tools/apr-util-1.6.1.tar.gz /usr/src
ADD tools/httpd-${apache_version}.tar.gz /usr/src
ADD entrypoint.sh /
# 运行的命令
RUN rm -rf /etc/yum.repos.d/* && \
cd /etc/yum.repos.d/ && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo && \
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && \
yum clean all && yum makecache && \
yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make && \
cd /usr/src/apr-1.7.0 && \
sed -i '/$RM "$cfgfile"/d' configure && \
./configure --prefix=/usr/local/apr && \
make && make install && \
cd && \
cd /usr/src/apr-util-1.6.1 && \
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && \
make && make install && \
cd && \
cd /usr/src/httpd-${apache_version} && \
./configure --prefix=/usr/local/apache \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork && \
make && make install
# 暴露端口
EXPOSE 80
# 启动容器时默认执行的命令,指定了多条命令,只有最后一条会被执行
# 如果用户docker run 容器时指定了运行的命令,则会覆盖掉CMD指定的命令
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
# 不可被docker run 容器时覆盖, 而且如果在docker run的后面提供了参数,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序
# 每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效
ENTRYPOINT ["/bin/bash","/entrypoint.sh"]
# 进入容器后,指定工作的目录
WORKDIR /usr/local/apache
[root@master httpd]# podman build -t httpd:v0.2 .
[root@master httpd]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/httpd v0.2 a6a42574dc59 53 seconds ago 727 MB
docker.io/library/nginx latest 605c77e624dd 8 months ago 146 MB
docker.io/library/httpd latest dabbfbe0c57b 8 months ago 148 MB
docker.io/library/registry latest b8604a3fe854 9 months ago 26.8 MB
quay.io/centos/centos 8 5d0da3dc9764 11 months ago 239 MB
docker.io/library/centos latest 5d0da3dc9764 11 months ago 239 MB
[root@master httpd]# podman login docker.io
Username: yexiaotian
Password:
Login Succeeded!
[root@master httpd]# podman tag a6a42574dc59 docker.io/yexiaotian/httpd:v0.3
[root@master httpd]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/httpd v0.2 a6a42574dc59 5 minutes ago 727 MB
docker.io/yexiaotian/httpd v0.3 a6a42574dc59 5 minutes ago 727 MB
docker.io/library/nginx latest 605c77e624dd 8 months ago 146 MB
docker.io/library/httpd latest dabbfbe0c57b 8 months ago 148 MB
docker.io/library/registry latest b8604a3fe854 9 months ago 26.8 MB
quay.io/centos/centos 8 5d0da3dc9764 11 months ago 239 MB
docker.io/library/centos latest 5d0da3dc9764 11 months ago 239 MB
[root@master httpd]# podman push docker.io/yexiaotian/httpd:v0.3