Docker 極簡入門教程,傻瓜都能看懂!

2022-01-01 Java技術棧

Java技術棧

www.javastack.cn

關注閱讀更多優質文章

富 Web 時代,應用變得越來越強大,與此同時也越來越複雜。集群部署、隔離環境、灰度發布以及動態擴容缺一不可,而容器化則成為中間的必要橋梁。本文我們就來探索一下 Docker 的神秘世界,從零到一掌握 Docker 的基本原理與實踐操作。別再守著前端那一畝三分地,是時候該開疆擴土了。我需要蓋一個房子,於是我搬石頭、砍木頭、畫圖紙、蓋房子。一頓操作,終於把這個房子蓋好了。結果,住了一段時間,心血來潮想搬到海邊去。這時候按以往的辦法,我只能去海邊,再次搬石頭、砍木頭、畫圖紙、蓋房子。煩惱之際,跑來一個魔法師教會我一種魔法。這種魔法可以把我蓋好的房子複製一份,做成「鏡像」,放在我的背包裡。等我到了海邊,就用這個「鏡像」,複製一套房子,拎包入住。是不是很神奇?對應到我們的項目中來,房子就是項目本身,鏡像就是項目的複製,背包就是鏡像倉庫。如果要動態擴容,從倉庫中取出項目鏡像,隨便複製就可以了。Build once,Run anywhere!不用再關注版本、兼容、部署等問題,徹底解決了「上線即崩,無休止構建」的尷尬。虛擬機 Virtual Machine 指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整計算機系統。在實體計算機中能夠完成的工作在虛擬機中都能夠實現。在計算機中創建虛擬機時,需要將實體機的部分硬碟和內存容量作為虛擬機的硬碟和內存容量。每個虛擬機都有獨立的 CMOS、硬碟和作業系統,可以像使用實體機一樣對虛擬機進行操作。在容器技術之前,業界的網紅是虛擬機。虛擬機技術的代表,是 VMWare 和 OpenStack。

隨處運行:容器可以將代碼與配置文件和相關依賴庫進行打包,從而確保在任何環境下的運行都是一致的。

高資源利用率:容器提供進程級的隔離,因此可以更加精細地設置 CPU 和內存的使用率,進而更好地利用伺服器的計算資源。

快速擴展:每個容器都可作為單獨的進程予以運行,並且可以共享底層作業系統的系統資源,這樣一來可以加快容器的啟動和停止效率。

虛擬機雖然可以隔離出很多「子電腦」,但佔用空間更大,啟動更慢。虛擬機軟體可能還要花錢,例如VMWare;

容器技術不需要虛擬出整個作業系統,只需要虛擬一個小規模的環境,類似「沙箱」;

運行空間,虛擬機一般要幾 GB 到 幾十 GB 的空間,而容器只需要 MB 級甚至 KB 級。

虛擬機屬於虛擬化技術,而 Docker 這樣的容器技術,屬於輕量級的虛擬化。與虛擬機相比,容器更輕量且速度更快,因為它利用了 Linux 底層作業系統在隔離的環境中運行。虛擬機的 Hypervisor 創建了一個非常牢固的邊界,以防止應用程式突破它,而容器的邊界不那麼強大。Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。Docker 技術的三大核心概念,分別是:鏡像 Image、容器 Container、倉庫 Repository。

Build, Ship and Run(搭建、運輸、運行);

Build once, Run anywhere(一次搭建,處處運行);

Docker 本身並不是容器,它是創建容器的工具,是應用容器引擎;

Docker 三大核心概念,分別是:鏡像 Image,容器 Container、倉庫 Repository;

Docker 技術使用 Linux 內核和內核功能(例如 Cgroups 和 namespaces)來分隔進程,以便各進程相互獨立運行。

由於 Namespace 和 Cgroups 功能僅在 Linux 上可用,因此容器無法在其他作業系統上運行。那麼 Docker 如何在 macOS 或 Windows 上運行?Docker 實際上使用了一個技巧,並在非 Linux 作業系統上安裝 Linux 虛擬機,然後在虛擬機內運行容器。

鏡像是一個可執行包,其包含運行應用程式所需的代碼、運行時、庫、環境變量和配置文件,容器是鏡像的運行時實例。

Homebrew 的 Cask 已經支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 來進行安裝,執行如下命令:

更多安裝方式,請查看官方文檔:https://www.docker.com/get-started

{
  "registry-mirrors": [
    "http://hub-mirror.c.163.com/",
    "https://registry.docker-cn.com"
  ],
  "insecure-registries":[],
  "experimental": false,
  "debug": true
}

桌面端操作非常簡單,先去官網下載[1]。通過 Docker 桌面端,我們可以方便的操作:

clone:克隆一個項目

build:打包鏡像

run:運行實例

share:共享鏡像

安裝完 Docker 之後,我們先打個實際項目的鏡像,邊學邊用。

訪問地址:http://localhost:8080/。項目就緒,我們接著為項目打包:

這時候,項目目錄下的 Dist 就是我們要部署的靜態資源了,我們繼續下一步。需要注意:前端項目一般分兩類,一類直接 Nginx 靜態部署,一類需要啟動 Node 服務。本節我們只考慮第一種。關於 Node 服務,後文我會詳細說明。

cd docker-demo && touch Dockerfile

.
├── Dockerfile
├── README.md
├── babel.config.js
├── dist
├── node_modules
├── package.json
├── public
├── src
└── yarn.lock

可以看到我們已經在 docker-demo 目錄下成功創建了 Dockerfile 文件。具體這裡不再介紹,更多Docker系列教程可以關注公眾號Java技術棧搜索閱讀。運行你的 Docker 桌面端,就會默認啟動實例,我們在控制臺拉取 Nginx 鏡像:

Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Pull complete
8d69e59170f7: Pull complete
3f9f1ec1d262: Pull complete
d1f5ff4f210d: Pull complete
1e22bfa8652e: Pull complete
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

如果你出現這樣的異常,請確認 Docker 實例是否正常運行。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

鏡像準備 OK,我們在根目錄創建 Nginx 配置文件:

FROM nginx
COPY dist/ /usr/share/nginx/html/
COPY default.conf /etc/nginx/conf.d/default.conf

FROM nginx 指定該鏡像是基於 nginx:latest 鏡像而構建的;

COPY dist/ /usr/share/nginx/html/ 命令的意思是將項目根目錄下 dist 文件夾中的所有文件複製到鏡像中 /usr/share/nginx/html/ 目錄下;

COPY default.conf /etc/nginx/conf.d/default.conf 將 default.conf 複製到 etc/nginx/conf.d/default.conf,用本地的 default.conf 配置來替換 Nginx 鏡像裡的默認配置。

docker build -t jartto-docker-demo .

Sending build context to Docker daemon  115.4MB
Step 1/3 : FROM nginx
 ---> 2622e6cca7eb
Step 2/3 : COPY dist/ /usr/share/nginx/html/
 ---> Using cache
 ---> 82b31f98dce6
Step 3/3 : COPY default.conf /etc/nginx/conf.d/default.conf
 ---> 7df6efaf9592
Successfully built 7df6efaf9592
Successfully tagged jartto-docker-demo:latest

docker image ls | grep jartto-docker-demo

可以看到,我們打出了一個 133MB 的項目鏡像:

jartto-docker-demo latest 7df6efaf9592 About a minute ago 133MB

鏡像也有好壞之分,後續我們將介紹如何優化,這裡可以先暫時忽略。

docker run -d -p 3000:80 --name docker-vue jartto-docker-demo

在控制臺,我們可以通過 docker ps 查看剛運行的 Container 的 ID:

CONTAINER ID IMAGE              COMMAND                  CREATED       STATUS PORTS  NAMES
ab1375befb0b jartto-docker-demo "/docker-entrypoint.…"   8 minutes ago Up 7 minutes  0.0.0.0:3000->80/tcp  docker-vue

如果你使用桌面端,那麼打開 Docker Dashboard 就可以看到容器列表了,如下圖:

curl -v -i localhost:3000

或者打開瀏覽器,訪問:localhost:3000。如果你想為社區貢獻力量,那麼需要將鏡像發布,方便其他開發者使用。全流程結束,以後我們要使用,再也不需要「搬石頭、砍木頭、畫圖紙、蓋房子」了,拎包入住。這也是 Docker 獨特魅力所在。到這裡,恭喜你已經完成了 Docker 的入門項目!如果還想繼續深入,不妨接著往下看看。

指定基礎鏡像,所有構建的鏡像都必須有一個基礎鏡像,且 FROM 命令必須是 Dockerfile 的第一個命令

FROM <image> [AS <name>] 指定從一個鏡像構建起一個新的鏡像名字

FROM <image>[:<tag>] [AS <name>] 指定鏡像的版本 Tag

示例:FROM mysql:5.0 AS database

啟動容器後執行的命令,和 RUN 不一樣,RUN 是在構建鏡像是要運行的命令

當使用 docker run 運行容器的時候,這個可以在命令行被覆蓋

示例:CMD ["executable", "param1", "param2"]

也是執行命令,和 CMD 一樣,只是這個命令不會被命令行覆蓋

ENTRYPOINT ["executable", "param1", "param2"]

示例:ENTRYPOINT ["donnet", "myapp.dll"]

LABEL:為鏡像添加元數據,key-value 形式ENV:設置環境變量,有些容器運行時會需要某些環境變量

ENV <key> <value> 一次設置一個環境變量

ENV <key>=<value> <key>=<value> <key>=<value> 設置多個環境變量

示例:ENV JAVA_HOME /usr/java1.8/

EXPOSE:暴露對外的埠(容器內部程序的埠,雖然會和宿主機的一樣,但是其實是兩個埠)VOLUME:指定數據持久化的目錄,官方語言叫做掛載

VOLUME /var/log 指定容器中需要被掛載的目錄,會把這個目錄映射到宿主機的一個隨機目錄上,實現數據的持久化和同步。

VOLUME ["/var/log","/var/test"] 指定容器中多個需要被掛載的目錄,會把這些目錄映射到宿主機的多個隨機目錄上,實現數據的持久化和同步

VOLUME /var/data var/log 指定容器中的 var/log 目錄掛載到宿主機上的 /var/data 目錄,這種形式可以手動指定宿主機上的目錄

WORKDIR:設置工作目錄,設置之後 ,RUN、CMD、COPY、ADD 的工作目錄都會同步變更

WORKDIR <path>

示例:WORKDIR /app/test

USER:指定運行命令時所使用的用戶,為了安全和權限起見,根據要執行的命令選擇不同用戶

USER <user>:[<group>]

示例:USER test

ARG <name>[=<value>]

ARG name=sss

在掌握 Docker 常規操作之後,我們很容易就可以打出自己想要的項目鏡像。然而不同的操作打出的鏡像也是千差萬別。以下是在應用 Docker 過程中整理的最佳實踐,請儘量遵循如下準則:

Require 明確:需要什麼鏡像

步驟精簡:變化較少的 Step 優先

版本明確:鏡像命名明確

說明文檔:整個鏡像打包步驟可以重現

相關焦點

  • Docker 極簡入門教程
    在實體計算機中能夠完成的工作在虛擬機中都能夠實現。在計算機中創建虛擬機時,需要將實體機的部分硬碟和內存容量作為虛擬機的硬碟和內存容量。每個虛擬機都有獨立的 CMOS、硬碟和作業系統,可以像使用實體機一樣對虛擬機進行操作。在容器技術之前,業界的網紅是虛擬機。虛擬機技術的代表,是 VMWare 和 OpenStack。
  • Docker教程:Docker Compose入門
    在本教程中,我們將逐步介紹定義和部署一個簡單的多容器Web服務應用程式所需的步驟。 雖然Docker Compose通常用於開發和測試,但它也可用於部署生產應用程式。 為了討論這個問題,我們將專注於開發和測試場景。Docker Compose示例最小的Docker Compose應用程式由三個組件組成:1.
  • Docker(一):Docker入門教程
    本文詳細解釋介紹Docker入門相關內容,後期重點關注Docker在微服務體系中的使用。在了解Docker之前我們先考慮幾個問題:1、Docker是什麼?2、為什麼要使用Docker,它有什麼優勢?帶著這些問題我們來看看下面的內容。什麼是Docker?Docker 是世界領先的軟體容器平臺。開發人員利用 Docker 可以消除協作編碼時「在我的機器上可正常工作」的問題。
  • Docker 入門萬字詳解!新手也能看懂!
    無論基礎架構是在企業內部還是在雲端,或者混合使用兩者,容器都能滿足您的需求。1.1.2 容器不就是虛擬化嗎是,但也不竟然。我們用一種簡單方式來思考一下:虛擬化使得許多作業系統可同時在單個系統上運行。同時,您還將獲得高度的靈活性,從而實現對容器的高效創建、部署及複製,並能將其從一個環境順利遷移至另一個環境。1.2.1 Docker 如何工作?Docker 技術使用 Linux 內核和內核功能(例如 Cgroups 和 namespaces)來分隔進程,以便各進程相互獨立運行。
  • Day 40 生信必備第三個利器Docker 系列 (五) Docker container 操作
    1.生信必備神器Docker回顧前面我們分幾篇文章聊了Docker 是什麼Day 34 生信必備三個利器之Docker 系列 (一)Docker是什麼 # 100天生信/數據科學自我挑戰#,聊了如何使用 Docker發布的一個單細胞分析教程
  • 佳能單眼相機入門教程
    隨著人們生活的提高,單眼相機早已平民化了,但由於缺乏對相機的系統了解,很多朋友拿單反按照傻瓜相機用,為此給大家整理了關於佳能單眼相機入門教程,供大家學習
  • Docker入門,看了不理解,假一賠命
    現在用我的話寫出來,我覺得對於跟我相同開始情況的小白用戶,能省不少時間,所以我要寫。其次,確實,現在Docker相關的文章真的太多了,那我為什麼還要寫呢?首先,我一直都很好奇Docker這個東西,但從來沒有機會去使用它。但是,這學期OS課的lab,純Linux系統編程,雖然使用雙系統或者虛擬機都是純小學生的難易程度了,也不麻煩,但我想,為什麼不用Docker呢?
  • Docker 入門教程 - 2021 最新版(上)
    所有這些問題都可以通過以下方式解決:在與最終部署環境匹配的隔離環境(稱為容器)中開發和運行應用程式。將你的應用程式及其所有依賴項和必要的部署配置放入一個文件(稱為鏡像)中。並通過具有適當授權的任何人都可以訪問的中央伺服器(稱為倉庫)共享該鏡像。
  • 30 分鐘快速入門 Docker 教程
    我們可以使用 docker images 來查看本地鏡像列表。Docker 的容器可以簡單理解為提供了系統硬體環境,它是真正跑項目程序、消耗機器資源、提供服務的東西。例如,我們可以暫時把容器看作一個 Linux 的電腦,它可以直接運行。那麼,容器是基於鏡像啟動的,並且每個容器都是相互隔離的。注意的是,容器在啟動的時候基於鏡像創建一層可寫層作為最上層。
  • 快速入門 Docker 實戰教程 | 圖文並茂
    我們可以使用 docker images 來查看本地鏡像列表。Docker 的容器可以簡單理解為提供了系統硬體環境,它是真正跑項目程序、消耗機器資源、提供服務的東西。例如,我們可以暫時把容器看作一個 Linux 的電腦,它可以直接運行。那麼,容器是基於鏡像啟動的,並且每個容器都是相互隔離的。注意的是,容器在啟動的時候基於鏡像創建一層可寫層作為最上層。
  • Docker 入門終極指南,這是我見過最好的教程!
    在實體計算機中能夠完成的工作在虛擬機中都能夠實現。在計算機中創建虛擬機時,需要將實體機的部分硬碟和內存容量作為虛擬機的硬碟和內存容量。每個虛擬機都有獨立的 CMOS、硬碟和作業系統,可以像使用實體機一樣對虛擬機進行操作。在容器技術之前,業界的網紅是虛擬機。
  • 「R」R Docker 教程
    ❝最近由於研究需要,複習下 Docker,找到了本教程,分兩次推送,感興趣的可以跟著學習。原英文網址:http://ropenscilabs.github.io/r-docker-tutorial❞這是專門為具有 R 和 RStudio 知識的朋友設計的 Docker 教程。
  • Docker小白到實戰之常用命令演示,通俗易懂
    docker events:從docker 服務獲取實時事件,通俗一點理解就是操作日誌,比如對鏡像、容器、網絡、掛載卷等操作,就會記錄對應的事件信息;最多能返回最近的1000條日誌信息2.3 容器常用命令容器是用鏡像創建的運行實例, 它可以被啟動、開始、停止、刪除,每個容器都是相互隔離;可以把容器看做是一個極簡版的Linux環境和在其中運行程序的組合;容器和鏡像幾乎一樣,唯一的區別就是鏡像層上面加載了一個可寫層,這層稱為
  • 史上講解最好的 Docker 教程,從入門到精通
    無論基礎架構是在企業內部還是在雲端,或者混合使用兩者,容器都能滿足您的需求。1.1.2 容器不就是虛擬化嗎是,但也不竟然。我們用一種簡單方式來思考一下:虛擬化使得許多作業系統可同時在單個系統上運行。容器則可共享同一個作業系統內核,將應用進程與系統其他部分隔離開。
  • 史上講解最好的Docker教程,從入門到精通(建議收藏的教程)
    無論基礎架構是在企業內部還是在雲端,或者混合使用兩者,容器都能滿足您的需求。1.2 容器不就是虛擬化嗎是,但也不竟然。我們用一種簡單方式來思考一下:虛擬化使得許多作業系統可同時在單個系統上運行。同時,您還將獲得高度的靈活性,從而實現對容器的高效創建、部署及複製,並能將其從一個環境順利遷移至另一個環境。2.1 Docker 如何工作?Docker 技術使用 Linux 內核和內核功能(例如 Cgroups 和 namespaces)來分隔進程,以便各進程相互獨立運行。
  • 一篇文章搞定 Docker 入門
    所以 Docker 之所以能火,是因為它比普通虛擬機輕巧!倉庫類似於 Github,我們寫好的代碼會提交到 Github 上面進行保存和管理,方便在其他地方也能下載代碼。鏡像倉庫也是類似的,製作好的鏡像,就把它放到鏡像倉庫,方便其他人直接用鏡像部署。
  • Docker,救你於「深度學習環境配置」的苦海
    一、Docker、深度學習鏡像、Nvidia-docker的安裝安裝這種事兒,真不想詳細寫。因為這裡確實沒有很多坑。1. Docker的安裝連結:https://docs.docker.com/install/linux/docker-ce/ubuntu/跟著教程一路複製粘貼回車即可。
  • 高質量播放器方案-madVR渲染器教程-入門篇
    註:中低配置檔針對HD4000及以下配置的核顯/入門神卡,中等配置針對HD4600以及同等位置顯卡,中高配置針對移動級960M以及同等級的顯卡,高配置針對960以及同等級左右的顯卡。其餘方案由於缺少測試條件,暫不提供。設置主要針對FHD24Fps 視頻,若播放出現卡頓請自行更改配置。
  • 10 分鐘帶你從入門到精通的 Docker 小白實戰教程
    我不僅要保證站點本地能跑通,還必須要保證遠程 VPS 的健康運行……可是,由於搭建了許多站點,VPS 伺服器環境相當複雜(或許這就是 MySQL 掛掉的原因),光 Apache 配置文件都幾百行了。重做系統的遷移成本,光是想一想就耗光了我所有的勇氣。
  • docker入門(上)
    這些都是官方的說法,我對於docker的理解,就是一個能夠快速的管理應用和作業系統池子的工具,在本地可以通過docker快速的啟動運行被稱為「鏡像」的應用或作業系統。一旦運行起來,我們就可以對其進行修改,所以這時它被稱為「容器」。我們的更改會層式的疊加,最後我們可以把更改後的結果打成一個全新的鏡像。