20.Docker
20.1 Docker的起源
2010年,幾個搞IT的年輕人,在美國舊金山成立了一家名叫“dotCloud”的公司,這家公司主要提供基於PaaS的雲端計算技術服務。
具體來說,是和LXC [ LXC,就是Linux容器虛擬技術(Linux container) ]有關的容器技術。後來,dotCloud公司將自己的容器技術進行了簡化和標準化,並命名為 Docker 。
後來公司在競爭之下快堅持不下去時,他們就想到了把Docker給開源出去,讓世界更多的人一起參與進來,貢獻程式碼和意見。
不開則已,一開驚人,越來越多的IT工程師發現了Docker的優點,然後蜂擁而至,加入Docker開源社群。之後Docker隨之火爆流行全球。
20.2 Docker是什麼
Docker和容器技術為什麼會這麼火爆?說白了,就是因為它“輕量級”。
在容器技術之前,業界的主流的虛擬化技術是虛擬機器。虛擬機器技術的代表,是VMWare和OpenStack。相信很多人都用過虛擬機器。虛擬機器,就是在你的作業系統裡面,裝一個軟體,然後通過這個軟體,再模擬一臺甚至多臺“子電腦”出來,在“子電腦”裡,你可以和正常電腦一樣執行程式,例如開QQ。如果你願意,你可以變出好幾個“子電腦”,裡面都開上QQ。“子電腦”和“子電腦”之間,是相互隔離的,互不影響。
虛擬機器屬於虛擬化技術。而Docker這樣的容器技術,也是虛擬化技術,屬於輕量級的虛擬化,虛擬機器雖然可以隔離出很多“子電腦”,但佔用空間更大,啟動更慢,虛擬機器軟體可能還要花錢購買啟用碼。
而容器技術恰好沒有這些缺點。它不需要虛擬出整個作業系統,只需要虛擬一個小規模的環境(類似“沙箱”)。它啟動時間很快,幾秒鐘就能完成。而且,它對資源的利用率很高(一臺主機可以同時執行幾千個Docker容器。此外,它佔的空間很小,虛擬機器一般要幾GB到幾十GB的空間,而容器只需要MB級甚至KB級。正因為如此,容器技術受到了熱烈的歡迎和追捧,發展迅速。
大家需要注意,Docker本身並不是容器,它是建立容器的工具,是應用容器引擎。
虛擬機器,類似於“子電腦”
20.3 Docker的優勢是什麼
“Build, Ship and Run”!
“搭建、傳送、執行”,三板斧。
舉個例子:
我來到一片空地,想建個房子,於是我搬石頭、砍木頭、畫圖紙,一頓操作,終於把這個房子蓋好了。
結果,我住了一段時間,想搬到另一片空地去。這時候,按以往的辦法,我只能再次搬石頭、砍木頭、畫圖紙、蓋房子。
但是,跑來一個老巫婆,教會我一種魔法,可以把我蓋好的房子複製一份,做成“映象”,放在我的揹包裡。
等我到了另一片空地,就用這個“映象”,複製一套房子,擺在那邊,拎包入住。
所以,Docker的第二句口號就是:“Build once,Run anywhere(搭建一次,到處能用)”。
20.4 Docker的核心概念
Docker技術的三大核心概念,分別是:
* 映象(Image)
* 容器(Container)
* 倉庫(Repository)
我剛才例子裡面,那個放在包裡的“映象”,就是Docker映象。而我的揹包,就是Docker倉庫。我在空地上,用魔法造好的房子,就是一個Docker容器。
說白了,這個Docker映象,是一個特殊的檔案系統。它除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(例如環境變數)。映象不包含任何動態資料,其內容在構建之後也不會被改變。
也就是說,每次變出房子,房子是一樣的,但生活用品之類的,都是不管的。誰住誰負責添置。
** 每一個映象可以變出一種房子。那麼,我可以有多個映象呀 **
也就是說,我蓋了一個歐式別墅,生成了映象。另一個哥們可能蓋了一箇中國四合院,也生成了映象。還有哥們,蓋了一個非洲茅草屋,也生成了映象。。。這麼一來,我們可以交換映象,你用我的,我用你的,豈不是很爽?
於是乎,就變成了一個大的公共倉庫。
負責對Docker映象進行管理的,是Docker Registry服務(類似倉庫管理員)。
不是任何人建的任何映象都是合法的。萬一有人蓋了一個有問題的房子呢?
所以,Docker Registry服務對映象的管理是非常嚴格的。
最常使用的Registry公開服務,是官方的Docker Hub,這也是預設的 Registry,並擁有大量的高質量的官方映象。
20.5 Docker的安裝
1.安裝依賴包
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2.設定阿里雲映象源
$ sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安裝Docker-CE
$ sudo yum install docker-ce
4.啟動docker
# 開機自啟
sudo systemctl enable docker
# 啟動docker服務
sudo systemctl start docker
5.映象加速配置
#加速地址 : 阿里雲控制檯搜尋容器映象服務,進入容器映象服務,左側最下方容器映象服務中複製加速器地址
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的加速器地址"]
}
EOF
# 重新載入docker配置
sudo systemctl daemon-reload
# 重啟docker
sudo systemctl restart docker
20.6 Docker demo入門
1.拉去centoS:7映象
$ sudo docker pull centos:7
2.編寫Dockerfile
# 建立一個空資料夾
$ sudo mkdir dockerFileStudy
# 建立Dockerfile檔案 (注意檔名稱不要錯,必須叫Dockerfile)
$ sudo vim Dockerfile
# 編寫Dockerfile
From centos:7
ENTRYPOINT ["cd /"]
ENTRYPOINT ["ls"]
# 編譯Dockerfile檔案 -t 是後面的名字為打成映象名
$ sudo docker build -t test .
# 啟動一個容器執行你的Dockerfile編譯的映象把
$ sudo docker run test
20.7 下面你由你自己來翻閱資料編寫一個Dockerfile來整合Tomcat並使用docker啟動一個Tomcat吧~~~~
20.8 常見問題 :
1.安裝Docker-ce報錯
--> Processing Conflict: 1:docker-ce-cli-18.09.6-3.el7.x86_64 conflicts docker
--> Processing Conflict: 1:docker-ce-cli-18.09.6-3.el7.x86_64 conflicts docker-io
--> Processing Conflict: 3:docker-ce-18.09.6-3.el7.x86_64 conflicts docker
--> Processing Conflict: 3:docker-ce-18.09.6-3.el7.x86_64 conflicts docker-io
--> Finished Dependency Resolution
Error: docker-ce conflicts with 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
Error: docker-ce-cli conflicts with 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
# 嘗試刪除本機上的所有docker服務再次安裝
# 1、檢視安裝過的docker:
$ yum list installed | grep docker
containerd.io.x86_64 1.3.7-3.1.el7 @docker-ce-stable
docker-ce.x86_64 3:19.03.13-3.el7 @docker-ce-stable
docker-ce-cli.x86_64 1:19.03.13-3.el7 @docker-ce-stable
# 2、解除安裝docker:
$ sudo yum remove -y containerd.io.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64
# 3、刪除容器映象:
$ sudo rm -rf /var/lib/docker
# 4、 重新安裝docker
$ sudo yum install docker-ce
2. 編譯Dockerfile報錯
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /usr/dockerbuild/Dockerfile: no such file or directory
# 檢視Dockerfile名稱是否有誤
# 檢視Dockerfile語法是否正確 左側docker保留命令是否大寫,右側執行命令是否小寫
3. 刪除映象報錯
Error response from daemon: conflict: unable to remove repository reference "test" (must force) - container cac0f265950c is using its referenced image 20c5428b958d
# 使用 docker ps -a 檢視此映象是否有啟動過的容器 ,如果有,先使用 docker rm 容器id 刪除容器 再刪除映象 注意 docker ps - a 檢視的是無論是否啟動的容器都顯示 而 docker ps 是隻顯示啟動的容器