一文簡單瞭解並構建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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...