Background
- docker原理
- docker是一個Client-Server結構的系統,Docker的守護進程運行在主機上。通過Socket從客戶端訪問。
- docker核心三大組件:
image
–鏡像、container
-容器、repository
-倉庫。- docker使用的cpu、內存以及系統內核等資源都是直接使用宿主物理機的硬件,所以docker的性能比虛擬機高。
- docker容器的本質是宿主機上的一個進程。通過namespace實現了資源隔離,通過cgroups實現了資源限制,通過寫時復制機制(copy-on-write)實現了高效的文件操作。
- docker可以對哪些資源進行隔離:1、文件系統;2、網絡(network);3、進程間的通信;4、針對權限的用戶和用戶組;5、進程內的pid和宿主機的pid;6、主機名與域名等。
- docker網絡
Docker是一種輕量級容器化技術,允許通過隔離OS級的虛擬化方式在一個操作系統上運行多個應用。網絡是Docker中的一個非常重要的組件,它允許容器之間進行通信和聯網訪問。本文主要介紹Docker網絡的基礎知識以及在容器化部署java程序時的應用。
1、docker網絡類型
docker網絡有三個基本要素:網絡類型、網絡驅動和網絡配置。
- bridge
這個是默認的網絡類型,建立在宿主機的網絡接口之上。 - host
這種網絡類型,直接使用宿主機的網絡棧,容器和宿主機共享網絡棧。 - overlay
這種網絡類型可以跨越多個Docker守護進程,通過內置的DNS服務,允許容器之間跨主機進行通信。 - macvlan
這種方式可以讓容器擁有自己的MAC地址,從而可以直接與物理網絡中的設備進行通信。
適用環境:希望容器能夠直接與物理網絡接口進行通信,或希望每個容器具有獨立的 IP 地址的場景。
創建方法:使用docker network create
命令并選擇--driver macvlan
參數來創建 Macvlan 網絡。
Macvlan是一個新的嘗試,是真正的網絡虛擬化技術的轉折點。Linux實現非常輕量級,因為與傳統的Linux Bridge隔離相比,它們只是簡單地與一個Linux以太網接口或子接口相關聯,以實現網絡之間的分離和與物理網絡的連接。
Macvlan提供了許多獨特的功能,并有充足的空間進一步創新與各種模式。這些方法的兩個高級優點是繞過Linux網橋的正面性能以及移動部件少的簡單性。刪除傳統上駐留在Docker主機NIC和容器接口之間的網橋留下了一個非常簡單的設置,包括容器接口,直接連接到Docker主機接口。由于在這些情況下沒有端口映射,因此可以輕松訪問外部服務。
- 創建MACVLAN網絡:
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my-macvlan-network
- 在MACVLAN網絡上啟動容器:
docker run -d --name my-container --network my-macvlan-network my-image
2、docker網絡驅動
docker支持多種網絡驅動程序,每種網絡驅動的實現方式都不同。下面列出了docker支持的網絡驅動程序。
1、bridge驅動:此驅動為docker的默認設置,docker安裝時會創建一個名為 docker0 的Linux bridge,新建的容器會自動橋接到這個接口。但與外界通信使用NAT,增加了通信的復雜性,在復雜場景下使用會有諸多限制。每個容器啟動后會通過DHCP自動獲取一個IP地址,容器間可以通過 IP 地址相互通信,但是容器重啟IP會發生變化。
2、host驅動:使用這種驅動的時候,Docker容器和宿主機共用同一個network namespace,使用宿主機的網卡、IP和端口等信息。但是,容器其他方面,如文件系統、進程列表等還是和宿主機隔離的。host模式不存在虛擬化網絡帶來的額外性能負擔。但是host驅動也降低了容器與容器之間、容器與宿主機之間網絡層面的隔離性,引起網絡資源的競爭與沖突。容器的網絡配置與宿主機相同,可以通過宿主機的 IP 地址直接訪問容器。
3、overlay驅動:此驅動采用IETF標準的VXLAN方式,并且是VXLAN中被普遍認為最適合大規模的云計算虛擬化環境的SDN controller模式。在使用的過程中,需要一個額外的配置存儲服務, 還需要在啟動docker daemon的的時候額外添加參數來指定所使用的配置存儲服務地址。overlay指的就是在物理網絡層上再搭建一層網絡,通過某種技術再構建一張相同的邏輯網絡。需要互相通信的容器鏈接到相同的邏輯網絡就可以通過容器名稱互相通信。
4、remote驅動:這個驅動實際上并未做真正的網絡服務實現,而是調用了用戶自行實現的網絡驅動插件,使libnetwork實現了驅動的可插件化。
5、null驅動:使用這種驅動的時候,Docker容器擁有自己的network namespace,但是并不為Docker容器進行任何網絡配置。也就是說,這個Docker容器除了network namespace自帶的loopback網卡外,沒有其他任何網卡、IP、路由等信息,需要用戶為Docker容器添加網卡、配置IP等。這種模式如果不進行特定的配置是無法正常使用的,但是優點也非常明顯,它給了用戶最大的自由度來自定義容器的網絡環境。
每個網絡類型都具有自己的特點和適用場景,根據實際需求選擇合適的網絡創建方法非常重要。此外,還有其他網絡驅動和網絡插件可供選擇,以滿足不同環境的需求,例如 Calico、Weave 等。
3、docker網絡配置
docker網絡配置官方文檔:https://docs.docker.com/reference/cli/docker/network
- docker安裝后會自動創建3種網絡:bridge、host、none
# 查看命令
docker network ls
- 創建一個自定義的Docker網絡
docker network create yunlu
- 將容器連接到一個已存在的Docker網絡
# 第一種方式,my-container容器已經啟動了
docker network connect yunlu my-container
# 第二種方式,my-container容器啟動時通過 `--network yunlu` 或 `--net=yunlu`連接自定義網絡
docker run -d --restart=always --name my-container --network yunlu -p 8080:8080 -v $(pwd):/app -w /app yunlu/openjdk:1.8-alpine java -Duser.timezone=GMT+08 -Dfile.encoding=utf-8 -Dspring.config.location=/app/application.yml -jar /app/app.jar
- 查看一個Docker網絡的詳細信息
docker network inspect yunlu
- 查看一個Docker網絡下的所有容器
docker network inspect --format='{{.Containers}}' yunlu
- 刪除一個已存在的Docker網絡
docker network rm yunlu
4、docker容器網絡配置
我們可以在容器啟動時通過 --network yunlu
或 --net=yunlu
連接自定義網絡。bridge 網絡是 docker 默認的網絡類型,當創建容器時,如果不指定網絡類型,則會自動創建一個橋接網絡并將容器連接到該網絡上。
- 查看某個容器的網絡信息
# 第一種方式
docker inspect my-container | grep "NetworkMode"
# 第二種方式
docker inspect --format='{{.HostConfig.NetworkMode}}' my-container
5、容器化部署java程序
實現目標
容器化部署一個java程序huhang-server,該程序用到mysql、redis等服務,這些服務也是采用容器化部署。
兩種實現思路
- huhang-server部署時網絡使用host模式,mysql、redis等服務容器化部署時把所需端口映射出來供huhang-server使用;
- 使用自定義網絡模式,先創建一個自定義網絡yunlu,然后mysql、redis等服務所有容器都加入自定義網絡yunlu,huhang-server也加入自定義網絡yunlu,然后通過容器名稱去訪問mysql、redis等服務。
容器化部署java程序的兩種方式:
- 對于一些簡單的單體項目,可以使用 docker run 命令可以直接在命令行中運行容器,無需事先構建鏡像;
- 如果項目較為復雜,涉及多個組件和配置,或者需要在不同環境中部署,建議使用 Dockerfile 構建自定義鏡像。這樣可以更好地管理和復用代碼,并確保在不同環境中的一致性。