摘自《Docker 容器與容器云(第2版)》
點(diǎn)擊查看我的博客原文
1. 從容器到容器云
1.1 云計(jì)算平臺(tái)
經(jīng)典云計(jì)算架構(gòu)包括 IaaS(Infrastructure as a Service颅拦,基礎(chǔ)設(shè)施即服務(wù))诽凌、PaaS(Platform as a Service书幕,平臺(tái)即服務(wù))、SaaS(Software as a Service纱皆,軟件即服務(wù))三層服務(wù),如下圖所示雾棺。
1.2 容器技術(shù)生態(tài)系統(tǒng)
可以看出柱告,容器技術(shù)生態(tài)系統(tǒng)自上而下分別覆蓋了 IaaS 層和 PaaS 層所涉及的各類(lèi)問(wèn)題,包括資源調(diào)度征椒、編排娇哆、部署、監(jiān)控勃救、配置管理、存儲(chǔ)網(wǎng)絡(luò)管理治力、安全蒙秒、容器化應(yīng)用支撐平臺(tái)等。容器技術(shù)主要帶來(lái)了以下幾點(diǎn)好處:
- 持續(xù)部署與測(cè)試:容器消除了線(xiàn)上線(xiàn)下的環(huán)境差異宵统,保證了應(yīng)用生命周期的環(huán)境一致性和標(biāo)準(zhǔn)化晕讲。
- 跨云平臺(tái)支持:越來(lái)越多的云平臺(tái)都已支持容器,用戶(hù)無(wú)需擔(dān)心受到云平臺(tái)的捆綁马澈。
- 環(huán)境標(biāo)準(zhǔn)化和版本控制:可使用 Git 等工具對(duì)容器鏡像進(jìn)行版本控制瓢省。相比基于代碼的版本控制來(lái)說(shuō),還能夠對(duì)整個(gè)應(yīng)用運(yùn)行環(huán)境實(shí)現(xiàn)版本控制痊班,一旦出現(xiàn)故障可以快速回滾勤婚。相比以前的虛擬機(jī)鏡像,容器壓縮和備份速度更快涤伐,鏡像啟動(dòng)也像啟動(dòng)一個(gè)普通進(jìn)程一樣快速馒胆。
- 高資源利用率與隔離:容器沒(méi)有管理程序的額外開(kāi)銷(xiāo)缨称,與底層共享操作系統(tǒng),性能更優(yōu)祝迂,負(fù)載更低睦尽。同時(shí),容器擁有不錯(cuò)的資源隔離與限制能力型雳,可以精確的對(duì)應(yīng)用分配 CPU当凡、內(nèi)存等資源,保證應(yīng)用之間不會(huì)相互影響纠俭。
- 容器跨平臺(tái)性與鏡像:容器在原有 Linux 容器的基礎(chǔ)上進(jìn)行大膽革新沿量,為容器設(shè)定了一整套標(biāo)準(zhǔn)化的配置方法,將應(yīng)用及其依賴(lài)的運(yùn)行環(huán)境打包成鏡像柑晒,大大提高了容器的跨平臺(tái)性欧瘪。
- 易于理解且易用:Docker 的英文原意是處理集裝箱的碼頭工人,標(biāo)志是鯨魚(yú)運(yùn)送一大堆集裝箱匙赞,集裝箱就是容器佛掖。容器的易用性加速了容器標(biāo)準(zhǔn)化的步伐。
- 應(yīng)用鏡像倉(cāng)庫(kù):Docker 官方構(gòu)建了一個(gè)鏡像倉(cāng)庫(kù)涌庭,已經(jīng)累積了成千上萬(wàn)的鏡像芥被,所有人都可以自由的下載微服務(wù)組件,為開(kāi)發(fā)者提供了巨大便利坐榆。
1.3 從容器到容器云
容器云以容器為資源分割和調(diào)度的基本單位拴魄,封裝整個(gè)軟件運(yùn)行時(shí)環(huán)境,為開(kāi)發(fā)者和系統(tǒng)管理員提供用于構(gòu)建席镀、發(fā)布和運(yùn)行分布式應(yīng)用的平臺(tái)匹中。
- 當(dāng)容器云專(zhuān)注于資源共享與隔離、容器編排與部署時(shí)豪诲,它更接近傳統(tǒng)的 IaaS
- 當(dāng)容器云滲透到應(yīng)用支撐與運(yùn)行時(shí)環(huán)境時(shí)顶捷,它更接近傳統(tǒng)的 PaaS
容器云并不僅限于 Docker,基于 rkt 容器的 CoreOS 項(xiàng)目也是容器云屎篱。Docker 最初發(fā)布時(shí)只是一個(gè)單機(jī)下的容器管理工具服赎,隨后 Docker 公司發(fā)布了 Compose、Machine交播、Swarm 等編排部署工具重虑,并收購(gòu)了 Socketplane 解決集群化后的網(wǎng)絡(luò)問(wèn)題。
除了 Docker 公司之外秦士,業(yè)界許多云計(jì)算廠(chǎng)商也對(duì)基于 Docker 的容器云做了巨大的投入缺厉。例如 Fleet、Flynn、Deis 以及目前成為事實(shí)主流標(biāo)準(zhǔn)的 Kubernetes芽死,都是基于 Docker 技術(shù)構(gòu)建的廣為人知的容器云乏梁。
2. Docker 基礎(chǔ)
2.1 Docker 的安裝
安裝 Docker 的基本要求如下:
- 只支持 64 位 CPU 架構(gòu)的計(jì)算機(jī),目前不支持 32 位 CPU
- 建議系統(tǒng)的 Linux 內(nèi)核版本為
3.10
及以上 - Linux 內(nèi)核需開(kāi)啟 cgroups 和 namespace 功能
安裝過(guò)程可參考 CentOS 7 安裝 Docker CE关贵。
2.2 Docker 操作參數(shù)解讀
docker
命令的執(zhí)行一般都需要 root 權(quán)限遇骑,因?yàn)?Docker 的命令行工具docker
與 Docker daemon 是同一個(gè)二進(jìn)制文件,而 Docker daemon 負(fù)責(zé)接收并執(zhí)行來(lái)自docker
的命令揖曾,它的運(yùn)行需要 root 權(quán)限落萎。同時(shí),從 Docker0.5.2
版本開(kāi)始炭剪,Docker daemon 默認(rèn)綁定一個(gè) UNIX Socket 來(lái)代替原有的 TCP 端口练链,該 UNIX Socket 默認(rèn)是屬于 root 用戶(hù)的。
用戶(hù)在使用 Docker 時(shí)奴拦,需要使用 Docker 命令行工具docker
與 Docker daemon 建立通信媒鼓。Docker daemon 是 Docker 守護(hù)進(jìn)程,負(fù)責(zé)接收并分發(fā)執(zhí)行 Docker 命令错妖÷堂可以使用docker
或docker help
命令獲取docker
的命令清單:
> docker
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/root/.docker")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
config Manage Docker configs
container Manage containers
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
例如可以使用docker start --help
命令來(lái)獲取子命令start
的詳細(xì)信息:
> docker start --help
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
Start one or more stopped containers
Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--detach-keys string Override the key sequence for detaching a container
-i, --interactive Attach container's STDIN
推薦閱讀:
根據(jù)命令的用途,可將 Docker 子命令進(jìn)行如下分類(lèi):
從docker
命令的使用出發(fā)暂氯,可以梳理出如下的命令結(jié)構(gòu)圖:
下面選擇每個(gè)功能分類(lèi)中常用的子命令進(jìn)行用法和操作參數(shù)的解讀潮模。
1. Docker 環(huán)境信息
docker info
命令用于檢查 Docker 是否正確安裝。如果 Docker 正確安裝痴施,該命令會(huì)輸出 Docker 的配置信息:
> docker info
Containers: 33
Running: 20
Paused: 0
Stopped: 13
Images: 23
Server Version: 18.06.1-ce
Storage Driver: overlay2
...
Kernel Version: 4.15.0-38-generic
Operating System: Ubuntu 18.04.1 LTS
...
docker info
命令一般結(jié)合docker version
命令使用擎厢,兩者結(jié)合能夠提取到足夠詳細(xì)的 Docker 環(huán)境信息:
> docker version
Client:
Version: 18.06.1-ce
API version: 1.38
Go version: go1.10.3
Git commit: e68fc7a
Built: Tue Aug 21 17:24:56 2018
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.06.1-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: e68fc7a
Built: Tue Aug 21 17:23:21 2018
OS/Arch: linux/amd64
Experimental: false
2. 容器生命周期管理
容器生命周期管理涉及容器啟動(dòng)、停止等功能辣吃。
docker run 命令
docker run
命令使用方法如下:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run
命令用來(lái)基于特定的鏡像創(chuàng)建一個(gè)容器动遭,并依據(jù)選項(xiàng)來(lái)控制該容器:
> docker run ubuntu echo "Hello Docker"
Hello Docker
該命令從 ubuntu 鏡像啟動(dòng)一個(gè)容器,并執(zhí)行echo
命令打印 Hello Docker神得。執(zhí)行完echo
命令后沽损,容器將停止運(yùn)行。docker run
命令啟動(dòng)的容器會(huì)隨機(jī)分配一個(gè)容器 IDCONTAINER ID
循头,用以標(biāo)識(shí)該容器。
root@ubuntu:~> docker run -i -t --name mytest ubuntu:latest /bin/bash
root@eb9dda25b0fe:/>
上例中炎疆,docker run
命令啟動(dòng)一個(gè)容器卡骂,并為它分配一個(gè)偽終端執(zhí)行/bin/bash
命令,用戶(hù)可以在該偽終端與容器進(jìn)行交互形入。其中:
-
-i
:表示使用交互模式全跨,始終保持輸入流開(kāi)放 -
-t
:表示分配一個(gè)偽終端,一般兩個(gè)參數(shù)結(jié)合時(shí)使用-it
-
--name
:可以指定啟動(dòng)的容器的名字亿遂。若無(wú)此選項(xiàng)浓若,Docker 將為容器隨機(jī)分配一個(gè)名字 -
-c
:用于給運(yùn)行在容器中的所有進(jìn)程分配 CPU 的 shares 值渺杉,這是一個(gè)相對(duì)權(quán)重,實(shí)際處理速度還與宿主機(jī)的 CPU 有關(guān) -
-m
:用于限制為容器中所有進(jìn)程分配的內(nèi)存總量挪钓,以 B是越、K、M碌上、G 為單位 -
-v
:用于掛載一個(gè) volume倚评,可以用多個(gè)-v
參數(shù)同時(shí)掛載多個(gè) volume。volume 的格式為[host-dir]:[container-dir]:[rw|ro]
-
-p
:用于將容器的端口暴露給宿主機(jī)的端口馏予,其常用格式為hostPort:containerPort
天梧。這樣外部主機(jī)就可以通過(guò)宿主機(jī)暴露的端口來(lái)訪(fǎng)問(wèn)容器內(nèi)的應(yīng)用
docker start/stop/restart 命令
對(duì)于已經(jīng)存在的容器,可以通過(guò)docker start/stop/restart
命令來(lái)啟動(dòng)霞丧、停止和重啟呢岗,一般利用CONTAINER ID
標(biāo)識(shí)來(lái)確定具體容器,某些情況下也使用容器名來(lái)確定容器蛹尝。
docker start
命令使用-i
選項(xiàng)來(lái)開(kāi)啟交互模式后豫,并始終保持輸入流開(kāi)放。使用-a
選項(xiàng)來(lái)附加標(biāo)準(zhǔn)輸入箩言、輸出或錯(cuò)誤輸出硬贯。此外,docker stop
和docker restart
命令使用-t
選項(xiàng)來(lái)設(shè)定容器停止前的等待時(shí)間陨收。
3. Docker registry
Docker registry 是存儲(chǔ)容器鏡像的倉(cāng)庫(kù)饭豹,用戶(hù)可以通過(guò) Docker client 與 Docker registry 進(jìn)行通信,以此來(lái)完成鏡像的搜索务漩、下載和上傳等相關(guān)操作拄衰。
Docker Hub 是 Docker 公司官方提供的鏡像倉(cāng)庫(kù),提供鏡像的公有與私有存儲(chǔ)服務(wù)饵骨,是目前最主要的鏡像來(lái)源翘悉。除此之外,用戶(hù)還可以自行搭建私有服務(wù)器來(lái)實(shí)現(xiàn)鏡像倉(cāng)庫(kù)功能居触。
docker pull 命令
用于從 Docker registry 中拉取 image 或 repository:
docker pull [OPTIONS] NAME[:TAG @DIGEST]
使用示例如下:
# 從官方 Hub 拉取 ubuntu:latest 鏡像
> docker pull ubuntu
# 從官方 Hub 拉取指明 "ubuntu 16.04" tag 的鏡像
> docker pull ubuntu:16.04
# 從特定的倉(cāng)庫(kù)拉取 ubuntu 鏡像
> docker pull SEL/ubuntu
# 從其他服務(wù)器拉取鏡像
> docker pull 10.10.103.215:5000/sshd
docker push 命令
用于將本地的 image 或 repository 推送到 Docker Hub 的公共或私有鏡像庫(kù)妖混,以及私有服務(wù)器:
docker push [OPTIONS] NAME[:TAG]
使用示例如下:
> docker push SEL/ubuntu
4. 鏡像管理
用戶(hù)可以在本地保存鏡像資源,為此 Docker 提供了相應(yīng)的管理子命令轮洋。
docker images 命令
通過(guò)docker images
命令可以列出主機(jī)上的鏡像制市,默認(rèn)只列出最頂層的鏡像。使用-a
選項(xiàng)可以顯示所有鏡像:
docker images [OPTIONS] [REPOSITORY[:TAG]]
使用示例如下:
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 b0ef3016420a 11 days ago 117MB
influxdb latest 623f651910b3 7 weeks ago 238MB
memcached latest 8230c836a4b3 7 weeks ago 62.2MB
mongo 3.2 fb885d89ea5c 7 weeks ago 300MB
mist/mailmock latest 95c29bda552f 7 weeks ago 299MB
mist/docker-socat latest f00ed0eed13f 7 weeks ago 7.8MB
mistce/logstash v3-3-1 0f90a36d12c8 2 months ago 730MB
mistce/api v3-3-1 4a21b676352f 2 months ago 705MB
mistce/nginx v3-3-1 4f55dd9b39e0 2 months ago 109MB
mistce/gocky v3-3-1 ee93caf66f70 2 months ago 440MB
mistce/elasticsearch-manage v3-3-1 10a48b9ea0e1 2 months ago 65.8MB
mistce/ui v3-3-1 b8fdbe0ccb23 2 months ago 626MB
ubuntu-with-vi-dockerfile latest 74ba87f80b96 2 months ago 169MB
ubuntu-with-vi latest 9d2fac08719d 2 months ago 169MB
ubuntu latest ea4c82dcd15a 2 months ago 85.8MB
centos latest 75835a67d134 3 months ago 200MB
hello-world latest 4ab4c602aa5e 4 months ago 1.84kB
elasticsearch 5.6.10 73e6fdf8bd4f 4 months ago 486MB
mistce/landing v3-3-1 b0e433749aa9 5 months ago 532MB
kibana 5.6.10 bc661616b61c 5 months ago 389MB
hello-world <none> 2cb0d9787c4d 6 months ago 1.85kB
traefik v1.5 fde722950ccf 9 months ago 49.7MB
mist/swagger-ui latest 0b5230f1b6c4 10 months ago 24.8MB
rabbitmq 3.6.6-management c74093aa9895 22 months ago 179MB
上例中弊予,從REPOSITORY
屬性可以判斷出鏡像是來(lái)自于官方鏡像祥楣、私人倉(cāng)庫(kù)還是私有服務(wù)器。
docker rmi/rm 命令
docker rmi
命令用于刪除鏡像,docker rm
命令用于刪除容器误褪。它們可以同時(shí)刪除多個(gè)鏡像或容器责鳍,也可以按條件來(lái)刪除:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rmi [OPTIONS] IMAGE [IMAGE...]
使用
docker rmi
命令刪除鏡像時(shí),如果已有基于該鏡像啟動(dòng)的容器存在兽间,則無(wú)法直接刪除历葛,需要首先刪除啟動(dòng)的容器。當(dāng)然渡八,這兩個(gè)子命令都提供了-f
選項(xiàng)啃洋,可以強(qiáng)制刪除存在容器的鏡像或啟動(dòng)中的容器。
5. 容器運(yùn)維操作
作為 Docker 的核心屎鳍,容器的操作是重中之重宏娄,Docker 也為用戶(hù)提供了豐富的容器運(yùn)維操作命令。
docker attach 命令
docker attach
命令可以連接到正在運(yùn)行的容器逮壁,觀(guān)察該容器的運(yùn)行情況孵坚,或與容器的主進(jìn)程進(jìn)行交互:
docker attach [OPTIONS] CONTAINER
docker inspect 命令
docker inspect
命令可以查看鏡像和容器的詳細(xì)信息,默認(rèn)會(huì)列出全部信息窥淆,可以通過(guò)--format
參數(shù)來(lái)指定輸出的模板格式卖宠,以便輸出特定信息:
docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
具體示例如下:
> docker inspect --format='{{.NetworkSettings.IPAddress}}' ee36
172.17.0.8
docker ps 命令
docker ps
命令可以查看容器的相關(guān)信息,默認(rèn)只顯示正在運(yùn)行的容器的信息忧饭】肝椋可以查看到的信息包括CONTAINER ID
、NAMES
词裤、IMAGE
刺洒、STATUS
、容器啟動(dòng)后執(zhí)行的COMMAND
吼砂、創(chuàng)建時(shí)間CREATED
和綁定開(kāi)啟的端口PORTS
:
docker ps [OPTIONS]
docker ps
命令常用的選項(xiàng)有-a
和-l
逆航。-a
選項(xiàng)可以查看所有容器,包括停止的容器渔肩。-l
選項(xiàng)則只查看最新創(chuàng)建的容器因俐,包括不在運(yùn)行中的容器。
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8befe85aa9b2 ubuntu "/bin/bash" 4 minutes ago Exited (0) 4 minutes ago elegant_hawking
eb9dda25b0fe ubuntu:latest "/bin/bash" About an hour ago Exited (0) About an hour ago mytest
33be0880de8a ubuntu "echo 'Hello Docker'" About an hour ago Exited (0) About an hour ago loving_neumann
9dbd65001cc2 ubuntu "echo hello" About an hour ago Exited (0) About an hour ago zealous_mendeleev
ee10555e84be hello-world "/hello" About an hour ago Exited (0) About an hour ago friendly_mestorf
4219345c98a0 ubuntu-with-vi-dockerfile "/bin/bash" 2 months ago Exited (0) 2 months ago ecstatic_wilson
7257b9828da4 centos "/bin/bash" 2 months ago Exited (0) 2 months ago hopeful_chaplygin
26119a6e11bd centos "/bin/bash" 2 months ago Exited (0) 2 months ago brave_khorana
f48bc1339340 ubuntu-with-vi "/bin/bash" 2 months ago Exited (127) 2 months ago agitated_hugle
1abe6e7341ca ubuntu "/bin/bash" 2 months ago Exited (0) 2 months ago laughing_leavitt
5c5eabb13be4 hello-world "/hello" 2 months ago Exited (0) 2 months ago eloquent_wiles
8f2f6854078c 2cb0d9787c4d "/hello" 4 months ago Exited (0) 4 months ago goofy_sinoussi
> docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8befe85aa9b2 ubuntu "/bin/bash" 6 minutes ago Exited (0) 6 minutes ago elegant_hawking
6. 其他子命令
docker commit 命令
docker commit
命令可以將一個(gè)容器固化為一個(gè)新的鏡像:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
提交保存時(shí)周偎,只能選用正在運(yùn)行的容器來(lái)制作新的鏡像抹剩。在制作特定鏡像時(shí),直接使用
docker commit
命令只是一個(gè)臨時(shí)性的輔助命令蓉坎,不推薦使用吧兔。官方建議通過(guò)docker build
命令結(jié)合 Dockerfile 來(lái)創(chuàng)建和管理鏡像。
docker events/history/logs 命令
docker events/history/logs
這 3 個(gè)命令用于查看 Docker 的系統(tǒng)日志信息袍嬉。docker events
命令會(huì)打印出實(shí)時(shí)的系統(tǒng)事件。docker history
命令會(huì)打印出指定鏡像的歷史版本信息,即構(gòu)建該鏡像的每一層鏡像的命令記錄伺通。docker logs
命令會(huì)打印出容器中進(jìn)程的運(yùn)行日志:
docker events [OPTIONS]
docker history [OPTIONS] IMAGE
docker logs [OPTIONS] CONTAINER
2.3 搭建第一個(gè) Docker 應(yīng)用棧
Docker 的設(shè)計(jì)理念是希望用戶(hù)能夠保證一個(gè)容器只運(yùn)行一個(gè)進(jìn)程箍土,即只提供一種服務(wù)。通常情況下罐监,用戶(hù)需要利用多個(gè)容器吴藻,分別提供不同的服務(wù),并在不同容器間互連通信弓柱,最后形成一個(gè) Docker 集群沟堡,以實(shí)現(xiàn)特定的功能。
基于 Docker 集群構(gòu)建的應(yīng)用稱(chēng)為 Docker App Stack矢空,即 Docker 應(yīng)用棧航罗。
以下示例將在單臺(tái)機(jī)器上利用 Docker 自帶的命令行工具,搭建一個(gè) Docker 應(yīng)用棧屁药,利用多個(gè)容器來(lái)組成一個(gè)特定的應(yīng)用粥血。
在開(kāi)始搭建過(guò)程前,需要對(duì)所要搭建的應(yīng)用棧進(jìn)行簡(jiǎn)單的設(shè)計(jì)和描述:我們將搭建一個(gè)包含 6 個(gè)節(jié)點(diǎn)的 Docker 應(yīng)用棧酿箭,其中包括 1 個(gè)代理節(jié)點(diǎn)复亏、2 個(gè) Web 應(yīng)用節(jié)點(diǎn)、1 個(gè)主數(shù)據(jù)庫(kù)節(jié)點(diǎn)及 2 個(gè)從數(shù)據(jù)庫(kù)節(jié)點(diǎn)缭嫡。應(yīng)用棧具體結(jié)構(gòu)如下圖所示:
如圖所示缔御,HAProxy 是負(fù)載均衡代理節(jié)點(diǎn)。Redis 是非關(guān)系型的數(shù)據(jù)庫(kù)妇蛀,它由一個(gè)主數(shù)據(jù)庫(kù)節(jié)點(diǎn)和兩個(gè)從數(shù)據(jù)庫(kù)節(jié)點(diǎn)組成耕突。App 是應(yīng)用,這里將使用 Python 語(yǔ)言讥耗、基于 Django 架構(gòu)設(shè)計(jì)一個(gè)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的基礎(chǔ) Web 應(yīng)用有勾。
1. 獲取應(yīng)用棧各節(jié)點(diǎn)所需鏡像
在搭建過(guò)程中,可以從 Docker Hub 獲取現(xiàn)有可用的鏡像古程,在這些鏡像的基礎(chǔ)上啟動(dòng)容器蔼卡,按照需求進(jìn)行修改來(lái)實(shí)現(xiàn)既定的功能。
> docker pull ubuntu
> docker pull django
> docker pull haproxy
> docker pull redis
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
haproxy latest d23194a3929a 40 hours ago 72MB
redis latest 5d2989ac9711 12 days ago 95MB
ubuntu latest 1d9c17228a9e 12 days ago 86.7MB
django latest eb40dcf64078 2 years ago 436MB
2. 應(yīng)用棧容器節(jié)點(diǎn)互聯(lián)
鑒于在同一主機(jī)下搭建容器應(yīng)用棧的環(huán)境挣磨,只需要完成容器互聯(lián)來(lái)實(shí)現(xiàn)容器間的通信即可雇逞,可以采用docker run
命令的--link
選項(xiàng)建立容器間的互聯(lián)關(guān)系。使用示例如下:
> docker run --link redis:redis --name console ubuntu bash
上例將在 ubuntu 鏡像上啟動(dòng)一個(gè)容器茁裙,并命名為console
塘砸,同時(shí)將新啟動(dòng)的console
容器連接到名為redis
的容器上。
通過(guò)
--link
選項(xiàng)來(lái)建立容器間的連接晤锥,不但可以避免容器的 IP 和端口暴露到外網(wǎng)所導(dǎo)致的安全問(wèn)題掉蔬,還可以防止容器在重啟后 IP 地址變化導(dǎo)致的訪(fǎng)問(wèn)失效廊宪,原理類(lèi)似于 DNS 的域名和地址映射。
回到應(yīng)用棧的搭建女轿,應(yīng)用棧各節(jié)點(diǎn)的連接信息如下:
- 啟動(dòng)
redis-master
容器節(jié)點(diǎn) - 兩個(gè)
redis-slave
容器節(jié)點(diǎn)啟動(dòng)時(shí)要連接到redis-master
上 - 兩個(gè) App 容器節(jié)點(diǎn)啟動(dòng)時(shí)要連接到
redis-master
上 - HAProxy 容器節(jié)點(diǎn)啟動(dòng)時(shí)要連接到兩個(gè) App 節(jié)點(diǎn)上
綜上所述箭启,容器的啟動(dòng)順序?yàn)椋?/p>
redis-master --> redis-slave --> APP --> HAProxy
此外,為了能夠從外網(wǎng)訪(fǎng)問(wèn)應(yīng)用棧蛉迹,并通過(guò) HAProxy 節(jié)點(diǎn)來(lái)訪(fǎng)問(wèn)應(yīng)用棧中的 App傅寡,在啟動(dòng) HAProxy 容器節(jié)點(diǎn)時(shí),需要利用-p
參數(shù)暴露端口給主機(jī)北救,即可從外網(wǎng)訪(fǎng)問(wèn)搭建的應(yīng)用棧荐操。以下是整個(gè)應(yīng)用棧的搭建流程示例。
3. 應(yīng)用棧容器節(jié)點(diǎn)啟動(dòng)
# 啟動(dòng) Redis 容器
> docker run -it --name redis-master redis /bin/bash
> docker run -it --name redis-slave1 --link redis-master:master redis /bin/bash
> docker run -it --name redis-slave2 --link redis-master:master redis /bin/bash
# 啟動(dòng) Django 容器珍策,即應(yīng)用
> docker run -it --name APP1 --link redis-master:db -v ~/Projects/Django/App1:/usr/src/app django /bin/bash
> docker run -it --name APP2 --link redis-master:db -v ~/Projects/Django/App2:/usr/src/app django /bin/bash
# 啟動(dòng) HAProxy 容器
> docker run -it --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:/tmp haproxy /bin/bash
啟動(dòng)的容器信息可以通過(guò)docker ps
命令查看:
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
733e71e16ac5 haproxy "/docker-entrypoint.…" 30 seconds ago Up 29 seconds 0.0.0.0:6301->6301/tcp HAProxy
3f91ac2a23a6 django "/bin/bash" 47 seconds ago Up 46 seconds APP2
e94c7ff2c319 django "/bin/bash" 3 minutes ago Up 3 minutes APP1
5e7994e6ad59 redis "docker-entrypoint.s…" 5 minutes ago Up 4 minutes 6379/tcp redis-slave2
6fac6db730c3 redis "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 6379/tcp redis-slave1
936c426faa29 redis "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 6379/tcp redis-master
至此托启,所有搭建應(yīng)用棧所需容器的啟動(dòng)工作已經(jīng)完成。
4. 應(yīng)用棧容器節(jié)點(diǎn)的配置
Redis Master 主數(shù)據(jù)庫(kù)容器節(jié)點(diǎn)的配置
Redis Master 主數(shù)據(jù)庫(kù)容器節(jié)點(diǎn)啟動(dòng)后膛壹,我們需要在容器中添加 Redis 的啟動(dòng)配置文件驾中,以啟動(dòng) Redis 數(shù)據(jù)庫(kù)。
由于容器的輕量化設(shè)計(jì)模聋,其中缺乏相應(yīng)的文本編輯命令工具肩民,這時(shí)可以利用 volume 來(lái)實(shí)現(xiàn)文件的創(chuàng)建。在容器啟動(dòng)時(shí)链方,利用
-v
參數(shù)掛載 volume持痰,在主機(jī)和容器之間共享數(shù)據(jù),就可以直接在主機(jī)上創(chuàng)建和編輯相關(guān)文件祟蚀。
在利用 Redis 鏡像啟動(dòng)容器時(shí)工窍,鏡像中已經(jīng)集成了 volume 的掛載命令,通過(guò)docker inspect
命令查看redis-master
所掛載 volume 的情況:
> docker inspect --format "{{.Mounts}}" redis-master
[{volume a77509a99df7d7a9d78313c1a1bb19619bac98fedadd78dbab17f072a49a905c /var/lib/docker/volumes/a77509a99df7d7a9d78313c1a1bb19619bac98fedadd78dbab17f072a49a905c/_data /data local true }]
可以發(fā)現(xiàn)前酿,該 volume 在主機(jī)中的目錄為/var/lib/docker/volumes/a77509a99df7d7a9d78313c1a1bb19619bac98fedadd78dbab17f072a49a905c/_data
患雏,在容器中的目錄為/data
。進(jìn)入主機(jī)目錄創(chuàng)建 Redis 的啟動(dòng)配置文件:
> cd /var/lib/docker/volumes/a77509a99df7d7a9d78313c1a1bb19619bac98fedadd78dbab17f072a49a905c/_data
> cp <your-own-redis-dir>/redis.conf redis.conf
> vim redis.conf
對(duì)于 Redis 主數(shù)據(jù)庫(kù)罢维,需要修改模板文件中的如下幾個(gè)參數(shù):
daemonize yes
pidfile /var/run/redis.pid
protected-mode no # 關(guān)閉保護(hù)模式
在主機(jī)創(chuàng)建好啟動(dòng)配置文件后淹仑,切換到容器中的 volume 目錄,并復(fù)制redis.conf
到 Redis 的執(zhí)行工作目錄肺孵,然后啟動(dòng) Redis 服務(wù)器:
> cd /data
> cp redis.conf /usr/local/bin/
> cd /usr/local/bin/
> redis-server redis.conf
Redis Slave 從數(shù)據(jù)庫(kù)容器節(jié)點(diǎn)的配置
與redis-master
容器節(jié)點(diǎn)類(lèi)似匀借,在啟動(dòng)redis-slave
容器節(jié)點(diǎn)后,首先需要查看 volume 信息平窘,然后將redis.conf
復(fù)制到對(duì)應(yīng)的目錄中吓肋。不同的是,對(duì)于 Redis 從數(shù)據(jù)庫(kù)瑰艘,需要修改如下幾個(gè)參數(shù):
daemonize yes
pidfile /var/run/redis.pid
protected-mode no # 關(guān)閉保護(hù)模式
replicaof master 6379 # 之前是 slaveof
replicaof
參數(shù)的使用格式為replicaof <masterip> <masterport>
在主機(jī)修改好redis.conf
配置文件后是鬼,切換到容器中的/data
目錄肤舞,并復(fù)制配置文件到 Redis 的執(zhí)行工作目錄,然后啟動(dòng) Redis 服務(wù)器:
> cd /data
> cp redis.conf /usr/local/bin/
> cd /usr/local/bin/
> redis-server redis.conf
594:C 10 Jan 2019 23:10:43.936 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
594:C 10 Jan 2019 23:10:43.936 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=594, just started
594:C 10 Jan 2019 23:10:43.936 # Configuration loaded
同理屑咳,可以完成對(duì)另一個(gè) Redis Slave 容器節(jié)點(diǎn)的配置萨赁。至此,便完成了所有 Redis 數(shù)據(jù)庫(kù)容器節(jié)點(diǎn)的配置兆龙。
Redis 數(shù)據(jù)庫(kù)容器節(jié)點(diǎn)的測(cè)試
完成 Redis Master 和 Redis Slave 容器節(jié)點(diǎn)的配置以及服務(wù)器的啟動(dòng)后,可以通過(guò)啟動(dòng)redis-cli
來(lái)測(cè)試數(shù)據(jù)庫(kù)敲董。
首先紫皇,在redis-master
容器內(nèi),啟動(dòng)redis-cli
腋寨,并存儲(chǔ)一個(gè)數(shù)據(jù):
> redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=1260,lag=0
slave1:ip=172.17.0.4,port=6379,state=online,offset=1260,lag=0
master_replid:295c948cc1bbdf21eb49fdd8417ba5b4b76fc32b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1260
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1260
127.0.0.1:6379> set master 936c
OK
127.0.0.1:6379> get master
"936c"
隨后聪铺,在redis-slave1
和redis-slave2
兩個(gè)容器中,分別啟動(dòng)redis-cli
并查詢(xún)先前在redis-master
數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù):
> redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:1330
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:295c948cc1bbdf21eb49fdd8417ba5b4b76fc32b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1330
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:127
repl_backlog_histlen:1204
127.0.0.1:6379> get master
"936c"
可以看到redis-master
主數(shù)據(jù)庫(kù)中的數(shù)據(jù)已經(jīng)自動(dòng)同步到了兩個(gè)從數(shù)據(jù)庫(kù)中萄窜。至此铃剔,應(yīng)用棧的數(shù)據(jù)庫(kù)部分已搭建完成,并通過(guò)測(cè)試查刻。
APP 容器節(jié)點(diǎn)( Django)的配置
Django 容器啟動(dòng)后键兜,需要利用 Django 框架,開(kāi)發(fā)一個(gè)簡(jiǎn)單的 Web 程序穗泵。
為了訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)普气,需要在容器中安裝 Python 語(yǔ)言的 Redis 支持包:
> pip install redis
安裝完成后,驗(yàn)證 Redis 支持包是否安裝成功:
> python
Python 3.4.5 (default, Dec 14 2016, 18:54:20)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis
>>> print(redis.__file__)
/usr/local/lib/python3.4/site-packages/redis/__init__.py
如果沒(méi)有報(bào)錯(cuò)佃延,就說(shuō)明已經(jīng)可以使用 Python 語(yǔ)言來(lái)調(diào)用 Redis 數(shù)據(jù)庫(kù)现诀。接下來(lái)開(kāi)始創(chuàng)建 Web 程序。以APP1
為例履肃,首先在容器的 volume 目錄/usr/src/app/
下創(chuàng)建 APP:
# 在容器內(nèi)
> cd /usr/src/app/
> mkdir dockerweb
> cd dockerweb/
> django-admin.py startproject redisweb
> ls
redisweb
> cd redisweb
> ls
manage.py redisweb
> python manage.py startapp helloworld
> ls
helloworld manage.py redisweb
在容器內(nèi)創(chuàng)建好 APP 后仔沿,切換到主機(jī)的 volume 目錄~/Projects/Django/App1
,進(jìn)行相應(yīng)的編輯來(lái)配置 APP:
# 在主機(jī)內(nèi)
> cd ~/Projects/Django/App1
> ls
dockerweb
可以看到尺棋,在容器內(nèi)創(chuàng)建的 APP 文件在主機(jī)的 volume 目錄下同樣可見(jiàn)封锉。之后修改helloworld
應(yīng)用的視圖文件views.py
:
> cd dockerweb/redisweb/helloworld
> ls
admin.py __init__.py models.py views.py apps.py migrations tests.py
> vim views.py
為了簡(jiǎn)化設(shè)計(jì),只要求完成 Redis 數(shù)據(jù)庫(kù)信息輸出陡鹃,以及從 Redis 數(shù)據(jù)庫(kù)存儲(chǔ)和讀取數(shù)據(jù)的結(jié)果輸出烘浦。viwes.py
文件如下:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
import redis
def hello(request):
str = redis.__file__
str += "<br>"
r = redis.Redis(host="db", port=6379, db=0)
info = r.info()
str += ("Set Hi <br>")
r.set('Hi', 'HelloWorld-APP1')
str += ("Get Hi: %s <br>" % r.get('Hi'))
str += ("Redis Info: <br>")
str += ("Key: Info Value")
for key in info:
str += ("%s: %s <br>" % (key, info[key]))
return HttpResponse(str)
完成views.py
文件修改后,接下來(lái)修改redisweb
項(xiàng)目的配置文件setting.py
萍鲸,并添加新建的helloworld
應(yīng)用:
> cd ../redisweb/
> ls
__init__.py __pycache__ settings.py urls.py wsgi.py
> vim settings.py
在settings.py
文件中的INSTALLED_APPS
選項(xiàng)下添加 helloworld闷叉,并修改ALLOWED_HOSTS
:
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'helloworld'
]
此處為了演示方便將
ALLOWED_HOSTS
設(shè)置為['*']
即允許所有連接,在實(shí)際開(kāi)發(fā)環(huán)境中請(qǐng)勿按此設(shè)置脊阴。另外在生產(chǎn)環(huán)境中還需將DEBUG
選項(xiàng)設(shè)置為False
握侧。
最后品擎,修改redisweb
項(xiàng)目的 URL 模式文件urls.py
,它將設(shè)置訪(fǎng)問(wèn)應(yīng)用的 URL 模式萄传,并為 URL 模式調(diào)用視圖函數(shù)之間的映射表:
> vim urls.py
在urls.py
文件中甚颂,引入 helloworld 應(yīng)用的hello
視圖振诬,并為hello
視圖添加一個(gè)urlpatterns
變量。urls.py
文件內(nèi)容如下:
from django.conf.urls import url
from django.contrib import admin
from helloworld.views import hello
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^helloworld$', hello),
]
在主機(jī)下修改完成這幾個(gè)文件后衍菱,需要再次進(jìn)入APP1
容器,在目錄/usr/src/app/dockerweb/redisweb
下完成項(xiàng)目的生成:
> python manage.py makemigrations
No changes detected
> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK
> python manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address: admin@gmail.com
Password:
Password (again):
Superuser created successfully.
舊版本的 Django 使用
syncdb
命令來(lái)同步數(shù)據(jù)庫(kù)并創(chuàng)建admin
賬戶(hù)。在新版 Django 中syncdb
命令已被移除琼锋,使用createsuperuser
命令創(chuàng)建管理員賬戶(hù)斩例。
至此念赶,APP1
容器的所有配置已經(jīng)完成,另一個(gè)APP2
容器配置也是同樣的過(guò)程旗吁,這樣就完成了應(yīng)用棧 APP 部分的全部配置很钓。
在啟動(dòng) APP 的 Web 服務(wù)器時(shí)码倦,可以指定服務(wù)器的端口和 IP 地址袁稽。為了通過(guò) HAProxy 容器節(jié)點(diǎn)接受外網(wǎng)所有的公共 IP 地址訪(fǎng)問(wèn),實(shí)現(xiàn)負(fù)載均衡擒抛,需要指定服務(wù)器的 IP 地址和端口。對(duì)于APP1
使用 8001 端口莲组,而APP2
則使用 8002 端口锹杈。同時(shí)嬉橙,都使用0.0.0.0
地址。以APP1
為例糕韧,啟動(dòng)服務(wù)器的過(guò)程如下:
> python manage.py runserver 0.0.0.0:8001
Performing system checks...
System check identified no issues (0 silenced).
January 11, 2019 - 03:35:58
Django version 1.10.4, using settings 'redisweb.settings'
Starting development server at http://0.0.0.0:8001/
Quit the server with CONTROL-C.
[11/Jan/2019 03:37:01] "GET /helloworld HTTP/1.1" 200 3999
[11/Jan/2019 03:37:14] "GET /admin/ HTTP/1.1" 200 2779
...
HAProxy 容器節(jié)點(diǎn)的配置
在完成了數(shù)據(jù)庫(kù)和 APP 部分的應(yīng)用棧部署后萤彩,最后部署一個(gè) HAProxy 負(fù)載均衡代理的容器節(jié)點(diǎn)雀扶,所有對(duì)應(yīng)用棧的訪(fǎng)問(wèn)將通過(guò)它來(lái)實(shí)現(xiàn)負(fù)載均衡愚墓。
首先浪册,將 HAProxy 的啟動(dòng)配置文件復(fù)制進(jìn)容器中兼犯。在主機(jī)的 volume 目錄~/Projects/HAProxy
下勺爱,執(zhí)行以下命令:
> cd ~/Projects/HAProxy
> vim haproxy.cfg
其中库菲,haproxy.cfg
配置文件的內(nèi)容如下:
global
log 127.0.0.1 local0 # 日志輸入配置蝙昙,所有日志都記錄在本機(jī)奇颠,通過(guò) local0 輸出
maxconn 4096 # 最大連接數(shù)
chroot /usr/local/sbin # 改變當(dāng)前工作目錄
daemon # 以后臺(tái)形式運(yùn)行 HAProxy 實(shí)例
nbproc 4 # 啟動(dòng) 4 個(gè) HAProxy 實(shí)例
pidfile /usr/local/sbin/haproxy.pid # pid 文件位置
defaults
log 127.0.0.1 local3 # 日志文件的輸出定向
mode http # { tcp|http|health } 設(shè)定啟動(dòng)實(shí)例的協(xié)議類(lèi)型
option dontlognull # 保證 HAProxy 不記錄上級(jí)負(fù)載均衡發(fā)送過(guò)來(lái)的用于檢測(cè)狀態(tài)沒(méi)有數(shù)據(jù)的心跳包
option redispatch # 當(dāng) serverId 對(duì)應(yīng)的服務(wù)器掛掉后烈拒,強(qiáng)制定向到其他健康>的服務(wù)器
retries 2 # 重試 2 次連接失敗就認(rèn)為服務(wù)器不可用荆几,主要通過(guò)后面的 check 檢查
maxconn 2000 # 最大連接數(shù)
balance roundrobin # balance 有兩個(gè)可用選項(xiàng):roundrobin 和 source吨铸,其中,roundrobin 表示
# 輪詢(xún)诞吱,而 source 表示 HAProxy 不采用輪詢(xún)的策略房维,而是把來(lái)自某個(gè) IP 的請(qǐng)求轉(zhuǎn)發(fā)給一個(gè)固定 IP 的后端
timeout connect 5000ms # 連接超時(shí)時(shí)間
timeout client 50000ms # 客戶(hù)端連接超時(shí)時(shí)間
timeout server 50000ms # 服務(wù)器端連接超時(shí)時(shí)間
listen redis_proxy
bind 0.0.0.0:6301
stats enable
stats uri /haproxy-stats
server APP1 APP1:8001 check inter 2000 rise 2 fall 5 # 你的均衡節(jié)點(diǎn)
server APP2 aPP2:8002 check inter 2000 rise 2 fall 5
隨后咙俩,進(jìn)入到容器的 volume 目錄/tmp
下阿趁,將 HAProxy 的啟動(dòng)配置文件復(fù)制到 HAProxy 的工作目錄中:
# 在容器中
> cd /tmp
> cp haproxy.cfg /usr/local/sbin/
> cd /usr/local/sbin/
> ls
haproxy haproxy.cfg
接下來(lái)利用該配置文件來(lái)啟動(dòng) HAProxy 代理:
> haproxy -f haproxy.cfg
另外歌焦,如果修改了配置文件的內(nèi)容独撇,需要先結(jié)束所有的 HAProxy 進(jìn)程纷铣,并重新啟動(dòng)代理搜立。Docker 鏡像為了精簡(jiǎn)體積,本身并沒(méi)有安裝ps
刁标、killall
等進(jìn)程管理命令膀懈,需要手動(dòng)在容器中安裝:
> apt-get update
> apt-get install procps # ps启搂、pkill
> apt-get install psmisc # killall
> killall haproxy
至此胳赌,完成了 HAProxy 容器節(jié)點(diǎn)的全部部署疑苫,同時(shí)也完成了整個(gè) Docker 應(yīng)用棧的部署缀匕。
應(yīng)用棧訪(fǎng)問(wèn)測(cè)試
參考結(jié)構(gòu)圖可知,整個(gè)應(yīng)用棧群的訪(fǎng)問(wèn)是通過(guò) HAProxy 代理節(jié)點(diǎn)來(lái)進(jìn)行的饵史。HAProxy 在啟動(dòng)時(shí)通過(guò)-p 6301:6301
參數(shù)胳喷,映射了容器訪(fǎng)問(wèn)的端口到主機(jī)上吭露,因此可在其他主機(jī)上通過(guò)本地主機(jī)的 IP 地址和端口來(lái)訪(fǎng)問(wèn)搭建好的應(yīng)用棧讲竿。
首先在本地主機(jī)上進(jìn)行測(cè)試题禀。在瀏覽器中訪(fǎng)問(wèn)http://172.17.0.7:6301/helloworld
迈嘹,可以查看來(lái)自 APP1 或 APP2 的頁(yè)面內(nèi)容秀仲,具體訪(fǎng)問(wèn)到的 APP 容器節(jié)點(diǎn)會(huì)由 HAProxy 代理進(jìn)行均衡分配神僵。其中挑豌,172.17.0.7
為 HAProxy 容器的 IP 地址氓英。
本地測(cè)試通過(guò)后址貌,嘗試在其他主機(jī)上通過(guò)應(yīng)用棧入口主機(jī)的 IP 地址和暴露的 6301 端口來(lái)訪(fǎng)問(wèn)該應(yīng)用棧练对,即訪(fǎng)問(wèn)http://116.56.129.153:6301/helloworld
螟凭,可看到來(lái)自 APP1 或 APP2 容器節(jié)點(diǎn)的頁(yè)面螺男,訪(fǎng)問(wèn)http://116.56.129.153:6301/haproxy-stats
則可看到 HAProxy 的后臺(tái)管理頁(yè)面及統(tǒng)計(jì)數(shù)據(jù)下隧。其中淆院,116.56.129.153
為 宿主機(jī)的 IP 地址。