這是本專欄的第一部分:Docker 入門,共 3 篇,帶你們進入 Docker 的世界。上一節,我帶你們瞭解了 Docker 和容器技術的發展歷程,知道了它的基礎技術發展路線。下面一塊兒進入第二節的內容。python
Docker 支持 Linux、MacOS 和 Windows 等系統,且在 Linux 的各發行版中的安裝步驟也都略有差別。linux
這裏我不會列出它在各個系統平臺上的具體安裝步驟,由於Docker 的文檔描述的很詳細了,不必贅述。docker
這裏我對在 Linux 平臺下的安裝多說一點,若是你使用的是比較常見的發行版,如 Debian、Ubuntu、CentOS、Fedora 等,能夠直接經過https://get.docker.com/中提供的腳原本一鍵完成安裝。shell
# 下載腳本 $ curl -fsSL https://get.docker.com -o get-docker.sh
腳本中內置了使用國內源進行加速:bash
# 使用 Azure 進行加速 $ sh get-docker.sh --mirror AzureChinaCloud
或curl
# 使用 Aliyun 進行加速 $ sh get-docker.sh --mirror Aliyun
在安裝完成後,強烈建議閱讀官方文檔,對已經安裝的 Docker 進行配置,好比配置 Docker 的開機自啓動。post
第一個容器
在安裝完成後,咱們正式開始。url
通過上一節的介紹,咱們也知道 Docker 一開始能勝出,並且吸引無數開發者,與它的易用性是密不可分的。spa
使用 Docker 啓動容器很簡單,只須要一句 docker run 命令行便可搞定。命令行
例如,當我想要運行最新版本的 Python 解釋器時,只須要一句 docker run -it python 便可。
(MoeLove) ➜ ~ docker run -it python Unable to find image 'python:latest' locally latest: Pulling from library/python 4ae16bd47783: Pull complete bbab4ec87ac4: Pull complete 2ea1f7804402: Pull complete 96465440c208: Pull complete 6ac892e64b94: Pull complete 5b3ec9e84adf: Pull complete 317202007d7c: Pull complete ba1ee226143f: Pull complete cba5f4ed3782: Pull complete Digest: sha256:4432d65bd7da4693bb9365c3369ed5c7f0cb472195a294c54d1b766751098f7b Status: Downloaded newer image for python:latest Python 3.7.4 (default, Aug 14 2019, 12:09:51) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.version '3.7.4 (default, Aug 14 2019, 12:09:51) \n[GCC 8.3.0]'
看吧真的很簡單,如今已經運行了一個容器,並在容器中完成了操做。
你可能已經注意到了,咱們在docker run
命令與 python 鏡像之間加了 -it 的參數。
這是一種簡寫,實際上這條命令的完整寫法是docker run --interactive --tty python
。
其中:
這兩個選項經常一塊兒使用,用於與容器內程序直接進行交互。
理解了上述內容,咱們的第一個容器實驗也就順利結束了。
咱們並不老是但願一直保持與容器進行交互,如 Redis、NGINX 之類的這種可提供服務的容器,在多數狀況下只是但願它能夠運行在後臺提供服務便可。
通過前面內容的介紹,也許會有人很天然的認爲,既然增長 --interactive 和 --tty 參數可讓咱們直接與容器進行交互,那若是去掉這兩個參數,是否就能夠保證容器不與咱們交互,運行在後臺呢?不妨來試試看:
(MoeLove) ➜ ~ docker run python (MoeLove) ➜ ~ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7a803976d0a4 python "python3" 10 seconds ago Exited (0) 9 seconds ago flamboyant_yalow
執行完 docker run python 後沒有任何輸出或反饋,經過 docker ps 來查看容器的狀態。其中,-l 參數是 --latest 的縮寫,表示最新的容器(包含全部狀態),能夠看到該容器的狀態是已經退出了。
這是爲何呢?
回憶下剛纔帶着 --interactive 和 --tty 的時候,啓動容器後,直接進入了 Python 的可交互式終端內。而如今咱們沒有攜帶任何參數,那天然在啓動時 Python 的終端知道即便等待也不會有任何結果,所以就退出了。
那咱們有沒有辦法改變這一狀況呢?
有,咱們給命令的最後增長一些參數來解決。
(MoeLove) ➜ ~ docker run python sleep 60
加了一句 sleep 60,如今整個終端沒有任何輸出,也沒法進行交互(畢竟咱們沒有傳遞過 --interactive 的參數,所以輸入是無效的)。另外打開一個終端,執行剛纔的 docker ps -l 命令進行查看。
(MoeLove) ➜ ~ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82686b276ec4 python "sleep 60" 6 seconds ago Up 5 seconds cranky_banach
能夠看到該容器是 Up 的狀態,且正在執行 sleep 60 的命令,這說明咱們在最後傳遞的命令是可執行的。
如今容器的行爲並不符合咱們的預期,那如何實現預期呢? 答案是能夠給docker run
命令傳遞-d
或者完整的--detach
參數,這表示將容器運行於後臺。來試試看。
(MoeLove) ➜ ~ docker run -d python sleep 60 9f2b81e85893b1f8402247867344c9ab6bde92f377ec9949bd491e857b570048
該命令執行後,輸出了一行字符串,終端並無被佔用,來執行docker ps -l
命令:
(MoeLove) ➜ ~ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9f2b81e85893 python "sleep 60" 5 seconds ago Up 4 seconds pensive_fermat
能夠看到容器也正在運行,符合咱們預期的 「後臺運行容器」 。
使用docker run
鏡像名 命令能夠啓動一個容器,在執行該命令時組合使用--interactive
和--tty
可直接與容器內應用程序進行交互。
容器啓動時,在鏡像名以後寫命令,可傳遞至咱們實驗的容器內(具體緣由會放在下一個部分的章節講)。
一樣地,當咱們啓動容器時,傳遞了--detach
參數,而且容器內執行的程序無需等待交互,則容器能夠啓動在後臺。
剛纔咱們的容器已經啓動在了後臺,若是此時想要在容器內執行一條命令,或者想要運行 Python 的解釋器該如何操做呢?
答案是用 docker exec:
(MoeLove) ➜ ~ docker run -d python sleep 60 10aad6e0af4fad2405c420a90fbf56f9689f033608e6f22d987c2f18d644eda9 (MoeLove) ➜ ~ docker exec -it 10aad6e0af4fad2405c420a90fbf56f9689f033608e6f22d987c2f18d644eda9 python Python 3.7.4 (default, Aug 14 2019, 12:09:51) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.version '3.7.4 (default, Aug 14 2019, 12:09:51) \n[GCC 8.3.0]'
如上所述,-it
仍然是--interactive
和--tty
的縮寫,最後的 python 是咱們預期要執行的命令,固然換成 bash 或者其餘命令也能夠。
(MoeLove) ➜ ~ docker exec -it 10aad6e0af4fad2405c420a90fbf56f9689f033608e6f22d987c2f18d644eda9 bash root@f396422ae58d:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
經過本節,咱們介紹了使用docker run
鏡像 來啓動一個容器,能夠給此命令傳遞--interactive
和--tty
(簡寫組合爲 -it)參數,以達到直接與容器內應用程序直接交互的目的。
另外也能夠在docker run
鏡像 以後傳遞命令和參數,以改變使用鏡像啓動容器後的默認行爲(因爲本篇是 Docker 入門的內容,爲了讓讀者更易理解,此處的表述不是很嚴謹,在下一部分的章節中會進行補充)。
好比,咱們能夠傳遞 sleep 60 讓上面例子中的 Python 容器啓動後休眠 60s;配合着給docker run
傳遞的--detach
參數,能夠實現將容器啓動在後臺的目的。
除了以上內容,還介紹了使用docker ps
可列出容器記錄,經過給它傳遞-l
參數可獲得最近的一條記錄。
若是是一個正在運行的容器,能夠經過docker exec -it
容器 ID/名稱 命令 的方式進入該容器內。
以上即是本節的所有內容,你可能會問,這就是「Docker 入門」嗎?事實上,是的。
Docker 一直以易用性著稱,且 Docker 也一直很注意用戶體驗,從 Docker 的首次面世到如今,一直都是用 docker run 鏡像 這樣簡單的一句命令便可啓動容器。
Docker 的其餘知識,後續章節中會經過實踐加深刻原理的方式,逐層遞進,帶你掌握 Docker 的核心知識!