文章目錄
- 前言
- 引入
- docker 簡介
- docker的應用場景
- docker的虛擬化技術VS虛擬機
- docker的優點
- docker架構
- Docker倉庫
- Docker鏡像
- linux操作系統的大致組成部分
- Docker容器
- docker安裝與啟動
- 校驗版本
- 移除舊的版本
- 安裝依賴工具
- 設置軟件源
- 安裝docker
- 驗證
- 配置鏡像加速器
- docker服務相關命令
- docker鏡像相關命令
- docker容器相關命令
- 數據卷
- 數據卷配置
- 數據卷容器
- docker應用部署
- mysql部署
- tomcat
- 制作鏡像
- dockerfile 制作鏡像
- dockerfile 常用命令
- 通過dockerfile制作鏡像
- docker compose
- 安裝
- 示例
- docker 私有倉庫(未完成)
- docker swarm集群搭建(未完成)
- 參考目錄
前言
閱讀本文前請注意最后編輯時間,文章內容可能與目前最新的技術發展情況相去甚遠。歡迎各位評論與私信,指出錯誤或是進行交流等。
引入
問題1:
某IT部門要上線一個項目。常規操作,直接去線上服務器,拷貝一個tomcat,然后改端口號,然后部署應用到webapps文件
夾下,重啟就好。
一個服務器上可能會部署多個應用服務。如果某個應用出現問題,CPU占用達到100%,可能這個服務器上的其他應用也會出現問題。
對于一個大型應用拆分為幾十個微服務,分別交由不同的團隊開發,不同團隊之間水平參差不齊。如果還采用這種部署方式,
你的應用可能會因為另一個團隊的應用發生意外。因部署在了同一臺服務器上,導致全部出現問題。
問題2:
開發和線上代碼(同一套代碼)問題。開發階段部署一套軟件環境,測試人員在開發中測試沒有問題,運維進行部署。但是正
式部署到服務器時,發生了問題(啟動參數、環境問題、漏配了參數)等意外。
問題3:
隨著微服務技術的興起,一個大的應用需要拆分成多個微服務。多個微服務的生成,就會面臨龐大系統的部署效率,開發協同
效率問題。然后通過服務的拆分,數據的讀寫分離、分庫分表等方式重新架構,而且這種方式如果要做的徹底,需要花費大量人力
物力。可能需要部署很多個服務器。
問題4:
持續的軟件版本發布/測試項目。到線上環境的集成
以上問題可以由docker解決。
docker 簡介
Docker 是一個開源的應用容器引擎,可以讓開發者打包應用及其依賴到一個輕量級、可移植的容器中。
容器是一種標準化的軟件單元,可以在任何支持 Docker 的環境中快速部署和運行。容器性能開銷極低。
容器是完全使用沙箱機制,相互隔離。
docker的應用場景
- 應用的自動化打包和發布。
- 自動化測試和持續集成、發布。
- 微服務架構:每個微服務獨立打包成容器,靈活擴展
docker的虛擬化技術VS虛擬機
名詞解釋:
infrastructure(基礎服務)硬件
Host OS 主機操作系統
VM 虛擬機
Hypervisor 虛擬層程序
1.實現原理技術不同
虛擬機是用來進行硬件資源劃分的完美解決方案,利用的是硬件虛擬化技術,如VT-x、AMD-V會通
過一個hypervisor層來實現對資源的徹底隔離。
而容器則是操作系統級別的虛擬化,利用的是內核的Cgroup和Namespace特性,此功能通過軟件
來實現,僅僅是進程本身就可以實現互相隔離,不需要任何輔助。
2.使用資源方面不同
Docker容器與主機共享操作系統內核,不同的容器之間可以共享部分系統資源,因此更加輕量級,
消耗的資源更少。
虛擬機會獨占分配給自己的資源,不存在資源共享,各個虛擬機之間近乎完全隔離,會消耗更多的資源。
3.應用場景不同
若需要資源的完全隔離并且不考慮資源的消耗,可以使用虛擬機。
若是想隔離進程并且需要運行大量進程實例,應該選擇Docker容器。
特性 | 容器 | 虛擬機 |
---|---|---|
啟動速度 | 秒級 | 分鐘級 |
硬盤使用 | 一般為MB | 一般為GB |
性能 | 接近原生 | 弱于原生 |
系統支持量 | 單機一般支持上千個容器 | 單機一般支持幾十個虛擬機 |
docker的優點
- Docker能夠自動執行重復性任務,例如搭建和配置開發環境,從而解放了開發人員以便他們專注在真正重要的
事情上:構建杰出的軟件。 - 用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、復制、分享、修改,就
像管理普通的代碼一樣。 - Docker的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現“這段代碼在
我機器上沒問題啊”這類問題; - 可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。–更快速的啟動時間
- 避免公用的服務器,資源會容易受到其他用戶的影響。–隔離性
- 善于處理集中爆發的服務器使用壓力;–彈性伸縮,快速擴展
- 可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環境的變化導致應用無法正
常運行的情況。–遷移方便 - 用Docker可以通過定制應用鏡像來實現持續集成、持續交付、部署。-持續交付和部署
docker架構
Docker使用客戶端-服務器(C/S)架構模式,使用遠程API來管理和創建Docker容器。
組件 | 說明 |
---|---|
Docker Machine | 是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker |
Docker客戶端(Client) | Docker客戶端通過命令行或者其他工具使用DockerAPI與Docker的守護進程(daemon)通信。 |
Docker主機(Host) | 一個物理或者虛擬的機器用于執行Docker守護進程和容器。 |
Docker鏡像(Images) | Docker鏡像是用于創建Docker容器的模板。 |
Docker容器(Container) | 容器是獨立運行的一個或一組應用。 |
Docker倉庫(Registry) | Docker倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。DockerHub提供了龐大的鏡像集合供用戶使用。 |
Docker倉庫
是一個存儲鏡像的倉庫。通常被部署在互聯網服務器或者云端。
Docker Hub(https://hub.docker.com)提供了龐大的鏡像集合供使用。
Docker鏡像
Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些
為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也
不會被改變。
經觀察發現,
問題1:Docker中一個centos鏡像為什么只有200MB,而一個centos操作系統的iso文件要幾個G?
問題2:Docker中一個tomcat鏡像為什么有500MB,而一個tomcat安裝包只有70多MB?
在說明上述兩個問題之前,先了解一下linux操作系統的大致組成部分
linux操作系統的大致組成部分
操作系統組成部分:
- 進程調度子系統
- 進程通信子系統
- 內存管理子系統
- 設備管理子系統
- 文件管理子系統
- 網絡通信子系統
- 作業控制子系統
其中Linux文件系統由bootfs和rootfs兩部分組成
- bootfs:包含bootloader(引導加載程序)和kernel(內核)
- rootfs:root文件系統,包含的就是典型Linux系統中的/dev,/proc,/bin,/etc等標準目錄和文件
- 不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu、centos等
Docker鏡像是由特殊的文件系統疊加而成
- 最底端是bootfs,并使用宿主機的bootfs
- 第二層是root文件系統rootfs,稱為base image
- 然后再往上可以疊加其他的鏡像文件
- 統一文件系統(UnionFileSystem)技術能夠將不同的層整合成一個文件系統,為這些層提供了一個統一的視角
這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。 - 一個鏡像可以放在另一個鏡像的上面。位于下面的鏡像稱為父鏡像,最底部的鏡像成為基礎鏡像。
答問題1:Docker使用了宿主機中的bootfs,所以docker中的centos鏡像只需要下載對應的rootfs文件系統即可。而一個centos操作系統的iso文件是包含了bootfs和rootfs兩部分。
答問題2:Docker中一個tomcat鏡像將jdk和tomcat整合成一個文件,隱藏了多層的存在,在用戶的角度看來,只存在一個tomcat。tomcat安裝包僅有tomcat部分的文件。
iso鏡像包含操作系統完整的root文件系統,其體積往往是龐大的。因此在Docker設計時,就充分利用統一文件系統(UnionFileSystem)的技術,將其設計為分層存儲的架構。所以嚴格來說,鏡像并非是像一個ISO那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現并非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。
分層存儲的特征還使得鏡像的復用、定制變的更為容易。當從一個鏡像啟動容器時,docker會加載一個可讀寫文件系統作為容器。可以用之前構建好的鏡像作為基礎層,然后在此基礎上修改或進一步添加新的層,以定制自己所需的內容,構建新的鏡像。
Docker容器
Docker容器通過Docker鏡像來創建。容器與鏡像的關系類似于面向對象編程中的對象與類。鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的命名空間。因此容器可以擁有自己的root文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶ID空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立于宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因為這種隔離的特性,很多人初學Docker時常常會混淆容器和虛擬機。
前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而準備的存儲層為容器存儲層(也就是上文提到的可讀寫容器)。
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。
按照Docker最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用數據卷(Volume)、或者綁定宿主目錄。這樣讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存周期獨立于容器,容器消亡,數據卷不會消亡。因此,使用數據卷后,容器刪除或者重新運行之后,數據不會丟失。
docker安裝與啟動
docker命令參考大全:https://www.runoob.com/docker/docker-tutorial.html
docker官方文檔:https://docs.docker.com/
本文基于安裝了centos7的虛擬機進行介紹。
因此,安裝docker容器需要先配置好一臺centos虛擬機,并配置好網絡連接,以及掛載完iso鏡像文件。確保yum可以正常使用
目前,CentOS發行版本中的內核支持Docker。Docker運行在CentOS7上,要求系統為64位、系統內核版本為3.10以上。
校驗版本
命令: uname -r 校驗Linux內核版本(3.10以上版本)
從2017年3月開始docker在原來的基礎上分為兩個分支版本:Docker CE和Docker EE。
Docker CE 即社區免費版, Docker EE 即企業版,強調安全,但需付費使用。
移除舊的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common\
docker-latest \
docker-latest-logrotate\
docker-logrotate\
docker-selinux \
docker-engine-selinux \
docker-engine
如果yum報告未安裝這些軟件包,則可以。
安裝依賴工具
yum install -y yum-utils device-mapper-persistent-data lvm2
設置軟件源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 也可以使用阿里云的源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝docker
yum install -y docker-ce docker-ce-cli containerd.io
# 或者使用以下命令
sudo yum -y install docker-ce
驗證
docker --version
配置鏡像加速器
使用Docker的時候,默認從官方獲取鏡像。鑒于國內網絡問題,從倉庫拉取Docker鏡像十分緩慢,我們可以配置鏡像加速器來解決。
Docker官方和國內很多云服務商都提供了國內加速器服務,例如:阿里云鏡像加速器
-
注冊阿里云賬號(已有賬號可跳過)
-
獲取專屬加速器地址
- 登錄阿里云控制臺
- 搜索進入 容器鏡像服務 → 鏡像工具 → 鏡像加速器
根據官網提示的命令進行操作
sudo mkdir -p /etc/docker
# 寫入阿里云加速器配置(替換成你的實際地址)
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
# 重啟 Docker 生效
sudo systemctl daemon-reload
sudo systemctl restart docker
docker服務相關命令
# 啟動docker
systemctl start docker# 停止docker
systemctl stop docker# 重啟docker
systemctl restart docker# 查看docker狀態:
systemctl status docker# 設置docker開機啟動:
systemctl enable docker# 查看docker概要信息:
docker info# 查看docker總體幫助文檔:
docker --help# 查看docker命令幫助文檔:
docker 具體命令 --help
docker鏡像相關命令
#列出當前環境中已下載的鏡像
docker images docker search 某個xxx鏡像名字
# 去公共倉庫中查找某個鏡像 例如:docker search redis
加上 --limit : 只列出N個鏡像 例如:docker search --limit 5 redis docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]
# Docker 鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號]。默認地址是 Docker Hub。
# 倉庫名:如之前所說,這里的倉庫名是兩段式名稱,即 <用戶名>/<軟件名>。對于 Docker Hub,如果不給出用戶名,則默認為 library,也就是官方鏡像。
#簡略版
docker pull 某個xxx鏡像名字[:TAG]
# 沒有TAG就是拉取最新版
例如 docker pull mysqldocker pull redis:6.0.8docker rmi -f 某個xxx鏡像名字ID
刪除單個 docker rmi -f 鏡像ID
刪除多個 docker rmi -f 鏡像名1:TAG鏡像2
刪除全部 docker rmi -f $(docker images -qa)
docker容器相關命令
1.新建和啟動容器實例
docker run [options] image [command]
options說明(常用):
–name= “容器新名字” 為容器指定一個名稱
-d 后臺運行容器并返回容器ID,也即啟動守護式容器(后臺運行)
-i 以交互模式運行容器,通常與-t 同時使用
-t 為容器重新分配一個偽輸入終端,通常與-i 同時使用
-P 隨機端口映射,大寫P
-p 指定端口映射,小寫p
docker run -it --name=c1 centos:7 /bin/bash啟動一個有交互命令的centos7系統
參數說明:
i:交互式操作。
t:終端。
centos:7:centos:7鏡像。
bin/bash:放在鏡像名后的是命令,這里我們希望有個交互式Shell,因此用的是bin/bash。一經創建就會進入容器
要退出容器,直接輸入exit
2.查看容器狀態
docker ps
-a 列出當前所有正在運行的容器+歷史上運行過的
-l 顯示最近創建的容器
-n 顯示最近n個創建的容器
-q 靜默模式,只顯示容器編號
如果使用docker ps則看不到這一條記錄。因為我們使用docker run -it創建的容器在輸入exit命令退出后,該容器就不再運行了。因為該容器沒有使用 -d參數設置為后臺運行。
# 創建守護式容器(后臺運行)
docker run -id redis:6.0.8 /bin/bash
3.退出容器
進入容器,exit退出,容器停止(守護式容器不會停止)
exit進入容器,ctrl+p+q 退出,容器不停止
ctrl+p+q
4.進入容器、查看容器信息
進入容器
docker exec -it 容器id/容器名稱 bashShell
例 docker exec -it c1 bin/bash查看容器運行日志
docker logs 容器id查看容器運行的進程
docker top 容器id 查看內部細節
docker inspect 容器id
5.重啟、停止、強制停止容器,啟動、刪除已停止的容器
重啟容器
docker restart 容器ID或者容器名停止容器
docker stop 容器ID或者容器名強制停止容器
docker kill 容器ID或容器名啟動已經停止運行的容器
docker start 容器ID或者容器名刪除已經停止的容器
docker rm 容器ID或容器名一次刪除多個容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
6.在宿主機和容器之間交換文件
在宿主機和容器之間相互COPY文件cp的用法如下docker cp [OPTIONS] LOCALPATHI CONTAINER:PATH #宿主機復制到容器中
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH #容器中復制到宿主機宿主機復制一個圖片到容器中:將png圖片復制到了容器指定目錄下
docker cp guoweixin.png tomcat2:/usr/local/tomcat/webapps/ROOT將容器內的index.jsp復制到root下
docker cp tomcat2:/usr/local/tomcat/webapps/ROOT/index.jsp /root
數據卷
問題一:通過鏡像創建一個容器。Docker容器刪除后,在容器中產生的數據也會隨之銷毀。容器中的數據不是持久化狀態的。
問題二:Docker容器和外部機器如何交換文件
問題三:容器與容器之間如何進行數據交互
那有沒有一種獨立于容器、提供持久化并能服務于多個容器的東西呢?
數據卷:是宿主機中的一個目錄或文件(可供一個或多個容器使用的特殊目錄),當容器目錄和數據卷目錄綁定后,對方的修改會立即同步。一個數據卷可以被多個容器同時掛載,一個容器也可以被掛載多個數據卷
特性:
- 數據卷可以在容器之間共享和重用
- 對數據卷的修改會立馬生效
- 對數據卷的更新,不會影響鏡像
- 數據卷默認會一直存在,即使容器被刪除
數據卷配置
創建啟動容器時,使用-V參數設置數據卷
# 方式一
docker run...-v 宿主機目錄(文件):容器內目錄(文件)...
注意事項:
1.目錄必須是絕對路徑
2.如果目錄不存在,會自動創建
3.一個容器可以掛載多個數據卷
將兩個容器掛載同一數據卷,則可實現容器之間的數據交換。
# 方式二
#1 創建數據卷
docker volume create 數據卷名稱
#創建數據卷之后,默認會存放到目錄:/var/lib/docker/volume/數據卷名稱/_data目錄下
#2 查看數據卷
docker volume inspect 數據卷名稱
#3 查看全部數據卷信息
docker volume 1s
#4 刪除數據卷
docker volume rm 數據卷名稱
#5 應用數據卷
#5.1 當你映射數據卷時,如果數據卷不存在,Docker會幫你自動創建
docker run -v...數據卷名稱:容器內路徑...
數據卷容器
當多個容器掛在同一個數據卷,我們可以將一個容器掛載到數據卷上(作為數據卷容器)。其余容器掛載在 這個 數據卷容器上,這樣就相當于所有容器都掛載在這一數據卷上。(即使c3容器出問題了, c1和c2仍然可以和數據卷進行數據交換)
#1 創建數據卷
docker volume create 數據卷名稱
#創建數據卷之后,默認會存放到目錄:/var/lib/docker/volume/數據卷名稱/_data目錄下
#2 創建數據卷容器(name=c3 僅作演示)
docker run -it --name=c3 -v /var/lib/docker/volume/數據卷名稱/_data目錄下:/volume centos:7 bin/bash
#3 將其他容器掛載到該數據據容器上
docker run -it --name=c1 --volumes-from c3 centos:7
docker應用部署
總體步驟:
搜索鏡像 (docker search xx) 或者在 dockerhub上查看鏡像
拉取鏡像 (docker pull xx)
查看鏡像 (docker images xx)
啟動鏡像 (docker run -it -p 8080:8080 tomcat)
停止容器 (docker stop xx)
移除容器 (docker rmi -f xx)
mysql部署
- 容器內的網絡服務和外部機器不能直接通信
- 外部機器和宿主機可以直接通信
- 宿主機和容器可以直接通信
- 當容器中的網絡服務需要被外部機器訪問時,可以將容器中提供服務的端口映射到宿主機的端口上。外部機器訪問宿主機的該端口,從而間接訪問容器的服務。
- 這種操作稱為:端口映射
# 搜索mysql 鏡像
docker search mysql
# 拉取mysql 鏡像
docker pull mysql:5.6
# 在/root目錄下創建mysql目錄用于存儲數據
mkdir /root/mysql
cd /root/mysql
# 使用mysql鏡像創建容器c_mysql 以3307端口打開 并設置數據卷 并配置mysql的root密碼為123456
docker run -id \
-p 3307:3306 \
--name=c_mysql\
-v/root/mysql/conf:/etc/mysql/conf.d\
-v $PWD/logs:/logs\
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456
mysql:5.6參數說明:
-p 3307:3306:將容器的3306端口映射到宿主機的3307端口。也可以都為3306
$PWD 是當前目錄 /root/mysql
-v $PWD/conf:/etc/mysql/conf.d:將主機當前目錄下的conf/my.cnf 與容器的/etc/mysql/my.cnf 掛載# 進入該容器
docker exec -it c_mysql /bin/bash# 運行mysql 輸入密碼后進入mysql操作端
mysql -u -root -p123456
就和正常Linux系統下操作mysql一樣了。
通過SQLyog訪問宿主機IP和映射的端口,可以訪問到容器中的Mysql服務。
tomcat
拉取tomcat 鏡像
docker pull tomact運行該容器至8080端口
docker run -d -p 8080:8080 --name t1 tomcat
訪問首頁 看看有沒有成功 發現出現404頁面
- 可能沒有映射端口或者沒有關閉防火墻 (很小可能)
- 把webapps.dist 目錄換成webapps (因為新版的tomcat換掉了訪問的目錄)
# 重新進入tomcat終端 以此來排查問題
docker exec -it t1 /bin/bash進入目錄
cd webapps查看當前目錄下文件 發現沒有任何文件
ls -l切換到上層目錄
cd ../刪除目錄 因為這個目錄沒有想要的文件
rm -r webapps將有內容的文件改名為 webapps 讓tomcat找到對應的文件
mv webapps.dist webapps
再次訪問 發現可以正常訪問
制作鏡像
當我們從docker鏡像倉庫中下載的鏡像不能滿足我們的需求時,我們可以通過以下兩種方式對鏡像進行更改。
- 將已經創建的容器中制作成鏡像,并且提交這個鏡像
- 使用 Dockerfile 指令來創建一個新的鏡像
- 對于開發人員,可以為開發團隊提供一個完全一致的開發環境
- 對于測試人員,可以直接拿開發時所構建的鏡像測試。
- 對于運維人員,在部署時,可以實現快速部署、移值。
命令
# 將已經創建的容器轉換成鏡像
docker commit 容器id 鏡像名稱:版本號# 將鏡像文件壓縮 (用于傳輸給他人)
docker save -o 壓縮文件名稱 鏡像名稱:版本號# 將鏡像壓縮文件解壓
docker load -i 壓縮文件名稱
dockerfile 制作鏡像
dockerfile制作鏡像實際上就是確定鏡像每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、制作鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。
Dockerfile是一個文本文件,其內包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
dockerfile 常用命令
FROM :指定基礎鏡像
基礎鏡像不存在會在Docker Hub上拉去(一般會是文件的第一個指令)
使用格式:
FROM<鏡像>:[tag]
FROM <鏡像>@digest[校驗碼]
當前主機沒有此鏡像時,會自動去官網HUB下載
如果不以任何鏡像為基礎,那么寫法為:FROM scratch。
MAINTAINER:提供Dockerfile制作者提供本人信息 [逐漸廢棄]
LABLE-替代MAINTANIER
使用格式:
MAINTANIER “作者信息”
MAINTANIER “guoweixin guoweixin@aliyun.com”
LABLE maintainer=“作者信息”
LABEL maintainer=“guoweixin@aliyun.com”
ENV:用于為docker容器設置環境變量,ENV設置的環境變量,可以使用 docker inspect命令來查看。
同時還可以使用docker run -env =來修改環境變量。
具體用法:
ENV JAVA_HOME /usr/local/jdk
ENV JRE HOME SJAVA HOME/jre
ENV CLASSPATH SJAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH SPATH:SJAVA_HOME/bin/
USER:用來切換運行屬主身份的。Docker默認是使用root,但若不需要,建議切換使用者身份,畢竟root權限太大
了,使用上有安全的風險。
WORKDIR:WORKDIR用來切換工作目錄的。
Docker默認的工作目錄是/,只有RUN能執行cd命令切換目錄,而且還只作用在當下的RUN,也就是說每一個RUN都是獨立進行的。
如果想讓其他指令在指定的目錄下執行,就得靠WORKDIR。WORKDIR動作的目錄改變是持久的,不用每個指令前都使用一次WORKDIR。
WORKDIR /usr/local/tomcat/
EXPOSE:暴露容器運行時的監聽端口給外部,以實現與外部通信。想使得容器與主機的端口有映射關系,必須在容器啟動的時候加上 -P參數。如果不設定,會隨機映射端口。
具體寫法:
EXPOSE 端口號
EXPOSE 端口號/協議
不加協議默認為tcp
例如
EXPOSE 80/tcp
EXPOSE 80/udp
RUN:RUN指令是用來執行命令行命令的。其格式有兩種:
shell格式:RUN<命令>,就像直接在命令行中輸入的命令一樣。
exec格式:RUN[”可執行文件",“參數1”,“參數2”】,這更像是函數調用中的格式。
使用格式:
RUN
RUN [‘’‘’‘’‘’‘’]
注意:多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層,多少個RUN就構建了多少層鏡像,會造成鏡像的臃腫、多層,不僅僅增加了構件部署的時間,還容易出錯。
RUN書寫時的換行符是\
CMD:功能為容器啟動時要運行的命令
語法有三種寫法:
- CMD [“executable”,“param1”,“param2”]
- CMD [“param1”,“param2”]
- CMD command param1 param2
第三種比較好理解了,就是shell執行方式和寫法
第一種和第二種其實都是可執行文件加上參數的形式
注意:RUN是構件容器時就運行的命令以及提交運行結果
CMD是容器啟動時執行的命令,在構建時并不運行。
ADD: 一個復制命令,把文件復制到鏡像中。
語法如下:
- ADD …
- ADD [“”,… “”]
路徑的填寫可以是容器內的絕對路徑,也可以是相對于工作目錄的相對路徑
可以是一個本地文件或者是一個本地壓縮文件,還可以是一個url
如果把寫成一個url,那么ADD就類似于wget命令
盡量不要把寫成一個文件夾,如果是一個文件夾了,會復制整個目錄的內容,包括文件系統元數據
COPY:看這個名字就知道,又是一個復制命令。將宿主機的文件拷貝到容器中
語法如下:
- COPY …
- COPY [“”,… “”]
與ADD的區別
COPY的只能是本地文件,其他用法一致
ENTRYPOINT:功能是啟動時的默認命令
語法如下:
- ENTRYPOINT [“executable”, “param1”, “param2”]
- ENTRYPOINT command param1 param2
第二種就是shell寫法
第一種就是可執行文件加參數
與CMD比較說明:
- 相同點:
- 只能寫一條,如果寫了多條,那么只有最后一條生效
- 容器啟動時才運行,運行時機相同
- 不同點:
- ENTRYPOINT不會被運行的command覆蓋,而CMD則會被覆蓋
- 如果我們在Dockerfile種同時寫了ENTRYPOINT和CMD,并且CMD指令不是一個完整的可執行命令,那么CMD指定的內容將會作為ENTRYPOINT的參數
通過dockerfile制作鏡像
docker build -f dockerfile文件路徑 -t 鏡像名稱:版本號
docker compose
前面我們使用 Docker的時候,定義 Dockerfile文件,然后使用 docker build、docker run-d–name-p等命令操作容器。然而微服務架構的應用系統一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟停,那么效率之低,維護量之大可想而知
使用 Docker Compose可以輕松、高效的管理容器,它是一個用于定義和運行多容器 Docker的應用程序工具
Docker Compose 是Docker官方編排(Orchestration)項目之一,負責快速的部署分布式應用。
其代碼目前在https://github.com/docker/compose上開源
Compose 定位是「定義和運行多個Docker容器的應用(Defining and running multi-container Dockerapplications)。
我們知道使用一個 Dockerfile模板文件,可以讓用戶很方便的定義一個單獨的應用容器。然而,在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個Web項目,除了Web服務容器本身,往往還需要再加上后端的數據庫服務容器,甚至還包括負載均衡容器等。Compose恰好滿足了這樣的需求。它允許用戶通過一個單獨的docker-compose.yml模板文件(YAML格式)來定義一組相關聯的應用容器為一個項目(project)。
Compose中有兩個重要的概念:
- 服務(service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
- 項目(project):由一組關聯的應用容器組成的一個完整業務單元,在docker-compose.yml文件中定義。
Compose的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理。
Compose項目由Python編寫,實現上調用了Docker服務提供的API來對容器進行管理。因此,只要所操作的平臺支持 Docker API,就可以在其上利用 Compose來進行編排管理。
安裝
# 官方安裝
#1 github官方網站 搜索Docker compose
https://github.com/docker/compose/releases/download/1.25.5/docker-compose-Linux-x86_64
#2將下載好的文件拖入Linux并剪切到/usr/local目錄下
mv docker-compose-Linux-x86_64/usr/local
#3 修改名稱(為后面方便調用)并修改其為可執行文件
mv docker-compose-Linux-x8664 docker-compose
chmod 777 docker-compose
mv docker-compose /usr/local/bin/
示例
用compose的方式管理一個Tomcat容器和MySQL
- 管理文件夾,創建相應的目錄
mkdir -p /opt/docker_mysql_tomcat/ - 在如上目錄中編寫創建docker-compose.yml配置文件
編寫 docker-compose.yml文件,這個是Compose使用的模板文件。
vergion:'3.1'
services:mysql: #服務的名稱restart: always # 只要docker啟動,容器會隨著啟動image: daocloud.io/library/mysq1:5.7.6 #指定鏡像路徑信息(默認官方鏡像地址)container_name:mysq1-3306 #指定容器名稱--nameports:- 3306:3306 #指定端口號映射environment:MYSQL_ROOT_PASSWORD:root #指定MYSQL ROOT用戶的密碼TZ: Asiz/Shanghai #指定時區volumes:- /opt/docker_mysql_tomcat/mysql/data:/var/lib/mysql #映射mysq1的數據目錄到宿主機,保存數據- /opt/docker_mysql_tomcat/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf#把mysq1的配置文件映射到容器的相應目錄tomcat:restart: alwaysimage: daocloud.io/library/tomcat:8.5.15-jre8container_name:tomcat-8080ports:- 8080:8080environment:TZ: Asiz/Shanghaivolumes:- /opt/docker_mysql_tomcat/tomcat/webapps:/usr/local/tomcat/webapps- /opt/docker_mysql_tomcat/tomcat/logs:/usr/local/tomcat/logs
- 啟動
# 執行該docker-compose.yml文件
# 只有當該文件的名稱是docker-compose.yml的時候 且在當前文件路徑下能運行
docker-compose up -d# 如果文件名是其他的 需要指定該yml文件的名稱 且在當前文件路徑下
docker-compose -f 文件名.后綴 up -d
docker 私有倉庫(未完成)
docker swarm集群搭建(未完成)
參考目錄
https://www.bilibili.com/video/BV1CJ411T7BK
https://www.bilibili.com/video/BV1ug411j71W
https://www.bilibili.com/video/BV1CJ411T7BK
https://www.bilibili.com/video/BV1CJ411T7BK
https://www.bilibili.com/video/BV1gr4y1U7CY
https://www.bilibili.com/video/BV1Zn4y1X7AZ
https://blog.csdn.net/weixin_67102357/article/details/129399578
https://blog.csdn.net/weixin_67102357/article/details/129399578
https://blog.csdn.net/qq_45297578/article/details/117926769
https://blog.csdn.net/qq_37132495/article/details/118739692