(转)kubernetes基础之docker file文件详解
原文:https://blog.csdn.net/guijianchouxyz/article/details/114482803
docker file让你有意想不到的收获
针对这个docker file自己也是找了好久,想着怎么可以用自己的话,讲出来。当你学习一个东西的时候,不是因为你学会了他就过,而是你还要试着给别人讲出来,这样你才算真的懂了。
首先让我们来了解一下什么是dockerfile?
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。例:docker build -f /path/to/a/Dockerfile
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
其次就是让我们来好好的heppy一下这个所谓的docker file
Dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
dockerfile构建镜像的思路
这里以构建一个nginx镜像为列
肯定需要一个基础镜像,比如你要创建一个Nginx的镜像,那么首先你的dokcer pull 一个centos镜像,在这个centos镜像的基础之上增删改来构建一个Nginx镜像
需要一个很清晰的nginx部署过程,如果你用yum在dockerfile文件里面安装nginx也不是不可以,但是你要想到一个事,第一yum安装的版本是不是你要的版本,第二、镜像讲究轻量级,说白了就是能少安装附带的服务,就少安装,建议通过编译安装,这样思路清晰,安装过程可控,更关键的是,删除掉一些无用的安装包,可以实现最大的轻量级
构建镜像所需要的各种包,包括依赖包,记得部署完后,将无用的包进行一个删除的操作,减负
一个镜像里面必须要有一个进程在不断的跑着,否则的话,你的镜像创建的容器一创建就自动退出了
nginx镜像构建思路
(1)上传nginx包,并解压,这个用add命令最好,因为add命令本身带有解压功能
(2)通过yum升级一下或者安装一下nginx服务的依赖服务
(3)到nginx压缩包目录下
(4)开始进行–config && make && make install编译
(5)复制nginx.conf配置文件到指定目录下面,这个用copy就可以了
(6)复制网站首页或者网站数据到指定目录下面,这个看情况所定,用add或者copy,看实际需要
(7)删除无用的包,为镜像减负
(8) 启动nginx,配合deam off命令,让他从后台变成在前台一直运行,写到cmd命令里面
完成
展示一些常用的指令。
常用命令 在file中的作用
FROM 指定基础镜像
MAINTAINER 维护者信息
RUN 构建镜像时执行的命令
ADD 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD 构建容器后调用,也就是在容器启动时才进行调用
ENTRYPOINT 配置容器,使其可执行化。配合CMD可省去"application"
LABEL 用于为镜像添加元数据
ENV 设置环境变量
EXPOSE 指定于外界交互的端口
VOLUME 用于指定持久化目录
WORKDIR 工作目录,类似于cd命令
USER 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
ARG 用于指定传递给构建运行时的变量
ONBUILD 用于设置镜像触发器
图显的方式理解
直接上docler file文件解释
[root@localhost ~]# cat Dockerfile
# This my first nginx Dockerfile
# Version 1.0
# 告诉dockerfile我的基础镜像是谁
FROM centos
#MAINTAINER 维护者信息
MAINTAINER shiliandenanhai
#ENV 设置环境变量 告诉dockerfile,我所需要的命令在哪里去找,如果你不写这个的话,那下面启动nginx命令一定要是绝对路径
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.16.1.tar.gz /usr/local/
#RUN 执行以下命令
RUN rm -rf /usr/local/nginx-1.16.1.tar.gz
RUN yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.16.1
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
WORKDIR /usr/local/nginx/
##修改下nginx的配置文件
RUN grep -Ev "#|^$" ./conf/nginx.conf.default > ./conf/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令,配合daemon off让nginx保持一致在前台运行
CMD ["./sbin/nginx","-g", "daemon off;"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
具体实操过程
[root@localhost ~]# docker image rm nginx nginx:v1 #清理所有镜像
Untagged: nginx:latest
Untagged: nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Deleted: sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74
Deleted: sha256:4dfe71c4470c5920135f00af483556b09911b72547113512d36dc29bfc5f7445
Deleted: sha256:3c90a0917c79b758d74b7040f62d17a7680cd14077f734330b1994a2985283b8
Deleted: sha256:a1c538085c6f891424160d8db120ea093d4dda393e94cd4713e3fff3c82299b5
Deleted: sha256:a3ee2510dcf02c980d7aff635909612006fd1662084d6225e52e769b984abeb5
Deleted: sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864
Untagged: nginx:v1
Deleted: sha256:b9ffb514da6132b9e0c65112148f73e8528182f7f24027bf27d481113857861e
Deleted: sha256:8f6cb55ae698dfc2dc74577775f1bcbed1d48f72213bb6097207631cce9db58a
[root@localhost ~]# docker images #当前没有任何的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost ~]# docker pull centos #拉取一个centos镜像,这个将作为基础镜像
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@localhost ~]# docker images #可以看到基础镜像已经成功的下载了下来
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 2 months ago 209MB
[root@localhost ~]# ls #准备好所需要的nginx源码包
nginx-1.16.1.tar.gz
[root@localhost ~]# vim Dockerfile #编辑Dockerfile文件
[root@localhost ~]# cat Dockerfile #文件内容如下
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER shiliandenanhai
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.16.1.tar.gz /usr/local/
RUN rm -rf /usr/local/nginx-1.16.1.tar.gz
#RUN 执行以下命令
RUN yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.16.1
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
WORKDIR /usr/local/nginx/
RUN grep -Ev "#|^$" ./conf/nginx.conf.default > ./conf/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["./sbin/nginx","-g", "daemon off;"]
[root@localhost ~]# docker build -f /root/Dockerfile -t nginx:v1 .
Sending build context to Docker daemon 1.056MB
Step 1/13 : FROM centos
---> 300e315adb2f
Step 2/13 : MAINTAINER shiliandenanhai
---> Running in 66377b50ad24
Removing intermediate container 66377b50ad24
---> 244019a1688b
Step 3/13 : ENV PATH /usr/local/nginx/sbin:$PATH
---> Running in d01283ba67d7
Removing intermediate container d01283ba67d7
---> 55ae3fb8da5f
Step 4/13 : ADD nginx-1.16.1.tar.gz /usr/local/
---> 530750c97404
Step 5/13 : RUN rm -rf /usr/local/nginx-1.16.1.tar.gz
---> Running in 3b1c8bf4669b
Removing intermediate container 3b1c8bf4669b
---> 9a0f1ea4fce2
Step 6/13 : RUN yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel && yum clean all
---> Running in 4f695646faa1
******************中间省略***********************************
make[1]: Leaving directory '/usr/local/nginx-1.16.1'
Removing intermediate container 20890ab983e6
---> 8024bd8e38b1
Step 10/13 : WORKDIR /usr/local/nginx/
---> Running in edfe0deeb339
Removing intermediate container edfe0deeb339
---> 73b4bb58fbe8
Step 11/13 : RUN grep -Ev "#|^$" ./conf/nginx.conf.default > ./conf/nginx.conf
---> Running in 71655f47453a
Removing intermediate container 71655f47453a
---> 34750e236d24
Step 12/13 : EXPOSE 80
---> Running in 37e8e74ef282
Removing intermediate container 37e8e74ef282
---> 489af6bd5f9c
Step 13/13 : CMD ["./sbin/nginx","-g", "daemon off;"]
---> Running in 44bc8597b533
Removing intermediate container 44bc8597b533
---> be73a882a030
Successfully built be73a882a030
Successfully tagged nginx:v1 #表示成功创建nginx:v1镜像
[root@localhost ~]# docker images #查看当前所有镜像,能看到我们所创建的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 be73a882a030 50 seconds ago 415MB
centos latest 300e315adb2f 2 months ago 209MB
[root@localhost ~]# docker run -d --name=web1 nginx:v1 #用刚刚创建的镜像创建一个容器
d815c3553a4978c2e54cca7c5e9dc65b357201954412812003764c53f1a0ca88
[root@localhost ~]# docker ps -a #查看容器状态是up状态,没有问题
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d815c3553a49 nginx:v1 "./sbin/nginx -g 'da…" 16 seconds ago Up 15 seconds 80/tcp web1
[root@localhost ~]# docker inspect web1 | grep -i ipadd #获取容器ip
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
[root@localhost ~]# curl 172.17.0.2 #访问容器ip,nginx可以正常的访问,ok
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
————————————————
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性