在以前的兩篇文章中,咱們在 面向初學者的Docker學習教程:基礎篇中經過mysql
這三個問題來幫助你們更好的瞭解Docker,以後在第二篇文章Docker 三要素 :鏡像、容器和倉庫中解釋了docker中最核心的三個概念,經過這兩篇的學習,我想你們對於Docker是什麼?這個問題已經有了本身的答案,那麼再瞭解過這些概念以後,咱們將經過實際的命令行來使用Docker,並可以完成一些基礎的操做。nginx
不廢話,直接上代碼:git
在使用Docker以前,咱們須要先安裝Docker,在這裏 ,我只列舉最簡單的那一種安裝方式,若是須要其餘方式安裝的話,能夠參照官方文檔-快速上手,上面有更爲詳細的安裝教程。github
Docker 安裝(yum):web
#在終端輸入yum命令,安裝docker及相關依賴
yum install docker
#啓動docker 服務:centos 7+
systemctl start docker
#啓動docker 服務:centos 6+
service docker restart
複製代碼
驗證Docker是否安裝成功:redis
#從docker官方倉庫拉取docker hello-world鏡像
docker pull hello-world
#運行hello-world鏡像
docker run hello-world
複製代碼
若是出現 Hello from Docker! 則說明咱們的Docker已經正確安裝完成啦sql
注:docker
docker 官方的鏡像源因爲在國外,致使國內不少在本低虛擬機學習docker的同窗下載鏡像特別特別的慢,實測阿里雲服務器速度還能夠,以下載較慢的同窗能夠嘗試更換國內阿里雲,或者網易雲的鏡像倉庫,須要的同窗能夠自行去網上搜索相關教程。shell
Docker完美融合Linux,因此Docker命令行的風格和Linux仍是比較接近的,相對來講比較容易上手,首先,咱們先說鏡像相關的命令:ubuntu
#搜索鏡像:
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中,咱們經過運行鏡像來得到一個的容器,在這裏咱們以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
複製代碼
不少時候咱們不可避免的會對容器有所修改,好比修改了tomcat,mysql等等的配置文件,可是若是再配置一臺如出一轍的tomcat容器的話,則又要從新修改配置文件,Docker能夠經過commit命令將如今的容器從新打包成一個鏡像,若是你如今修改了tomcat容器內端口爲8081的話,那麼咱們使用commit將該容器打包成鏡像的話,以後咱們運行這個新鏡像,會發現鏡像裏面tomcat默認端口是8081.
咱們定製好了變化,而且但願能將其保存下來造成鏡像。要知道,當咱們運行一個容器的時候(若是不使用卷的話),咱們作的任何文件修改都會被記錄於容器存儲層裏。而 Docker 提供了一個 docker commit 命令,能夠將容器的存儲層保存下來成爲鏡像。換句話說,就是在原有鏡像的基礎上,再疊加上容器的存儲層,並構成新的鏡像。之後咱們運行這個新鏡像的時候,就會擁有原有容器最後的文件變化。
docker commit [選項] <容器 ID 或容器名> [<倉庫名>[:<標籤>]]
#例:
docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默認網頁" \
webserver \
nginx:v2
##其中 --author 是指定修改的做者,而 --message 則是記錄本次修改的內容。這點和 git 版本控制類似,不過這裏這些信息能夠省略留空。
複製代碼
即便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…