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 | 自定義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)成吏奸。
- swarm mananger:負(fù)責(zé)整個集群的管理工作包括集群配置欢揖、服務(wù)管理等所有跟集群有關(guān)的工作。
-
work node:即圖中的 available node奋蔚,主要負(fù)責(zé)運(yùn)行相應(yīng)的服務(wù)來執(zhí)行任務(wù)(task)她混。
搭建Swarm集群
- 進(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的信息
- 進(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