Docker 是近期相當熱門的經量級虛擬技術,因接觸的時間不算多,所以這篇文章並不會做深入的介紹,而是從新手的角度切入,從安裝、基本指令一個一個的做練習,希望能讓新手有一個基本的概念,若各位要查看其他更多的指令用法,建議參考官方文件的說明。
延伸閱讀:Docker Container 指令:Docker run & Docker exec
Docker快速安裝
在Docker官網有寫了不同平台上取得Docker的方法,因一般我執行Docker時所用的平台都是Linux,所以在這邊提供Ubuntu與CentOS的「快速安裝」方式供大家參考,如果安裝失敗的話,那麼就建議你參考官方詳細的安裝文件:Ubuntu、CentOS
Ubuntu
curl -sSL https://get.docker.com/ | sh
更新:現在安裝更方便了,可直接用apt安裝 (在Ubuntu 18.04 的版本測試通過)
sudo apt-get update
sudo apt install docker.io
CentOS
CentOS 7之後的版本,在
sudo yum install docker
Is the docker daemon running?
在安裝完成後,如果你發現你在下Docker指令時出現「Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?」的錯誤訊息,這應該是沒有啟動Docker所造成,以CentOS為例,請直接啟動Docker的服務即可:
sudo systemctl start docker
希望開機就啟動Docker服務,執行以下指令即可:
sudo systemctl enable docker
基本名詞
這裡介紹三個在學習Docker時常會用到的名詞,知道這三個名詞的相互關係在使用上會相當有幫助:
- Image(映像檔):可以想像成一個已經打包好的執行環境或OS,裡面包含的東西可以是一個單純的OS,也可以包含所有你想執行的應用程式。映像檔是用來創建Container(容器)的,但它是唯讀的,也就是說Container所產生的變更不會影響原本的映像檔,但Docker可以對變更後的Container建立Image。
- Container(容器):Container是Docker Image建立而來,可以想像它是在Image上多建立一層可讀寫的Layer,Container可以提供應用程式所需要的執行環境,每個容器之間都是各別獨立的,也就是說容器A如果有開Port 22,容器B也有開Port 22,二者是不會衝突的,另外,一個Images是可以建立多個Container的。
- Registry(倉庫註冊伺服務):通常分為公開倉庫(Public)與私有倉庫(Private),主要就是放置一些Image供大家使用,你也可以把自己的Image上傳到這些倉庫中,供其他人下載,目前最大的公開倉庫當屬「Docker Hub」,預設的Image就是會從這邊下載。那什麼是
Repository 儲存庫呢?它是Docker Image不同版本的集合,你可以想像成和Github一樣幫我們做版本控管 - Tag(標籤):用標示Image的版本
Docker常用指令說明
我覺得對於初學者來說,動手做做看比較會有感覺,一邊實作、一邊學習指令,也比較容易記的住,所以下面會透過一連串的例子來當成範例解說:
1. 查詢Docker的版本資訊
一般來說,在使用Docker指令時,通常會需要權限,因此如果是非root的帳號,需要加「sudo」來執行
sudo docker version 或 sudo docker info
2. 加入Docker群組
上面有提到,如果沒有足夠的權限,在執行docker指令時是需要加上
sudo groupadd docker (建立docker群組)
sudo gpasswd -a 使用者帳號 docker (將帳號加入docker群組)
sudo reboot (重新啟動,或者使用 newgrp docker 指令來立即生效)
3. 搜尋 Image
想要查詢是否有可用的Image,可以直接用Search的指令來達成,格式為:
docker search tomcat
如果想要限制搜尋來源是官方提供的,那麼可以加入以下參數:
docker search tomcat -f is-official=true
- -f: filter,進行篩選
- is-official: 是否為官方版,true = 是、false = 否
小技巧:在查詢的結果會有一欄是「STARS」,數字越大代表獲得使用者青睞越多,相對來說也是越穩定或者越安全,建議在選擇Image安裝的時候可以考慮釋出的來源以及星號數
4. 下載 Image (pull)
我們可以直接透過指令來尋找Image,也可以直接到「Docker Hub」中尋找,後者是我比較偏愛的方式,因為網頁上會列出一些有關於該Image的資訊,例如如何設定、如何下載、如何執行等。不管你用哪個方式,找到想要的Image之後,可以透過
docker pull hello-world (等於 docker pull hello-world:latest)
若有指定的版本,只要加上版本號即可,如下面的範例就指定了ubuntu的版本號
docker pull ubuntu:14.04
5. 列出本機已有的 Image
可以查看目前本機已經下的Image以及相關的資訊,如Image ID、檔案大小、版本號等等
[demo@localhost ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest 2cb0d9787c4d 3 weeks ago 1.85K
6. 建立 Container
前面有提到,Image可以用來建立Container,而要執行這個動作可以透過
方法一:docker run hello-world 或
方法二:docker run 2cb0d9787c4d
7. 查看 Container(容器)的訊息
當有建立Container後,即可使用
docker ps
若要查看所有容器的狀態,例如:執行中與停止的容器,那麼只要在後面加一個
docker ps -a
執行的結果如下:(只列出幾個比較重要的欄位,沒有全列出)
CONTAINER ID IMAGE STATUS NAMES
d3f6f25b83d3 2cb0d9787c4d Exited (0) About an hour ago unruffled_snyder
94564cd9aa2d hello-world Exited (0) About an hour ago awesome_hypatia
5476d21edb8a hello-world Exited (0) About an hour ago priceless_engelbart
8. 刪除 Container
刪除Container的指令有二種:
docker rm unruffled_snyder 或
docker rm d3f6f25b83d3
9. 刪除 Image
刪除Image的指令則為
docker rmi 2cb0d9787c4d 或
docker rmi docker.io/hello-world 或
docker rmi hello-world
要注意一點:若該Image有產生Container,則要把此Image相關的Container都刪除,才能進一步刪除Image
小結:Docker的指令很多,所以要一次介紹完是不可能的,所以本文先要簡單的入門指令來做為範例,後續會再介紹一些比較實用的指令給大家
延伸閱讀:
.Docker Documentation
.Docker – Dockerfile 指令教學,含範例解說
.Docker Compose – 安裝教學、指令用法及官方範例說明