Docker安裝确憨、自定義鏡像、網(wǎng)絡(luò)配置套媚、持久化數(shù)據(jù)缚态、compose、swarm

Docker簡介

Docker是一個開源的引擎堤瘤,它提供了為應(yīng)用程序創(chuàng)建輕量級/可移植/高效的容器方案玫芦。支持部署到本地和云平臺環(huán)境。使用Docker有很多好處,比如更快的交付和部署本辐,更高效的資源利用桥帆,更輕松的遷移。它的應(yīng)用場景包括Web應(yīng)用的自動化打包部署,自動化測試,持續(xù)集成等慎皱。

Docker基本概念

docker的核心: 鏡像老虫、容器、倉庫

鏡像

Docker中的鏡像類似于虛擬機(jī)的鏡像茫多,可以理解為一個只讀的模板祈匙。比如,一個鏡像包含一個基本操作系統(tǒng)環(huán)境天揖,或者包含某個應(yīng)用程序正確運(yùn)行所需的運(yùn)行環(huán)境夺欲。鏡像是創(chuàng)建Docker容器的基礎(chǔ),通過鏡像的版本控制今膊,Docker提供了十分簡單的機(jī)制來創(chuàng)建和更新鏡像些阅,也可以直接下載已經(jīng)做好的應(yīng)用鏡像,并直接使用斑唬。

容器

Docker容器類似一個輕量級的沙盒市埋,Docker利用容器來運(yùn)行和隔離應(yīng)用,容器是從鏡像創(chuàng)建的應(yīng)用運(yùn)行示例恕刘,可以對它進(jìn)行啟動缤谎,停止,刪除等操作雪营。
可以理解容器為一個簡易版的Linux操作系統(tǒng)環(huán)境弓千,包括某些應(yīng)用程序打包而成的盒子。

倉庫

Docker倉庫類似代碼倉庫献起,是Docker用來集中存放鏡像的地方洋访。Docker倉庫根據(jù)鏡像是否公開分為公開倉庫和私有倉庫,目前最大的公開倉庫是官方提供的Docker Hub,其中存放了大量的鏡像供用戶下載谴餐。同時姻政,國內(nèi)不少云服務(wù)提供商也提供了倉庫的本地源,可以提高穩(wěn)定的國內(nèi)訪問岂嗓。

關(guān)于私有倉庫汁展,用戶可以自行搭建本地倉庫,用于維護(hù)私有的鏡像厌殉。

分層存儲

鏡像構(gòu)建時食绿,會一層一層的構(gòu)建,前一層是后一層的基礎(chǔ)公罕,每一層構(gòu)建完就不會發(fā)生改變器紧,后一層所有的改變都不會影響前一層的。比如刪除前一層的文件楼眷,其實并不是刪除了前一層的文件铲汪,只是標(biāo)記為已刪除,在容器運(yùn)行的時候罐柳,不會看到這個文件,但是實際上文件還存在掌腰。

分層存儲的特征讓鏡像的復(fù)用變得容易,比如可以以之前建好的鏡像作為基礎(chǔ)層,然后逐步添加新的層张吉,以定制自己所需的內(nèi)容齿梁。

Docker的安裝

刪除舊版本的 Docker

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安裝所需的軟件包

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

設(shè)置docker默認(rèn)的鏡像倉庫

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

一下代碼是設(shè)置阿里云的 docker 鏡像倉庫

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://y5j5hcnv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

安裝docker

sudo yum install docker-ce docker-ce-cli containerd.io

啟動docker

sudo systemctl start docker

docker常用命令

docker images                                       # 查看所有模板
docker pull tomcat                                  # 從遠(yuǎn)程倉庫拉取 image 鏡像
docker rmi tomcat                                   # 刪除某個鏡像
docker run -d --name mytomcat -p 80:8080 tomcat     # 運(yùn)行docker image 鏡像
docker exec -it tomcat /bin/bash                    # 進(jìn)入到容器中執(zhí)行命令
docker ps                                           # 查看正在運(yùn)行的  container
docker kill tomcat                                  # 殺死進(jìn)程
docker build -t vitshop-image                       # 構(gòu)建 image 鏡像
docker logs -f vitshop                              # 查看日志
docker container ls -a                              # 查看所有的container
docker container rm tomcat                          # 刪除container
docker inspect tomcat                               # 查看 image 鏡像詳細(xì)信息
docker history tomcat                               # 查看鏡像歷史
docker volume ls                                    # 查看所有的 volume
docker volume inspect tomcat                        # 查看 volume 詳情
docker volume create                                # 創(chuàng)建volume
docker volume rm                                    # 刪除 volume
docker start mytomcat                               # 啟動已有的container

docker官網(wǎng)命令集合

Docker | 自定義image 自定義docker鏡像

Dockerfile 什么是 Dockerfile?

Dockerfile是一個用來構(gòu)建鏡像的文本文件肮蛹,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說明勺择。

Dockerfile 指令的作用

FROM centos     # 基于什么鏡像之上構(gòu)建自己的自定義鏡像
RUN             # 用于執(zhí)行后面命令,RUN ["./test.php", "dev", "offline"] 等價于 RUN ./test.php dev offline
CMD             # 類似于 RUN 命令蔗崎,用于運(yùn)行程序酵幕。 CMD在docker run 時運(yùn)行。 run 是在docker build時運(yùn)行
COPY            # 復(fù)制指令缓苛,從上下文目錄中復(fù)制文件或者目錄到容器的制定位置
ADD             # 跟復(fù)制命令使用格式一致(同樣的需求下芳撒,官方建議使用 copy)
VOLUME          # 定義匿名數(shù)據(jù)卷。在啟動容器時忘記掛載數(shù)據(jù)卷未桥,會自動掛載匿名的數(shù)據(jù)卷笔刹。   做持久化數(shù)據(jù)

ENTRYPOINT      # 類似于 cmd 命令但其不會被 docker run的命令行參數(shù)指定的指令所覆蓋,而且這些命令行的參數(shù)會被當(dāng)做參數(shù)傳給 
                # ENTRYPOINT 所指定的程序冬耿,但是如果運(yùn)行 docker run 時候使用了 --entrypoint 選項舌菜,
                # 此選項的參數(shù)可當(dāng)做要運(yùn)行的程序覆蓋 ENTRYPOINT 指定的程序
                # 優(yōu)點: 在執(zhí)行 docker run 的時候可以指定 ENTRYPOINT 運(yùn)行所需的參數(shù)
                # 注意: 如果 Dockerfile 文件中存在多個 ENTRYPOINT 指令,僅最后一個生效亦镶。

ENV             # 設(shè)置環(huán)境變量日月,定義了環(huán)境變量袱瓮,那么在后續(xù)的指令中就可以使用這個變量。

ARG             # 構(gòu)建參數(shù)爱咬,與 ENV 作用一至尺借。不過作用域不一樣。ARG 設(shè)置的環(huán)境變量僅對 Dockerfile 內(nèi)有效精拟,
                # 也就是說只有 docker build 的過程中有效燎斩,構(gòu)建好的鏡像內(nèi)不存在此環(huán)境變量。
                # 構(gòu)建命令 docker build 中可以用 --build-arg <參數(shù)名>=<值> 來覆蓋蜂绎。

EXPOSE          # 僅僅只是聲明端口栅表。幫助鏡像使用者理解這個鏡像服務(wù)的守護(hù)端口,以方便配置映射师枣。
                # 在運(yùn)行時使用隨機(jī)端口映射時怪瓶,也就是 docker run -P 時,會自動隨機(jī)映射 EXPOSE 的端口坛吁。

WORKDIR         # 指定工作目錄劳殖。用 WORKDIR 指定的工作目錄,會在構(gòu)建鏡像的每一層中都存在(WORKDIR 指定的工作目錄拨脉,必須是提前創(chuàng)建好的)
                # docker build 構(gòu)建鏡像過程中的哆姻,每一個 RUN 命令都是新建的一層。只有通過 WORKDIR 創(chuàng)建的目錄才會一直存在玫膀。

USER            # 用于指定執(zhí)行后續(xù)命令的用戶和用戶組矛缨,這邊只是切換后續(xù)命令執(zhí)行的用戶(用戶和用戶組必須提前已經(jīng)存在)。
HEALTHCHECK     # 用于指定某個程序或者指令來監(jiān)控 docker 容器服務(wù)的運(yùn)行狀態(tài)帖旨。
ONBUILD         # 用于延遲構(gòu)建命令的執(zhí)行箕昭。簡單的說,就是 Dockerfile 里用 ONBUILD 指定的命令解阅,在本次構(gòu)建鏡像的過程中不會執(zhí)行
                # (假設(shè)鏡像為 test-build)落竹。當(dāng)有新的 Dockerfile 使用了之前構(gòu)建的鏡像 FROM test-build ,
                # 這是執(zhí)行新鏡像的 Dockerfile 構(gòu)建時候货抄,會執(zhí)行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令述召。

使用 Dockerfile 創(chuàng)建自定義 image 鏡像

以springboot項目為例:把打包好的 springboot.jar 放入服務(wù)器自定義目錄中,并創(chuàng)建 Dockerfile 文件蟹地。

mkdir vitshop-image  # 創(chuàng)建自定義目錄积暖,
vim Dockerfile       # 創(chuàng)建 Dockerfile 文件

編輯 Dockerfile 文件

FROM openjdk:8
MAINTAINER itcrazy2016
LABEL name="dockerfile-dome" version="1.0" author="itcrazy2016"
COPY vitshop-0.0.1.jar vitshop.jar
CMD ["java","-jar","vitshop.jar"]

保存 Dockerfile 文件之后,使用 docker build -t vitshop-image 命令創(chuàng)建 image怪与。
等待創(chuàng)建完畢之后就可以夺刑,運(yùn)行或者查看 image 鏡像了。

docker build -t vitshop-image .                         # -t vitshop-image 是自定義的名稱
docker iamges                                           # 查看所有的鏡像
docker run -d --name vitshop -p 80:8080 vitshop-image   # 運(yùn)行自己創(chuàng)建的  image鏡像

把 image 鏡像推送到阿里云鏡像倉庫

** 登陸阿里云控制臺,找到容器鏡像服務(wù)標(biāo)簽遍愿,選擇下面的鏡像倉庫開通空間之后照下面命令上傳自己的鏡像存淫。 **

# 登陸到阿里云鏡像倉庫
$ sudo docker login --username=tb4005142_00 registry.cn-beijing.aliyuncs.com
# 給自定的鏡像打包
$ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/daozhuang/daozhuang:[鏡像版本號]
# 推送到阿里云倉庫
$ sudo docker push registry.cn-beijing.aliyuncs.com/daozhuang/daozhuang:[鏡像版本號]
# 從Registry中拉取鏡像
$ sudo docker pull registry.cn-beijing.aliyuncs.com/daozhuang/daozhuang:[鏡像版本號]
# 從ECS推送鏡像時,可以選擇使用鏡像倉庫內(nèi)網(wǎng)地址错览。推送速度將得到提升并且將不會損耗您的公網(wǎng)流量纫雁。
# 如果您使用的機(jī)器位于VPC網(wǎng)絡(luò)煌往,請使用 registry-vpc.cn-beijing.aliyuncs.com 作為Registry的域名登錄倾哺,并作為鏡像命名空間前綴。

深入探討Container

Docker commit 命令
docker commit :從容器創(chuàng)建一個新的鏡像刽脖。
語法:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a "xxxx" -m "xxxx" a404c6c174a2  mymysql:v1 

OPTIONS說明:
-a :提交的鏡像作者羞海;
-c :使用Dockerfile指令來創(chuàng)建鏡像;
-m :提交時的說明文字曲管;
-p :在commit時却邓,將容器暫停。

container資源限制

語法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run --name mynginx -d nginx:latest
# 內(nèi)存限制
docker run -d --memory 100M --name tomcat01 tomcat
# cpu限制  設(shè)置CPU權(quán)重
docker run -d --cpu-shares 10 --name tomcat01 tomcat

OPTIONS說明:
-a stdin: 指定標(biāo)準(zhǔn)輸入輸出內(nèi)容類型院水,可選 STDIN/STDOUT/STDERR 三項腊徙;
-d: 后臺運(yùn)行容器,并返回容器ID檬某;
-i: 以交互模式運(yùn)行容器撬腾,通常與 -t 同時使用;
-P: 隨機(jī)端口映射恢恼,容器內(nèi)部端口隨機(jī)映射到主機(jī)的高端口
-p: 指定端口映射民傻,格式為:主機(jī)(宿主)端口:容器端口
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用场斑;
--name="nginx-lb": 為容器指定一個名稱漓踢;
--dns 8.8.8.8: 指定容器使用的DNS服務(wù)器,默認(rèn)和宿主一致漏隐;
--dns-search example.com: 指定容器DNS搜索域名喧半,默認(rèn)和宿主一致;
-h "mars": 指定容器的hostname青责;
-e username="ritchie": 設(shè)置環(huán)境變量挺据;
--env-file=[]: 從指定文件讀入環(huán)境變量;
--cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運(yùn)行爽柒;
-m :設(shè)置容器使用內(nèi)存最大值吴菠;
--net="bridge": 指定容器的網(wǎng)絡(luò)連接類型,支持 bridge/host/none/container: 四種類型浩村;
--link=[]: 添加鏈接到另一個容器做葵;
--expose=[]: 開放一個端口或一組端口;
--volume , -v: 綁定一個卷

Docker | 容器網(wǎng)絡(luò)配置

Docker的四種網(wǎng)絡(luò)模式

docker默認(rèn)網(wǎng)路 bridge
Docker啟動的時候會在主機(jī)上自動創(chuàng)建一個docker0網(wǎng)橋心墅,實際上是一個Linux網(wǎng)橋酿矢,所有容器的啟動如果在docker run的時候沒有指定網(wǎng)絡(luò)模式的情況下都會掛載到docker0網(wǎng)橋上榨乎。這樣容器就可以和主機(jī)甚至是其他容器之間通訊了。
我們可以使用 命令 ip a 查看所有的網(wǎng)卡

host模式網(wǎng)絡(luò)
該模式中將禁用Docker容器的網(wǎng)絡(luò)隔離瘫筐,容器共享宿主機(jī)的網(wǎng)絡(luò)命名空間蜜暑,直接暴露在公網(wǎng)中,容器會繼承宿主機(jī)的IP地址策肝。使用host模式會將容器直接暴露在公網(wǎng)数冬,會存在安全隱患全释。

container模式網(wǎng)絡(luò)
該模式中,容器會使用另一個容器的網(wǎng)絡(luò)命名空間。使用方式為:--net=container:containername

none模式網(wǎng)絡(luò)
該模式將容器放置在自己的網(wǎng)絡(luò)棧中蚂子,并不進(jìn)行任何配置辉哥,該模式實際上是關(guān)閉了容器的網(wǎng)絡(luò)功能蓬蝶。

外部訪問容器:
外部要訪問容器使用: -p 參數(shù)把容器端口映射到宿主機(jī)上即可訪問本慕,-p 和 -P是有區(qū)別的 -P是隨機(jī)映射端口范圍是 49000~49900;
-p是要自己指定端口號膘婶, 如:-p hostPort:containerPort

容器訪問外部:
默認(rèn)情況下缺前,容器可以訪問到外部網(wǎng)絡(luò)的連接,因為容器的默認(rèn)網(wǎng)絡(luò)接口為docker0網(wǎng)橋上的接口悬襟,也即是主機(jī)上的本地接口衅码。其原理是通過Linux系統(tǒng)的轉(zhuǎn)發(fā)功能實現(xiàn)的,在Linux中檢查轉(zhuǎn)發(fā)是否打開:

[root@VM_0_14_centos ~]# sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

0表示轉(zhuǎn)發(fā)未打開古胆,1表示轉(zhuǎn)發(fā)已經(jīng)打開肆良。可以在docker run時使用--ip-forward=true來指定逸绎,Docker會打開主機(jī)的轉(zhuǎn)發(fā)功能惹恃。

同時可以通過上述的nat表中找到對應(yīng)的規(guī)則,在POSTRONTING的第一個規(guī)則就是把所有原地址在172.17.0.0/16網(wǎng)段但不是屬于Docker0的網(wǎng)包(即容器中的網(wǎng)包)棺牧,動態(tài)偽裝為0.0.0.0/0網(wǎng)段巫糙,即主機(jī)網(wǎng)卡。

自定義 bridge 網(wǎng)絡(luò)

docker默認(rèn)的網(wǎng)絡(luò)模式
在使用此網(wǎng)絡(luò)模式的時候需要端口映射颊乘,
Docker網(wǎng)絡(luò)操作:

# 創(chuàng)建網(wǎng)路
docker network create -d bridge --subnet 172.25.0.0/16 mynet
# 連接一個網(wǎng)絡(luò)到容器中
docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect mynet containername
# 查看所有網(wǎng)絡(luò)
docker network ls
# 刪除網(wǎng)絡(luò)
docker network rm
# 容器和網(wǎng)絡(luò)斷開連接
docker network disconnect [OPTIONS] NETWORK CONTAINER
# 查看網(wǎng)絡(luò)詳情
docker network inspect

Docker link方式互聯(lián)

容器之間相互通訊可以通過docker run中的--link=container_name:alias參數(shù)來達(dá)到效果参淹。
此種方式可以很方便讓容器使用容器名進(jìn)行通訊,而不需要依賴ip地址乏悄,不過link方式僅僅解決了單機(jī)容器間的互聯(lián)浙值,多機(jī)的情況下,需要通過別的方式進(jìn)行連接檩小。

Docker 持久化數(shù)據(jù)

Docker文件系統(tǒng)

Docker的鏡像是由多個文件系統(tǒng)(只讀)疊加而成开呐,當(dāng)我們啟動一個容器的時候,Docker會加載只讀鏡像層并在其上添加一層’讀寫層’.如果運(yùn)行中的容器需要了一個文件,那么并不會修改只讀層的文件筐付,只會把該文件復(fù)制到’讀寫層’然后對他修改卵惦,只讀層的文件就被隱藏了,當(dāng)刪除了Docker容器之后瓦戚,或者重啟容器之后沮尿,之前對文件的更改會丟失,鏡像的只讀層以及容器運(yùn)行時的’讀寫層’被稱為Union File System(聯(lián)合文件系統(tǒng))

為了能夠保存數(shù)據(jù)的持久化以及共享容器之間的數(shù)據(jù)较解,提出了Volume的概念畜疾。簡單來說Volume就是一個文件或者目錄。它可以繞過聯(lián)合文件系統(tǒng)哨坪,以正常的文件或者目錄的形式保存在主機(jī)上庸疾。可以通過兩種方式來初始化Volume,這兩種方式有一些細(xì)微區(qū)別当编。

運(yùn)行時創(chuàng)建 volume

# 使用 -v 參數(shù)指定掛載的目錄  聲明volume
# 以下命令會創(chuàng)建一個CentOs的容器并且把容器內(nèi)部的/data目錄作為數(shù)據(jù)卷掛載
docker run -it --name centOs -v /data centos
# 查看掛載的volume,可以看到容器已經(jīng)把/var/lob/docker/volumes/xxx/_data目錄掛載到容器的/data目錄了徒溪。
docker inspect -f {{.Mounts}} centOs
[{volume centOs /var/lib/docker/volumes/XXXXX/_data /data local  true }]
# 該命令是將主機(jī)的/home/centos/data目錄掛載到容器的/data目錄忿偷。
docker run -it --name centOs -v /home/centos/data:/data centos

另外值得注意的是,只要將主機(jī)的目錄掛載到容器上臊泌,那改變就會立即生效鲤桥。掛載目錄不會將鏡像的文件復(fù)制到Volume中,只會把主機(jī)中不存在的文件夾創(chuàng)建出來渠概。

數(shù)據(jù)共享
如果要授權(quán)一個容器訪問另一個容器的Volume茶凳,可以使用-volumes-from參數(shù)來執(zhí)行docker run命令:

docker run -it --name centOs1 --volumes-from centOs centos

不管容器是否正在運(yùn)行,Volume都不會被刪除播揪。

數(shù)據(jù)備份與恢復(fù)

如果使用數(shù)據(jù)卷容器贮喧,想做備份和恢復(fù)就非常容易了。假設(shè)有較多的鏡像從centOs中掛載了數(shù)據(jù)卷猪狈,那么備份與恢復(fù)只需針對centOs這個容器即可箱沦。

備份

docker run --volumes-from centOs -v $(pwd):/backup --name worker centos tar cvf /backup/backup.tar /data 

這個命令的意思是 將當(dāng)前目錄掛載到容器的/backup 目錄,然后容器的工作就是壓縮 /data的內(nèi)容到 /back/backup.tar文件中雇庙。執(zhí)行完之后就會看見在當(dāng)前目錄中生成了backup.tar文件

恢復(fù)

docker run --volumes-from centOs -v $(pwd):/backup centos tar xvf /backup/backup.tar -C /data

刪除數(shù)據(jù)卷
Volume可以使用兩種方式刪除數(shù)據(jù)卷:

  • 使用docker rm -v命令谓形,這個命令移除容器的同時也會移除數(shù)據(jù)卷
  • 使用docker run --rm這個命令會在容器退出時清除數(shù)據(jù)
  • docker volume ls 列出所有數(shù)據(jù)卷
  • docker volume prune 刪除無用的數(shù)據(jù)卷

Docker Compose

Compose 簡介

Compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。通過 Compose疆前,您可以使用 YML 文件來配置應(yīng)用程序需要的所有服務(wù)寒跳。然后,使用一個命令竹椒,就可以從 YML 文件配置中創(chuàng)建并啟動所有服務(wù)童太。

Compose 使用的三個步驟:

  • 使用 Dockerfile 定義應(yīng)用程序的環(huán)境。
  • 使用 docker-compose.yml 定義構(gòu)成應(yīng)用程序的服務(wù),這樣它們可以在隔離環(huán)境中一起運(yùn)行康愤。
  • 最后儡循,執(zhí)行 docker-compose up 命令來啟動并運(yùn)行整個應(yīng)用程序。

Compose 安裝

Linux 上我們可以從 Github 上下載它的二進(jìn)制包來使用征冷,最新發(fā)行的版本地址:https://github.com/docker/compose/releases择膝。
運(yùn)行以下命令以下載 Docker Compose 的當(dāng)前穩(wěn)定版本:要安裝其他版本的 Compose,請?zhí)鎿Q 1.24.1检激。

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

注意: 對于 alpine肴捉,需要以下依賴包: py-pip,python-dev叔收,libffi-dev齿穗,openssl-dev,gcc饺律,libc-dev窃页,和 make。

使用:

# 創(chuàng)建一個測試目錄:
mkdir composetest
cd composetest
# 在此文件夾中放置 需要運(yùn)行的項目 如: springboot.jar复濒,還有Dockerfile脖卖,和docker-compose.yml
springboot.jar
Dockerfile
docker-compose.yml

docker-compose.yml 配置文件:

# yaml 配置
version: '3'                    # 指定本 yml 依從的 compose 哪個版本制定的。
services:                       # 
  web:                          # 該 web 服務(wù)使用從 Dockerfile 當(dāng)前目錄中構(gòu)建的鏡像巧颈。
    build: .                    # 指定為構(gòu)建鏡像上下文路徑:也就是Dockerfile文件的路徑
    networks:                   # 指定容器連接的網(wǎng)絡(luò)畦木,使用頂級 networks 下的條目 。
      - app-net                 # 
  redis:                        # 
    image: "redis:alpine"       # 指定容器運(yùn)行的鏡像砸泛。
    networks:                   # 指定容器連接的網(wǎng)絡(luò)十籍,使用頂級 networks 下的條目 。
      - app-net
networks:                       # 配置網(wǎng)絡(luò) 如果沒有會自動創(chuàng)建
  app-net:
    driver: bridge

使用 Compose 命令構(gòu)建和運(yùn)行您的應(yīng)用:

# 在測試目錄中唇礁,執(zhí)行以下命令來啟動應(yīng)用程序:
docker-compose up
# 如果你想在后臺執(zhí)行該服務(wù)可以加上 -d 參數(shù):
docker-compose up -d
# 若要對容器進(jìn)行擴(kuò)縮容
docker-compose up --scale web=5 -d
docker-compose ps
docker-compose logs web

Swarm 集群管理

簡介

Docker Swarm 是 Docker 的集群管理工具勾栗。它將 Docker 主機(jī)池轉(zhuǎn)變?yōu)閱蝹€虛擬 Docker 主機(jī)。 Docker Swarm 提供了標(biāo)準(zhǔn)的 Docker API垒迂,所有任何已經(jīng)與 Docker 守護(hù)程序通信的工具都可以使用 Swarm 輕松地擴(kuò)展到多個主機(jī)械姻。

支持的工具包括但不限于以下各項: Dokku、Docker Compose机断、Docker Machine楷拳、Jenkins

原理

如下圖所示,swarm 集群由管理節(jié)點(manager)和工作節(jié)點(work node)構(gòu)成吏奸。

  1. swarm mananger:負(fù)責(zé)整個集群的管理工作包括集群配置欢揖、服務(wù)管理等所有跟集群有關(guān)的工作。
  2. work node:即圖中的 available node奋蔚,主要負(fù)責(zé)運(yùn)行相應(yīng)的服務(wù)來執(zhí)行任務(wù)(task)她混。


    在這里插入圖片描述

搭建Swarm集群

  1. 進(jìn)入manager: manager node也可以作為 worker node提供服務(wù)
docker swarm init --advertise-addr=192.168.0.11     # 這里的ip對應(yīng)的是宿主機(jī)的ip

注意觀察日志烈钞,拿到worker node加入manager node的信息


在這里插入圖片描述
  1. 進(jìn)入兩個worker 執(zhí)行以下命令,加入到manager 集群中
docker swarm join --token SWMTKN-1-3zzim2k6p9v18ed2l94li2dngt10kvkibfa94gpjqvlt280y0f-9gkawx7564dzh4fvmqccwhnyh 192.168.0.48:2377
# 日志打印
This node joined a swarm as a worker.
# 進(jìn)入到 manager node 查看所有node節(jié)點
docker node ls
# 將 worker node 升級為 manager
docker node promote NODENAME
# 將 manager node 降級為 worker
docker node demote NODENAME
# 停止某個節(jié)點
docker node update --availability drain swarm-worker1
# 從新啟動某個節(jié)點
docker node update --availability active swarm-worker1

注意:swarm-worker1 狀態(tài)變?yōu)?Drain坤按。不會影響到集群的服務(wù)毯欣,只是 swarm-worker1 節(jié)點不再接收新的任務(wù),集群的負(fù)載能力有所下降臭脓。

Swarm基本操作

# 創(chuàng)建一個tomcat的service
docker service create --name my-tomcat tomcat
# 查看當(dāng)前swarm的service
docker service ls
# 查看service的啟動日志
docker service logs my-tomcat
# 查看 service詳情
docker service inspect my-tomcat
# 查看 my-tomcat 運(yùn)行在哪個node上
docker service ps my-tomcat
# 水平擴(kuò)展service
docker service scale my-tomcat=5
# 查看所有service
docker service ls
# 刪除 service
docker service rm my-tomcat

參考文章 https://blog.csdn.net/u012943767/article/details/79767670

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酗钞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子来累,更是在濱河造成了極大的恐慌砚作,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘹锁,死亡現(xiàn)場離奇詭異葫录,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)领猾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門米同,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘤运,你說我怎么就攤上這事窍霞。” “怎么了拯坟?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長韭山。 經(jīng)常有香客問我郁季,道長,這世上最難降的妖魔是什么钱磅? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任梦裂,我火速辦了婚禮,結(jié)果婚禮上盖淡,老公的妹妹穿的比我還像新娘年柠。我一直安慰自己,他們只是感情好褪迟,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布冗恨。 她就那樣靜靜地躺著,像睡著了一般味赃。 火紅的嫁衣襯著肌膚如雪掀抹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天心俗,我揣著相機(jī)與錄音傲武,去河邊找鬼蓉驹。 笑死,一個胖子當(dāng)著我的面吹牛揪利,可吹牛的內(nèi)容都是我干的态兴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疟位,長吁一口氣:“原來是場噩夢啊……” “哼瞻润!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起献汗,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤敢订,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罢吃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楚午,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年尿招,在試婚紗的時候發(fā)現(xiàn)自己被綠了矾柜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡就谜,死狀恐怖怪蔑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丧荐,我是刑警寧澤缆瓣,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站虹统,受9級特大地震影響弓坞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜车荔,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一渡冻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忧便,春花似錦族吻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至切平,卻和暖如春握础,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悴品。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工禀综, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留简烘,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓定枷,卻偏偏與公主長得像孤澎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欠窒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353