一文簡單瞭解並構建DockerFile

来源:https://www.cnblogs.com/greatsql/archive/2023/03/23/17247927.html
-Advertisement-
Play Games

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介紹

官方網站: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 [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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .NET Core WebApi介面ip限流實踐 前言 之前一直想實現介面限流,但一直沒去實現,然後剛好看到一篇文章是基於AspNetCoreRateLimit 組件的限流策略。這個組件不做多的介紹,想瞭解詳情可以去訪問官方網址或者原文地址,地址在文章底部,本文只講實現。 實現介面限流步驟 導包 第 ...
  • 當前的Winform分頁控制項中,當前導出的數據一般使用Excel來處理,Excel的文檔可以用於後期的數據展示或者批量導入做準備,因此是比較好的輸入輸出格式。但是有框架的使用客戶希望分頁控制項能夠直接導出PDF,雖然Excel也可以直接轉換為PDF,不過直接導出PDF的處理肯定更加方便直觀。因此整理了... ...
  • 1. 核心關註點 1.1. 開發軟體的原因 2. 切麵關註點 2.1. 所有的代碼領域都需要處理相關的問題 3. 結構化模式 3.1. 裝飾器模式 3.1.1. 可以在現有對象上添加新的功能,而不改變其結構 3.2. 代理模式 3.2.1. 所提供的對象可以替代客戶端使用的實際服務對象 4. 使用P ...
  • 使用lvs+keepalived架構架構實現後端web伺服器(該web伺服器要求搭建wordpress博客站)的負載均衡 最終客戶端訪問功能變數名稱 我的名字.wordpress.cn 能夠訪問搭建的博客站 ,達到負載均衡的目的 IP 主機名 角色 192.168.26.101 rs1 後端真實伺服器/ng ...
  • 操作系統: RHEL7.x 或CentOS 7.x 最小化安裝 配置好固定的IP,能訪問互聯網 配置好yum源(yum repolist 可以查看yum源) 本地光碟 掛載光碟,開機自動掛載 vim + /etc/fstable /dev/sr0 /mnt iso9660 defaults 0 0 ...
  • 一:存儲架構 根據存儲設備所在的位置分類 1、DAS DAS:(Direct-Attached Storage)直連式存儲。伺服器使用專用線纜(例如SCSI)和存儲設備(例如磁碟陣列)進行直連。 特點: 優點是儲設備只能連接到一臺主機使用,無法共用,成本較高,且安全性可靠性較低 缺點是容量有限,不適 ...
  • 一、線程簡介 線程是參與系統調度的最小單位。它被包含在進程之中,是進程中的實際運行單位。 一個進程中可以創建多個線程,多個線程實現併發運行,每個線程執行不同的任務。 每個線程都有其對應的標識,稱為線程 ID,線程 ID 使用 pthread_t 數據類型來表示。 二、線程的創建 線程是輕量級的併發執 ...
  • MySQL基礎:事務 事務簡介 事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。 預設MySQL的事務是自動提交的,也就是說,當執行一條DML(數據操作語言:對資料庫進行增刪改操作)語句,MySQL會 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...