翼度科技»论坛 编程开发 mysql 查看内容

一文简单了解并构建DockerFile

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12

  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者:  蟹黄瓜子
  • 文章来源:GreatSQL社区投稿
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
那么今天要介绍的DockerFile是什么呢?简单来说DockerFile用来描述Docker镜像的文件,而且是类似源码的描述。
假设现有一台机器,docker容器中有镜像如下:
  1. [root@localhost ~]# docker images
  2. REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
  3. redis               latest    7614ae9453d1   12 months ago   113MB
  4. mysql               5.7       c20987f18b13   12 months ago   448MB
  5. mysql               8.0       3218b38490ce   12 months ago   516MB
  6. greatsql/greatsql   latest    2390016ed67a   16 months ago   550MB
  7. consul              1.9.4     28efe5fcc049   21 months ago   120MB
复制代码
我们可以简单看看greatsql/greatsql:latest的dockerfile:
  1. [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
  2. ADD file:bd7a2aed6ede423b719ceb2f723e4ecdfa662b28639c8429731c878e86fb138b in /
  3. 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
  4. CMD ["/bin/bash"]
  5. MAINTAINER greatsql@greatdb.com
  6. ENV LANG=en_US.utf8
  7. ENV MYSQL_DATA_DIR=/data/GreatSQL
  8. ENV MYSQL_USER=mysql
  9. ENV MYSQL_UID_GID=3306
  10. ENV MYSQL_EXTRACT_DIR=/usr/local
  11. ENV TMP_DIR=/tmp
  12. ENV MYSQL_PORT=3306
  13. ENV GREATSQL=GreatSQL-8.0.25-15-Linux-glibc2.28-x86_64-minimal
  14. ENV MYSQL_BASEDIR=/usr/local/GreatSQL-8.0.25-15-Linux-glibc2.28-x86_64-minimal
  15. ENV DEP_LIBS=numactl-libs libaio readline-devel ncurses-devel
  16. ENV JEMALLOC_RPM=jemalloc-3.6.0-1.el8.x86_64.rpm
  17. ENV GREATSQL_INIT=greatsql-init.sh
  18. 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}
  19. COPY dir:39057b483c2d76e9f0001cb84ed6603761599e330b2e714a6ee5941a4332cd97 in /usr/local/GreatSQL-8.0.25-15-Linux-glibc2.28-x86_64-minimal
  20. COPY file:fe881a5e38a8821b0a03018241b9e51c6f815bd0733a73b8ff95c0cb23e53df9 in /tmp
  21. RUN yum install -y ${TMP_DIR}/${JEMALLOC_RPM}
  22. RUN yum install -y ${DEP_LIBS}
  23. 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
  24. RUN PATH="\$PATH:${MYSQL_BASEDIR}/bin"
  25. RUN export PATH
  26. 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
  27. RUN rm -f ${TMP_DIR}/${JEMALLOC_RPM}
  28. COPY file:246cf23778cd1862e366d7b64f51aaf616c480874560e8f1ed0992ba7f6e4273 in /docker-entrypoint.sh
  29. ENTRYPOINT ["/docker-entrypoint.sh"]
  30. EXPOSE 3306 33060 33061
  31. CMD ["mysqld"]
复制代码
1.Dockerfile介绍

官方网站:https://hub.docker.com/
现在我们简单介绍一下dockerfile:
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。dockerfile 用于指示 docker image build 命令自动构建Image的源代码
  1. # 对该目录下的dockerfile进行镜像的构建
  2. 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
  1. # 格式
  2. FROM <image>
  3. FROM <image>:<tag>
  4. FROM <image>@<digest>
  5. # 例子
  6. FROM mysql:5.6
复制代码
2.2 MAINTAINER
  1. # 格式
  2. MAINTAINER <name>
  3. # 例子
  4. MAINTAINER xiehgz@foxmail.com
复制代码
2.3 RUN
  1. # 格式
  2. RUN <command>
  3. # 例子
  4. RUN yum install -y mysql
复制代码
2.4 ADD
  1. # 格式
  2. ADD <src>... <dest>
  3. # 例子,添加 "name" 到 `WORKDIR`/dir/
  4. ADD name Dir/
复制代码
2.5 COPY
  1. # 格式
  2. COPY <src>... <dest>
  3. # 例子
  4. COPY name in /dir
复制代码
2.6 CMD
  1. # 格式
  2. CMD ["executable","param1","param2"]
  3. # 例子
  4. CMD ["mysqld"]
复制代码
2.7 ENTRYPOINT
  1. # 格式
  2. ENTRYPOINT ["executable", "param1", "param2"]
  3. # 例子:让什么可执行化
  4. ENTRYPOINT ["ls", "/usr/local"]
复制代码
2.8 LABEL
  1. # 格式
  2. LABEL <key>=<value> <key>=<value> ...
  3. # 例子
  4. LABEL version="1.0"
复制代码
2.9 ENV
  1. # 格式
  2. ENV <key> <value>
  3. ENV <key>=<value> ...
  4. # 例子
  5. ENV name guazi
  6. ENV name=guazi
复制代码
2.10 EXPOSE
  1. # 格式
  2. EXPOSE <port> [<port>...]
  3. # 例子
  4. EXPOSE 3306
复制代码
2.11 VOLUME
  1. # 格式
  2. VOLUME ["/path"]
  3. # 例子
  4. VOLUME ["/mydata"]
复制代码
2.12 WORKDIR
  1. # 格式
  2. WORKDIR /path
  3. # 例子
  4. WORKDIR /mydata
复制代码
2.13 ARG
  1. # 格式
  2. ARG <name>[=<default value>]
  3. # 例子,外部传入一参数testparm,默认值为1
  4. ARG testparm=1
复制代码
2.14 ONBUILD
  1. # 格式
  2. ONBUILD [INSTRUCTION]
  3. # 例子
  4. ONBUILD ADD . /app/src
复制代码
3.制作镜像

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

  • 首先创建dockerfile:
  1. [root@localhost dockerfile]# cat Dockerfile
  2. FROM centos:7
  3. MAINTAINER xiehgz
  4. ENV MYPATH /usr/local
  5. WORKDIR $MYPATH
  6. RUN yum -y install vim   net-tools
  7. EXPOSE 80
  8. CMD /bin/bash
复制代码

  • 构建镜像:
  1. [root@localhost dockerfile]# docker build -t mycentos:3.0 .
  2. Sending build context to Docker daemon  2.048kB
  3. Step 1/7 : FROM centos:7
  4. 7: Pulling from library/centos
  5. 2d473b07cdd5: Pull complete
  6. Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
  7. Status: Downloaded newer image for centos:7
  8. ---> eeb6ee3f44bd
  9. Step 2/7 : MAINTAINER xiehgz
  10. ---> Running in a43782764a07
  11. Removing intermediate container a43782764a07
  12. ---> ba42beb587ed
  13. Step 3/7 : ENV MYPATH /usr/local
  14. ---> Running in 9a7b0fab77b6
  15.     ...........                             
  16.   vim-filesystem.x86_64 2:7.4.629-8.el7_9                                       
  17.   which.x86_64 0:2.20-7.el7                                                     
  18. Complete!
复制代码

  • 查看镜像:
  1. [root@localhost dockerfile]# docker images
  2. REPOSITORY          TAG       IMAGE ID       CREATED              SIZE
  3. mycentos            3.0       b2d59a130341   About a minute ago   453MB
复制代码

  • 检验是否正常启动:
  1. [root@localhost dockerfile]# docker run -it mycentos:3.0
  2. [root@0b8baab6a633 local]#
复制代码

  • 构建成功
最后,也可以测试阅读GreatSQL官方的dockerfile:https://gitee.com/GreatSQL/GreatSQL-Docker/blob/master/GreatSQL/Dockerfile,这里就不展开了。

Enjoy GreatSQL
来源:https://www.cnblogs.com/greatsql/p/17247927.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具