溫馨提示
- 不同的元件需要不同的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="zs@163.com"
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