vue cdn做的網(wǎng)站搜索排名競價(jià)
一、Docker基本命令
1. Docker的常用命令
幫助命令
docker version # docker版本信息
docker info # 系統(tǒng)級(jí)別的信息,包括鏡像和容器的數(shù)量
docker 命令 --help
- 幫助文檔
鏡像命令
docker images 查看所有本地主機(jī)上的鏡像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 7 months ago 13.3kB# 解釋
REPOSITORY # 鏡像的倉庫
TAG # 鏡像的標(biāo)簽
IMAGE ID # 鏡像的ID
CREATED # 鏡像的創(chuàng)建時(shí)間
SIZE # 鏡像的大小# 可選項(xiàng)
--all , -a # 列出所有鏡像
--quiet , -q # 只顯示鏡像的id
docker search 查找鏡像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9822 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3586 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 719 [OK]# 可選項(xiàng)
--filter=STARS=3000 # 搜素出來的鏡像就是STARS大于3000的[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9822 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3586 [OK]
docker pull 下拉鏡像
# 下載鏡像,docker pull 鏡像名[:tag]
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql
Using default tag: latest # 如果不寫tag,默認(rèn)就是latest
latest: Pulling from library/mysql
bf5952930446: Pull complete # 分層下載,dockerimages的核心,聯(lián)合文件系統(tǒng)
8254623a9871: Pull complete
938e3e06dac4: Pull complete
ea28ebf28884: Pull complete
f3cef38785c2: Pull complete
894f9792565a: Pull complete
1d8a57523420: Pull complete
6c676912929f: Pull complete
ff39fdb566b4: Pull complete
fff872988aba: Pull complete
4d34e365ae68: Pull complete
7886ee20621e: Pull complete
Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed # 簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真實(shí)地址# 等價(jià)于
docker pull mysql
docker pull docker.io/library/mysql:latest# 指定版本下載
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bf5952930446: Already exists
8254623a9871: Already exists
938e3e06dac4: Already exists
ea28ebf28884: Already exists
f3cef38785c2: Already exists
894f9792565a: Already exists
1d8a57523420: Already exists
5f09bf1d31c1: Pull complete
1b6ff254abe7: Pull complete
74310a0bf42d: Pull complete
d398726627fd: Pull complete
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7# 查看本地鏡像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 718a6da099d8 6 days ago 448MB
mysql latest 0d64f46acfd1 6 days ago 544MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
docker rmi 刪除鏡像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID # 刪除指定鏡像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID1 IMAGE ID2 IMAGE ID3 # 刪除多個(gè)鏡像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f $(docker images -aq) # 刪除所有鏡像
容器命令
說明: 我們有了鏡像才可創(chuàng)建容器,linux,下載一個(gè)centos鏡像來測試學(xué)習(xí)
docker pull centos
新建容器并啟動(dòng)
docker run [可選參數(shù)] image# 參數(shù)說明
--name=“Name” 容器名字 tomcat01 tomcat02 用來區(qū)分容器
-d 后臺(tái)方式運(yùn)行
-it 使用交互方式運(yùn)行,進(jìn)入容器查看內(nèi)容
-p 指定容器的端口 -p 8080:8080-p ip:主機(jī)端口:容器端口-p 主機(jī)端口:容器端口(常用)-p 容器端口容器端口
-p 隨機(jī)指定端口# 測試,啟動(dòng)并進(jìn)入容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -it centos /bin/bash
[root@74e82b7980e7 /]# ls # 查看容器內(nèi)的centos,基礎(chǔ)版本,很多命令是不完善的
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr# 從容器中退回主機(jī)
[root@77969f5dcbf9 /]# exit
exit
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# ls
bin dev fanfan lib lost+found mnt proc run srv tmp var
boot etc home lib64 media opt root sbin sys usr
列出所有的運(yùn)行的容器
# docker ps 命令# 列出當(dāng)前正在運(yùn)行的容器
-a # 列出正在運(yùn)行的容器包括歷史容器
-n=? # 顯示最近創(chuàng)建的容器
-q # 只顯示當(dāng)前容器的編號(hào)[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77969f5dcbf9 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago xenodochial_bose
74e82b7980e7 centos "/bin/bash" 16 minutes ago Exited (0) 6 minutes ago silly_cori
a57250395804 bf756fb1ae65 "/hello" 7 hours ago Exited (0) 7 hours ago elated_nash
392d674f4f18 bf756fb1ae65 "/hello" 8 hours ago Exited (0) 8 hours ago distracted_mcnulty
571d1bc0e8e8 bf756fb1ae65 "/hello" 23 hours ago Exited (0) 23 hours ago magical_burnell[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -qa
77969f5dcbf9
74e82b7980e7
a57250395804
392d674f4f18
571d1bc0e8e8
退出容器
exit # 直接退出容器并關(guān)閉
Ctrl + P + Q # 容器不關(guān)閉退出
刪除容器
docker rm -f 容器id # 刪除指定容器
docker rm -f $(docker ps -aq) # 刪除所有容器
docker ps -a -q|xargs docker rm -f # 刪除所有的容器
啟動(dòng)和停止容器的操作
docker start 容器id # 啟動(dòng)容器
docker restart 容器id # 重啟容器
docker stop 容器id # 停止當(dāng)前正在運(yùn)行的容器
docker kill 容器id # 強(qiáng)制停止當(dāng)前的容器
常用的其他命令
后臺(tái)啟動(dòng)容器
# 命令 docker run -d 鏡像名
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos# 問題 docker ps, 發(fā)現(xiàn)centos停止了# 常見的坑, docker 容器使用后臺(tái)運(yùn)行, 就必須要有一個(gè)前臺(tái)進(jìn)程,docker發(fā)現(xiàn)沒有應(yīng)用,就會(huì)自動(dòng)停止
# nginx, 容器啟動(dòng)后,發(fā)現(xiàn)自己沒有提供服務(wù),就會(huì)立即停止,就是沒有程序了
查看日志
docker logs -tf --tail number 容器id[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 1 8d1621e09bff
2020-08-11T10:53:15.987702897Z [root@8d1621e09bff /]# exit # 日志輸出# 自己編寫一段shell腳本
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos /bin/sh -c "while true;do echo xiaofan;sleep 1;done"
a0d580a21251da97bc050763cf2d5692a455c228fa2a711c3609872008e654c2[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0d580a21251 centos "/bin/sh -c 'while t…" 3 seconds ago Up 1 second lucid_black# 顯示日志
-tf # 顯示日志
--tail number # 顯示日志條數(shù)
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 10 a0d580a21251
查看容器中進(jìn)程信息ps
# 命令 docker top 容器id
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker top df358bc06b17
UID PID PPID C STIME TTY
root 28498 28482 0 19:38 ?
查看鏡像的元數(shù)據(jù)
# 命令
docker inspect 容器id[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker inspect df358bc06b17
[{"Id": "df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3","Created": "2020-08-11T11:38:34.935048603Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 28498,"ExitCode": 0,"Error": "","StartedAt": "2020-08-11T11:38:35.216616071Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566","ResolvConfPath": "/var/lib/docker/containers/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3/resolv.conf","HostnamePath": "/var/lib/docker/containers/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3/hostname","HostsPath": "/var/lib/docker/containers/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3/hosts","LogPath": "/var/lib/docker/containers/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3-json.log","Name": "/hungry_heisenberg","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"Capabilities": null,"Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"KernelMemory": 0,"KernelMemoryTCP": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/5af8a2aadbdba9e1e066331ff4bce56398617710a22ef906f9ce4d58bde2d360-init/diff:/var/lib/docker/overlay2/62926d498bd9d1a6684bb2f9920fb77a2f88896098e66ef93c4b74fcb19f29b6/diff","MergedDir": "/var/lib/docker/overlay2/5af8a2aadbdba9e1e066331ff4bce56398617710a22ef906f9ce4d58bde2d360/merged","UpperDir": "/var/lib/docker/overlay2/5af8a2aadbdba9e1e066331ff4bce56398617710a22ef906f9ce4d58bde2d360/diff","WorkDir": "/var/lib/docker/overlay2/5af8a2aadbdba9e1e066331ff4bce56398617710a22ef906f9ce4d58bde2d360/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "df358bc06b17","Domainname": "","User": "","AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Tty": true,"OpenStdin": true,"StdinOnce": true,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20200809","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"NetworkSettings": {"Bridge": "","SandboxID": "4822f9ac2058e8415ebefbfa73f05424fe20cc8280a5720ad3708fa6e80cdb08","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/4822f9ac2058","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "5fd269c0a28227241e40cd30658e3ffe8ad6cc3e6514917c867d89d36a31d605","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "30d6017888627cb565618b1639fecf8fc97e1ae4df5a9fd5ddb046d8fb02b565","EndpointID": "5fd269c0a28227241e40cd30658e3ffe8ad6cc3e6514917c867d89d36a31d605","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null}}}}
]
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]#
進(jìn)入當(dāng)前正在運(yùn)行的容器
# 我們通常容器使用后臺(tái)方式運(yùn)行的, 需要進(jìn)入容器,修改一些配置# 命令
docker exec -it 容器id /bin/bash# 測試
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker exec -it df358bc06b17 /bin/bash
[root@df358bc06b17 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@df358bc06b17 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug11 pts/0 00:00:00 /bin/bash
root 29 0 0 01:06 pts/1 00:00:00 /bin/bash
root 43 29 0 01:06 pts/1 00:00:00 ps -ef# 方式二
docker attach 容器id# docker exec # 進(jìn)入容器后開啟一個(gè)新的終端,可以在里面操作
# docker attach # 進(jìn)入容器正在執(zhí)行的終端,不會(huì)啟動(dòng)新的進(jìn)程
從容器中拷貝文件到主機(jī)
docker cp 容器id:容器內(nèi)路徑 目的地主機(jī)路徑[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker cp 7af535f807e0:/home/Test.java /home
二、Docker部署軟件實(shí)戰(zhàn)
1.Docker部署軟件實(shí)戰(zhàn)
Docker安裝Nginx
# 1. 搜索鏡像 search 建議去docker hub搜索,可以看到幫助文檔
# 2. 下載鏡像 pull
# 3. 運(yùn)行測試
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 32 hours ago 215MB
nginx latest 08393e824c32 7 days ago 132MB# -d 后臺(tái)運(yùn)行
# -name 給容器命名
# -p 宿主機(jī)端口:容器內(nèi)部端口
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d --name nginx01 -p 3344:80 nginx # 后臺(tái)方式啟動(dòng)啟動(dòng)鏡像
fe9dc33a83294b1b240b1ebb0db9cb16bda880737db2c8a5c0a512fc819850e0
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe9dc33a8329 nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:3344->80/tcp nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# curl localhost:3344 # 本地訪問測試# 進(jìn)入容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker exec -it nginx01 /bin/bash
root@fe9dc33a8329:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@fe9dc33a8329:/# cd /etc/nginx/
root@fe9dc33a8329:/etc/nginx# ls
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
端口暴露概念
2. Docker安裝Tomcat
# 官方的使用
docker run -it --rm tomcat:9.0# 我們之前的啟動(dòng)都是后臺(tái)的,停止了容器之后, 容器還是可以查到,docker run -it --rm 一般用來測試,用完就刪# 下載再啟動(dòng)
docker pull tomcat# 啟動(dòng)運(yùn)行
docker run -d -p 3344:8080 --name tomcat01 tomcat# 測試訪問沒有問題# 進(jìn)入容器
docker exec -it tomcat01 /bin/bash# 發(fā)現(xiàn)問題:1.linux命令少了, 2. webapps下內(nèi)容為空,阿里云凈吸納過默認(rèn)是最小的鏡像,所有不必要的都剔除了,保證最小可運(yùn)行環(huán)境即可
3. Docker部署es + kibana
# es 暴露的端口很多
# es 十分的耗內(nèi)存
# es 的數(shù)據(jù)一般需要放置到安全目錄! 掛載
# --net somenetwork 網(wǎng)絡(luò)配置# 啟動(dòng)elasticsearch
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
a920894a940b354d3c867079efada13d96cf9138712c76c8dea58fabd9c7e96f# 啟動(dòng)了linux就卡主了,docker stats 查看cpu狀態(tài)# 測試一下es成功了
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# curl localhost:9200
{"name" : "a920894a940b","cluster_name" : "docker-cluster","cluster_uuid" : "bxE1TJMEThKgwmk7Aa3fHQ","version" : {"number" : "7.6.2","build_flavor" : "default","build_type" : "docker","build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f","build_date" : "2020-03-26T06:34:37.794943Z","build_snapshot" : false,"lucene_version" : "8.4.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}# 增加內(nèi)存限制,修改配置文件 -e 環(huán)境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
可視化
- portainer(先用這個(gè))
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer# 測試
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# curl localhost:8088
<!DOCTYPE html
><html lang="en" ng-app="portainer"># 外網(wǎng)訪問 http://ip:8088
- Rancher(CI/CD再用)
三、Docker原理
特點(diǎn)
Docker獎(jiǎng)項(xiàng)都是只讀的,當(dāng)容器啟動(dòng)時(shí), 一個(gè)新的可寫層被加載到鏡像的頂部!
這一層就是我們通常說的容器層, 容器之下的都叫做鏡像層
- commit鏡像
docker commit 提交容器成為一個(gè)新的版本# 命令和git 原理類似
docker commit -m="提交的描述信息" -a="作者" 容器id 目標(biāo)鏡像名:[TAG]docker commit -a="xiaofan" -m="add webapps app" d798a5946c1f tomcat007:1.0
實(shí)戰(zhàn)測試
# 1. 啟動(dòng)一個(gè)默認(rèn)的tomcat
# 2. 發(fā)現(xiàn)這個(gè)默認(rèn)的tomcat是沒有webapps應(yīng)用, 鏡像的原因,官方鏡像默認(rèn)webapps下面是沒有內(nèi)容的
# 3. 我自己拷貝進(jìn)去了基本的文件
# 4. 將我們操作過的容器通過commit提價(jià)為一個(gè)鏡鏡像!我們以后就使用我們自己制作的鏡像了
四、容器數(shù)據(jù)卷
1. 容器數(shù)據(jù)卷
1.1. docker的理解回顧
將應(yīng)用和環(huán)境打包成一個(gè)鏡像!
數(shù)據(jù)?如果數(shù)據(jù)都在容器中,那么我們?nèi)萜鲃h除,數(shù)據(jù)就會(huì)丟失!需求:數(shù)據(jù)可以持久化
MySQL,容器刪了,刪庫跑路!需求:MySQL數(shù)據(jù)可以存儲(chǔ)在本地!
容器之間可以有一個(gè)數(shù)據(jù)共享技術(shù)!Docker容器中產(chǎn)生的數(shù)據(jù),同步到本地!
這就是卷技術(shù),目錄的掛載,將我們?nèi)萜鲀?nèi)的目錄掛載到linux目錄上面!
**總結(jié): **容器的持久化和同步操作!容器間數(shù)據(jù)也是可以共享的!
1.2. 使用數(shù)據(jù)卷
方式一:直接使用命令來掛載 -v
docker run -it -v 主機(jī)目錄:容器目錄[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
測試文件的同步(在主機(jī)上改動(dòng),觀察容器變化)
再來測試(測試通過)
- 停止容器
- 主機(jī)上修改文件
- 啟動(dòng)容器
- 容器內(nèi)的數(shù)據(jù)依舊是同步的!
1.3. 實(shí)戰(zhàn):安裝MySQL
思考:MySQL的數(shù)據(jù)持久化的問題!
# 獲取鏡像
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker pull mysql:5.7# 運(yùn)行容器, 需要做數(shù)據(jù)掛載! # 安裝啟動(dòng)mysql,需要配置密碼(注意)
# 官方測試, docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 啟動(dòng)我們的
-d # 后臺(tái)運(yùn)行
-p # 端口隱射
-v # 卷掛載
-e # 環(huán)境配置
--name # 容器的名字
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
9552bf4eb2b69a2ccd344b5ba5965da4d97b19f2e1a78626ac1f2f8d276fc2ba# 啟動(dòng)成功之后,我們在本地使用navicat鏈接測試一下
# navicat鏈接到服務(wù)器的3344 --- 3344 和 容器的3306映射,這個(gè)時(shí)候我們就可以連接上mysql嘍!# 在本地測試創(chuàng)建一個(gè)數(shù)據(jù)庫,查看下我們的路徑是否ok!
1.4. 匿名和具名掛載
# 匿名掛載
-v 容器內(nèi)路徑
docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 隨機(jī)指定端口# 查看所有volume的情況
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882# 這里發(fā)現(xiàn),這種情況就是匿名掛載,我們在-v 后面只寫了容器內(nèi)的路徑,沒有寫容器外的路徑!# 具名掛載
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26da1ec7d499 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32769->80/tcp nginx02
486de1da03cb nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local juming-nginx# 通過-v 卷名:容器內(nèi)的路徑
# 查看一下這個(gè)卷
# docker volume inspect juming-nginx[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[{"CreatedAt": "2020-08-12T18:15:21+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"}
]
所有docker容器內(nèi)的卷,沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxxxx/_data
我們通過具名掛載可以方便的找到我們的一個(gè)卷,大多數(shù)情況下使用的是具名掛載
# 通過 -v 容器內(nèi)容路徑 ro rw 改變讀寫權(quán)限
ro readonly # 只讀
rw readwrite # 可讀可寫docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx# ro 只要看到ro就說明這個(gè)路徑只能通過宿主機(jī)來操作,容器內(nèi)容無法操作
拓展
# 通過 -v 容器內(nèi)容路徑 ro rw 改變讀寫權(quán)限
ro readonly # 只讀
rw readwrite # 可讀可寫docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx# ro 只要看到ro就說明這個(gè)路徑只能通過宿主機(jī)來操作,容器內(nèi)容無法操作
五、DockerFile
初始DockerFile
DockerFile就是用來狗之間docker鏡像的構(gòu)建文件!命令腳本!先體驗(yàn)一下!
通過這個(gè)腳本可以生成鏡像,鏡像是一層一層的,腳本一個(gè)個(gè)的命令,每個(gè)命令都是一層!
# 創(chuàng)建一個(gè)dockerfile文件, 名字可以隨機(jī)
# 文件的內(nèi)容 指定(大寫) 參數(shù)FROM centosVOLUME ["volume01", "volume02"]CMD echo "----end----"
CMD /bin/bash# 這里的每一個(gè)命令都是鏡像的一層!
# 啟動(dòng)自己的容器
這個(gè)卷和外部一定有一個(gè)同步的目錄!
docker inspect 容器id
測試一下剛才的文件是否同步到主機(jī)上了!
這種方式我們未來使用的十分多, 因?yàn)槲覀兺ǔ?huì)構(gòu)建自己的鏡像!
假設(shè)構(gòu)建鏡像時(shí)候沒有掛載卷,要手動(dòng)鏡像掛載 -v 卷名:容器內(nèi)路徑!
數(shù)據(jù)卷容器
多個(gè)mysql同步數(shù)據(jù)!
# 啟動(dòng)3個(gè)容器,通過我們剛才自己寫的鏡像啟動(dòng)
多個(gè)mysql實(shí)現(xiàn)數(shù)據(jù)共享
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
結(jié)論
容器之間配置信息的傳遞, 數(shù)據(jù)卷容器的聲明周期一直持續(xù)到?jīng)]有容器使用為止。
但是一旦你持久化到了本地,這個(gè)時(shí)候,本地的數(shù)據(jù)是不會(huì)刪除的!
DockerFile
dockerFile是用來構(gòu)建docker鏡像的文件!命令參數(shù)腳本!
構(gòu)建步驟
1. 編寫一個(gè)dockerFile文件
2.docker build 構(gòu)建成為一個(gè)鏡像
3. docker run 運(yùn)行鏡像
4. docker push 發(fā)布鏡像(DockerHub、阿里云鏡像)
查看嬰喜愛官方是怎么做的?
很多官方鏡像都像是基礎(chǔ)包,很多功能都不具備,我們通常會(huì)自己搭建自己的鏡像!
官方既然可以制作鏡像,能我們一樣可以!
DockerFile的構(gòu)建過程
基礎(chǔ)知識(shí):
- 每個(gè)保留關(guān)鍵字(指令)都是必須大寫字母
- 執(zhí)行從上到下順序執(zhí)行
- # 表示注釋
- 每個(gè)指令都會(huì)創(chuàng)建提交一個(gè)新的鏡像層,并提交!
dockerFile是面向開發(fā)的, 我們以后要發(fā)布項(xiàng)目, 做鏡像, 就需要編寫dockefile文件, 這個(gè)文件十分簡單!
Docker鏡像逐漸成為企業(yè)的交互標(biāo)準(zhǔn),必須要掌握!
步驟:開發(fā),部署, 運(yùn)維..... 缺一不可!
DockerFile: 構(gòu)建文件, 定義了一切的步驟,源代碼
DockerImages: 通過DockerFile構(gòu)建生成的鏡像, 最終發(fā)布和運(yùn)行的產(chǎn)品!
Docker容器:容器就是鏡像運(yùn)行起來提供服務(wù)器
DockerFile指令說明
FROM # 基礎(chǔ)鏡像,一切從這里開始構(gòu)建
MAINTAINER # 鏡像是誰寫的, 姓名+郵箱
RUN # 鏡像構(gòu)建的時(shí)候需要運(yùn)行的命令
ADD # 步驟, tomcat鏡像, 這個(gè)tomcat壓縮包!添加內(nèi)容
WORKDIR # 鏡像的工作目錄
VOLUME # 掛載的目錄
EXPOSE # 保留端口配置
CMD # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,只有最后一個(gè)會(huì)生效可被替代
ENTRYPOINT # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令, 可以追加命令
ONBUILD # 當(dāng)構(gòu)建一個(gè)被繼承DockerFile 這個(gè)時(shí)候就會(huì)運(yùn)行 ONBUILD 的指令,觸發(fā)指令
COPY # 類似ADD, 將我們文件拷貝到鏡像中
ENV # 構(gòu)建的時(shí)候設(shè)置環(huán)境變量!
創(chuàng)建一個(gè)自己的centos
# 1. 編寫Dockerfile的文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAINER xiaofan<594042358@qq.com>ENV MYPATH /usr/local
WORKDIR $MYPATH # 鏡像的工作目錄RUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash# 2. 通過這個(gè)文件構(gòu)建鏡像
# 命令 docker build -f dockerfile文件路徑 -t 鏡像名:[tag] .[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .Successfully built d2d9f0ea8cb2
Successfully tagged mycentos:0.1
我們可以列出本地進(jìn)行的變更歷史
CMD 和ENTRYPOINT區(qū)別
CMD # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,只有最后一個(gè)會(huì)生效可被替代
ENTRYPOINT # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令, 可以追加命令
測試CMD
# 1. 編寫dockerfile文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls", "-a"]# 2. 構(gòu)建鏡像
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .# 3. run運(yùn)行, 發(fā)現(xiàn)我們的ls -a 命令生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125
.
..
.dockerenv
bin
dev
etc
home
lib
lib64# 想追加一個(gè)命令 -l 變成 ls -al
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l# cmd的情況下 -l替換了CMD["ls", "-a"]命令, -l不是命令,所以報(bào)錯(cuò)了
測試ENTRYPOINT
# 1. 編寫dockerfile文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls", "-a"]# 2. 構(gòu)建文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test .# 3. run運(yùn)行 發(fā)現(xiàn)我們的ls -a 命令同樣生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test
.
..
.dockerenv
bin
dev
etc
home
lib# 4. 我們的追加命令, 是直接拼接到ENTRYPOINT命令的后面的!
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test -l
total 56
drwxr-xr-x 1 root root 4096 Aug 13 07:52 .
drwxr-xr-x 1 root root 4096 Aug 13 07:52 ..
-rwxr-xr-x 1 root root 0 Aug 13 07:52 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Aug 13 07:52 dev
drwxr-xr-x 1 root root 4096 Aug 13 07:52 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Aug 9 21:40 lost+found
六、Dockerfile制作tomcat鏡像
Dockerfile制作tomcat鏡像
- 準(zhǔn)備鏡像文件 tomcat壓縮包,jdk的壓縮包!
- 編寫Dockerfile文件,官方命名Dockerfile, build會(huì)自動(dòng)尋找這個(gè)文件,就不需要-f指定了!
[root@iZ2zeg4ytp0whqtmxbsqiiZ tomcat]# cat Dockerfile
FROM centos
MAINTAINER xiaofan<594042358@qq.com>COPY readme.txt /usr/local/readme.txtADD jdk-8u73-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/local
WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/logs/catalina.out
- 構(gòu)建鏡像
# docker build -t diytomcat .
- 啟動(dòng)鏡像
# docker run -d -p 3344:8080 --name xiaofantomcat1 -v /home/xiaofan/build/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v /home/xiaofan/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.37/logs diytomcat
- 訪問測試
- 發(fā)布項(xiàng)目(由于做了卷掛載, 我們直接在本地編寫項(xiàng)目就可以發(fā)布了)
在本地編寫web.xml和index.jsp進(jìn)行測試
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. xiaofan</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>
發(fā)現(xiàn):項(xiàng)目部署成功, 可以直接訪問ok!
我們以后開發(fā)的步驟:需要掌握Dockerfile的編寫! 我們之后的一切都是使用docker進(jìn)行來發(fā)布運(yùn)行的!
發(fā)布自己的鏡像到Docker Hub
Docker Hub
- 地址 注冊自己的賬號(hào)!
- 確定這個(gè)賬號(hào)可以登錄
- 在我們的服務(wù)器上提交自己的鏡像
# push到我們的服務(wù)器上
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker push diytomcat
The push refers to repository [docker.io/library/diytomcat]
2eaca873a720: Preparing
1b38cc4085a8: Preparing
088ebb58d264: Preparing
c06785a2723d: Preparing
291f6e44771a: Preparing
denied: requested access to the resource is denied # 拒絕# push鏡像的問題?
The push refers to repository [docker.io/1314520007/diytomcat]
An image does not exist locally with the tag: 1314520007/diytomcat# 解決,增加一個(gè)tag
docker tag diytomcat 1314520007/tomcat:1.0
發(fā)布到阿里云鏡像服務(wù)上
- 登錄阿里云
- 找到容器鏡像服務(wù)
- 創(chuàng)建命名空間
- 創(chuàng)建容器鏡像
- 點(diǎn)擊倉庫名稱,參考官方文檔即可
總結(jié)
七、Docker網(wǎng)絡(luò)
1. Docker網(wǎng)絡(luò)
鏈接Docker0
測試
三個(gè)網(wǎng)絡(luò)
# 問題: docker是如何處理容器網(wǎng)絡(luò)訪問的?# [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat01 tomcat# 查看容器內(nèi)部的網(wǎng)絡(luò)地址 ip addr
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat01 ip addr, 發(fā)現(xiàn)容器啟動(dòng)的時(shí)候得到一個(gè)eth0@if115 ip地址,docker分配的!
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
114: eth0@if115: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever# 思考: linux 能不能ping通容器?
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.077 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.075 ms# linux 可以 ping 通docker容器內(nèi)部!
原理
- 我們沒啟動(dòng)一個(gè)docker容器, docker就會(huì)給docker容器分配一個(gè)ip, 我們只要安裝了docker,就會(huì)有一個(gè)網(wǎng)卡 docker0橋接模式,使用的技術(shù)是veth-pair技術(shù)!
再次測試 ip addr
- 再啟動(dòng)一個(gè)容器測試, 發(fā)現(xiàn)又多了一對(duì)網(wǎng)卡
# 我們發(fā)現(xiàn)這個(gè)容器帶來網(wǎng)卡,都是一對(duì)對(duì)的
# veth-pair 就是一對(duì)的虛擬設(shè)備接口,他們都是成對(duì)出現(xiàn)的,一端連著協(xié)議,一端彼此相連
# 正因?yàn)橛羞@個(gè)特性,veth-pair充當(dāng)一個(gè)橋梁, 連接各種虛擬網(wǎng)絡(luò)設(shè)備
# OpenStac, Docker容器之間的鏈接,OVS的鏈接, 都是使用veth-pair技術(shù)
- 我們測試一下tomcat01和tomcat02之間是否可以ping通!
結(jié)論:容器與容器之間是可以相互ping通的!
繪制一個(gè)網(wǎng)絡(luò)模型圖
結(jié)論:tomcat01和tomcat02是共用的一個(gè)路由器,docker0
所有容器不指定網(wǎng)絡(luò)的情況下,都是docker0路由的,doucker會(huì)給我們的容器分配一個(gè)默認(rèn)的可用IP
小結(jié)
Docker使用的是Linux的橋接,宿主機(jī)中是一個(gè)Docker容器的網(wǎng)橋docker0.
Docker中的所有的網(wǎng)絡(luò)接口都是虛擬的,虛擬的轉(zhuǎn)發(fā)效率高!(內(nèi)網(wǎng)傳遞文件!)
只要容器刪除,對(duì)應(yīng)的網(wǎng)橋一對(duì)就沒有了!
-- link
思考一個(gè)場景,我們編寫了一個(gè)微服務(wù),database url =ip; 項(xiàng)目不重啟,數(shù)據(jù)ip換掉了,我們希望可以處理這個(gè)問題,可以按名字來進(jìn)行訪問容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known# 如何可以解決呢?
# 通過--link既可以解決網(wǎng)絡(luò)連通問題
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
3a2bcaba804c5980d94d168457c436fbd139820be2ee77246888f1744e6bb473
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a2bcaba804c tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:32772->8080/tcp tomcat03
f22ed47ed1be tomcat "catalina.sh run" 57 minutes ago Up 57 minutes 0.0.0.0:32771->8080/tcp tomcat02
9d97f93401a0 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:32770->8080/tcp tomcat01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.129 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.110 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.107 ms# 反向可以ping通嗎?
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
探究:inspect!
其實(shí)這個(gè)tomcat03就是在本地配置了tomcat02的配置?
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 f22ed47ed1be
172.17.0.4 3a2bcaba804c
本質(zhì)探究:--link 就是我們在hosts配置中增加了一個(gè)172.17.0.3 tomcat02 f22ed47ed1be
我們現(xiàn)在玩Docker已經(jīng)不建議使用--link了!
自定義網(wǎng)絡(luò)!不使用Docker0!
Docker0的問題:它不支持容器名鏈接訪問!
自定義網(wǎng)絡(luò)
查看所有的docker網(wǎng)絡(luò)
網(wǎng)絡(luò)模式
bridge: 橋接模式,橋接 docker 默認(rèn),自己創(chuàng)建的也是用brdge模式
none: 不配置網(wǎng)絡(luò)
host: 和宿主機(jī)共享網(wǎng)絡(luò)
container:容器網(wǎng)絡(luò)連通!(用的少, 局限很大)
測試
# 我們直接啟動(dòng)的命令默認(rèn)有一個(gè) --net bridge,而這個(gè)就是我們的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat# docker0特點(diǎn),默認(rèn),容器名不能訪問, --link可以打通連接!
# 我們可以自定義一個(gè)網(wǎng)絡(luò)!
# --driver bridge
# --subnet 192.168.0.0/16 可以支持255*255個(gè)網(wǎng)絡(luò) 192.168.0.2 ~ 192.168.255.254
# --gateway 192.168.0.1
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
30d601788862 bridge bridge local
226019b14d91 host host local
26a5afdf4805 mynet bridge local
7496c014f74b none null local
我們自己創(chuàng)建的網(wǎng)絡(luò)就ok了!
在自己創(chuàng)建的網(wǎng)絡(luò)里面啟動(dòng)兩個(gè)容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
0e85ebe6279fd23379d39b27b5f47c1e18f23ba7838637802973bf6449e22f5c
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
c6e462809ccdcebb51a4078b1ac8fdec33f1112e9e416406b606d0c9fb6f21b5
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network inspect mynet
[{"Name": "mynet","Id": "26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec","Created": "2020-08-14T11:12:40.553433163+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.168.0.0/16","Gateway": "192.168.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"0e85ebe6279fd23379d39b27b5f47c1e18f23ba7838637802973bf6449e22f5c": {"Name": "tomcat-net-01","EndpointID": "576ce5c0f5860a5aab5e487a805da9d72f41a409c460f983c0bd341dd75d83ac","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""},"c6e462809ccdcebb51a4078b1ac8fdec33f1112e9e416406b606d0c9fb6f21b5": {"Name": "tomcat-net-02","EndpointID": "81ecbc4fe26e49855fe374f2d7c00d517b11107cc91a174d383ff6be37d25a30","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]# 再次拼連接
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.113 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.093 ms
^C
--- 192.168.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.093/0.103/0.113/0.010 ms
# 現(xiàn)在不使用 --link也可以ping名字了!
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.068 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.096 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.094 ms
我們自定義的網(wǎng)絡(luò)docker都已經(jīng)幫我們維護(hù)好了對(duì)應(yīng)的關(guān)系,推薦我們平時(shí)這樣使用網(wǎng)絡(luò)
好處:
redis - 不同的集群使用不同的網(wǎng)絡(luò),保證集群時(shí)安全和健康的
mysql - 不同的集群使用不同的網(wǎng)絡(luò),保證集群時(shí)安全和健康的
網(wǎng)絡(luò)連通
測試打通tomcat01 和mynet
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network connect mynet tomcat01# 連通之后就是講tomcat01 放到了mynet網(wǎng)路下
# 一個(gè)容器兩個(gè)ip地址:
# 阿里云服務(wù)器,公網(wǎng)ip,私網(wǎng)ip
# 連通ok
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.085 ms
^C
--- tomcat-net-01 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.085/0.092/0.100/0.012 ms
# 依舊無法連通,沒有connect
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
結(jié)論:假設(shè)要跨網(wǎng)絡(luò) 操作別人,就要使用docker network connect連通.....!
實(shí)戰(zhàn):部署redis
# 創(chuàng)建網(wǎng)卡
docker network create redis --subnet 172.38.0.0/16# 通過腳本創(chuàng)建六個(gè)redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 創(chuàng)建結(jié)點(diǎn)1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf#創(chuàng)建結(jié)點(diǎn)2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#創(chuàng)建結(jié)點(diǎn)3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#創(chuàng)建結(jié)點(diǎn)4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#創(chuàng)建結(jié)點(diǎn)5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#創(chuàng)建結(jié)點(diǎn)6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 創(chuàng)建集群
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof nodes.conf
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 541b7d237b641ac2ffc94d17c6ab96b18b26a638 172.38.0.11:6379slots:[0-5460] (5461 slots) master
M: a89c1f1245b264e4a402a3cf99766bcb6138dbca 172.38.0.12:6379slots:[5461-10922] (5462 slots) master
M: 259e804d6df74e67a72e4206d7db691a300c775e 172.38.0.13:6379slots:[10923-16383] (5461 slots) master
S: 9b19170eea3ea1b92c58ad18c0b5522633a9e271 172.38.0.14:6379replicates 259e804d6df74e67a72e4206d7db691a300c775e
S: 061a9d38f22910aaf0ba1dbd21bf1d8f57bcb7d5 172.38.0.15:6379replicates 541b7d237b641ac2ffc94d17c6ab96b18b26a638
S: 7a16b9bbb0615ec95fc978fa62fc054df60536f0 172.38.0.16:6379replicates a89c1f1245b264e4a402a3cf99766bcb6138dbca
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 541b7d237b641ac2ffc94d17c6ab96b18b26a638 172.38.0.11:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: a89c1f1245b264e4a402a3cf99766bcb6138dbca 172.38.0.12:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: 7a16b9bbb0615ec95fc978fa62fc054df60536f0 172.38.0.16:6379slots: (0 slots) slavereplicates a89c1f1245b264e4a402a3cf99766bcb6138dbca
S: 061a9d38f22910aaf0ba1dbd21bf1d8f57bcb7d5 172.38.0.15:6379slots: (0 slots) slavereplicates 541b7d237b641ac2ffc94d17c6ab96b18b26a638
M: 259e804d6df74e67a72e4206d7db691a300c775e 172.38.0.13:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 9b19170eea3ea1b92c58ad18c0b5522633a9e271 172.38.0.14:6379slots: (0 slots) slavereplicates 259e804d6df74e67a72e4206d7db691a300c775e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
docker搭建redis集群完成!
SpringBoot微服務(wù)打包Docker鏡像
- 構(gòu)建springboot項(xiàng)目
? IDEA2020 Ultimate版本激活方案 親測有效
- 打包應(yīng)用
- 編寫Dockerfile
FROM java:8COPY *.jar /app.jar
CMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java", "-jar", "/app.jar"]
- 構(gòu)建鏡像
- 發(fā)布運(yùn)行!
# 把打好的jar包和Dockerfile上傳到linux
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# ll
total 16140
-rw-r--r-- 1 root root 16519871 Aug 14 17:38 demo-0.0.1-SNAPSHOT.jar
-rw-r--r-- 1 root root 122 Aug 14 17:38 Dockerfile# 構(gòu)建鏡像,不要忘了最后有一個(gè)點(diǎn)
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker build -t xiaofan666 .
Sending build context to Docker daemon 16.52MB
Step 1/5 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8---> d23bdf5b1b1b
Step 2/5 : COPY *.jar /app.jar---> d4de8837ebf9
Step 3/5 : CMD ["--server.port=8080"]---> Running in e3abc66303f0
Removing intermediate container e3abc66303f0---> 131bb3917fea
Step 4/5 : EXPOSE 8080---> Running in fa2f25977db7
Removing intermediate container fa2f25977db7---> d98147377951
Step 5/5 : ENTRYPOINT ["java", "-jar", "/app.jar"]---> Running in e1885e23773b
Removing intermediate container e1885e23773b---> afb6b5f28a32
Successfully built afb6b5f28a32
Successfully tagged xiaofan666:latest# 查看鏡像
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xiaofan666 latest afb6b5f28a32 14 seconds ago 660MB
tomcat latest 2ae23eb477aa 8 days ago 647MB
redis 5.0.9-alpine3.11 3661c84ee9d0 3 months ago 29.8MB
java 8 d23bdf5b1b1b 3 years ago 643MB# 運(yùn)行容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker run -d -P --name xiaofan-springboot-web xiaofan666
fd9a353a80bfd61f6930c16cd92204532bfd734e003f3f9983b5128a27b0375e
# 查看運(yùn)行起來的容器端口(因?yàn)槲覀儐?dòng)的時(shí)候沒有指定)
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd9a353a80bf xiaofan666 "java -jar /app.jar …" 9 seconds ago Up 8 seconds 0.0.0.0:32779->8080/tcp xiaofan-springboot-web
# 本地訪問1
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# curl localhost:32779
{"timestamp":"2020-08-14T09:42:57.371+00:00","status":404,"error":"Not Found","message":"","path":"/"}
# 本地訪問2
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# curl localhost:32779/hello
hello, xiaofan
# 遠(yuǎn)程訪問(開啟阿里云上的安全組哦)
以后我們使用了Docker之后,給別人交互的就是一個(gè)鏡像即可!
八、Docker Compose
Docker Compose
簡介
Docker
Dockerfile build run 手動(dòng)操作,單個(gè)容器!
微服務(wù),100個(gè)微服務(wù),依賴關(guān)系。
Docker Compose 來輕松高效的管理容器,定義運(yùn)行多個(gè)容器。
官方介紹
- 定義運(yùn)行多個(gè)容器
- YAML file配置文件
- single command。命令有哪些?
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
- 所有的環(huán)境都可以使用compose。
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
三步驟:
Using Compose is basically a three-step process:
- Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
-
- Dockerfile保證我們的項(xiàng)目再任何地方可以運(yùn)行
- Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
-
- services 什么是服務(wù)。
- Run docker-compose up and Compose starts and runs your entire app.
-
- 啟動(dòng)項(xiàng)目
作用:批量容器編排
我自己的理解
Compose是Docker官方的開源項(xiàng)目,需要安裝!
Dockerfile讓程序在任何地方運(yùn)行。web服務(wù)、redis、mysql、nginx... 多個(gè)容器。 run
Compose
version: '2.0'
services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis
volumes:logvolume01: {}
docker-compose up 100個(gè)服務(wù)
Compose:重要概念
- 服務(wù)services, 容器、應(yīng)用(web、redis、mysql...)
- 項(xiàng)目project。 一組關(guān)聯(lián)的容器
安裝
- 下載
# 官網(wǎng)提供 (沒有下載成功)
curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 國內(nèi)地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 授權(quán)
chmod +x /usr/local/bin/docker-compose
體驗(yàn)(沒有測試通過)
地址:https://docs.docker.com/compose/gettingstarted/
python應(yīng)用。 計(jì)數(shù)器。redis!
- 應(yīng)用app.py
- Dockerfile 應(yīng)用打包為鏡像
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]# 官網(wǎng)的用來flask框架,我們這里不用它
# 這告訴Docker
# 從python3.7開始構(gòu)建鏡像
# 將當(dāng)前目錄添加到/code印像中的路徑中
# 將工作目錄設(shè)置為/code
# 安裝Python依賴項(xiàng)
# 將容器的默認(rèn)命令設(shè)置為python app.py
- Docker-compose yaml文件(定義整個(gè)服務(wù),需要的環(huán)境 web、redis) 完整的上線服務(wù)!
version: '3.8'
services:web:build: .ports:- "5000:5000"volumes:- .:/coderedis:image: "redis:alpine"
- 啟動(dòng)compose 項(xiàng)目 (docker-compose up)
流程:
- 創(chuàng)建網(wǎng)絡(luò)
- 執(zhí)行Docker-compose.yaml
- 啟動(dòng)服務(wù)
yaml規(guī)則
docker-compose.yaml 核心!
https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples
開源項(xiàng)目:博客
https://docs.docker.com/compose/wordpress/
下載程序、安裝數(shù)據(jù)庫、配置....
compose應(yīng)用 => 一鍵啟動(dòng)
- 下載項(xiàng)目(docker-compse.yaml)
- 如果需要文件。Dockerfile
- 文件準(zhǔn)備齊全,一鍵啟動(dòng)項(xiàng)目即可
實(shí)戰(zhàn):自己編寫微服務(wù)上線
- 編寫項(xiàng)目微服務(wù)
- Dockerfile構(gòu)建鏡像
FROM java:8COPY *.jar /app.jar
CMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java", "-jar", "/app.jar"]
- docker-compose.yml編排項(xiàng)目
version '3.8'
services:xiaofanapp:build: .image: xiaofanappdepends_on:- redisports:- "8080:8080"redis:image: "library/redis:alpine"
- 丟到服務(wù)器運(yùn)行 docker-compose up
docker-compose down # 關(guān)閉容器
docker-compose up --build # 重新構(gòu)建
總結(jié):
工程、服務(wù)、容器
項(xiàng)目 compose: 三層
- 工程 Project
- 服務(wù)
- 容器 運(yùn)行實(shí)例! docker k8s 容器
九、Docker Swarm
Docker Swarm
集群
購買服務(wù)器
- 登錄阿里云賬號(hào),進(jìn)入控制臺(tái),創(chuàng)建實(shí)例
4臺(tái)服務(wù)器2G
到此,我們的服務(wù)器購買成功!
四臺(tái)機(jī)器安裝docker
和我們單機(jī)安裝一樣
技巧: xshell直接同步操作,省時(shí)間!
- Docker的安裝
Swarm集群搭建
- 工作機(jī)制
docker swarm init --helpip addr # 獲取自己的ip(用內(nèi)網(wǎng)的不要流量)[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker swarm init --advertise-addr 172.16.250.97
Swarm initialized: current node (otdyxbk2ffbogdqq1kigysj1d) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-3vovnwb5pkkno2i3u2a42yrxc1dk51zxvto5hrm4asgn37syfn-0xkrprkuyyhrx7cidg381pdir 172.16.250.97:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
初始化結(jié)點(diǎn)docker swarm init
docker swarm join 加入一個(gè)結(jié)點(diǎn)!
# 獲取令牌
docker swarm join-token manager
docker swarm join-token worker
[root@iZ2ze58v8acnlxsnjoulk6Z ~]# docker swarm join --token SWMTKN-1-3vovnwb5pkkno2i3u2a42yrxc1dk51zxvto5hrm4asgn37syfn-0xkrprkuyyhrx7cidg381pdir 172.16.250.97:2377
This node joined a swarm as a worker.
把后面的結(jié)點(diǎn)都搭建進(jìn)去
100臺(tái)!
- 生成主節(jié)點(diǎn)init
- 加入(管理者,worker)
Raft協(xié)議
雙主雙從:假設(shè)一個(gè)結(jié)點(diǎn)掛了!其他結(jié)點(diǎn)是否可以用!
Raft協(xié)議:保證大多數(shù)結(jié)點(diǎn)存活才可以使用,只要>1, 集群至少大于3臺(tái)!
實(shí)驗(yàn):
1、將docker1機(jī)器停止。宕機(jī)!雙主,另外一個(gè)結(jié)點(diǎn)也不能使用了!
- 可以將其他結(jié)點(diǎn)離開docker swarm leave
- worker就是工作的,管理結(jié)點(diǎn)操作! 3臺(tái)結(jié)點(diǎn)設(shè)置為了管理結(jié)點(diǎn)。
- Docker swarm集群增加節(jié)點(diǎn)
十分簡單:集群,可用! 3個(gè)主節(jié)點(diǎn)。 > 1臺(tái)管理結(jié)點(diǎn)存活!
Raft協(xié)議:保證大多數(shù)結(jié)點(diǎn)存活,才可以使用,高可用!
體會(huì)
彈性、擴(kuò)縮容!集群!
以后告別 docker run!
docker-compose up!啟動(dòng)一個(gè)項(xiàng)目。單機(jī)!
集群: swarm docker-service
k8s service
容器 => 服務(wù)!
容器 => 服務(wù)! => 副本!
redis => 10個(gè)副本!(同時(shí)開啟10個(gè)redis容器)
體驗(yàn):創(chuàng)建服務(wù)、動(dòng)態(tài)擴(kuò)容服務(wù)、動(dòng)態(tài)更新服務(wù)
- 灰度發(fā)布(金絲雀發(fā)布)
-
- 編程浪子的博客
docker run 容器啟動(dòng)! 不具有擴(kuò)縮容器docker service 服務(wù)! 具有擴(kuò)縮容器,滾動(dòng)更新!
查看服務(wù)
動(dòng)態(tài)擴(kuò)縮容
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service update --replicas 3 my-nginx
1/3: running [==================================================>]
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service scale my-nginx=5
my-nginx scaled to 5
overall progress: 3 out of 5 tasks
overall progress: 3 out of 5 tasks
overall progress: 3 out of 5 tasks
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service scale my-nginx=1
my-nginx scaled to 1
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
移出!docker service rm
docker swarm其實(shí)并不難
只要會(huì)搭建集群、會(huì)啟動(dòng)服務(wù)、動(dòng)態(tài)管理容器就可以了!
概念的總結(jié)
swarm
集群的管理和編號(hào),docker可以初始化一個(gè)swarm集群,其他結(jié)點(diǎn)可以加入。(管理,工作者)
Node
就是一個(gè)docker結(jié)點(diǎn),多個(gè)結(jié)點(diǎn)就組成了一個(gè)網(wǎng)絡(luò)集群(管理、工作者)
Service
任務(wù),可以在管理結(jié)點(diǎn)或者工作結(jié)點(diǎn)來運(yùn)行。核心,用戶訪問。
Task
容器內(nèi)的命令、細(xì)節(jié)任務(wù)!
service
命令 -> 管理 -> api -> 調(diào)度 -> 工作結(jié)點(diǎn)(創(chuàng)建Task容器維護(hù)創(chuàng)建!)
服務(wù)副本和全局服務(wù)
調(diào)整service以什么方式運(yùn)行
--mode string
Service mode (replicated or global) (default "replicated")docker service create --mode replicated --name mytom tomcat:7 默認(rèn)的
docker service create --mode global --name haha alpine ping www.baidu.com
拓展: 網(wǎng)絡(luò)模式 "PublishMode":"ingress"
Swarm:
Overlay:
ingress:特殊的Overlay網(wǎng)絡(luò)!負(fù)載均衡的功能!ipvs vip!
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
74cecd37149f bridge bridge local
168d35c86dd5 docker_gwbridge bridge local
2b8f4eb9c2e5 host host local
dmddfc14n7r3 ingress overlay swarm
8e0f5f648e69 none null local[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker network inspect ingress
[{"Name": "ingress","Id": "dmddfc14n7r3vms5vgw0k5eay","Created": "2020-08-17T10:29:07.002315919+08:00","Scope": "swarm","Driver": "overlay","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "10.0.0.0/24","Gateway": "10.0.0.1"}]},"Internal": false,"Attachable": false,"Ingress": true,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"ingress-sbox": {"Name": "ingress-endpoint","EndpointID": "9d6ec47ec8309eb209f4ff714fbe728abe9d88f9f1cc7e96e9da5ebd95adb1c4","MacAddress": "02:42:0a:00:00:02","IPv4Address": "10.0.0.2/24","IPv6Address": ""}},"Options": {"com.docker.network.driver.overlay.vxlanid_list": "4096"},"Labels": {},"Peers": [{"Name": "cea454a89163","IP": "172.16.250.96"},{"Name": "899a05b64e09","IP": "172.16.250.99"},{"Name": "81d65a0e8c03","IP": "172.16.250.97"},{"Name": "36b31096f7e2","IP": "172.16.250.98"}]}
]
其他命令學(xué)習(xí)方式
- Docker Stack
docker-compose 單機(jī)部署項(xiàng)目
docker stack 集群部署# 單機(jī)
docker-compose up -d wordpress.yaml
# 集群
docker stack deploy wordpress.yaml
- Docker Secret
安全!配置密碼!證書![root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker secret --helpUsage: docker secret COMMANDManage Docker secretsCommands:create Create a secret from a file or STDIN as contentinspect Display detailed information on one or more secretsls List secretsrm Remove one or more secrets
- Docker Config
配置!
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker config --helpUsage: docker config COMMANDManage Docker configsCommands:create Create a config from a file or STDINinspect Display detailed information on one or more configsls List configsrm Remove one or more configs