Docker入門教程之拉取/創(chuàng)建鏡像以及運行和管理容器
寫在前面:
本篇簡單介紹一下如何入手 Docker,從 創(chuàng)建/拉取 鏡像,再到運行和管理容器,還包括導出容器等操作。這里先貼一下官方的文檔地址:
Docker Docs:https://docs.docker.com/
一、Docker 介紹
作為一個開源的應用容器引擎,Docker 可以讓開發(fā)者將應用以及應用的依賴打包到一個可移植的容器中,然后發(fā)布到任何安裝了 Docker 的服務器上運行。這些容器就像一個個輕量級的虛擬機,但與傳統(tǒng)虛擬機相比,Docker 容器更加高效、快速和資源友好。
主要特點:
輕量級
Docker 容器共享主機內(nèi)核,不需要像虛擬機那樣模擬完整的操作系統(tǒng),因此啟動速度極快,通常在幾秒鐘內(nèi)就能啟動。
占用的資源少,多個容器可以在同一臺服務器上高效運行,提高了服務器的利用率。可移植性
由于容器包含了應用及其所有依賴,所以可以在不同的環(huán)境中輕松遷移,無論是從開發(fā)環(huán)境到測試環(huán)境,還是從本地服務器到云服務器。
保證了應用在不同環(huán)境中的一致性運行,減少了因環(huán)境差異導致的問題。高效性
容器的快速啟動和停止特性使得應用的部署和擴展變得非常容易。
可以根據(jù)需求快速創(chuàng)建和銷毀容器,實現(xiàn)彈性的資源分配。隔離性
每個容器都有自己獨立的文件系統(tǒng)、網(wǎng)絡和進程空間,實現(xiàn)了應用之間的隔離。
一個容器中的問題不會影響到其他容器,提高了系統(tǒng)的穩(wěn)定性和安全性。
核心組成:
鏡像(Image)
是一個只讀的模板,包含了應用程序及其所有依賴(如庫、框架、配置文件等)。
可以從 Docker 倉庫中下載或自己創(chuàng)建鏡像,然后基于鏡像創(chuàng)建容器。容器(Container)
是由鏡像創(chuàng)建的運行實例,是一個獨立的運行環(huán)境。
可以對容器進行啟動、停止、刪除等操作,也可以在容器中運行應用程序。倉庫(Repository)
用于存儲和分發(fā) Docker 鏡像,可以是公共倉庫(如 Docker Hub),也可以是私有倉庫。
開發(fā)者可以將自己創(chuàng)建的鏡像推送到倉庫中,以便在不同的環(huán)境中使用。
使用場景:
應用部署
簡化了應用的部署過程,提高了部署的效率和可靠性。
可以快速將應用部署到多臺服務器上,實現(xiàn)大規(guī)模的應用部署。微服務架構
適合用于構建微服務架構,每個微服務可以運行在一個獨立的容器中。開發(fā)環(huán)境一致性
保證了開發(fā)、測試和生產(chǎn)環(huán)境的一致性,減少了因環(huán)境差異導致的問題。
開發(fā)者可以在本地使用與生產(chǎn)環(huán)境相同的容器來進行開發(fā)和測試。
二、創(chuàng)建鏡像
這里介紹幾種常見的創(chuàng)建鏡像的方式,大家可以根據(jù)自己需求選擇。
2.1 從 Docker Hub 拉取鏡像
第一步:登錄/注冊 Docker Hub
如果沒有則先去官網(wǎng)(https://hub.docker.com/)注冊一個,然后登錄即可(Desktop版圖形化操作即可,普通的則打開終端輸入 “ docker login ”)。
第二步:查找所需的鏡像
可以直接在官網(wǎng)去搜索即可,這里寫幾個常用的鏡像:
- Alpine:基于輕量級 Linux 操作系統(tǒng)的鏡像,體積非常小巧,只有 5MB 左右,提供了一些基本的工具和包,如
bash、curl、gcc等,適合構建輕量級的容器。 - Ubuntu:基于 Debian 的 Linux 操作系統(tǒng),常用版本(LTS):22.04、20.04、18.04;
- Nginx:廣泛使用的 Web 服務器軟件,也可用作反向代理、負載均衡和 HTTP 緩存服務器。結合其他技術如 WordPress 等,可以用于構建高性能的 Web 應用程序。
- Redis:基于內(nèi)存的數(shù)據(jù)存儲系統(tǒng),常用于實時數(shù)據(jù)緩存、排名、計數(shù)器、分布式會話管理等方面,具有快速、可靠且易于使用的特點,適合構建可擴展的分布式系統(tǒng)。
- MySQL:流行的關系數(shù)據(jù)庫管理系統(tǒng),支持多數(shù)據(jù)類型、多連接和高性能,是開發(fā)人員構建數(shù)據(jù)庫應用程序的常用選擇之一。
- Node.js:基于 JavaScript 的后端服務器技術,支持高性能、非阻塞 I/O 和事件驅動編程,許多開發(fā)者使用它來構建 Node.js 的 Web 應用程序和 Web 服務。
- Tomcat:一個流行的 Java Web 應用服務器,用于運行 Java Web 應用程序3。
- CentOS:一種常用的 Linux 發(fā)行版鏡像,提供了穩(wěn)定的操作系統(tǒng)環(huán)境,適合用于各種服務器應用的部署。
第三步:拉取所需鏡像
在命令行中輸入docker pull [鏡像名稱]:[標簽]。
如果不指定標簽,默認會拉取 latest(最新)標簽的鏡像。
例如,要拉取官方的 Ubuntu 鏡像,可輸入
docker pull ubuntu # 最新版 docker pull ubuntu:22.04 # 特定版
后續(xù):可創(chuàng)建自己的鏡像倉庫
登錄上 Docker Hub,在存儲庫頁面上,選擇創(chuàng)建存儲庫。
將其進行命名,比如<you-username>/my-Privateal-repo,將可見性設置為私有。
配置完自己鏡像后,可以上傳到倉庫。上傳鏡像之前,先對鏡像進行標記:
docker tag my_image:latest <you-username>/my-Privateal-repo
使用 docker push 命令將標記后的鏡像上傳到私有倉:
docker push <you-username>/my-private-repo
當然,可以在另外機器上或使用 pull 拉取驗證鏡像。
2.2 用 Dockerfile 創(chuàng)建鏡像
Dockerfile 是一個文本文件,包含了一系列指令,用于描述如何構建一個 Docker 鏡像。這些指令會按照順序依次執(zhí)行,最終生成一個包含特定應用及其依賴的鏡像,使用 Dockerfile 創(chuàng)建鏡像是一種常見且高效的方式,
常見指令:
FROM:指定基礎鏡像,它是構建新鏡像的起點。例如:FROM ubuntu:22.04。RUN:在鏡像構建過程中執(zhí)行命令??梢杂糜诎惭b軟件包、配置環(huán)境等。例如:RUN apt-get update && apt-get install -y python3。COPY或ADD:將本地文件或目錄復制到鏡像中。例如:COPY. /app將當前目錄下的所有文件復制到鏡像中的/app目錄。WORKDIR:設置工作目錄。例如:WORKDIR /app將后續(xù)命令的工作目錄設置為/app。CMD或ENTRYPOINT:指定容器啟動時要執(zhí)行的命令。例如:CMD ["python", "app.py"]表示啟動容器時運行python app.py命令。
示例:
先編寫一個 app.py 文件:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)再創(chuàng)建一個 Dockerfile 文件:
FROM python:3.10 WORKDIR /app COPY.. RUN pip install flask EXPOSE 5000 CMD ["python", "app.py"]
上面的 Dockerfile 中,設置了工作目錄,拷貝當前目錄文件到鏡像內(nèi),并安裝了 Flask 庫,暴露容器的 5000 端口,最后在容器啟動后運行命令啟動程序。
接下來只需要在包含 Dockerfile 和 app.py 文件的目錄下,運行構建鏡像即可:
docker build -t myflaskapp:latest .
其中 -t 參數(shù)指定鏡像的名稱和標簽,最后的 . 表示 Dockerfile 所在的目錄。
構建鏡像后,啟動容器即可:
docker run -p 5000:5000 myflaskapp:latest
這里將容器的 5000 端口映射到主機的 5000 端口,這樣就可以在瀏覽器中訪問http://localhost:5000 來查看 Flask 應用的輸出。
Dockerfile 的優(yōu)勢:
- Dockerfile 本身就是一種文檔,它清晰地展示了鏡像的構建過程和包含的內(nèi)容。其他開發(fā)人員可以更容易理解和使用這個鏡像;
- 可以根據(jù)具體需求自定義鏡像的內(nèi)容和配置??梢赃x擇不同的基礎鏡像、安裝特定的軟件包、設置環(huán)境變量等,滿足各種復雜的應用場景;
- 可以確保每次構建的鏡像都是一致的,無論在哪個環(huán)境中構建。
存在的不足:
- 當構建復雜的鏡像時,Dockerfile 可能會變得冗長和復雜,需要合理組織指令和管理依賴關系;
- 如果配置中使用了不可信的源或安裝了未知的軟件包,可能會引入安全風險。需要謹慎選擇基礎鏡像和軟件源;
- 當基礎鏡像較大或者需要下載大量的軟件包時,構建過程可能會比較耗時,并且依賴于良好的網(wǎng)絡連接。
之前我們遇到過,當配置的軟件源更新或者網(wǎng)絡原因等,導致無法構建甚至版本控制不理想等問題。所以對于相對復雜的鏡像環(huán)境,還是不建議這樣構建,直接傳輸鏡像會更穩(wěn)定。
2.3 導出的鏡像文件直接導入
Docker 支持直接把容器導出成 tar 的壓縮文件,然后從這個文件導入鏡像,即可完美復刻容器的環(huán)境和內(nèi)容。
1. 找出要導出容器的 名稱 或 ID
docker ps # 會列出正在運行的容器 docker ps -a # 會列出所有的容器
2. 導出容器到 .tar 文件
docker export container_name > container.tar
后面的文件名可以自己指定
3. 在目標電腦上導入鏡像
docker import container.tar new_image_name:tag
其中 new_image_name 是新鏡像的名稱,tag 是標簽(可選)。
這種方法的好處就是:對于特定狀態(tài)的容器,可以快速地在不同環(huán)境中進行遷移,無需重新構建鏡像。如果目標環(huán)境沒有網(wǎng)絡連接或者網(wǎng)絡受限,這種方式可以避免從遠程倉庫拉取鏡像的問題。
當然,與使用 Dockerfile 構建的鏡像不同,通過這種方式導入的鏡像沒有構建歷史記錄。這可能會在一些需要追蹤構建過程或進行調(diào)試的情況下帶來不便。
三、運行和管理容器
3.1 命令行運行
可以基于之前生成的鏡像來啟動容器,當然一個鏡像可以啟動多個容器,但是一個容器一定是基于某個鏡像的。命令比較簡單,這里就著重給大家介紹幾個常用的配置。
1. 分離模式
以分離模式(detached mode)運行容器,即容器在后臺運行,不會將容器的輸出打印到終端。
docker run -d my_image
2. 映射端口
將主機的 某個 端口映射到容器的 指定 端口,比如 8080-80,這樣可以通過訪問主機的 8080 端口來訪問容器內(nèi)運行在 80 端口的服務。
docker run -p 8080:80 my_image
3. 容器命名
為容器命名,方便后續(xù)對該容器進行管理和識別。不寫則會隨機生成,可用 docker ps -a 查找。
docker run --name my_container my_image
4. 掛載目錄
將主機上的指定目錄掛載到容器內(nèi)的指定目錄,實現(xiàn)數(shù)據(jù)持久化,并且兩側是同步的。
docker run --name my_container -v /host/data:/container/data my_image
5. 設置環(huán)境變量
設置環(huán)境變量和值,容器內(nèi)的應用可以讀取這個環(huán)境變量。
docker run --name my_container -e MY_ENV_VARIABLE=value my_image
6. 限制內(nèi)存
限制容器使用的內(nèi)存,防止容器過度占用主機資源。(Windows 下可能不行,得改 WSL2配置)
docker run --name my_container --memory 512m my_image
7. 限制核心
限制容器最多使用主機 CPU 核心數(shù)。(Windows 下可能不行,得改 WSL2配置)
docker run --name my_container --cpus 0.5 my_image
8. 連接網(wǎng)絡
將容器連接到 Docker 網(wǎng)絡,如果該網(wǎng)絡不存在,Docker 會自動創(chuàng)建。這樣可以方便容器之間的通信和網(wǎng)絡隔離。(當然,網(wǎng)絡模式有很多種,我的另一篇有詳細介紹)
docker run --name my_container --network my_network my_image
9. 退出重啟
設置容器的自動重啟策略為總是在退出時自動重啟。這在容器因某些原因意外退出時很有用,可以確保服務的連續(xù)性。
docker run --name my_container --restart always my_image
容器開啟后,就可以運行程序了,當然可以打開新的終端,輸入命令進入到容器內(nèi)部:
docker exec -it [容器名稱或 ID] /bin/bash
這里的 -i 表示允許交互,-t 表示分配一個偽終端。這樣就可以進入容器并啟動一個 bash shell。
想退出用 exit 即可,但是退出后容器默認會在后臺運行。
停止容器:
docker stop [容器名稱或 ID]
發(fā)送一個 SIGTERM 信號給容器,讓容器內(nèi)的主進程有機會進行優(yōu)雅的關閉。如果容器在一段時間內(nèi)(默認是 10 秒)沒有停止,Docker 會發(fā)送一個 SIGKILL 信號強制停止容器。
刪除容器:
docker rm [容器名稱或 ID]
刪除一個已停止的容器。如果容器正在運行,需要先停止容器才能刪除。
docker rm -f [容器名稱或 ID]
強制刪除一個正在運行的容器。使用這個命令時要注意,可能會導致數(shù)據(jù)丟失或其他問題。
查看容器日志:
docker logs [容器名稱或 ID]
查看容器的日志輸出??梢允褂?code>-f參數(shù)來實時跟蹤日志輸出。
重啟容器:
docker restart [容器名稱或 ID]
復制文件:
docker cp [源路徑] [容器名稱或 ID]:[目標路徑]
將本地文件或目錄復制到容器中。
docker cp [容器名稱或 ID]:[源路徑] [目標路徑]
將容器中的文件或目錄復制到本地。
3.2 Docker Compose
Docker Compose 是一個用于定義和運行多容器應用程序的工具,它是開啟精簡高效的開發(fā)和部署體驗的關鍵??梢砸淮涡詥踊蛲V苟鄠€相關容器,提高開發(fā)和調(diào)試效率。
可以在單個易于理解的 YAML 配置文件中輕松管理服務、網(wǎng)絡和卷。然后,通過一個命令,就可以從配置文件中創(chuàng)建并啟動所有服務。
注意,適用于多容器和復雜管理的情況,容器較少的情況下就沒有必要了。
使用之前需要安裝,這里不具體介紹,根據(jù)官方文檔即可??梢杂么嗣畈榭矗?/p>

使用需要創(chuàng)建一個 docker-compose.yml 文件,在文件中定義服務(容器)、網(wǎng)絡、卷等。
這里展示一個示例,包含一個 Web 服務器(Nginx)和一個后端應用(假設是一個 Python Flask 應用):
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
-./nginx_config:/etc/nginx/conf.d
networks:
- mynetwork
app:
build:.
command: python app.py
volumes:
- app_data:/app/data
networks:
- mynetwork
environment:
- DB_HOST=db
- DB_PORT=5432
- DB_NAME=mydb
- DB_USER=myuser
- DB_PASSWORD=mypassword
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
- POSTGRES_DB=mydb
networks:
- mynetwork
volumes:
app_data:
db_data:
networks:
mynetwork:
driver: bridge上面配置中,通過 networks 部分定義了一個名為 mynetwork 的網(wǎng)絡,類型為 bridge。三個服務(web、app 和 db)都連接到這個自定義網(wǎng)絡,使得它們可以通過服務名稱相互通信。
定義了兩個卷 app_data 和 db_data。web 服務將本地的 ./nginx_config 目錄掛載到容器內(nèi)的 /etc/nginx/conf.d,用于配置 Nginx。
app 服務將卷 app_data 掛載到容器內(nèi)的 /app/data,用于數(shù)據(jù)存儲。db 服務將卷 db_data 掛載到容器內(nèi)的 /var/lib/postgresql/data,用于 PostgreSQL 數(shù)據(jù)庫的數(shù)據(jù)存儲。
四、總結
上面詳細介紹了 Docker 的基本操作,涵蓋了生成鏡像、運行容器以及管理容器等多方面內(nèi)容。然而,Docker 作為一款功能極為強大的軟件,其能力遠不止于此。
在容器間的交互方面,Docker 支持容器間的加密通訊,確保數(shù)據(jù)在不同容器之間傳輸?shù)陌踩院捅C苄浴Mㄟ^加密機制,敏感信息得以在復雜的容器化環(huán)境中安全流轉。
同時,Docker 擁有豐富的插件功能。例如,某些插件可以實現(xiàn)更高效的存儲管理,優(yōu)化容器對存儲資源的利用;還有些插件能夠增強網(wǎng)絡配置的靈活性,為容器間的通訊提供更多定制化的選項。此外,插件還可以與其他工具和技術進行集成,進一步提升 Docker 在不同場景下的適用性和實用性。
官方文檔內(nèi)容也比較多,大家按需學習即可。
到此這篇關于Docker入門教程之拉取/創(chuàng)建鏡像以及運行和管理容器的文章就介紹到這了,更多相關Docker拉取創(chuàng)建鏡像及運行和管理容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Docker-client for python詳解及簡單示例
這篇文章主要介紹了Docker-client for python詳解及簡單示例的相關資料,需要的朋友可以參考下2017-04-04
docker容器增加或者修改容器映射端口的實現(xiàn)方法
在只有使用docker安裝的容器,沒有使用docker-compose或者其他客戶端工具,如果要增加或者修改容器端口,也是可以增加或者修改容器端口映射,本文給大家介紹了docker容器增加或者修改容器映射端口的實現(xiàn)方法,需要的朋友可以參考下2025-01-01
docker --link容器互聯(lián)的實現(xiàn)
–link可以通過容器名互相通信,容器間共享環(huán)境變量,本文主要介紹了docker --link容器互聯(lián)的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
docker compose安裝es+kibana 8.12.2的詳細過程
因云平臺需要改造,es7升級為es8,所以記錄一下,es8需要開啟ssl認證,需要配置證書,全本帶你用docker安裝,便于后面es8的學習,這篇文章主要介紹了docker compose安裝es+kibana 8.12.2的詳細過程,感興趣的朋友跟隨小編一起看看吧2024-05-05
docker部署Prometheus+Cadvisor+Grafana實現(xiàn)服務器監(jiān)控
這篇文章主要為大家介紹了docker部署Prometheus+Cadvisor+Grafana實現(xiàn)服務器監(jiān)控,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
如何解決IDEA無法連接docker中的數(shù)據(jù)庫的問題
這篇文章主要介紹了如何解決IDEA無法連接docker中的數(shù)據(jù)庫的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06

