Docker容器技术
Docker基础概念
Docker安装配置
通过docker registry搭建私有仓库
Dockerfile编写学习
数据卷管理
Docker 镜像
Docker容器管理
daemon.json配置示例
Dcocker网络互联
Docker部署nextcloud网盘
Watchtower-容器的自动升级
想要轻松上手Docker?Portainer帮你实现零基础快速部署!
Nextcloud搭建
Docker搭建Mrdoc
Mrdoc迁移记录
Docker部署wordpress博客
Docker部署个人密码管理平台bitwarden
Docker-compose安装配置
Docker-compose搭建小说阅读器
Docker搭建青龙面板
Docker搭建自己的导航页dashy
uptime-kuma监控面板部署
容器搭建Nas-tool及相关套件
本文档使用 MrDoc 发布
-
+
首页
Dockerfile编写学习
# Dockerfile学习 通过dockerfile文件可以自定义构建镜像,可以实现个性化需求,相对于docker commit和导入导出能够实现更加灵活的功能实现。 ## FROM指令 指定基础镜像,必备命令且为第一条命令。如常见应用镜像`nginx`、`mysql`、`apache`、`wordpress`等,也可以使用基础的系统镜像`centos`、`ubuntu`、`debian`等,以及特殊镜像`scratch`表示空白镜像。 ``` # FROM nginx FROM mysql FROM centos ``` ## MAINTAINER指令 该指令用于指定作者或维护人员信息,新版可以使用LABEL指明。使用docker inspect查看位于顶层 `"Author": ""`中。 ``` # 格式 MAINTAINER <name> MAINTAINER chuck ``` ## LABEL 指令 新版用于设置标签元数据信息,以键值对形式存在。 ``` # 格式,可以写多个,可以以\分隔 LABEL <key>=<value> <key>=<value> <key>=<value> ... LABEL version="1.0" description="test image" ``` ## RUN指令 RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。 其格式有两种: - shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockrfile 中的 RUN 指令就是这种格式。 ``` RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ``` - exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。 ``` RUN apt-get update ``` 需要注意的是在dockerfile中每一条命令都会在镜像上增加一层,镜像限制最大127层,层数越大体积越大越臃肿,因此我们可以使用`&&`连接,使用 `\`换行。 ## ADD指令 可以用于将本地文件复制到容器中,原路径可以是目录、url,ADD指令还可以用于压缩文件解压到容器中. ``` # 用法:ADD <src> <dest> ADD /www/test.txt /usr/local/test.txt ADD http://example.cn/config.property / ``` 但是在实际应用中建议复制文件使用`COPY指令`,需要解压文件才使用`ADD指令`。 ## WORKDIR指令 使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。容器内默认工作目录应该是/根目录。 ## VOLUME指令 用于指定匿名卷。匿名卷作用,在Dockerfile使用`VOLUME指令`指定的目录会自动映射一个到宿主机的docker安装目录下的一个目录,在容器被删除后不会被删除,用于防止像`mysql`等需要数据持久化的容器在`docker run`时没有指定挂载卷的情况。 如果-v和VOLUME指令同时应用,以-v配置为准,本身就是为了保护数据安全性的。 ``` VOLUME /var/log/ ``` ## EXPOSE指令 声明容器使用的端口。 ``` 格式为 EXPOSE <端口1> [<端口2>...] ``` EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。可以帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。 ## CMD指令 指定该容器启动的时候要运行的命令,只有最后一个会生效,可被替代。和RUN指令一样有两种形式。 - shell 格式:CMD <命令> - exec 格式:CMD ["可执行文件", "参数1", "参数2"...] 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。 用于设置容器的主程序,并且要声明用前台运行,例如下面的nginx: ``` CMD ["nginx", "-g", "daemon off;"] ``` ## ENTRYPOINT指令 指定该容器启动的时候要运行的命令,可以追加,可以作为容器运行前的检查以及执行CMD指令的内容。 ``` <ENTRYPOINT> "<CMD>" ``` ## ONBUILD指令 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令,触发指令。ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。 ## COPY指令 复制文件,将主机文件或文件夹复制到容器内部,需要注意文件上下文位置。 格式: - COPY <源路径>... <目标路径> - COPY ["<源路径1>",... "<目标路径>"] ## ENV指令 设置环境变量,可以用于后面的RUN、CMD等指令执行。 ``` ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... # 示例 ENV PG_MAJOR=9.3 ENV PG_VERSION=9.3.4 ENV PATH=/usr/local/postgres-$PG_MAJOR/bin:$PATH ``` ## 测试:基于centos构建安装net-tools 创建文件夹 `mkdir myimage` 进入文件夹 `cd myimage` 创建Dockerfile文件 `touch Dockerfile` 编辑文件,内容如下: `vim Dockerfile` ``` # this is my test dockerfile # 设置基础镜像 FROM centos # 设置作者信息 MAINTAINER chuck VOLUME /var/log/ # yum源问题更新阿里云 RUN rm -rf /etc/yum.repos.d/* COPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo RUN dnf install -y net-tools \ && dnf clean all ``` 由于使用yum源问题,需要清空官方的repo,然后下载新的yum源,wegt无法使用,这里采用了从宿主机复制到容器的方法,不能直接写源路径,建议将文件复制到文件上下文目录。 执行构建命令 `docker build -t centos8:v1 .` 查看j镜像 `docker images` 查看历史构建过程 `docker history centos8:v1` 查看镜像的详细信息 `docker inspect centos8:v1`
Chuck
2022年12月21日 17:25
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码