GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 蟹黃瓜子 文章來源:GreatSQL社區投稿 Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可抑制的容器中,然 ...
- GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
- GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。
- 作者: 蟹黃瓜子
- 文章來源:GreatSQL社區投稿
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 [email protected]
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介紹
現在我們簡單介紹一下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 [email protected]
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]#
- 構建成功
最後,也可以測試閱讀GreatSQL官方的dockerfile:https://gitee.com/GreatSQL/GreatSQL-Docker/blob/master/GreatSQL/Dockerfile,這裡就不展開了。
Enjoy GreatSQL