- GreatSQL社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。
- GreatSQL是MySQL的国产分支版本,应用上与MySQL统一。
- 作者: 蟹黄瓜子
- 文章起源:GreatSQL社区投稿
Docker是一个开源的利用容器引擎,让开发者能够打包他们的利用以及依赖包到一个可抑制的容器中,而后公布到任何风行的Linux机器上,也能够实现虚拟化。
那么明天要介绍的DockerFile是什么呢?简略来说DockerFile用来形容Docker镜像的文件,而且是相似源码的形容。
假如现有一台机器,docker容器中有镜像如下:
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEredis latest 7614ae9453d1 12 months ago 113MBmysql 5.7 c20987f18b13 12 months ago 448MBmysql 8.0 3218b38490ce 12 months ago 516MBgreatsql/greatsql latest 2390016ed67a 16 months ago 550MBconsul 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" | tacADD 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.shRUN 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.shRUN PATH="\$PATH:${MYSQL_BASEDIR}/bin"RUN export PATHRUN 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.cnfRUN 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 guaziENV 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,默认值为1ARG testparm=1
2.14 ONBUILD
# 格局ONBUILD [INSTRUCTION]# 例子ONBUILD ADD . /app/src
3.制作镜像
以自定义一个centos镜像为例,在官网镜像的根底上增加vim和net-tools工具
- 首先创立dockerfile:
[root@localhost dockerfile]# cat Dockerfile FROM centos:7MAINTAINER xiehgzENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vim net-toolsEXPOSE 80CMD /bin/bash
- 构建镜像:
[root@localhost dockerfile]# docker build -t mycentos:3.0 . Sending build context to Docker daemon 2.048kBStep 1/7 : FROM centos:77: Pulling from library/centos2d473b07cdd5: Pull complete Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987Status: Downloaded newer image for centos:7 ---> eeb6ee3f44bdStep 2/7 : MAINTAINER xiehgz ---> Running in a43782764a07Removing intermediate container a43782764a07 ---> ba42beb587edStep 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 imagesREPOSITORY TAG IMAGE ID CREATED SIZEmycentos 3.0 b2d59a130341 About a minute ago 453MB
- 测验是否失常启动:
[root@localhost dockerfile]# docker run -it mycentos:3.0[root@0b8baab6a633 local]#
- 构建胜利
最初,也能够测试浏览GreatSQL官网的dockerfile:https://gitee.com/GreatSQL/GreatSQL-Docker/blob/master/GreatS...,这里就不开展了。
Enjoy GreatSQL :)
## 对于 GreatSQL
GreatSQL是由万里数据库保护的MySQL分支,专一于晋升MGR可靠性及性能,反对InnoDB并行查问个性,是实用于金融级利用的MySQL分支版本。
相干链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html
技术交换群:
微信:扫码增加GreatSQL社区助手
微信好友,发送验证信息加群
。