Docker學習記錄
Docker簡介
Docker是一個用於構建、執行、傳送(build,run,share)應用程式的平臺。可以將應用程式和他執行時所需要的各種依賴包,第三方軟體,配置檔案等打包到一起。以便在任何環境中都可以正確的執行。
Docker和虛擬機器的區別?
虛擬機器是透過虛擬化(Hypervisor)的技術實現的。可以將一臺物理伺服器虛擬成多臺邏輯伺服器,每個邏輯伺服器都有自己的作業系統,CPU,記憶體,硬碟和網路介面等等。他們之間是完全隔離的,可以獨立執行。虛擬機器在一定程度上實現了資源的整合,可以將一臺伺服器的計算能力,儲存能力和網路資源分配給多個邏輯伺服器,實現多臺伺服器的功能。缺點是每臺伺服器需要佔用大量的資源,比如CPU、記憶體、硬碟、網路等等。啟動速度特別慢。且大部分情況一臺伺服器只需要執行一個主要對外服務的應用程式就可以了。並不需要一個完整的作業系統所提供的所有功能。這樣的話會佔用大量的資源,啟動速度也受到影響。
容器和Docker是兩個不同的概念,Docker非常的流行,所以有的人會把他們視為一談。Docker只是容器的一種實現,是一個容器化的解決方案和平臺。而容器是一種虛擬化技術,和虛擬機器類似也是一個獨立的環境,可以在這個環境中執行應用程式,和虛擬機器不同的是,他不需要再容器中執行一個完整的作業系統,而是使用宿主機的作業系統,所以啟動速度非常快,同時因為所需要的資源更少,所以可以在一臺物理伺服器上執行更多的容器,這樣就可以更充分的利用伺服器的資源,減少資源的閒置和浪費,
基本原理和概念
- Docker映象(Image):映象是一個只讀的模板,可以用來建立容器;
- Docker容器(Container):容器是映象的執行例項,它是一個獨立的環境,可以在這個環境中執行應用程式,一個映象可以建立多個容器;
- Docker倉庫(Repository):Docker倉庫是用來儲存Docker映象的地方,比如DockerHub,我們可以在這裡下載各種映象,也可以將自己的映象上傳到這裡。
安裝
在官網上下載安裝包,一路next安裝。安裝成功後會重啟。
需要開啟虛擬化功能。 Windows 系統需要開啟 Hyper-v 功能,否則 Docker 會無法正常工作。
遇到問題,我的 win 11 家庭版沒有虛擬化功能。解決方案參考文章:開啟虛擬化解決方法
解決後重啟電腦就可以了。
error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/v1.47/version": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.
發生這個報錯的原因是未開啟 Docker 桌面版。
Docker 的體系結構
- Docker Engine:Docker引擎,是一個C/S架構的應用程式,它包含了一系列的命令列工具,比如docker、dockerd、docker-compose、docker-machine、docker-swarm等。
- Docker Client:Docker客戶端,是一個命令列工具,用來傳送命令給Docker引擎,比如docker run、docker pull、docker build等。
- Docker Daemon:Docker守護程序,是一個後臺程序,用來接收並處理來自Docker客戶端的請求,然後將結果返回給Docker客戶端。
- Docker Compose:Docker組合,是一個命令列工具,用來定義和執行由多個容器組成的應用程式。
- Docker swarm:是管飯提供的一個容器編排和叢集管理工具,用來管理多個Docker主機,透過Swarm可以將多個Docker主機抽象為一個Docker主機,實現負載均衡和容器高可用等功能。
建立映象,啟動容器
Dockerfile是一個文字檔案,用於自動化構建映象,Dockerfile中包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
Dockerfile中的指令不區分大小寫,但是為了可讀性,建議使用大寫。
Dockerfile中的指令按照從上到下的順序執行。
Dockerfile指令
-
FROM:指定基礎映象,必須為Dockerfile檔案的第一條指令;
FROM [base_image]
-
MAINTAINER:指定映象的作者和聯絡方式;
-
ADD:用於將檔案複製到映象中,源可以是URL或者本地檔案,也可以是一個壓縮檔案(自動解壓);
-
COPY:用於將檔案複製到映象中,源只能是本地檔案;
COPY src /app/src
-
WORKDIR:用於指定工作目錄,可以使用多個WORKDIR指令,如果使用相對路徑,則是相對於上一條WORKDIR指令所指定的目錄;
WORKDIR /app
-
ENV:用於設定環境變數;
-
RUN:用於執行命令列命令,比如安裝軟體包;
RUN apt-get install -y nginx
-
EXPOSE:暴露埠,指定容器執行時監聽的埠,但是這個埠只能在容器內部訪問,外部無法訪問;
EXPOSE 80
-
CMD:用於指定預設的容器主程序,每個Dockerfile中只能有一條CMD指令,如果有多條,則只有最後一條會生效;
CMD ["node", "/app/index.js"]
-
ENTRYPOINT:用於指定預設的容器主程序,每個Dockerfile中只能有一條ENTRYPOINT指令,如果有多條,則只有最後一條會生效;
-
VOLUME:用於指定持久化目錄,Docker容器中的資料不會儲存在映象中,當容器刪除時,資料也會隨之刪除;
-
USER:用於指定執行容器時的使用者名稱或UID,後續的RUN、CMD、ENTRYPOINT指令都會使用該使用者;
-
HEALTHCHECK:用於指定檢查容器健康狀況的命令,如果檢查結果不是0,則認為容器不健康,從而終止容器執行;
-
ONBUILD:用於指定當構建一個被繼承的Dockerfile時需要執行的命令,父映象在被子繼承後,父映象中的ONBUILD指令會被執行;
-
LABEL:用於為映象新增後設資料,可以使用多個LABEL指令。
-
STOPSIGNAL:用於指定停止容器時傳送的系統呼叫訊號;
-
SHELL:用於指定預設的SHELL型別,可以使用多個SHELL指令。
-
ARG:用於指定構建引數,構建引數可以在構建時使用–build-arg =來指定。
-
EXPORT:用於匯出映象,這個指令已經被廢棄,不建議使用。
Dockerfile編寫完成後,就可以使用docker build
命令來構建映象了。
docker build -t [image]:[tag] [PATH]
# eg:
docker build -t geekhour/hello-docker:latest .
# or 從當前目錄的Dockerfile構建映象
docker build .
Docker Compose
Docker Compose是由Docker官方開源的專案,用於定義和執行多個Docker容器應用程式的工具。(Defining and running multi-container Docker applications)比如我們如果想要搭建一個網站的話,可能會用到前端、後端、資料庫、甚至快取和負載均衡等多個服務,這些服務都是獨立的,但是它們之間又是有關聯的,需要相互配合工作,比如後端需要連線資料庫,前端需要連線後端,這些服務之間的關聯關係就是Compose要解決的問題。它透過一個單獨的docker-compose.yml配置檔案來將這一組相互管理的容器組合在一起。
Docker Compose YAML檔案
Docker Compose使用一個命名為docker-compose.yml
的YAML檔案來配置應用程式的服務,YAML檔案中包含了應用程式的配置資訊,比如服務、網路、卷等。
啟動一個應用程式時,只需要執行docker-compose up
命令,Docker Compose就會自動去查詢當前目錄下的docker-compose.yml
檔案,並根據這個檔案來啟動應用程式的所有服務。
當你不再需要這個應用程式時,只需要執行docker-compose down
命令,Docker Compose就會停止並刪除所有容器、網路、卷等。
常用命令
映象相關
檢索映象
docker search [image]
# eg: 檢索nginx映象
docker search nginx
拉取映象
docker pull [image]
上傳映象
docker push [image]
# eg:
docker push geekhour/hello-docker:latest
列出映象
docker images
# or
docker image ls
從Dockerfile構建映象
docker build -t [image]:[tag] [PATH]
# eg:
docker build -t geekhour/hello-docker:latest .
# or 從當前目錄的Dockerfile構建映象
docker build .
匯出映象
docker save [image] -o FILE
# or
docker save [image] > FILE
# eg:
docker save geekhour/hello-docker:latest > hello-docker.tar
從檔案匯入映象
docker load -i FILE
# eg:
docker load -i hello-docker.tar
檢視映象歷史
docker history [image]
刪除映象
docker rmi [image]
# or
docker image rm [image]
刪除不再使用的映象(dangling images)
docker image prune
# 刪除所有不再使用的映象
docker image prune -a
將檔案系統匯入為映象
docker import [URL/FILE]
從容器建立映象
docker commit [container] [image]
容器管理
建立容器(僅建立,不執行)
docker create [image]
建立並執行容器
docker run [image]
啟動容器
docker start [container]
停止容器
docker stop [container]
重啟容器
docker restart [container]
列出正在執行的容器
docker ps
# or
docker container ls
列出所有容器
docker ps -a
# or
docker container ls -a
進入容器
# 以互動模式進入容器
docker exec -it [container] bash
# or
docker attach [container]
匯出容器
docker export [container] -o FILE
# or
docker export [container] > FILE
匯入容器快照
docker import FILE
檢視容器日誌
docker logs [container]
刪除容器
docker rm [container]
# or
docker container rm [container]
檢視容器埠對映
docker port [container]
顯示容器內程序
docker top [container]
複製本地檔案到容器內的指定路徑
docker cp [FILE] [container]:[PATH]
顯示容器內的變化
docker diff [container]
顯示容器資源使用情況
docker stats [container]
容器執行
docker run
命令的各種引數
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# OPTIONS:
# -a stdin: 指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
# -d: 後臺執行容器,並返回容器ID;
# -i: 以互動模式執行容器,通常與 -t 同時使用;
# -p: 埠對映,格式為:主機(宿主)埠:容器埠
# -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
# --name="nginx-lb": 為容器指定一個名稱;
# -e: 為容器設定環境變數;eg:docker run -e [key=value] [image]
# -w: 指定容器的工作目錄;eg:docker run -w [PATH] [image]
# --rm: 容器退出後自動刪除容器檔案;
# --net="bridge": 指定容器的網路連線型別,支援 bridge/host/none/container: 四種型別;
以下是一些常用的docker run
命令示例:
建立,執行,並命名一個容器
docker run --name [name] [image]
建立一個容器並後臺執行
docker run -d [image]
建立一個容器並指定埠對映
docker run -p [hostPort]:[containerPort] [image]
建立一個容器並指定埠對映(隨機分配)
docker run -P [image]
建立一個容器並指定環境變數
docker run -e [key=value] [image]
建立一個容器並指定工作目錄
docker run -w [PATH] [image]
建立一個容器並指定容器名稱
docker run --name [name] [image]
建立一個容器並在容器中執行命令
docker run [image] [COMMAND]
建立一個容器並在容器中執行命令(互動模式)
docker run -it [image] [COMMAND]
建立一個容器並在容器中執行命令(互動模式,終端)
docker run -it [image] [COMMAND] /bin/bash
建立一個容器並在容器中執行命令(互動模式,終端,退出後刪除容器)
docker run -it --rm [image] [COMMAND] /bin/bash
建立一個容器並指定容器名稱,後臺執行,埠對映,環境變數,工作目錄
docker run -d -p [hostPort]:[containerPort] -e [key=value] -w [PATH] --name [name] [image]
網路管理
Docker預設會建立三個網路,分別是bridge、host、none。
網路模式:
- bridge:橋接網路,Docker預設使用的網路模式,使用docker run命令建立容器時如果不指定網路模式,那麼就會使用bridge模式。
- host:主機網路,使用宿主機的網路,容器將不會獲得一個獨立的網路名稱空間,配置和宿主機共享,容器將不會隔離宿主機網路,使用宿主機的IP和埠。
- none:無網路、禁用網路,容器擁有自己的網路名稱空間,但是並不為容器進行任何網路配置,這個網路模式的容器只適合於只進行資料處理,沒有任何網路的應用場景。
- container:容器網路,使用其他容器的網路,指定使用其他容器的網路棧。
- overlay:跨主機網路,用於跨多個Docker守護程序的容器通訊,Docker 1.9版本中增加的功能。
- macvlan:透過MAC地址繫結來實現容器訪問外部網路,Docker 1.12版本中增加的功能。
- ipvlan:透過IP地址繫結來實現容器訪問外部網路,Docker 1.12版本中增加的功能。
列出可用網路
docker network ls
檢視網路詳細資訊
docker network inspect [network]
建立一個新的網路
docker network create [network]
刪除一個網路
docker network rm [network]
將容器連線到網路
docker network connect [network] [container]
將容器從網路斷開
docker network disconnect [network] [container]
資料管理
資料卷
資料卷(Data Volumes)是一個可供一個或多個容器使用的特殊目錄,它繞過了UFS,可以提供很多有用的特性:
- 資料卷可以在容器之間共享和重用
- 對資料卷的修改會立馬生效
- 對資料卷的更新,不會影響映象
- 資料卷預設會一直存在,即使容器被刪除
- 資料卷會一直存在,直到沒有容器使用
Docker Volume本質上是容器與主機之間共享的目錄或者檔案,這樣Docker Volume中的資料可以在主機和容器中實時同步。
建立一個資料卷
docker volume create [volume]
# eg:
docker volume create my-vol
檢視資料卷
docker volume ls
檢視資料卷詳細資訊
docker volume inspect [volume]
刪除資料卷
docker volume rm [volume]
刪除所有未使用的資料卷
docker volume prune
日常操作
檢視Docker系統資訊
docker info
檢視Docker版本
docker version
檢視Docker幫助
docker --help
檢視Docker命令幫助
docker [COMMAND] --help
登入Docker Hub
docker login
登出Docker Hub
docker logout
移除所有未被使用的容器、映象、資料卷和網路
docker system prune