Docker 筆記 1:Docker 基礎(chǔ)與搭建第一個(gè) Docker 應(yīng)用棧

摘自《Docker 容器與容器云(第2版)》
點(diǎn)擊查看我的博客原文

《Docker 容器與容器云(第2版)》

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ù),如下圖所示雾棺。

云平臺(tái)經(jīng)典架構(gòu)

1.2 容器技術(shù)生態(tài)系統(tǒng)

容器技術(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)啟 cgroupsnamespace 功能

安裝過(guò)程可參考 CentOS 7 安裝 Docker CE关贵。

2.2 Docker 操作參數(shù)解讀

docker命令的執(zhí)行一般都需要 root 權(quán)限遇骑,因?yàn)?Docker 的命令行工具dockerDocker daemon 是同一個(gè)二進(jìn)制文件,而 Docker daemon 負(fù)責(zé)接收并執(zhí)行來(lái)自docker的命令揖曾,它的運(yùn)行需要 root 權(quán)限落萎。同時(shí),從 Docker 0.5.2 版本開(kāi)始炭剪,Docker daemon 默認(rèn)綁定一個(gè) UNIX Socket 來(lái)代替原有的 TCP 端口练链,該 UNIX Socket 默認(rèn)是屬于 root 用戶(hù)的。

用戶(hù)在使用 Docker 時(shí)奴拦,需要使用 Docker 命令行工具dockerDocker daemon 建立通信媒鼓。Docker daemon 是 Docker 守護(hù)進(jìn)程,負(fù)責(zé)接收并分發(fā)執(zhí)行 Docker 命令错妖÷堂可以使用dockerdocker 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

推薦閱讀:

  1. docker專(zhuān)題(2):docker常用管理命令(上)| Sean's Notes
  2. docker專(zhuān)題(2):docker常用管理命令(下)| Sean's Notes

根據(jù)命令的用途,可將 Docker 子命令進(jìn)行如下分類(lèi)

Docker 子命令分類(lèi)

docker命令的使用出發(fā)暂氯,可以梳理出如下的命令結(jié)構(gòu)圖

Docker 命令結(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)程分配 CPUshares 值渺杉,這是一個(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 stopdocker restart命令使用-t選項(xiàng)來(lái)設(shè)定容器停止前的等待時(shí)間陨收。

3. Docker registry

Docker registry存儲(chǔ)容器鏡像的倉(cāng)庫(kù)饭豹,用戶(hù)可以通過(guò) Docker clientDocker 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 中拉取 imagerepository

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 命令

用于將本地的 imagerepository 推送到 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 IDNAMES词裤、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)如下圖所示:

Docker 應(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 MasterRedis 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-slave1redis-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.7HAProxy 容器的 IP 地址氓英。

訪(fǎng)問(wèn) APP1 容器節(jié)點(diǎn)
訪(fǎng)問(wèn) APP2 容器節(jié)點(diǎn)

本地測(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 地址

其他主機(jī)訪(fǎng)問(wèn)本地主機(jī)
HAProxy 后臺(tái)管理頁(yè)面
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辕棚,隨后出現(xiàn)的幾起案子逝嚎,更是在濱河造成了極大的恐慌补君,老刑警劉巖挽铁,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楣铁,死亡現(xiàn)場(chǎng)離奇詭異盖腕,居然都是意外死亡浓镜,警方通過(guò)查閱死者的電腦和手機(jī)听隐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)遵绰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人虑润,你說(shuō)我怎么就攤上這事拳喻∪叱海” “怎么了亚亲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵肛响,是天一觀(guān)的道長(zhǎng)特笋。 經(jīng)常有香客問(wèn)我猎物,道長(zhǎng)蔫磨,這世上最難降的妖魔是什么质帅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮魄揉,結(jié)果婚禮上洛退,老公的妹妹穿的比我還像新娘兵怯。我一直安慰自己媒区,他們只是感情好袜漩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著座掘,像睡著了一般雹顺。 火紅的嫁衣襯著肌膚如雪嬉愧。 梳的紋絲不亂的頭發(fā)上没酣,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天绒净,我揣著相機(jī)與錄音挂疆,去河邊找鬼缤言。 笑死胆萧,一個(gè)胖子當(dāng)著我的面吹牛跌穗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羹唠,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼验辞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跌造!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起寝杖,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎只盹,沒(méi)想到半個(gè)月后殖卑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孵稽,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馅笙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片董习。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窝趣,靈堂內(nèi)的尸體忽然破棺而出哑舒,到底是詐尸還是另有隱情洗鸵,我是刑警寧澤膘滨,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布丹弱,位于F島的核電站蹈矮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏北滥。R本人自食惡果不足惜再芋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一坚冀、第九天 我趴在偏房一處隱蔽的房頂上張望济赎。 院中可真熱鬧,春花似錦记某、人聲如沸司训。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至滑凉,卻和暖如春统扳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畅姊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工咒钟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人若未。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓朱嘴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親陨瘩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腕够,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容