目录
基础结构
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
Docker分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时默认要执行的指令
# 第一行必须指定基于的基础镜像
FROM centos
# 维护者信息
LABEL MANTAINER "marui123 [email protected]"
# 镜像操作指令
RUN useradd -r -M -s /sbin/nologin apache
# 容器启动时默认要执行的指令
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
其中,一开始必须指明所基于的镜像名称,接下来一般会说明维护者信息。
后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层,并提交。最后是CMD指令来指定运行容器时的操作指令。
指令
指令的一般格式为INSTRUCTION arguments,指令包括:
- FROM
- LABEL MAINTAINER
- RUN
- CMD
- EXPOSE
- ENV
- ADD
- COPY
- ENTRYPOINT
- VOLUME
- USER
- WORKDIR
- ONBUILD
from
格式为FROM 或FROM :
第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。
FROM <镜像名称>
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
label maintainer
格式为LABEL MAINTAINER
LABEL MAINTAINER "[作者] [邮箱]"
LABEL MANTAINER "marui123 [email protected]"
run
格式为RUN
RUN <命令行的命令>RUN ["/bin/bash","-c","echo hello"]
[root@localhost ~]# cd httpd/
[root@localhost httpd]# ls
Dockerfile files
[root@localhost httpd]# vim Dockerfile
FROM busybox
LABEL MANTAINER "marui123 [email protected]"
RUN echo "abcdefg" > /tmp/abc
[root@localhost httpd]# podman build -t httpd:1.0 .
[root@localhost httpd]# podman run -it --rm httpd:1.0 /bin/sh
/ # cd /tmp/
/tmp # ls
abc
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行
RUN ["可执行文件", "参数1", "参数2"]RUN echo "hello world\nhello tom" > /tmp/abc && \
cat /tmp/abc
cmd
CMD支持三种格式:
- CMD ["executable","param1","param2"]使用exec执行,推荐方式
- CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用
- CMD ["param1","param2"]提供给ENTRYPOINT的默认参数
CMD用于指定启动容器时默认要执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
export
格式为EXPOSE
例如:EXPOSE 22 80 8443
EXPOSE用于告诉Docker服务器容器暴露的端口号,供互联系统使用。
在启动容器时通过-P,Docker主机会自动分配一个端口转发到指定的端口;
使用-p则可以具体指定哪个本地端口映射过来。
EXPOSE 端口号
env
格式为ENV
ENV PATH /usr/local/apache/bin:$PATH //配置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
add
格式为ADD
该命令将复制指定的
ADD <src> <dest>
[root@localhost httpd]# ls
Dockerfile files
[root@localhost httpd]# ls files/
apr-1.7.0.tar.gz apr-util-1.6.1.tar.gz entrypoint.sh httpd-2.4.54.tar.gz
[root@localhost httpd]# vim Dockerfile
FROM busybox
ADD files/apr-1.7.0.tar.gz /tmp/
[root@localhost httpd]# podman build -t httpd:2.0 .
[root@localhost httpd]# podman run -it --rm httpd:2.0 /bin/sh
/ # cd tmp/
/tmp # ls
apr-1.7.0
/tmp #
copy
格式为COPY
复制本地主机的
当使用本地目录为源目录时,推荐使用COPY。
格式为COPY <src> <dest>。
复制本地主机的<src>(为Dockerfile所在目录的相对路径,文件或目录)为容器中的<dest>。目标路径不存在时会自动创建。
当使用本地目录为源目录时,推荐使用COPY。
entrypoint
ENTRYPOINT有两种格式:
- ENTRYPOINT ["executable","param1","param2"]
- ENTRYPOINT command param1 param2(在shell中执行)
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。而且,如果在docker run的后面提供了参数,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。
ENTRYPOINT <shell 命令>ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
volume
格式为VOLUME ["/data"]。
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
VOLUME ["<路径1>", "<路径2>"...]VOLUME <路径>
user
格式为USER daemon。
指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres
要临时获取管理员权限可以使用gosu,而不推荐sudo。如果不指定,容器默认是root运行。
USER <用户名>[:<用户组>]
workdir
格式为WORKDIR /path/to/workdir。
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
WORKDIR <工作目录路径>
onbuild
配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。
ONBUILD <其它指令>
此时,如果基于image-A创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像时,会自动执行ONBUILD指令的内容,等价于在后面添加了两条指令。
使用ONBUILD指令的镜像,推荐在标签中注明
创建镜像
编写完成Dockerfile后,可以通过docker build命令来创建镜像。
基本的格式为docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。
另外,可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过-t选项。
- podman用dockerfile做apache编译安装镜像
[root@localhost ~]# mkdir apache
[root@localhost ~]# cd apache/
[root@localhost apache]# mkdir files
[root@localhost apache]# touch Dockerfile
[root@localhost apache]# ls
Dockerfile files
[root@localhost apache]# cd files/
[root@localhost files]#
wget https://downloads.apache.org/apr/apr-1.7.0.tar.gz https://downloads.apache.org/apr/apr-util-1.6.1.tar.gz https://downloads.apache.org/httpd/httpd-2.4.54.tar.gz
[root@localhost files]# ls
apr-1.7.0.tar.gz apr-util-1.6.1.tar.gz httpd-2.4.54.tar.gz
[root@localhost files]# vim 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 httpd]# vim Dockerfile
FROM centos
LABEL MANTAINER "marui123 [email protected]"
ENV apache_version 2.4.54
ENV PATH /usr/local/apache/bin:$PATH
ADD files/apr-1.7.0.tar.gz /usr/src/
ADD files/apr-util-1.6.1.tar.gz /usr/src/
ADD files/httpd-${apache_version}.tar.gz /usr/src/
ADD files/entrypoint.sh /
RUN useradd -r -M -s /sbin/nologin apache && \
cd /etc/yum.repos.d && rm -r * && \
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 gcc gcc-c++ make openssl-devel pcre-devel expat-devel libtool && \
cd /usr/src/apr-1.7.0 && \ sed -i '/$RM "$cfgfile"/d' configure && \
./configure --prefix=/usr/local/apr && \ make && make install && \
cd ../apr-util-1.6.1 && \ ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && \
make && make install && \
cd ../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 && \
yum clean all && \
yum -y remove gcc gcc-c++ make && \
rm -rf /tmp/* /usr/src/*
EXPOSE 80
WORKDIR /usr/local/apache
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
ENTRYPOINT ["/bin/bash","/entrypoint.sh"]
[root@localhost httpd]# podman build -t httpd:v6.66 .
[root@mr ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/marui123/httpd v6.66 69bb2bcc3538 About an hour ago 427 MB
localhost/httpd v6.66 69bb2bcc3538 About an hour ago 427 MB
docker.io/library/httpd latest a981c8992512 7 days ago 149 MB
docker.io/library/centos latest 5d0da3dc9764 11 months ago 239 MB
[root@localhost httpd]# podman run -d httpd:v6.66
[root@mr ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1bc3da5e13d localhost/httpd:v6.66 /usr/local/apache... 44 minutes ago Up 44 minutes ago funny_sanderson
[root@localhost httpd]# podman inspect -l |grep -i ipaddr
"IPAddress": "10.88.0.6", "IPAddress": "10.88.0.6", [root@localhost httpd]# curl 10.88.0.6 //访问成功 <html><body><h1>It works!</h1></body></html>
[root@mr ~]# podman inspect -l |grep -i ipaddr
"IPAddress": "10.88.0.10",
"IPAddress": "10.88.0.10",
[root@mr ~]# curl 10.88.0.10
<html><body><h1>It works!</h1></body></html>
[root@mr ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/marui123/httpd v6.66 69bb2bcc3538 About an hour ago 427 MB
localhost/httpd v6.66
docker.io/library/docker latest 0dfb722b2a54 3 days ago 135 MB
docker.io/library/httpd latest a981c8992512 7 days ago 149 MB
docker.io/library/centos latest 5d0da3dc9764 11 months ago 239 MB
[root@localhost httpd]# podman tag httpd:v6.66 docker.io/marui123/httpd:v6.66
[root@localhost httpd]# podman login docker.io
Username: marui123
Password: Login Succeeded! [root@localhost httpd]# podman push docker.io/marui123/httpd:v6.66
Getting image source signatures
Copying blob 74ddd0ec08fa skipped: already exists
Copying blob 87fc485808f9 skipped: already exists
Copying blob 96a9e2e4d6c9 skipped: already exists
Copying blob 5f6db79d3d08 skipped: already exists
Copying blob 231da1b56346 skipped: already exists
Copying blob e97783ef0259 skipped: already exists
Copying config 69bb2bcc35 done
Writing manifest to image destination
Storing signatures
[root@mr containers]# podman run -d --name marui123 -P docker.io/marui123/httpd:v6.66
cd89aa7da015c89d7cf07647372ee72a71516f7c9446e07d2ff311d199dbdbec
[root@mr containers]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbef59562810 docker.io/library/httpd:latest httpd-foreground 3 hours ago Up 3 hours ago web
339b5ca8079e docker.io/library/centos:latest /bin/bash 3 hours ago Up 3 hours ago jovial_chaplygin
bae49df78a61 localhost/httpd:v2.2 /usr/local/apache... 59 minutes ago Up 59 minutes ago funny_keldysh
b1bc3da5e13d localhost/httpd:v6.66 /usr/local/apache... 16 minutes ago Up 16 minutes ago funny_sanderson
cd89aa7da015 docker.io/marui123/httpd:v6.66 /usr/local/apache... 21 seconds ago Up 21 seconds ago 0.0.0.0:38349->80/tcp marui123
标签:httpd,apr,root,&&,apache,dockerfile,localhost
From: https://www.cnblogs.com/marymary/p/16641584.html