Dockerfile與docker-compose容器編排(Docker系列第3章,共3章)

来源:https://www.cnblogs.com/phpphp/p/18135045
-Advertisement-
Play Games

溫馨提示 不同的組件需要不同的docker配置(例如容器捲,埠,環境變數等),使用你懂得工具看hub.docker.com官方手冊。 不要死記硬背,因為這種東西不是天天要寫,過段時間就忘了,很容易引起挫敗感。 Dockerfile或者Docker-compose的編寫,可以安裝一些編輯器插件輔助編 ...


溫馨提示

  • 不同的組件需要不同的docker配置(例如容器捲,埠,環境變數等),使用你懂得工具看hub.docker.com官方手冊。
  • 不要死記硬背,因為這種東西不是天天要寫,過段時間就忘了,很容易引起挫敗感。
  • Dockerfile或者Docker-compose的編寫,可以安裝一些編輯器插件輔助編寫。
  • 非官方中文文檔鏡像地址:https://dockerdocs.cn

Dockerfile

  • 官方文檔:https://docs.docker.com/reference/dockerfile/#dockerfile-reference
  • 極簡概括:用於構建Docker鏡像的文本文件,包含一些指令,用於描述如何構建和配置容器,類比Linux的sh文件。
  • 適用場景:能夠使用docker的地方,並且需要複雜的構建,都可以用Dockerfile。
  • 優點:
    • 降低部署成本:使用Dockerfile可以將應用程式、運行時環境和依賴項打包到一個容器鏡像中,使得容器部署簡單化。
    • 方便版本控制:Dockerfile是文本文件,可以與應用程式的源代碼一起進行版本控制。
    • 自動化構建: Dockerfile可以與持續集成和持續交付 (CI/CD) 流程集成,實現自動化構建、測試和部署。
    • 靈活定製: Dockerfile允許DevOps自定義鏡像的構建過程,可以根據具體的需求添加、刪除或修改指令,實現靈活的定製。
  • 缺點:
    • 學習成本:Dockerfile有自己的語法,需要額外學習。

編寫規則

  • 每條保留字(內置關鍵字)指令都必須為大寫字母,後面至少跟隨一個參數值。
  • 表示註釋

  • 每條指令都會創建一個新的鏡像層並對鏡像進行提交,(docker會執行類似docker commit的操作,提交一個新的鏡像層,然後並運行為一個新的容器,反覆以上迴圈,直到所有命令執行完成)。
  • Dockerfile,D一定要大寫。
  • 同一個保留字可使用多次。

保留字說明

  • FROM: 指定基礎鏡像,用於構建當前鏡像的基礎。例如 FROM ubuntu:latest 表示基於 Ubuntu 鏡像構建,第一個指令必須是它。
  • MAINTAINER (已廢棄): 用於指定維護者信息,一般是郵件,但已在 Docker 1.13 版本中廢棄,建議使用 LABEL 指令來代替。
  • LABEL: 添加元數據到鏡像,通常用於指定鏡像的描述信息、版本號、維護者等。
  • RUN: 在鏡像構建過程(docker build的時機)中執行命令,用於安裝軟體包、設置環境變數等,有兩種運行方式,一種是shell原生風格,一種是exec風格(RUN ["參數1", "參數2", "參數3"])。
  • CMD: 指定容器啟動後(docker run的時機)立即要執行的預設命令。如果 Dockerfile 中存在多個 CMD 指令,只有最後一個 CMD 會生效,支持shell和exec(這是防止空格產生的歧義)風格的指令,在命令行情況下,docker run命令,若與CMD執行的有衝突,則docker run會覆蓋CMD中的指令。
  • EXPOSE: 聲明容器運行時監聽的埠,但並不映射到宿主機埠,就是個擺設。
  • ENV: 設置環境變數,可以在後續的指令中使用。例如 ENV key val,使用$KEY進行引用。也可以寫成key=val。
  • ADD: 將文件、目錄、URL 等資源複製到容器中。與 COPY 類似,但 ADD 具有解壓功能,可以自動解壓壓縮文件。語法:add 宿主機路徑 容器路徑
  • COPY: 將本地文件複製到容器中。建議在只需要複製文件而不需要額外處理的情況下使用。
  • ENTRYPOINT: 類似CMD,但與CMD不同的是,指定的命令不會被 Dockerfile 後續的參數覆蓋,而是作為參數的執行。當ENTRYPOINT遇見CMD時,CMD的含義就發生了變化,CMD變成了作為ENTRYPOINT的參數值,也就是說ENTRYPOINT為key,CMD為val,在命令行情況下,想要覆蓋原本的ENTRYPOINT,需要在命令行添加--entrypoint=原entrypoint 覆蓋命令。
  • VOLUME: 容器捲,垃圾玩意配置了死活不生效。
  • USER: 指定運行容器時使用的用戶名,預設是root。
  • WORKDIR: 登錄進容器後,預設進入的目錄,如果下方有COPY、ADD、RUN、CMD、ENTRYPOINT指令,並且參數寫的是相對路徑,那麼WORKDIR參數會影響他們的參考系。
  • ARG: 定義構建參數,用於在構建時傳遞變數。在構建時通過 --build-arg 參數傳遞。
  • ONBUILD: 定義觸發器指令,用於在構建派生鏡像時觸發一些操作。
  • STOPSIGNAL: 指定容器停止時發送的信號,預設為SIGTERM。

運行Dockerfile

在Dockerfile所在的目錄,執行(最後有個空格和點):
docker build -t 鏡像名:tag .

Dockerfile簡單實操

假設需要在新的centos上安裝ifconfig和vim,啟動容器後,進入根目錄,並添加/test:/test的容器數據捲(Dockerfile添加不生效,試了20次+)

編輯一個Dockerfile
vim /test/Dockfile


FROM centos:latest
LABEL maintainer="[email protected]"

ENV test_dir /test

#2021 年 12 月 31 日停止更新並停止維護,需要將鏡像從 mirror.centos.org 更改為 vault.centos.org
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#yum clean all 是為了節省空間
RUN yum makecache && yum -y install net-tools &&  yum -y install vim && yum clean all

WORKDIR $test_dir
RUN echo ----------Success------------
# 選擇預設的shell為bash shell
CMD ["/bin/bash"]


保存退出後,運行Dockerfile
cd /test
docker build -t zs_centos:0.0.1 .

然後運行容器,並添加容器捲
docker run -it -v /test:/test --privileged=true 7611bfc76047 /bin/bash

docker-compose

  • 官方文檔:https://docs.docker.com/compose/reference
  • 極簡概括:使用一個docker-compose.yml文件來配置多個容器的啟動關閉和載入順序,實現集群化統一管理的docker官方工具。
  • 適用場景:多容器部署。對於小公司或個人幾乎用不到,10個任意規模的公司,用docker的有3個,用容器編排可能就1個,並不是所有的公司都有分散式、微服務、或集群。
  • 兩個重要概念:
    • 項目:項目是Docker Compose管理的一個單元,它由一個或多個服務組成,一個docker-compose.yml管理一個項目。
    • 服務:一個或多個容器組成一個服務,服務是個模糊的概念,可以理解為一個或多個容器對外提供一種解決方案。
    • 輔助記憶:一個docker-compose.yml管一個項目,一個項目管多個服務,一個服務管單個或多個容器。
  • 優點:
    • 簡化多容器部署流程。
    • 對多個容器實現統一管理。
  • 缺點:
    • 學習成本大:DockerCompose有自己的語法,增加學習成本,可以照著官方文檔的docker run命令去實現。
    • 局限性:大規模複雜化的部署,可能需要更複雜的編排工具,或者更加精細化個性化的配置,這需要更複雜的編排計劃。
    • 不支持跨主機:對於需要跨多個主機進行部署和管理的場景,可能需要使用其它容器編排工具,如 Kubernetes(K8S)。
  • 安裝:
curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose --version

docker-compose.yml保留字

https://docs.docker.com/compose/compose-file/compose-file-v3/

  • version:定義Docker Compose文件的版本。例如,version: '3'表示使用Docker Compose的第3個版本。
  • services:定義各種服務的配置。每個服務可以包括鏡像、埠映射、環境變數等信息。
  • networks:定義網路配置,包括網路驅動、IP範圍等,相當於docker run --network
  • volumes:定義存儲捲的配置,用於持久化數據。
  • build:參數跟路徑,用於構建鏡像,可以指定Dockerfile的路徑去構建鏡像。
  • image:指定使用的鏡像名稱。
  • ports:定義埠映射,將容器內部的埠映射到宿主機上。
  • environment:設置容器的環境變數,相當於docker run -e。
  • depends_on:參數值為依賴的服務名,定義服務之間的依賴關係,確保一個服務在另一個服務啟動之後再啟動,但不會等待前面的服務完全啟動就緒後在啟動。
  • volumes_from:從其他服務或容器掛載存儲捲。
  • links:鏈接到其他服務。
  • restart:定義容器跟隨docker引擎的重啟,相當於docker run --restart=always
  • network_mode:指定容器使用的網路模式。
  • ports:定義容器埠映射。
  • external_links:鏈接到外部容器。
  • command:覆蓋容器啟動後預設執行的命令。
  • entrypoint:覆蓋容器的預設入口點。
  • env_file:從文件載入環境變數,通過env文件來替代environment,env文件更加私密,防止信息泄露。
  • expose:暴露埠,不進行埠映射,只是標示容器監聽的埠。
  • labels:為容器設置元數據。
  • logging:配置日誌記錄選項。
  • container_name:指定容器的名稱,相當於docker run --name
  • devices:允許容器使用宿主機的設備。
  • dns:自定義DNS伺服器。
  • dns_search:DNS搜索功能變數名稱配置。
  • tmpfs:掛載臨時文件系統。
  • cap_add, cap_drop:添加或刪除容器的內核能力。
  • security_opt:自定義容器的安全選項。
  • user:指定容器內的命令以何種用戶身份運行。
  • working_dir:設置容器內的工作目錄。
  • domainname:容器的功能變數名稱。
  • hostname:容器的主機名。
  • ipc:設置容器的IPC模式。
  • mac_address:為容器指定MAC地址。
  • privileged:指定容器是否在特權模式下運行。
  • read_only:設置容器的文件系統為只讀。
  • shm_size:設置共用記憶體大小。
  • stdin_open, tty:保持標準輸入開放,並分配一個偽終端。
  • extends:繼承另一個服務的配置。
  • external:聲明外部資源,如網路或捲。
  • extra_hosts:添加額外的 hosts 條目到容器的 /etc/hosts 文件中。
  • healthcheck:定義容器的健康檢查配置。
  • isolation:指定容器的隔離技術。
  • logging:配置單個服務的日誌記錄選項。
  • network_mode:指定容器使用的網路模式。
  • pid:指定容器的PID模式。
  • platform:指定在哪個平臺上運行容器。
  • ports:定義埠映射,將容器內部的埠映射到宿主機上。
  • secrets:從 Docker Swarm 中的 secret 中註入密鑰。
  • stop_grace_period:指定停止容器前的等待時間。
  • sysctls:自定義容器的內核參數。
  • ulimits:設置容器的資源限制。
  • volume_driver:指定使用的捲驅動程式。
  • stop_signal:指定停止容器時發送的信號。
  • tty:分配一個偽終端。
  • restart:定義容器重啟策略。
  • scale:指定服務的副本數量。
  • deploy:在 Docker Swarm 中定義部署選項。
  • configs:從 Docker Swarm 中的 config 中註入配置文件。

docker-compose 常用操作命令

#docker-compose xxx 後面跟參數的,一般是伺服器id,或者其它內置指令。
docker-compose -h                   # 查看幫助
docker-compose up                   #啟動所有docker-compose服務
docker-compose up-d                 #啟動所有docker-compose服務並後臺運行
docker-compose up 服務名            #啟動指定docker-compose服務
docker-compose down                 #停止並刪除容器、網路、捲、鏡像。
docker-compose exec yml裡面的服務id  #進入容器實例內部 docker-compose exec docker-compose.yml文件中寫的服務id/bin/bash
docker-compose ps                   #展示當前docker-compose編排過的運行的所有容器
docker-compose top                  #展示當前docker-compose編排過的容器進程
docker-compose logs 服務id          #查看容器輸出日誌 -f為動態實時輸出
docker-compose config               #檢查配置
docker-compose config -q            #檢查配置,有問題才有輸出
docker-compose restart              #重啟服務
docker-compose start                #啟動服務
docker-compose stop                 #停止服務
docker-compose pause 服務id         #暫停狀態中的服務
docker-compose unpause 服務id       #恢復處於暫停狀態中的服務

docker-compose.yml簡單實操

記得把中文註釋去了。

//docker-compose版本號,這個和docker引擎版本關聯,https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-and-docker-compatibility-matrix
version: "3.8"
//定義多個服務
services:
	//服務起個名
	zs_nginx:
		//鏡像
		image: nginx:latest
		//相當於docker run -p參數
		ports:
		- "80:80"
		//容器捲
		volumes:
      - /test:/usr/share/nginx/html
	//服務起個名
	zs_mysql:
		//鏡像
		image: mysql:latest
		//相當於docker run -p參數
		ports:
		- "3306:3306"
		//環境變數,相當於docker run -e
		environment:
		//或者寫成MYSQL_ROOT_PASSWORD:ROOT
		- "MYSQL_ROOT_PASSWORD=root"

保存並退出

docker-compose up -d

docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
65b8ea2596c9   mysql:latest   "docker-entrypoint.s…"   5 seconds ago   Up 4 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   test-zs_mysql-1
8de18d446714   nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp                      test-zs_nginx-1

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

-Advertisement-
Play Games
更多相關文章
  • 概述:WPF界面綁定和渲染大量數據可能導致性能問題。通過啟用UI虛擬化、非同步載入和數據分頁,可以有效提高界面響應性能。以下是簡單示例演示這些優化方法。 在WPF中,當你嘗試綁定和渲染大量的數據項時,性能問題可能出現。以下是一些可能導致性能慢的原因以及優化方法: UI 虛擬化: WPF提供了虛擬化技術 ...
  • 1.Linux上安裝Docken 伺服器系統版本以及內核版本:cat /etc/redhat-release 查看伺服器內核版本:uname -r 安裝依賴包:yum install -y yum-utils device-mapper-persistent-data lvm2 設置阿裡雲鏡像源:y ...
  • 概述:通過使用`SemaphoreSlim`,可以簡單而有效地限制非同步HTTP請求的併發量,確保在任何給定時間內不超過20個網頁同時下載。`ParallelOptions`不適用於非同步操作,但可考慮使用`Parallel.ForEach`,儘管在非同步場景中謹慎使用。 對於併發非同步 I/O 操作的數量 ...
  • 隨著Aspire發佈preview5的發佈,Microsoft.Extensions.ServiceDiscovery隨之更新, 服務註冊發現這個屬於老掉牙的話題解決什麼問題就不贅述了,這裡主要講講Microsoft.Extensions.ServiceDiscovery(preview5)以及如何 ...
  • 一、工程簡介 MultiButton 是一個小巧簡單易用的事件驅動型按鍵驅動模塊。 Github地址:https://github.com/0x1abin/MultiButton 這個項目非常精簡,只有兩個文件: (1)可無限擴展按鍵; (2)按鍵事件的回調非同步處理方式可以簡化程式結構,去除冗餘的按 ...
  • 課程簡介 課程目標 理解操作系統的設計和實現 通過 XV6 操作系統動手實驗,可以擴展或改進操作系統 操作系統的目標 Abstraction:對硬體進行抽象 Multiplex:在多個應用程式之間共用硬體資源 Isolation:隔離性,程式出現故障時,不同程式之間不能相互干擾 Sharing:實現 ...
  • 哈嘍大家好,我是鹹魚。 說到 Linux 定時任務,大家用得最多的就是 crond 服務,但其實 systemd 也有類似的功能。我們不但可以通過 systemd 來管理服務,還能設置定時任務,那就是 systemd timer。 與 crond 相比,systemd 定時任務具有以下優點: 更高的 ...
  • 這幾天系統更新,顯卡驅動由525.147.05升級到了535.171.04(tested),終端運行watch -n 1 nvidia-smi 實時顯示顯卡占用情況時,偶爾出現 Failed to initialize NVML: Driver/library version mismatch 問題 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...