在我最新的文章中,我談到了 Vagrant 以及它如何幫助我們在幾分鐘內建立虛擬機,但如果可以做得更快、更好、更可自訂呢?讓我們學習如何使用 Docker 輕鬆開發、部署和執行應用程式!

目錄介紹Docker 與虛擬機安裝基本指令範例:Jenkins 容器資料持久化資料持久化-卷最後的想法資源

介紹

如果你谷歌一下Docker ,你會發現 Docker 是一個使用作業系統級虛擬化來建立自包含容器的軟體平台。

幸運的是,我會用簡單的英語向您解釋這意味著什麼。

您可能已經使用 Oracle VM 或Vagrant建立了多個虛擬機器。 Docker 就是類似的東西(但更好,稍後會詳細介紹)。

使用 Docker,我們選擇一個映像(將 Docker 映像視為配方)並下載它。然後,我們建立該映像或容器的實例,與虛擬機器非常相似。

影像:

用於建立一個或多個容器的套件或模板

容器:

影像的實例彼此隔離,有自己的環境。

但讓我們看看它的實際效果。這是一個docker映像程式碼:

``免費:23.04

執行 apt-get update

執行 apt-get install -y curl nginx`

還記得我說過 Docker 鏡像是一個食譜嗎?在此映像或配方中,Docker 取得 Ubuntu 23.04 版本,更新 SO,然後安裝curlnginx

誠然,這是一個簡短的 Docker 映像版本,但它幫助我們直觀地了解了 Docker 的含義。

現在,使用這個鏡像,我們可以建立一個容器(想像一個虛擬機),它將建立一個類似 Linux Ubuntu 的虛擬機,已經更新,帶有curl和nginx。

我們公司的所有開發人員都可以使用相同的映像來安裝相同的程式、軟體包和版本。不再有「但是…但它可以在我的電腦上執行!」;現在每台計算機都有相同的規格。

Docker 與虛擬機

但是…如果 Docker 建立了一個類似 VM 的容器,為什麼我們不只使用虛擬機器呢?

我可以從低層次的角度解釋Docker 容器如何比虛擬機器更好,甚至可以從另一個網站(如本網站)獲取一些很酷的資訊圖表,並解釋Docker 對每個容器使用相同的內核,使其輕量且快速,只需幾秒鐘即可旋轉一個容器:

圖片描述

但使用 Docker 和 Docker 容器有一個很大的優點:

想像一下,您想要開發一個 21.1 NodeJS:您建立自己的 Docker 映像,在其中取得 Ubuntu 映像,更新它,安裝所有 NodeJS 相關的東西,然後將該映像分發給開發團隊。

在正常設定中,您必須上傳 NodeJS 應用程式,將其部署到您的伺服器上,並且您必須確保伺服器具有所有依賴項並且其 NodeJS 與您的伺服器相容。

而且你不想為此打賭。

使用 Docker,我們可以建立 Docker 映像,將其上傳到 Docker 相容的伺服器,僅此而已。

Docker 伺服器不在乎你使用什麼 Linux、安裝什麼軟體包或你的應用程式的語言是什麼:它只需要執行映像。就是這樣。

讓我強調這一點:我們不關心伺服器安裝了什麼。我們上傳並執行 Docker 映像。這就是我們所要做的。

安裝

您可以安裝 Docker Desktop,這是一個 GUI Docker 應用程式,但我們這些強大的開發人員使用適當的終端工具,因此您將安裝 Docker Engine,即 Docker 的終端版本。

拋開笑話不談,您可以安裝任何您想要的內容: Docker DesktopDocker Engine ,只需確保遵循作業系統的說明即可。例如,對於基於 Debian 的發行版(例如 Ubuntu):

解除安裝先前的 Docker 版本

`sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

sudo rm -rf /var/lib/docker

sudo rm -rf /var/lib/containerd`

安裝 Docker

`curl -fsSL https://get.docker.com -o get-docker.sh

sudo sh ./get-docker.sh`

檢查 Docker 是否已安裝

sudo docker version

讓我們進行一個測試。在終端機中執行以下命令:

sudo docker run docker/whalesay cowsay boo

圖片描述

重要提示:每個 Docker 指令都需要 sudo 權限。您可以將使用者新增至docker群組,但儘管如此,它仍然不斷要求 sudo 權限。我發現透過執行命令sudo chmod 666 /var/run/docker.sock ,您不再被要求提供 sudo 權限(您可以使用類似的命令,例如chmod +x )。

基本指令

我們已經啟動並執行了 Docker。讓我們看看一些基本指令。如果你想要的話,你的麵包和黃油:

列出所有圖像

docker images

從鏡像下載或執行容器

docker run <IMAGE_NAME>

下載特定版本

docker run <IMAGE_NAME>:<VERSION>

在背景執行容器

docker run -d <IMAGE_NAME>

將容器從後台帶到前台

docker run attach <ID>

執行命令

`docker run ubuntu cat /etc/ release

docker執行ubuntu睡眠15`

下載鏡像以便稍後執行

docker pull <IMAGE_NAME>

在docker容器內執行指令

docker exec <COMMAND>

連接到容器的 bash

docker run -it <IMAGE_NAME> bash

列出所有正在執行的容器

docker ps

列出所有容器,無論是否執行

docker ps -a

執行一個帶有其他容器連結的容器:

`docker 執行 -p : - 關聯:

docker run -p 5000:80 --link redis:redis 投票應用`

從 JSON 格式的圖像或容器中獲取詳細訊息

docker inspect <NAME_OR_ID>

從背景執行的容器取得日誌

docker logs <NAME_OR_ID>

取得影像的所有圖層

docker history <IMAGE_NAME>

停止容器

docker stop <IMAGE_NAME_OR_ID>

永久刪除容器

docker rm <IMAGE_NAME_OR_ID>

永久刪除未使用的影像

docker rmi <IMAGE_NAME>

從 Dockerfile 建置映像

docker build . -t <NAME>

環境變數

`docker 執行 -e =

docker run -e APP_COLOR=blue simple-webapp-color`

範例:Jenkins 容器

讓我們使用一個現實生活中的範例:使用 Jenkins 容器。

在以後的文章中,我將更深入地討論 Jenkins 及其功能,但 Jenkins 是一個很棒的 DevOps CI/CD 工具。讓我們下載 Jenkins 並在我們的電腦上執行它:

`docker run jenkins/jenkins # 這會下載並執行 jenkins

docker ps # 取得容器ID和端口

碼頭工人檢查# 取得容器IP`

使用以下命令在虛擬機器中開啟瀏覽器:

docker run -p 8080:8080 jenkins/jenkins # Map the port

使用以下命令在主機中開啟瀏覽器:

在這裡,我們在 Ubuntu 虛擬機器中安裝並下載 Docker 映像並執行它。我們可以透過開啟瀏覽器並使用 Docker 容器的 IP 和連接埠來查看虛擬機器中的 Jenkins,但透過映射端口,我們可以在主機中開啟 Jenkins。

結構是:

使用 Windows 主機 -> Linux VM -> 在 Linux 中執行的 Docker 容器

現在,Linux 正在執行一個輕量級 Docker 容器,我們可以從 Windows 電腦存取它。那不是很好嗎?

資料持久化

我們停止 Jenkins 容器,第二天我們恢復它以繼續工作。但我們已經失去了一切。發生了什麼事????

僅 Docker 不具備資料持久性。

容器使用自己的資料夾(Jenkins 上的/var/jenkins_home 、MySQL 上的/var/lib/mysql等),但是當您停止容器並再次執行映像時,您將從頭開始建立容器。我們對於它可以做些什麼呢?

我們可以透過連結執行Docker的作業系統中的資料夾和容器的資料夾來實現資料持久化

`mkdir my_jenkins_data

docker run -p 8080:8080 -v /home/ /my_jenkins_data:/var/jenkins_home jenkins/jenkins`

在這裡,我們建立了一個名為my_jenkins_data的資料夾,並將其與 Jenkins 資料夾/var/jenkins_home連結,Docker 在其中儲存所有變更。

因此,如果我們再次執行該命令,我們將建立一個新容器,連結儲存的訊息,就像我們正在恢復容器一樣。

資料容量的持久性

我們可以簡化這個過程。我們可以讓 Docker 透過在/var/lib/docker/volumes/*中建立磁碟區來管理磁碟區,而不是為我們的資料夾提供長字串。

建立卷

docker volume create test_volume

這會在 /var/lib/docker/volumes/test_volume 中建立一個磁碟區

docker run -v test_volume:var/lib/mysql mysql

我們也可以使用現代的方式,它更長但更聲明性和冗長:

docker run / --mount type=bind, source=/data/mysql, target=/var/lib/mysql mysql

最後的想法

正如我們剛剛看到的,Docker 之所以出色,有以下幾個原因:

  1. 隔離性:Docker允許應用程式與底層系統隔離,確保不同環境下的一致性。

  2. 效率:透過容器化優化資源利用率,更有效率地利用系統資源。

  3. 可移植性:Docker容器可以在任何安裝了Docker的機器上執行,從而可以輕鬆地在不同環境中部署應用程式。

  4. 可擴展性:使用 Docker,可以根據需求透過增加或減少容器數量來輕鬆擴展應用程式。

  5. 一致性:Docker確保開發、測試和生產環境的一致性,減少「它在我的機器上執行」的問題。

  6. 生態系統:Docker 擁有豐富的生態系統,提供廣泛的工具和服務來補充容器化,使其成為應用程式部署和管理的多功能平台。

  7. 部署:Docker 讓部署變得更容易、更安全。我們不是管理套件及其版本,而是將 Docker 映像上傳到伺服器。

資源

原帖

Vagrant 初學者教程

Docker 桌面

Docker引擎

Docker 在 DevOps 中的作用

碼頭工人中心


原文出處:https://dev.to/davidmm1707/docker-basics-for-beginners-49l9


共有 0 則留言