上一篇Docker 介紹到入門我們介紹了Docker並且實際弄出個虛擬的ubuntu系統,但只有這樣是不能滿足我們的,我們要的是什麼?
輕鬆的跟所有人分享我們的應用程式
因此,現在我們就來說說如何將一個完整的應用程式(環境與程式),一同打包並且上傳至DockerHub。
首先我們先來說說上次沒說完的”container”,我們回憶一下上個階段,我們使用docker pull
指令從docker Hub取得我們的image,然後我們使用了docker run -it
讓系統開始運作。
但其實這樣說並不夠精準,讓我們說的更細緻一些。
其實docker run -it
這個指令是用來命令docker,讀取image內容來建立container,這邊你可能會有疑問,
那什麼是container呢?
如果我們直接字面翻譯container的話,可以知道這個的意思代表“容器”,實際上container是Docker為了系統能完全獨立的一種設計,你可以直接想成是一台小小虛擬電腦即可。
這樣感覺還有點模糊嗎?那我們就說得更簡單一點。
有天,你去遊戲店買了個遊戲光碟,帶回家後,你開啟了新的遊戲紀錄並玩了一下,之後你覺得這個遊戲很不錯,也想跟別人分享遊戲並炫耀一下自己的遊戲紀錄,所以你將遊戲與遊戲紀錄一起燒成了一個新的光碟,最後你不但跟朋友分享新的光碟,還把新的光碟再拿回遊戲店去賣。
我們來對應一下這個小故事。
有天,你去遊戲店(docker hub)買了個遊戲光碟(image),帶回家後,你開啟了新的遊戲紀錄並玩了一下,之後你覺得這個遊戲很不錯,也想跟別人分享遊戲並炫耀一下自己的遊戲紀錄,所以你將遊戲與遊戲紀錄(container)一起燒成了一個新的光碟(image),最後你不但跟朋友分享新的光碟(image),然後把新的光碟(image)再拿回遊戲店(docker hub)去賣。
- 遊戲店 -> (docker hub)
- 遊戲光碟 -> (image)
- 遊戲與遊戲紀錄 -> (container)
這樣應該比較容易理解了吧?
那在對於Docker有了基本概念之後,我們來說一下Docker整體架構,當然我們還是以實際上常常使用的部分進行說明。
Docker 整體概念
我們來看看上圖,可以看到裡面包含有六個“角色”與角色之間的關係,乍看之下有點複雜,因此我們將分成幾個部分來分開介紹。
- DockerHub
DockerHub是Docker提供的雲端空間服務,提供給所有人上傳自己的image,基本上我們可以將它想像成Github。
接下來,讓我們來介紹關於“Docker Hub”的一些常用指令:
- 從Docker Hub 中下載 image
$ docker pull [image_tag]
2. 上傳image到Docker Hub
$ docker push [UserName]/[image_tag]
圖解:
- container
container顧名思義就是一個容器,可以根據image進行實體化,通過指令,我們可以讓image變成可執行的container,也可以將自己的container在打包回image,易於分享。
白話文來說的話,container就像是虛擬電腦,然後image就是被打包封裝起來的container。
接下來,讓我們來介紹關於“container”的一些常用指令:
- 根據image來實體化container
$ docker run -it --name [container_name] [image_tag]
-t
選項讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上, -i
則讓容器的標準輸入保持打開 (更多參數說明可以參考本文最後的參考文獻)
2. 啟動 container
$ docker start [container_name]
3. 進入 container
$ docker attach [container_name]
進去container之後就可以跟一般電腦一樣運作啦~ 看是要建立程式還是系統都隨你喜歡啦!
4. 封裝 container 成 image
$ docker commit [container_name] [image_tag]
圖解:
Debug:
- 沒辦法進入container / 沒辦法
docker attach
錯誤碼:You cannot attach to a stopped container, start it first
錯誤原因: container的狀態是 exited(關閉狀態)
解決方式:先啟動container
$ docker start [container_name]
- container 啟動成功,但是會立刻變回關閉狀態(exited)
錯誤原因:代表這個container並不會保持開啟的狀態,根據原始image的設定,container會在執行完後自動結束。(更多說明可以參考本文最後的參考文獻- A docker container exits when its main process finishes.)
解決方式:刪除掉container後,重新正確的建立container
刪除container:
$ docker rm [container_name]
重建container:
$ docker run -it --name [container_name] [image_tag] /bin/bash
終於,我們簡單的看完了如何取得建立封裝image與container,並且image與DockerHub的互動我們也重點式的說了一些,讓我們知道要如何跟別人分享我們的系統成果。但是有一個問題隱藏在這個看似完美的流程之中。
因此我們在下章節我們會來說說這個問題與dockerfile的功能(Docker 入門到使用 – dockerfile)
參考文獻:
- docker run 的常用参数用法, jiajially
-
《Docker —— 從入門到實踐》正體中文版, philipzheng
- A docker container exits when its main process finishes., Adrian Mouat
2 thoughts on “Docker 入門到使用”