一文简单了解并构建Dockerfile

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一文简单了解并构建Dockerfile


Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

那么今天要介绍的Dockerfile是什么呢?简单来说Dockerfile用来描述Docker镜像的文件,而且是类似源码的描述。

假设现有一台机器,docker容器中有镜像如下:

[root@localhost ~]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
redis               latest    7614ae9453d1   12 months ago   113MB
mysql               5.7       c20987f18b13   12 months ago   448MB
mysql               8.0       3218b38490ce   12 months ago   516MB
greatsql/greatsql   latest    2390016ed67a   16 months ago   550MB
consul              1.9.4     28efe5fcc049   21 months ago   120MB

我们可以简单看看greatsql/greatsql:latest的dockerfile:

[root@localhost ~]# docker history --format {{.CreatedBy}} --no-trunc=true 2390016ed67a|sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac
ADD file:bd7a2aed6ede423b719ceb2f723e4ecdfa662b28639c8429731c878e86fb138b in / 
 LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20201204
 CMD ["/bin/bash"]
 MAINTAINER greatsql@greatdb.com
 ENV LANG=en_US.utf8
 ENV MYSQL_DATA_DIR=/data/GreatSQL
 ENV MYSQL_USER=mysql
 ENV MYSQL_UID_GID=3306
 ENV MYSQL_EXTRACT_DIR=/usr/local
 ENV TMP_DIR=/tmp
 ENV MYSQL_PORT=3306
 ENV GREATSQL=GreatSQL-8.0.25-15-Linux-glibc2.28-x86_64-minimal
 ENV MYSQL_BASEDIR=/usr/local/GreatSQL-8.0.25-15-Linux-glibc2.28-x86_64-minimal
 ENV DEP_LIBS=numactl-libs libaio readline-devel ncurses-devel
 ENV JEMALLOC_RPM=jemalloc-3.6.0-1.el8.x86_64.rpm
 ENV GREATSQL_INIT=greatsql-init.sh
RUN groupadd -g ${MYSQL_UID_GID} ${MYSQL_USER};     useradd -u ${MYSQL_UID_GID} -r -g ${MYSQL_UID_GID} -s /sbin/nologin         -c "MySQL User" ${MYSQL_USER}
COPY dir:39057b483c2d76e9f0001cb84ed6603761599e330b2e714a6ee5941a4332cd97 in /usr/local/GreatSQL-8.0.25-15-Linux-glibc2.28-x86_64-minimal 
COPY file:fe881a5e38a8821b0a03018241b9e51c6f815bd0733a73b8ff95c0cb23e53df9 in /tmp 
RUN yum install -y ${TMP_DIR}/${JEMALLOC_RPM}
RUN yum install -y ${DEP_LIBS}
RUN cd ${MYSQL_BASEDIR}/support-files &&     cp -f my.cnf /etc/my.cnf ;     echo "LD_PRELOAD=/usr/lib64/libjemalloc.so.1" >> /etc/sysconfig/mysql ;     echo "THP_SETTING=never" >> /etc/sysconfig/mysql ;     echo "export PATH=\$PATH:${MYSQL_BASEDIR}/bin" >> /etc/profile.d/mysql.sh ;     source /etc/profile.d/mysql.sh
RUN PATH="\$PATH:${MYSQL_BASEDIR}/bin"
RUN export PATH
RUN mkdir -p ${MYSQL_DATA_DIR} && chown -R ${MYSQL_USER}:${MYSQL_USER} ${MYSQL_BASEDIR} ;     chmod -R ug+rwX ${MYSQL_BASEDIR} ;     chmod -R ug+rwX /etc/my.cnf
RUN rm -f ${TMP_DIR}/${JEMALLOC_RPM}
COPY file:246cf23778cd1862e366d7b64f51aaf616c480874560e8f1ed0992ba7f6e4273 in /docker-entrypoint.sh 
 ENTRYPOINT ["/docker-entrypoint.sh"]
 EXPOSE 3306 33060 33061
 CMD ["mysqld"]

1.Dockerfile介绍

官方网站:https://hub.docker.com/

现在我们简单介绍一下dockerfile:

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。dockerfile 用于指示 docker image build 命令自动构建Image的源代码

# 对该目录下的dockerfile进行镜像的构建
docker build -f Dockerfile

通过dockerfile创建镜像大致上分为三步:写Dockerfile ——>docker build——>docker run

Dockerfile 可以大致分为4个部分:

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

dockerfile也有一些需要注意的地方:

  • dockerfile是通过从上到下的顺序运行指令的。其中第一条指令是 FROM,表示源镜像是基于什么镜像,因此也就有了所有镜像的源镜像:scratch。
  • 每条保留字指令都必须是大写字母, 并且后面要跟随至少一个参数。
  • 每条指令可用 # 添加注释。
  • 每条指令都会创建一个新镜像层, 并对镜像进行提交。

2.Dockerfile指令解析

指令 解析
FROM 指定基础镜像,必须为第一个命令
MAINTAINER 维护者邮箱等信息
RUN 构建镜像docker build时执行的命令
ADD 将本地文件添加到容器中,tar 类型文件会自动解压
COPY 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD 在docker run时会执行的命令,如果存在多个则仅最后一个生效,例如一个镜像的dockerfile的结尾是“ CMD ["/bin/bash"] ”,那么进入容器可以使用docker exec -it imageName或docker exec -it imageName /bin/bash,后者是在“ CMD ["/bin/bash"] ”的指令下面多加了一个“ CMD ["/bin/bash"] ”,根据CMD的特性,存在多个时,只让最后一个CMD生效,因此不影响
ENTRYPOINT 可执行化
LABEL 用于为镜像添加元数据
ENV 设置环境变量
EXPOSE 指定于外界交互的端口
VOLUME 用于指定持久化目录
WORKDIR 工作目录
ARG 用于指定传递给构建运行时的变量
ONBUILD 用于设置镜像触发器
2.1 FROM
# 格式
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
# 例子
FROM mysql:5.6
2.2 MAINTAINER
# 格式
MAINTAINER <name>
# 例子
MAINTAINER xiehgz@foxmail.com
2.3 RUN
# 格式
RUN <command>
# 例子
RUN yum install -y mysql
2.4 ADD
# 格式
ADD <src>... <dest>
# 例子,添加 "name" 到 `WORKDIR`/dir/
ADD name Dir/
2.5 COPY
# 格式
COPY <src>... <dest>
# 例子
COPY name in /dir
2.6 CMD
# 格式
CMD ["executable","param1","param2"]
# 例子
CMD ["mysqld"]
2.7 ENTRYPOINT
# 格式
ENTRYPOINT ["executable", "param1", "param2"]
# 例子:让什么可执行化
ENTRYPOINT ["ls", "/usr/local"]
2.8 LABEL
# 格式
LABEL <key>=<value> <key>=<value> ...
# 例子
LABEL version="1.0"
2.9 ENV
# 格式
ENV <key> <value>
ENV <key>=<value> ...
# 例子
ENV name guazi
ENV name=guazi
2.10 EXPOSE
# 格式
EXPOSE <port> [<port>...]
# 例子
EXPOSE 3306
2.11 VOLUME
# 格式
VOLUME ["/path"]
# 例子
VOLUME ["/mydata"]
2.12 WORKDIR
# 格式
WORKDIR /path
# 例子
WORKDIR /mydata
2.13 ARG
# 格式
ARG <name>[=<default value>]
# 例子,外部传入一参数testparm,默认值为1
ARG testparm=1
2.14 ONBUILD
# 格式
ONBUILD [INSTRUCTION]
# 例子
ONBUILD ADD . /app/src

3.制作镜像

以自定义一个centos镜像为例,在官方镜像的基础上添加vim和net-tools工具

  • 首先创建dockerfile:
[root@localhost dockerfile]# cat Dockerfile 
FROM centos:7
MAINTAINER xiehgz
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim   net-tools
EXPOSE 80
CMD /bin/bash
  • 构建镜像:
[root@localhost dockerfile]# docker build -t mycentos:3.0 . 
Sending build context to Docker daemon  2.048kB
Step 1/7 : FROM centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
 ---> eeb6ee3f44bd
Step 2/7 : MAINTAINER xiehgz
 ---> Running in a43782764a07
Removing intermediate container a43782764a07
 ---> ba42beb587ed
Step 3/7 : ENV MYPATH /usr/local
 ---> Running in 9a7b0fab77b6
    ...........                             
  vim-filesystem.x86_64 2:7.4.629-8.el7_9                                       
  which.x86_64 0:2.20-7.el7                                                     
Complete!
  • 查看镜像:
[root@localhost dockerfile]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED              SIZE
mycentos            3.0       b2d59a130341   About a minute ago   453MB
  • 检验是否正常启动:
[root@localhost dockerfile]# docker run -it mycentos:3.0
[root@0b8baab6a633 local]#
  • 构建成功


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
10月前
|
SQL
南大通用GBase 8a配置gcware日志等级,减少日志输出,节省磁盘IO
南大通用GBase 8a配置gcware日志等级,减少日志输出,节省磁盘IO
|
机器学习/深度学习 人工智能 算法
探索深度学习在图像识别中的应用
【2月更文挑战第29天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域前进的关键力量。本文旨在探讨深度学习技术在图像识别任务中的应用及其带来的变革。我们将从卷积神经网络(CNN)的基础结构出发,分析其在图像处理中的优势,并深入讨论几种改进的深度学习模型,如循环神经网络(RNN)和生成对抗网络(GAN)。此外,本文还将评估深度学习在解决实际问题时面临的挑战,以及未来研究的可能方向。
|
数据库
GitLab数据库引起的502错误问题及解决方案
GitLab数据库引起的502错误问题及解决方案
801 1
|
SQL 关系型数据库 MySQL
MySQL kill会话不起作用?
MySQL kill会话不起作用?
331 1
|
SQL 缓存 监控
一文带你了解MySQL之Change Buffer
上一篇文章一文带你了解MySQL数据库InnoDB_Buffer_Pool(点击跳转)我们学习了InnoDB Buffer Pool的工作原理,其作用是减少MySQL读取数据时直接与磁盘打交道的次数。那么写入数据时MySQL是否做了减少IO的优化呢?答案是肯定的,就要我们深入的学习Change Buffer。
611 0
一文带你了解MySQL之Change Buffer
|
图形学
cocos creator DragonBones 源码阅读
cocos creator DragonBones 源码阅读
143 0
|
SQL 缓存 关系型数据库
故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
409 0
|
存储 SQL 关系型数据库
图文结合带你搞懂MySQL日志之General Query Log(通用查询日志)
图文结合带你搞懂MySQL日志之General Query Log(通用查询日志)
1342 0
|
SQL 监控 MySQL
RDS for MySQL 大表操作
RDS for MySQL 大表操作
7485 57
|
SQL 数据采集 消息中间件
Flink CDC使用(数据采集CDC方案比较)
cdc 使用场景 场景cdc方案对比 flink cdc 的基本使用
17568 2
Flink CDC使用(数据采集CDC方案比较)