Dockerfile

Dockerfile

创建一个目录存放docker和包

[root@localhost ~]# mkdir httpd
[root@localhost ~]# cd httpd
[root@localhost ~]# mkdir files
[root@localhost httpd]# cd files/
[root@localhost files]# wget http://mirrors.aliyun.com/apache/apr/apr-1.7.0.tar.gz https://mirrors.aliyun.com/apache/apr/apr-util-1.6.1.tar.gz https://mirrors.aliyun.com/apache/httpd/httpd-2.4.54.tar.gz
[root@localhost files]# vim entrypoint.sh
[root@localhost files]# cat entrypoint.sh 
#!/bin/bash

sed -i '/^#ServerName/s/#//g' /usr/local/apache/conf/httpd.conf

exec "$@"
[root@localhost files]# chmod -x entrypoint.sh
[root@localhost files]# cd ..
[root@localhost httpd]# vim Dockerfile  //编写dockerfile
[root@localhost httpd]# cat Dockerfile 
FROM centos
  
LABEL MAINTAINER "niebr 2951232847@qq.com"

ENV apr_version=1.7.0 apr_util_version=1.6.1 httpd_version=2.4.54

ADD files/* /usr/src/
ADD files/entrypoint.sh /

RUN rm -rf /etc/yum.repos.d/* && \   
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo  && \ 
yum -y install make gcc gcc-c++ openssl-devel pcre-devel expat-devel libtool libxml2-devel && \
    useradd -r -M -s /sbin/nologin apache && \
    cd /usr/src/apr-${apr_version} && \
    sed -i '/$RM "$cfgfile"/d' configure && \
    ./configure --prefix=/usr/local/apr && make && make install && \
    cd /usr/src/apr-util-${apr_util_version} && \
    ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && \
    make && make install && \
    cd /usr/src/httpd-${httpd_version} && \
    ./configure --prefix=/usr/local/apache \
    --sysconfdir=/etc/httpd24 \
    --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 && \
    yum clean all && \
    yum -y remove gcc gcc-c++ make && \
    rm -rf /tmp/* /usr/src/* 

WORKDIR /usr/local/apache 

EXPOSE 80   

CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]

ENTRYPOINT ["/bin/bash","/entrypoint.sh"]

使用dockerfile创建镜像

[root@localhost ~]# podman build -t daojiang/httpd:v1.3 httpd/

使用镜像运行容器进行测试

[root@localhost ~]# podman run -dit --name wbe -p 80:80 daojiang/httpd:v1.3
e99de0f0dd3fcdacd3e210c43c1fc11f6c5d63d7fb2944e53c6720d30e95af0b

上传镜像

[root@localhost ~]# podman login
Username: daojiang
Password: 
Login Succeeded!
[root@localhost ~]# podman push daojiang/httpd:v1.3
Getting image source signatures
Copying blob 97a609004ec2 done  
Copying blob 46bf5f766fa6 done  
Copying blob c909c6c1788d done  
Copying blob 2653d992f4ef done  
Copying config b768dd94b6 done  
Writing manifest to image destination
Storing signatures

image

Dockerfile基本结构

Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。

Docker分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时默认要执行的指令

指令

FROM

格式为FROM <image>FROM <image>:<tag>

第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。

示例

#语法:
FROM <镜像名称>

LABEL MAINTAINER

指定维护者信息

#语法:
LABEL MAINTAINER "[作者] [邮箱]"

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量

#语法:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

#语法:
ARG <参数名>[=<默认值>]

RUN

用于执行后面跟着的命令行命令。有以下俩种格式:

shell格式

#语法:
RUN <命令行的命令>
RUN ["/bin/bash","-c","echo hello"]

exec格式

#语法:
RUN ["可执行文件", "参数1", "参数2"]
RUN echo "hello world\nhello tom" > /tmp/abc && \
    cat /tmp/abc

CMD

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。
  • 作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

#语法: 
CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

ENTRYPONT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
#语法:
ENTRYPOINT <shell 命令>
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

WORKDIR

WORKDIR : 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

#语法:
WORKDIR <工作目录路径>

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

#语法:
COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

ADD

ADD :ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>;并且源文件目录可以是URL
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

#语法:
ADD <src> <dest>

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷

语法:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

EXPOSE

EXPOSE用于告诉Docker服务器容器暴露的端口号,供互联系统使用

#语法:
EXPOSE 端口号

USER

指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

#语法:
USER <用户名>[:<用户组>]

ONBUILD

配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。

#语法:
ONBUILD <其它指令>
posted @   niebangrui  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示