1. 程式人生 > 程式設計 >面向後端的Docker初級入門教程:實戰篇

面向後端的Docker初級入門教程:實戰篇

前言

在之前的兩篇文章中,我們在 面向初學者的Docker學習教程:基礎篇中通過

  1. 什麼是Docker?
  2. 為什麼是Docker?
  3. Docker 具體解決了什麼樣的問題?

這三個問題來幫助大家更好的瞭解Docker,之後在第二篇文章Docker 三要素 :映象、容器和倉庫中解釋了docker中最核心的三個概念,通過這兩篇的學習,我想大家對於Docker是什麼?這個問題已經有了自己的答案,那麼再瞭解過這些概念之後,我們將通過實際的命令列來使用Docker,並能夠完成一些基礎的操作。

不廢話,直接上程式碼:

Docker 安裝:

在使用Docker之前,我們需要先安裝Docker,在這裡 ,我只列舉最簡單的那一種安裝方式,如果需要其他方式安裝的話,可以參照官方檔案-快速上手,上面有更為詳細的安裝教程。

Docker 安裝(yum):

#在終端輸入yum命令,安裝docker及相關依賴
yum install docker

#啟動docker 服務:centos 7+
systemctl start docker 

#啟動docker 服務:centos 6+
service docker restart

複製程式碼

驗證Docker是否安裝成功:

#從docker官方倉庫拉取docker hello-world映象
docker pull hello-world

#執行hello-world映象
docker run hello-world
複製程式碼

如果出現 Hello from Docker! 則說明我們的Docker已經正確安裝完成啦

注:

docker 官方的映象源由於在國外,導致國內很多在本低虛擬機器器學習docker的同學下載映象特別特別的慢,實測阿里雲伺服器速度還可以,如下載較慢的同學可以嘗試更換國內阿里雲,或者網易雲的映象倉庫,需要的同學可以自行去網上搜索相關教程。

Docker 映象操作:

Docker完美融合Linux,所以Docker命令列的風格和Linux還是比較接近的,相對來說比較容易上手,首先,我們先說映象相關的命令:

#搜尋映象:
docker search 映象名
#例:docker search centos 搜尋centos相關的映象。

#拉取映象到本地伺服器 預設TAG是lastet即最新版本
docker pull 映象名:TAG #例:docker pull mysql or docker pull mysql:5.6 拉取最新版本或者5.6版本的mysql映象 #檢視所有映象: docker images ##檢視頂層映象 docker image ls #檢視中間層映象 docker image ls -a #在之前的基礎篇中有說到,docker的映象是分層來儲存的,為了加速映象構建、重複利用資源,Docker 會利用 中間層映象。所以在使用一段時間後,可能會看到一些依賴的中間層映象,這樣會看到很多無標籤的映象,與之前的虛懸映象不同,這些無標籤的映象很多都是中間層映象,是其它映象所依賴的映象。這些無標籤映象不應該刪除,否則會導致上層映象因為依賴丟失而出錯。實際上,這些映象也沒必要刪除,因為之前說過,相同的層只會存一遍,而這些映象是別的映象的依賴,因此並不會因為它們被列出來而多存了一份,無論如何你也會需要它們。只要刪除那些依賴它們的映象後,這些依賴的中間層映象也會被連帶刪除。 #列出部分映象,如果不指定的話,TAG部分可以省略 docker image ls ubuntu:18.04 #刪除映象 docker image rm 映象ID #批量刪除映象: docker image rm $(docker image ls -q redis) 複製程式碼

執行docker images 命令,如下圖所示:

列表包含了 倉庫名、標籤、映象 ID、建立時間 以及 所佔用的空間。

Docker 容器操作

在之前我們有說到過,映象與容器之間的關係類似於類與例項之間的關係,在Docker中,我們通過執行映象來獲得一個的容器,在這裡我們以centos為例:

docker run [選項] [映象名或者IMAGEID]
例:
docker run -it centos 
-it 互動式終端執行

#比如很多比如mysql映象,我們需要這個容器在後臺執行,並不是十分需要進入容器終端,這個時候我們只需要將-it 替換成 -d 即可啟動守護式容器:
docker run -d centos 
複製程式碼

通過執行上面的命令,我們會自動以互動模式進入到容器中,如圖所示:

可以發現,我們實際上已經進入centos容器內部的bin/bash了,在這裡,我們可以輸入相關的命令來操作我們的容器。如果只是單純的想建立一個容器,並不怎麼著急啟動的話,可以使用create命令:

#建立一個容器但是不立即啟動
docker creat 映象名或者映象ID

#例:docker create centos

#docker容器預設命名規則是科學家+他的發現,如果我們需要自定義自己的別名,比如說centos容器叫mycentos,我們需要加入--name選項
docker run -it --name [別名] [映象名]

#例:docker run -it --name mycentos centos
複製程式碼

當我們有某些應用比如tomcat需要使用特定埠向外部提供服務時,我們可以使用 -p 選項配置宿主機與容器之間的埠對映,以tomcat為例:

docker run -it -p 8899:8080 tomcat
-p 配置埠對映
複製程式碼

這樣,當我們訪問ip:8899 時,就會發現瀏覽器出現了tomcat的首頁,這個時候埠就已經正確對映到容器裡面8080埠上了。

當然,退出互動式終端,Docker同樣也提供了兩種方式供我們選擇:

#退出互動式命令環境:這種是比較優雅的退出,退出後容器仍然在執行
Ctrl+P+Q

exit 
#不太優雅的方式,退出之後容器也會停止
複製程式碼

如果退出了之後,我後悔了,又突然想再進去容器終端內改一些東西,重新進入容器互動式終端,Docker提供瞭如下兩種方式:

docker attach  [別名或IMAGEID] 

##推薦第二種
docker exec -it centos bash
##docker exec :在執行的容器中執行命令

複製程式碼

除去上面這些,Docker的容器還支援啟動,重啟,刪除等操作:

#停止容器: 溫柔式,正常關機
docker stop [別名或IMAGEID]
#
docker stop mycentos

#強制停止容器: 拔插頭
docker kill [別名或IMAGEID] 

#啟動容器:
docker start  [別名或IMAGEID] 
#重啟容器:
docker restart  [別名或IMAGEID] 
#刪除容器,只能刪除停止的容器
docker rm [別名或IMAGEID] 
複製程式碼

如果想檢視正在執行的容器,可以使用以下命令:

#檢視正在執行的容器
docker ps

#檢視所有容器,包括已經停止的容器
docker ps -a
複製程式碼

獲取容器輸出資訊:

docker logs container 
複製程式碼

容器資料卷:

在某些情況下,我們需要實時備份容器內的資料到我們的宿主機上,同樣在Docker中,是支援容器與宿主機之間建立共享目錄的,使用起來也非常簡單,只需要加一個 -v 選項就可以了。

#例,執行過之後,我們在宿主機目錄中建立一個新檔案,容器內目錄也會相應的出現這個檔案,所以就可以把mysql資料存放的目錄通過這種方式和宿主機共享,達到實時備份資料的目的。
docker run -it -v /宿主機目錄:/容器內目錄 centos /bin/bash
 
#如果需要給容器內目錄設定許可權,則只需要加上 ro 即可,read -only 的縮寫
docker run -it -v /宿主機目錄:/容器內目錄:ro /bin/bash
ro 只讀,這樣我們宿主機在共享目錄裡面建立的檔案在容器內是隻讀的
 
#檢視容器是否掛載成功:
docker inspect 容器ID
複製程式碼

製作Docker映象:

使用commit命令製作映象:

很多時候我們不可避免的會對容器有所修改,比如修改了tomcat,mysql等等的配置檔案,但是如果再配置一臺一模一樣的tomcat容器的話,則又要重新修改配置檔案,Docker可以通過commit命令將現在的容器重新打包成一個映象,如果你現在修改了tomcat容器內埠為8081的話,那麼我們使用commit將該容器打包成映象的話,之後我們執行這個新映象,會發現映象裡面tomcat預設埠是8081.

我們定製好了變化,並且希望能將其儲存下來形成映象。要知道,當我們執行一個容器的時候(如果不使用卷的話),我們做的任何檔案修改都會被記錄於容器儲存層裡。而 Docker 提供了一個 docker commit 命令,可以將容器的儲存層儲存下來成為映象。換句話說,就是在原有映象的基礎上,再疊加上容器的儲存層,並構成新的映象。以後我們執行這個新映象的時候,就會擁有原有容器最後的檔案變化。

docker commit [選項] <容器 ID 或容器名> [<倉庫名>[:<標籤>]]

#例:
docker commit \
--author "Tao Wang <[email protected]>" \
--message "修改了預設網頁" \
webserver \
nginx:v2

##其中 --author 是指定修改的作者,而 --message 則是記錄本次修改的內容。這點和 git 版本控制相似,不過這裡這些資訊可以省略留空。
複製程式碼

使用DockerFile來定製映象:

即使Docker提供了commit來製作映象,可是依然感覺麻煩了點。如果我們可以把每一層修改、安裝、構建、操作的命令 都寫入一個指令碼,用這個指令碼來構建、定製映象,那麼之前提及的無法重複的問題、映象構建透明性的問題、體積的問題就都會解決。這個指令碼就是 Dockerfile。 Dockerfile 是一個文字檔案,其內包含了一條條的指令(Instruction),每一條指 令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

由於DockerFile整塊內容還是很多的,所以後期我打算單獨拿出來做成筆記,本篇文章作為入門教程,將使用一些簡單的案例來幫助大家初識DockerFile,複雜映象的構建,則會單獨放在一篇文章中說明。

由於我們之前的centos映象只保留了centos的核心功能,很多常用的軟體都沒有,於是我們打算製作一個簡單的centos映象,在原來的基礎上使其擁有vim編輯器和net-tools工具。

首先新建一個DockerFile檔案,寫入以下內容:

from centos  //繼承至centos
ENV mypath /tmp  //設定環境變數
WORKDIR $mypath //指定工作目錄

RUN yum -y install vim //執行yum命令安裝vim
RUN yum -y install net-tools //執行yum命令安裝net-tools

EXPOSE 80 //對外預設暴露的埠是80
CMD /bin/bash //CMD 容器啟動命令,在執行容器的時候會自動執行這行命令,比如當我們 docker run -it centos 的時候,就會直接進入bash

複製程式碼

然後編譯該映象:

然後編譯該映象
docker build -f ./DockerFile -t mycentos:1.3.
-t 新映象名字:版本
-f 檔案 -d 資料夾
複製程式碼

之後我們執行docker images命令就會出現我們構建好的新映象, mycentos:1.3 ,執行該映象,會發現vim和net-tools 是可以正常使用的。

最後就大功告成啦。

下面開始技術總結:

本篇文章呢,我們講解了Docker常見的命令列的使用和解釋,以及DockerFile的簡單入門,下一篇呢,我們將從DockerFile入手,開始詳細的瞭解去怎麼去製作和釋出一個自己的映象。

最後,相關筆記已經同步開源至Github(歡迎star): github.com/hanshuaikan…