Docker入門——用docker運行容器(一)
在我的上一篇文章 Docker——理解Docker中,我們已經進行了一些整理簡述了一些 Docker 的基本概念
在這篇文章中,我將對Docker的初步使用進行總結,同時進一步明確一些概念
安裝
安裝確實沒有什麼好說的,我相信對Docker有興趣的你一定不會被這個問題難住
(事實上,沒有必要寫安裝步驟,因爲即便是寫了安裝步驟,不久後就會過時的,如果你使用的系統版本比較老,也許可以參考一下 Boot2Docker,Docker ToolBox
我安裝的版本是 Docker Desktop for Mac,安裝完成後頂部菜單欄會有一個可愛的小鯨魚
讓我們開始吧
安裝成功之後我們可以嘗試在終端中輸入幾條命令
$ docker info # 查看 Docker的基本信息
$ dorker version # 查看 Docker 的版本
如果終端顯示正常,說明Docker安裝成功了(鼓掌)
運行第一個容器
已經說過很多次了 Docker 是一個用來將應用程序部署到容器的引擎,那麼我們先嚐試運行一個容器
使用 docker run
命令運行一個容器,比如我們可以先運行一個ubuntu
$ sudo docker run -i -t ubuntu
關於這個命令的各種參數,我們可以參考官方文檔或者只直接在終端中輸入 docker help run
,在這裏的-i
,-t
分別代表了提供交互式能力和一個臨時終端
docker run
命令在執行的時候會先檢查本地是否存在這個鏡像,如果沒有我們選定的 ubuntu
,Docker會連接官方維護的 Docker Hub Registry 並搜索是否有我們需要的鏡像,隨後通過 docker pull
爲我們下載一個鏡像
在上面的下載過程中我們可以注意一下,一個沒有圖形化界面的 ubuntu 鏡像只需要不到400MB,Docker 的輕量的特點得到了很好的體現
隨後 Docker 會在文件系統內部利用這個鏡像創建一個容器,並進入這個容器的bash終端
root@ecd99d8d186c:/#
這個容器有自己的網絡,IP地址,以及一個用來和物理機通信的網絡接口
在容器中安裝應用
我們看到現在終端中出現了一串神祕字符串:root@ecd99d8d186c:/#
這說明我們以root權限登錄到了新容器中,後面一串字符串就是容器的ID,這也是在這個物理機上容器的唯一標識符,在物理機上進行一些操作的時候也許會用到這串 ID
我們在這個容器終端中檢查主機名試試:
root@ecd99d8d186c:/# hostname
ecd99d8d186c
可以看到這個容器的主機名就是這串ID!
由於我們的容器是一個完整的Ubuntu系統,在這裏可以隨意嘗試ubuntu系統中的命令,比如ls
ps
top
(只要不涉及桌面系統
我們也可以在這個容器中安裝常用的軟件,一個很常用的使用場景是我們要將這個容器作爲“代碼的搬運工”,不妨在這裏安裝一個git用來及時地同步代碼
由於這是一個空的容器,安裝軟件之前記得apt-get update
來同步軟件,然後再去apt-get install git
啓動我們的容器
當我們執行完任務之後,我們也許會直接關閉終端,或者按照正常的使用方式輸入 exit
來退出我們的容器
那麼我們應該怎麼啓動我們已經進行過操作的容器呢?再次執行docker run
? 並不是!
如果你執行了 docker run -i -t ubuntu
你將看到你再次進入了一個 Ubuntu 的 bash 中,但是容器的ID已經不是之前的ID了,也就是說你創建了一個新的容器
正確的做法:
- 執行
docker ps -a
查看當前系統下的所有 Docker,(如果不加-a
參數,我們將只能看到運行中的容器,顯然目前是沒有的) - 執行
docker start ecd99d8d186c
,通過ID啓動我們的容器,這時可以執行docker ps
來判斷這個容器是否在運行中 - 這個時候我們還是沒有進入容器的命令行重的,我們可以輸入
docker attach ecd99d8d186c
來重新附着到容器上
爲我們的容器命名
上面我們都是通過 ID 的方式來選擇我們要操作的容器,但是這樣的隨機序列是不可能強記的,我們也不能每次都查看系統中的鏡像(如果你的日常開發流程都是通過Docker管理的,可能會有十幾個容器)
爲了方便我們的操作,我們應當給容器命名,同時 Docker 也會自動生成一個隨機的名稱,參見上面的截圖我們可以看到我的實驗容器的 NAME 是 pensive_yalow
我們應當按照一定的的命名規範命名我們的容器,比如 項目名稱_開發階段_負責人
,
我們可以在容器創建之初就命名這個容器
$ docker run --name dockerLearn_raaabbit -i -t ubuntu
也可以通過rename
對已經有的容器進行重命名
$ docker rename dockerLearn_raaabbit dockerTry_raaabbit
注意: 由於容器名也作爲容器的唯一標識,所以命名要避免重複
守護式容器
設想一個這樣的使用場景,我們要在服務器上部署一個 WebService 顯然我們希望當我們退出容器終端之後,容器中的服務仍然在運行,這個時候我們就需要守護式容器
我們可以將之前創建的交互式容器運行起來,然後退出時不要輸入 exit
也不要用 ctrl+D
,而是使用 ctrl+P ctrl+Q
(輸入ctrl+P
後不要按下回車鍵)
look!我們的容器已經在後臺保持運行了
- 如果我們想要進入容器進行操作只要
docker attach dockerTry_raaabbit
即可 - 如果我們想要停止這個容器的運行,執行
docker stop dockerTry_raaabbit
或者我們也可以在創建之初就讓容器成爲守護式容器,和之前我們創建的有交互功能的交互式容器相比,守護式容器沒有交互式會話,創建依賴於docker run
的參數 -d
$ docker run --name daemon_container -d ubuntu
執行上面這條命令,終端會顯示一串字符串,也就是這個容器的完整id,此時用 docker ps
查看,並不能發現這個容器,這是因爲容器中並沒有正在運行的任務,嘗試輸入下面這條命令
docker fun --name daemon_hello -d ubuntu /bin/sh -c "while true; do echo hello; sleep 10; done"
容器中將執行一個死循環,直到容器停止爲止
這個容器記得停止運行,不然會一致循環下去的
好了,這篇文章就寫到這裏,下一次將會對運行中的容器進行一個小小的探索