Docker – 新手入門,快速安裝與基本指令介紹


Docker 是近期相當熱門的經量級虛擬技術,因接觸的時間不算多,所以這篇文章並不會做深入的介紹,而是從新手的角度切入,從安裝、基本指令一個一個的做練習,希望能讓新手有一個基本的概念,若各位要查看其他更多的指令用法,建議參考官方文件的說明。

Docker新手入門,快速安裝與基本指令介紹

延伸閱讀:Docker Container 指令:Docker run & Docker exec

Docker快速安裝

在Docker官網有寫了不同平台上取得Docker的方法,因一般我執行Docker時所用的平台都是Linux,所以在這邊提供Ubuntu與CentOS的「快速安裝」方式供大家參考,如果安裝失敗的話,那麼就建議你參考官方詳細的安裝文件:UbuntuCentOS

Ubuntu

curl -sSL https://get.docker.com/ | sh

CentOS

CentOS 7之後的版本,在CentOS Extras軟體庫中已內建有Docker,所以可以直接透過指令安裝:

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的,如果你覺得很麻煩的話,那麼可以依照以下的步驟,將使用者加入Docker群組,這樣以後在執行時就免打sudo了

sudo groupadd docker (建立docker群組)
sudo gpasswd -a 使用者帳號 docker (將帳號加入docker群組)
sudo reboot (重新啟動,或者使用 newgrp docker 指令來立即生效)
3. 搜尋 Image

想要查詢是否有可用的Image,可以直接用Search的指令來達成,格式為:docker 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之後,可以透過pull來下載,下載的Image它的Tag預設會使用latest(也就是最新版本),因此以下的指令等同於docker pull debian:latest,再提醒一次,所謂的Tag可以視為是此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 Image名稱docker run Image_ID來達成,例如下面的例子就會基於hello-world這個image來建立Container並啟動,如果本機沒有此Image,則會自行Pull下來執行。docker run還有許多參數可以搭配,目前本文先以最簡單的方式來做示範,進階的用法我們放到之後的文章再來做解明。

方法一:docker run hello-world 或
方法二:docker run 2cb0d9787c4d
7. 查看 Container(容器)的訊息

當有建立Container後,即可使用ps來查詢Container的資訊,如果不加其他額外參數的話,預設只會列出正在執行中的容器

docker ps

若要查看所有容器的狀態,例如:執行中與停止的容器,那麼只要在後面加一個-a」即可

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 “Container NAMES”docker run “Container ID”,以下是實際範例:

docker rm unruffled_snyder 或
docker rm d3f6f25b83d3
9. 刪除 Image

刪除Image的指令則為docker rmi “Image REPOSITORY”docker rmi “IMAGE ID”

docker rmi 2cb0d9787c4d 或
docker rmi docker.io/hello-world 或
docker rmi hello-world

要注意一點:若該Image有產生Container,則要把此Image相關的Container都刪除,才能進一步刪除Image

小結:Docker的指令很多,所以要一次介紹完是不可能的,所以本文先要簡單的入門指令來做為範例,後續會再介紹一些比較實用的指令給大家

延伸閱讀:
Docker Documentation