承上一篇文章,當我們拉取的所需要的映像檔之後,就可以利用docker container等系列指令,讓這些映像檔活起來,也就是讓Docker系統依映像檔的內容,讓它們可以在自己的電腦中建構出所需要的環境,並提供所需要的服務。
執行映像檔以啟動容器的指令如下:
docker run <image name>
或
docker container run <image name>
一般用來測試Docker在自己的環境中是否能順利運作的映像檔是hello-world,因此,可以執行如下:
docker run hello-world
或
docker container run hello-world
由於執行容器是使用Docker最主要的目的,因此,當你指令了一個目前在存在於本地端的映像檔時,Docker也會主動幫我們執行docker pull的拉取作業,以下的畫面顯示的就是從提取hello-world映像檔到把它作為容器執行之後的一個過程:
然而上述的方式只是讓容器執行一遍而已,如果在執行的過程中我們想要跟這個容器有所互動的話,例如想要登入到容器的環境中,通常在執行容器時我們會加上「-i」和「-t」,或是直接把它們合併在一起成為「-it」這兩個旗標。前者是指要把容器開啟為交談模式並保持標準輸入開啟的狀態,而後者則是在本地端建立一個端終機通道,並把它附加到剛剛開啟的標準輸入。除此之外,也可以加上「–name」旗標為這個啟用後的容器命名。以下是使用ubuntu這個映像檔所建立的一個例子:
docker run -it --name myubuntu ubuntu
上述的指令執行之後,會看到如下所示的畫面:
從上述畫面的最後一行可以看出來,現在終端機已經登入到了ubuntu的作業系統中,以root的身份在該環境中,可以輸入任一ubuntu的指令,就好像你已經面對一台真正的Ubuntu作業系統一樣。以下的畫面示範了一些指令執行的範例,以及最後利用exit離開Ubuntu環境回到Windows命令提示字元的過程。
如果我們想要瞭解目前有沒有正在執行中的容器,可以執行以下的指令:
docker container ls
如果想要瞭解包括執行過的容器,則可以在上述的指令後面再加上一個參數如下:
docker container ls -a
上述兩個指令的執行過程如下:
對於一個已經存在於本地端且已經執行過的容器(已有命名,如前述的myubuntu)而言,在離開該容器之後,也可以利用以下的兩個指令重新執行,並進入該容器中:
docker conatiner start myubuntu
docker container attach myubuntu
以下為上述兩個指令的操作示範:
有些容器的特性並不是提供終端機供使用者使用,而是讓它成為一個服務器在背景中執行,此類型的容器包括網頁伺服器或是資料庫伺服器等,它們在執行時就需要以「-d」這個旗標來運行,以Apache2網頁伺服器為例,可以執行如下:
docker run -d --name myweb ubuntu/apache2
以下是執行上述指令的操作示範畫面:
從上面的畫面可以看出,在docker run指令執行完畢之後,儘管我們的命令輸入模式已回到Windows命令提示字元,但該容器仍然持續在背景中運行,並且開始了80這個標準的HTTP連接埠。然而,因為預設的情況下容器的連接埠並沒有開放到主機的環境中,所以此時在Windows作業系統下執行瀏覽器連接到localhost:80該容器並沒有任何的回應,我們還需要利用「-p」這個旗標把本地端(Windows)的指令連接埠轉傳到容器中才行,如下所示(在執行新的指令之前,請先利用docker container stop myweb停止該容器):
docker container prune
docker run -d -p 8080:80 --name myweb ubuntu/apache2
上述指令執行完畢之後,該網頁伺服器就會在背景中運作,而且開放本地端的電腦連接埠8080轉傳到容器內的網頁伺服器中,此時當我們使用Windows中的瀏覽器開啟網址localhost:8080時,即可以看到如下所示的畫面:
回頭檢視該容器的狀態,會出現如下所示的資訊:
下列的指令也可以列出現有正在執行中的容器:
docker ps
上述的指令如果加上「-q」旗號,則只會列出所有容器的ID,如下所示:
(base) C:\Users\minhuang>docker ps -q
f4a3ce5874e2
e30b88f8bd37
那些列出來的id可以作為停止及移除容器使用的識別字,操作過程如下所示:
初學者在操作容器時有一點要特別地留意就是,儘管我們可以在容器中做任何的操作,但是如果你沒有執行任何的保存指令( docker container commit)的話,當我們一停止容器的執行之後,所以在容器中做的改變都會消失,下次再進來就看不到了。
例如,假設我們以如下所示的指令進入ubuntu/apache2這個映像檔所建立的容器:
docker run -it ubuntu/apache2 bash
然後在該容器中利用apt update以及apt install vim安裝了vim這個文字編輯器,接著,可以開啟另外一個命令提示字元執行以下的操作:
如此我們就有了一個和原有ubuntu/apache2相同的映像,該映像中還多了vim這個程式可以使用。下次就可以利用以下的指令啟動我們自己調整過環境的映像檔了:
docker run -it myapache2 bash