【docker系列3】docker的基本使用

這是本專欄的第一部分:Docker 入門,共 3 篇,帶你們進入 Docker 的世界。上一節,我帶你們瞭解了 Docker 和容器技術的發展歷程,知道了它的基礎技術發展路線。下面一塊兒進入第二節的內容。python

Docker 安裝

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

其中:

  • –interactive 就如同它字面上的意思,使用此選項表示會保持標準輸入(STDIN)打開,從標準輸入來接收輸入信號;
  • –tty 參數則表示分配一個僞終端給容器。

這兩個選項經常一塊兒使用,用於與容器內程序直接進行交互。

理解了上述內容,咱們的第一個容器實驗也就順利結束了。

後臺運行容器

咱們並不老是但願一直保持與容器進行交互,如 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 的核心知識!

在這裏插入圖片描述

相關文章
相關標籤/搜索