本文你能學到什麼
Docker 是什麼Docker 概念關於 Docker 的概念是確實不太好總結,下面我通過四點向你說明 Docker 到底是個什麼東西。
Docker 是世界領先的軟體容器平臺。Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基於 Linux 核心 的cgroup,namespace,以及 AUFS 類的 UnionFS 等技術,對程序進行封裝隔離,屬於作業系統層面的虛擬化技術。由於隔離的程序獨立於宿主和其它的隔離的進 程,因此也稱其為容器。Docker 最初實現是基於 LXC.Docker 能夠自動執行重複性任務,例如搭建和配置開發環境,從而解放了開發人員以便他們專注在真正重要的事情上,構建傑出的軟體。使用者可以方便地建立和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的程式碼一樣。Docker 的基本組成架構看一張 Docker 架構圖
左邊大框框是我們進行 Docker 操作的宿主機,其運行了一個 Docker daemon 的核心守護程式,負責構建、執行和分發 Docker 容器。在宿主機中安裝了 Docker 客戶端,其與 Docker daemon 守護程序進行通訊,客戶端會將 build、pull、run 等命令傳送到 Docker daemon 守護程序進行執行。右框框為 Docker 登錄檔儲存 Docker 映象,是一個所有 Docker 使用者共享 Docker 映象的服務,Docker daemon 守護程序與之進行互動。下面是對架構中基本組成說明,比較詳細,大家看的時候可以對著架構圖看。概念這個東西,你看下就好,怎麼記都記不住的,只有你常用的東西才會記住和想著去記住它,看完本文,可以把下面的應用實踐一遍。
Registry映象倉庫,儲存大量映象,可以從映象倉庫拉取和推送映象。
Docker 映象類似虛擬機器快照,從倉庫拉取,或者在現有工具映象上建立新映象。通過映象可以啟動容器。
Docker 容器從映象中建立應用環境,以單程序的方式執行。對外公開服務。是一種短暫的和一次性的環境。
Docker 資料卷資料卷可以完成資料持久化,資料卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
資料卷可以在容器之間共享和重用對資料卷的修改會立馬生效對資料卷的更新,不會影響映象卷會一直存在,直到沒有容器使用Docker 網路Docker 容器之間的網路互動,可以使用埠對映的方式,其他容器可以直接通過埠實現。除該方式外還有一個容器連線(linking)系統也可以達到容器互動。(本文中 node 連線 mongodb 使用的是埠對映的方式)
關於Docker 網路模組,容器連線詳情推薦這篇文章:Docker的網路模式詳解
Docker 應用場景Docker 部署 Node 專案完整流程(DockerFile實踐)使用 Koa2 初始化一個 Node 專案,通過 Mongose 中介軟體 連線 Mogodb 資料庫,實現一個基礎介面 Mogodb 插入資料。專案地址:https://github.com/koala-coding/dockerstudy首先在專案根目錄下建立 .dockerignore 檔案,把不需要打包進 Docker Image 裡的檔案進行過濾# /usr/src/nodejs/dockerstudy/.dockerignore.gitnode_modules在專案的根目錄中建立 Dockerfile 檔案(Dockerfile 這裡重點講一下)部署 Node專案 的時候,會有一個 Dockerfile 檔案配置# /usr/src/nodejs/hello-docker/DockerfileFROM node:10.0# 在容器中建立一個目錄RUN mkdir -p /usr/src/nodejs/# 定位到容器的工作目錄WORKDIR /usr/src/nodejs/# RUN/COPY 是分層的,package.json 提前,只要沒修改,就不會重新安裝包COPY package.json /usr/src/app/package.jsonRUN cd /usr/src/app/RUN npm i# 把當前目錄下的所有檔案拷貝到 Image 的 /usr/src/nodejs/ 目錄下COPY . /usr/src/nodejs/EXPOSE 3000CMD npm start配置引數說明( DockerFile 學習):FROM:FROM 是構建映象的基礎源映象,該 Image 檔案繼承官方的 node image。詳細說明:Dockerfile 中 FROM 是必備的指令,並且必須是第一條指令!它引入一個映象作為我們要構建映象的基礎層,就好像我們首先要安裝好作業系統,才可以在作業系統上面安裝軟體一樣。RUN:後面跟的是在容器中要執行的命令。詳細說明:每一個 RUN 指令都會新建立一層,在其上執行這些命令,我們頻繁使用 RUN 指令會建立大量映象層,然而 Union FS 是有最大層數限制的,不能超過 127 層,而且我們應該把每一層中我用檔案清除,比如一些沒用的依賴,來防止映象臃腫。WORKDIR:容器的工作目錄COPY:拷貝檔案至容器的工作目錄下,.dockerignore 指定的檔案不會拷貝EXPOSE:將容器內的某個埠匯出供外部訪問CMD:Dockerfile 執行寫一個 CMD 否則後面的會被覆蓋,CMD 後面的命令是容器每次啟動執行的命令,多個命令之間可以使用 && 連結,例如 CMD git pull && npm start詳細說明:CMD 指令用來在啟動容器的時候,指定預設的容器主程序的啟動命令和引數。它有兩種形式CMD echo 1CMD ["npm", "run", "test"] 必須是雙引號第一種執行的命令會被包裝程,CMD [ "sh", "-c", "echo 1" ] JSON 陣列形式,一般推薦 JSON 陣列形式。容器中的應用都應該以前臺執行,而不是啟動後臺服務,容器內沒有後臺服務的概念。對於容器而言,其啟動程式就是容器應用程序,容器就是為了主程序而存在的,主程序退出,容器就失去了存在的意義。比如 CMD service nginx start 它等同於 CMD [ "sh", "-c", "service nginx start"] 主程序實際上是 sh,sh 也就結束了,sh 作為主程序退出了。ENV(補充)ENV 指令用來設定環境變數,它有兩種形式:ENV <key> <value>ENV <key1>=<value1> <key2>=<value2>...定義了環境變數,那麼在後續的指令中,就可以使用這個環境變數。程式碼環節暫且告一段落,將帶有 Dockerfile 提交到 github 或 gitlab等。以我的伺服器 centos7 為例,已安裝好 Docker。首先檢出程式碼,把專案克隆到指定目錄git clone https://github.com/koala-coding/dockerstudy進入目錄構建cd dockerstudydocker build -t dockerstudy .★build 命令用來製作映象,-t 是給映象打標籤,-f 引數是指定 Dockerfile 路徑,由於我們使用的是預設 Dockerfile 名稱,所以可以不同填寫該引數。最後一個.也不要省略,表示 Dockerfile 檔案的所在目錄, 代表是當前路徑,它指定映象構建的上下文。我們剛才說過,真正製作映象的是 docker server,當我們執行 build命令時,docker client 會將上下文路徑下的所有內容打包,然後上傳給 docker server。這樣當我們要在 Dockerfile 檔案中執行 如 COPY 指令,就可以將上下文中的檔案複製到映象中去了。”構建目標名稱 dockerstudy,是一個映象,可以通過 docker images 來列出所有的映象。一般應該會將 Dockerfile 置於一個空目錄下,或者專案根目錄下。如果該目錄下沒有所需檔案,那麼應該把所需檔案複製一份過來。如果目錄下有些東西確實不希望構建時傳給 Docker引擎,那麼可以用.gitignore 一樣的語法寫一個 .dockerignore。通過映象 dockerstudy 建立一個容器並執行。docker run --name dockerstudycontainer -d -p 3000:3000 dockerstudy說明:建立的容器名稱是 dockerstudycontainer,你可以理解為 pid,這個名稱唯一,建立之後如果不刪除會一直存在。-p 用來指定埠對映,將容器的埠3000對映到主機3000`埠上,這樣就可外部訪問了。此時在宿主機中可以使用curl測試伺服器提供的服務是否正常curl localhost:3000或者可以直接在瀏覽器中請求介面看一下輸出建立容器後,有時候需要看一下容器資源佔用,使用docker statsdocker stats dockerstudycontainer★如果是購買的阿里雲或者騰訊雲伺服器,注意這裡將自己購買的 centos 伺服器3000埠開放,在安全組”進入容器docker ls -a 檢視所有容器,包括當前容器的iddocker exec -it <id> bash日誌檢查 檢視執行日誌,“50425b8f2ef3” 為容器 ID$ docker logs -f 50425b8f2ef3但是到了這裡我還有個問題,那我真想看日誌檔案的時候,也不能每個容器進去看日誌,好浪費時間啊!有沒有什麼更高的方式?我會在下一篇文章《線上環境如何優雅的列印,儲存,分析日誌》中寫到。Docker 部署 Mongodb 環境遠端獲取 Mongodb 映象docker pull mongo
建立一個docker容器docker run -p 27017:27017 -v /data/db --name docker_mongodb -d mongo在上面的命令中,幾個命令引數的詳細解釋如下:-p 指定容器的埠對映(特殊說明:前面的是本機埠 ,後面的是容器的埠,新增-p引數主動將容器內部埠給暴漏出來,將伺服器的 27017 埠對映到容器的 27017 埠,這樣在外網就可通過 伺服器的 27017 埠訪問到我們的服務,Mongodb 預設埠為 27017。最終訪問的還是本機的埠)-v 為設定容器的掛載目錄,這裡是將即本機中的目錄掛載到容器中的/data/db中,作為 Mongodb 的儲存目錄--name 為設定該容器的名稱-d 設定容器以守護程序方式執行測試連線容器中的 Mongodb視覺化工具連線
以上是 MongoDB 容器建立後的資訊。接下來,我們使用 Robo 3T 圖形介面軟體嘗試開啟資料庫。開啟 RoBo 3T,選擇新建連線,按照下圖填入相關資料庫資訊,儲存。
注意其中的許可權認證。連線資料庫時候可能失敗,會出現問題,這時候注意一個問題,安全組問題,需要把安全組中的27017的 Mongodb 資料庫埠開啟
”
優雅部署方式 DockerComposeCompose 是 Docker 官方開源的一個專案,可以管理多個 Docker 容器組成一個應用,例如 Web 服務,除了服務本身還有資料庫、Redis、Nginx 等一系列相關聯服務需要安裝。
有個 Compose 的支援,我們只需要定義一個 YAML 格式的配置檔案(docker-compose.yml),來編寫一個專案所需要的多個容器配置及呼叫關係,通過簡單的命令即可同時開始或者關閉這些容器。Compose 定位是定義和執行多個 Docker 容器的應用。在這篇文章中不具體講 DockerCompose 使用,主要講清楚 Docker 基本架構各部分的應用,多實踐下哦!
Docker 帶來了什麼(優點)環境隔離('隔離,安全')Docker 實現了資源隔離,一臺機器執行多個容器互無影響。更高效的資源利用(節約成本)Docker 容器的執行不需要額外的虛擬化管理程式的支援,它是核心級的虛擬化,可以實現更高的效能,同時對資源的額外需求很低。更快速的交付部署(敏捷)使用 Docker,開發人員可以利用映象快速構建一套標準的研發環境,開發完成後,測試和運維人員可以直接通過使用相同的環境來部署程式碼。更易遷移擴充套件(可移植性)Docker 容器幾乎可以在任意的平臺上執行,包括虛擬機器、公有云、私有云、個人電腦、伺服器等,這種相容性讓使用者可以在不同平臺之間輕鬆的遷移應用。更簡單的更新管理(高效)使用 Dockerfile,只需要很少的配置修改,就可以替代以往大量的更新工作。並且所有修改都是以增量的方式進行分發和更新,從而實現自動化和高效的容器管理。Docker的常用命令映象常用命令docker pull [映象名稱:版本] 拉取映象docker images 映象列表docker rmi [映象名稱:版本] 刪除映象docker history [映象名稱] 映象操作記錄docker tag [映象名稱:版本][新映象名稱:新版本]docker inspect [映象名稱:版本] 檢視映象詳細docker search [關鍵字] 搜尋映象docker login 映象登陸
容器常用命令
docker ps -a 容器列表(所有容器)docker ps 檢視所有(執行的)容器docker exec -ti <id> bash 以 bash 命令進入容器內docker run -ti --name [容器名稱][映象名稱:版本] bash 啟動容器並進入docker logs 檢視容器日誌docker top <container_id> 檢視容器最近的一個程序docker run -ti --name [容器名稱] -p 8080:80 [映象名稱:版本] bash 埠對映docker rm <container_id> 刪除容器docker stop <container_id> 停止容器docker start <container_id> 開啟容器docker restart <container_id> 重啟容器docker inspect <container_id> 檢視容器詳情docker commit [容器名稱] my_image:v1.0 容器提交為新的映象\t
DockerFile常用命令在上面實戰中已經詳細講解,可以返回看,這裡就不再重複寫。
總結讀完本文後,你應該掌握了 Docker 的基本使用,對 Docker 這個概念不那麼陌生了,並且知道了它的應用場景,可以自己實踐下,這個過程也會出現很多問題的,實踐才能更好的記住那些知識以及常用命令。
作者kaola