在我最新的文章中,我談到了 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,然後安裝curl和nginx 。
誠然,這是一個簡短的 Docker 映像版本,但它幫助我們直觀地了解了 Docker 的含義。
現在,使用這個鏡像,我們可以建立一個容器(想像一個虛擬機),它將建立一個類似 Linux Ubuntu 的虛擬機,已經更新,帶有curl和nginx。
我們公司的所有開發人員都可以使用相同的映像來安裝相同的程式、軟體包和版本。不再有「但是…但它可以在我的電腦上執行!」;現在每台計算機都有相同的規格。
但是…如果 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 Desktop或Docker 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 是一個很棒的 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 之所以出色,有以下幾個原因:
隔離性:Docker允許應用程式與底層系統隔離,確保不同環境下的一致性。
效率:透過容器化優化資源利用率,更有效率地利用系統資源。
可移植性:Docker容器可以在任何安裝了Docker的機器上執行,從而可以輕鬆地在不同環境中部署應用程式。
可擴展性:使用 Docker,可以根據需求透過增加或減少容器數量來輕鬆擴展應用程式。
一致性:Docker確保開發、測試和生產環境的一致性,減少「它在我的機器上執行」的問題。
生態系統:Docker 擁有豐富的生態系統,提供廣泛的工具和服務來補充容器化,使其成為應用程式部署和管理的多功能平台。
部署:Docker 讓部署變得更容易、更安全。我們不是管理套件及其版本,而是將 Docker 映像上傳到伺服器。
原文出處:https://dev.to/davidmm1707/docker-basics-for-beginners-49l9