之前在生產(chǎn)练俐,測(cè)試環(huán)境都接觸過(guò)docker swarm注暗,但沒(méi)實(shí)際部署過(guò),趁著部署自己做的django應(yīng)用猫牡,練一練手。
1.創(chuàng)建虛擬主機(jī):
λ brick [~] → docker-machine create --driver virtualbox Manager1 #命令會(huì)默認(rèn)使用boot2docker.iso鏡像創(chuàng)建
λ brick [~] → docker-machine create --driver virtualbox Worker1
Running pre-create checks...
Creating machine...
(Worker1) Copying /Users/brick/.docker/machine/cache/boot2docker.iso to /Users/brick/.docker/machine/machines/Worker1/boot2docker.iso...
(Worker1) Creating VirtualBox VM...
(Worker1) Creating SSH key...
(Worker1) Starting the VM...
(Worker1) Check network to re-create if needed...
(Worker1) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env Worker1\.
- 創(chuàng)建完畢可以使用docker-machine env查看環(huán)境變量邓线,使用 docker-machine ls 命令查看當(dāng)前狀態(tài)
λ brick [~] → docker-machine env Worker1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="[tcp://192.168.99.101:2376](tcp://192.168.99.101:2376)"
export DOCKER_CERT_PATH="/Users/brick/.docker/machine/machines/Worker1"
export DOCKER_MACHINE_NAME="Worker1"
# Run this command to configure your shell:
# eval $(docker-machine env Worker1)
λ brick [~] → docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
Manager1 - virtualbox Running [tcp://192.168.99.100:2376](tcp://192.168.99.100:2376) v18.06.1-ce
Worker1 - virtualbox Running [tcp://192.168.99.101:2376](tcp://192.168.99.101:2376) v18.06.1-ce
- 目前虛擬主機(jī)創(chuàng)建完成淌友,主機(jī)之間沒(méi)有關(guān)系,下面來(lái)建立Swarm集群關(guān)系
2. 建立Swarm集群關(guān)系:
- 首先介紹下進(jìn)入虛擬機(jī)的方法:
λ brick [~] → docker-machine ssh Manager1
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 18.06.1-ce, build HEAD : c7e5c3e - Wed Aug 22 16:27:42 UTC 2018
Docker version 18.06.1-ce, build e68fc7a
接下來(lái)開始建立集群關(guān)系
- 首先初始化Manager1
λ brick [~] → docker-machine ssh Manager1 docker swarm init --listen-addr 192.168.99.100:2377 --advertise-addr 192.168.99.100
Swarm initialized: current node (rqpfrj4275wmprkolyn5xc4lv) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4g5n38ltezp4kcr4475hbiyuuvmboptdd40cw6ornwloua36fx-abu5norpke47qkaj5fq3p0961 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
#第一段 docker-machine ssh Manager1 就是進(jìn)入虛擬機(jī)骇陈,如果是在實(shí)體機(jī)上則不需要震庭,可以直接docker swarm init,第二段就是初始化swarm你雌。
- 如果需要多個(gè)Manager器联,則需要獲取集群加入Manager的Token:
λ brick [~] → docker-machine ssh Manager1 docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4g5n38ltezp4kcr4475hbiyuuvmboptdd40cw6ornwloua36fx-9k2ik00lho3opuvuqbgutezyc 192.168.99.100:2377
- 接下來(lái)獲取Worker加入的Token
λ brick [~] → docker-machine ssh Manager1 docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4g5n38ltezp4kcr4475hbiyuuvmboptdd40cw6ornwloua36fx-abu5norpke47qkaj5fq3p0961 192.168.99.100:2377
- 其他主機(jī)加入集群二汛,接下來(lái)加入worker,加入Manager則需要替換Token為Manager Token:
λ brick [~] → docker-machine ssh worker1 docker swarm join --token SWMTKN-1-4g5n38ltezp4kcr4475hbiyuuvmboptdd40cw6ornwloua36fx-abu5norpke47qkaj5fq3p0961 192.168.99.100:2377
This node joined a swarm as a worker.
- 到這里集群就初始化完成了拨拓,查看集群狀態(tài):
λ brick [~] → docker-machine ssh Manager1 docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
rqpfrj4275wmprkolyn5xc4lv * Manager1 Ready Active Leader 18.06.1-ce
l2snsykhcb0aamcybudadd5j2 Worker1 Ready Active 18.06.1-ce
3. 網(wǎng)絡(luò)與部署服務(wù)
- 查看集群網(wǎng)絡(luò)狀態(tài):
λ brick [~] → docker-machine ssh Manager1 docker network ls
NETWORK ID NAME DRIVER SCOPE
0dde92fc25d0 bridge bridge local
2e636adb3dc7 docker_gwbridge bridge local
928cd824a8a6 host host local
lske5xp48ozu ingress overlay swarm
170c25ea6308 none null local
- 創(chuàng)建一個(gè)跨主機(jī)網(wǎng)絡(luò):
λ brick [~] → docker-machine ssh Manager1 docker network create -d overlay --attachable --subnet=192.168.0.0/16 --gateway=192.168.0.100 test_network
mik7b8hen2p09swm16a4k683v
#參數(shù)說(shuō)明:
#overlay 虛擬網(wǎng)絡(luò)驅(qū)動(dòng)類型
#--attachable 允許其他主機(jī)加入網(wǎng)絡(luò)
#--subnet 子網(wǎng)網(wǎng)段
#--gateway 網(wǎng)關(guān)地址
- 拉取nginx鏡像用于測(cè)試:
λ brick [~] → docker-machine ssh Manager1 docker pull[registry.docker-cn.com/library/nginx](http://registry.docker-cn.com/library/nginx)
Using default tag: latest
latest: Pulling from library/nginx
802b00ed6f79: Pulling fs layer
e9d0e0ea682b: Pulling fs layer
d8b7092b9221: Pulling fs layer
d8b7092b9221: Verifying Checksum
d8b7092b9221: Download complete
e9d0e0ea682b: Verifying Checksum
e9d0e0ea682b: Download complete
802b00ed6f79: Verifying Checksum
802b00ed6f79: Download complete
802b00ed6f79: Pull complete
e9d0e0ea682b: Pull complete
d8b7092b9221: Pull complete
Digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
Status: Downloaded newer image for[registry.docker-cn.com/library/nginx:latest](http://registry.docker-cn.com/library/nginx:latest)
- 接下來(lái)部署服務(wù):
λ brick → docker-machine ssh Manager1 docker service create--publish published=80,target=80 --replicas 2 --name helloworld --network=test_network nginx
kx5ptsjersb5m7pr5e47hi4f4
overall progress: 0 out of 2 tasks
1/2:
2/2:
overall progress: 0 out of 2 tasks
overall progress: 1 out of 2 tasks
overall progress: 2 out of 2 tasks
verify: Waiting 5 seconds to verify that tasks are stable...
verify: Waiting 4 seconds to verify that tasks are stable...
verify: Waiting 3 seconds to verify that tasks are stable...
verify: Waiting 2 seconds to verify that tasks are stable...
verify: Waiting 1 seconds to verify that tasks are stable...
verify: Service converged
#--publish published=80,target=80 映射端口肴颊,對(duì)外端口80,映射到容器80渣磷。 映射完成后所有節(jié)點(diǎn)都能訪問(wèn)80端口
#--replicas 指定實(shí)例數(shù)量
λ brick [~] → docker-machine ssh Manager1 docker service ls #查看服務(wù)狀態(tài)
ID NAME MODE REPLICAS IMAGE PORTS
kx5ptsjersb5 helloworld replicated2/2nginx:latest
λ brick_tezign [~] → docker-machine ssh Manager1 docker service ps helloworld.#查看服務(wù)狀態(tài), 可以看到具體運(yùn)行在哪個(gè)node
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9dj38dzmhgjp helloworld.1 nginx:latest Worker1 Running Running 20 minutes ago
vzr9dunuj3e0 helloworld.2 nginx:latest Manager1 Running Running 20 minutes ago
l5xlqc6pwusk \_ helloworld.2 nginx:latest Manager1 Shutdown Rejected 21 minutes ago "No such image: nginx:latest@s…"
i43egfl03bgm \_ helloworld.2 nginx:latest Manager1 Shutdown Rejected 21 minutes ago "No such image: nginx:latest@s…"
- 進(jìn)入容器:
docker-machine ssh Manager1 #進(jìn)入虛擬機(jī)Manager1
docker@Manager1:~$ docker ps -a #查看Manager1上運(yùn)行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
501e6609af46 nginx:latest "nginx -g 'daemon of…" 42 minutes ago Up 42 minutes 80/tcp helloworld.2.vzr9dunuj3e0vcv2xl2xso84j
docker@Manager1:~$ docker exec -it 501e6609af46 /bin/bash #以bash進(jìn)入容器
root@501e6609af46:/#
- 服務(wù)部署完畢
更多swarm相關(guān)操作請(qǐng)自行g(shù)oogle婿着,這里不再贅述