Docker入門——用docker運行容器(一)

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"

容器中將執行一個死循環,直到容器停止爲止

這個容器記得停止運行,不然會一致循環下去的

好了,這篇文章就寫到這裏,下一次將會對運行中的容器進行一個小小的探索

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章