前提
下面的操作是我在阿里云进行的操作,而且是我在学习完之后才写的,所以难免有些遗漏的地方,请见谅和欢迎指正。下面是凭我的记忆总结的几点准备事项(之后想到其他会加上)
- 阿里云服务器
- 阿里云的账号必须要大于100元(这是阿里云要求的否则在创建新实例的时候会报错)
- 切记测试完要删除你购买的,不然会一直扣费。我们操作是真实的服务器
- 环境是ubuntu的
- 安装docker-machine,参考
- 在阿里云服务上安装docker,官方文档
- 记得开放阿里云资源访问服务授权 点击查看具体开启方式 注意:阿里云已经准备不支持swarm了,具体可以查看控制台里的容器服务那里
开始创建实例
- 通过docker-machine可以创建服务器实例,简单来说比如像阿里云它给开发者提供了不需要在控制台操作就可以完成服务器购买的方式
- 支持的有这些第三方驱动
这个就是阿里云的
首先登录阿里云服务器
安装对应的驱动
- (这里选择的是阿里云的,我的不一定是最新的版本,直接看上面github获取最新的)
//下载包,解压包,修改名字,添加可执行权限,添加到系统命令中
wget https://docker-machine-aliyunecs-drivers.oss-cn-beijing.aliyuncs.com/docker-machine-driver-aliyunecs_linux-amd64.tgz
tar zxvf docker-machine-driver-aliyunecs_linux-amd64.tgz
mv bin/docker-machine-driver-aliyunecs.linux-amd64 bin/docker-machine-driver-aliyunecs
chmod +x bin/docker-machine-driver-aliyunecs
mv bin/docker-machine-driver-aliyunecs /usr/local/bin/
查看和创建你的accesskey
accesskey在控制台的头像那里。之前没创建过的需要你创建(这里不用子账户的)
创建新的实例
–aliyunecs-io-optimized=optimized //磁盘io优化,默认这个就行
–aliyunecs-description=aliyunecs-machine-driver //描述
–aliyunecs-instance-type=ecs.mn4.small //实例规格就是你要买的服务器,通过阿里云上查看
–aliyunecs-access-key-id=LTxxxcxx // accesskey id
–aliyunecs-access-key-secret=Axxx //accesskey secret秘钥
–aliyunecs-reginotallow=cn-hangzhou //你购买的服务器地区
我也没找到具体的文档,只找到下面这个,要把‘oss-去掉
-aliyunecs-ssh-password=zaq1@wsx //ssh登录密码
–aliyunecs-image-id=centos_7_04_64_20G_alibase_201701015.vhd //镜像实例,阿里云不填的话默认是ubuntu
manager //这个是你实例的名字,会在控制台显示
这个我没查到在哪官方文档
- 案例部分内容请自行根据要求修改
docker-machine create -d aliyunecs \
--aliyunecs-io-optimized=optimized \
--aliyunecs-description=aliyunecs-machine-driver \
--aliyunecs-instance-type=ecs.mn4.small \
--aliyunecs-access-key-id=控制看查看到的你的accesskey id \
--aliyunecs-access-key-secret=控制看查看到的你access key secret \
--aliyunecs-region=cn-hongkong \
--aliyunecs-ssh-password=ssh登录的密码 \
manager
- 通过上面的命令这里我创建了两个实例一个manage1r和worker1,在控制台可以看到
- 这里有个问题我在测试过程中,如果我阿里云是香港的,我在创建杭州服务器的时候一直卡在安装docker这里。当我把 --aliyunecs-region改为cn-hongkong的时候就不会了。
Provisioning with ubuntu(systemd)…
Installing Docker…
注意:安装docker失败不代表申请服务器失败,一定一定要把老的服务器删除
命令是:
// 查看已有的服务
docker-machine ls
// 删除对应的
docker-machine rm manager worker
看到下面说明成功了
开放端口
用于集群管理通信的TCP端口2377
TCP和UDP端口7946用于节点之间的通信
UDP端口4789用于覆盖网络流量
使用swarm创建集群
我们以manager1作为管理节点,以worker1作为工作节点
初始化节点
// 进入你对应的节点
docker-machine ssh manager1
// 初始化,ip是你manager1的公网ip
docker swarm init --advertise-addr 47.244.212.96
成功会提示你这个,上面框框的是你如果想把一个节点添加为worker要用的命令(进入到worker节点执行)。
如果你想把一个节点添加为manager,要先用docker swarm join-token manager 查看对应的命令,会显示一个类似worker一样的命令,然后操作如worker节点
创建工作节点
// 从云服务器上重新进入到worker
docker-machine ssh worker
// 执行命令,添加工作节点
docker swarm join --token SWMTKN-1-3k4373jw53b45d0hbr48ulltbb41bdn93hz1qs7lfbn527dogy-d005ql7yc8oyca111s3s5ln78 47.244.212.96:2377
// 会提示你:This node joined a swarm as a worker.
创建对应的服务
注意:我开了两个命令行窗口,所以下面的命令都会以这种格式“root@manager1”表示,manager1代表对应的节点。方便我交叉运行
// 查看已有的节点,注意在worker节点执行这个命令会报错
root@manager1:~# docker node ls
- 其中多个管理节点会只有一个Leader
方式一:直接命令创建
–replicas 3 : 创建3个容器
–name 容器的名字
-p 8080:80 开放的端口,8080是外部映射容器的80端口的意思
// 在管理节点执行创建的服务,比如我的是nginx。注意在worker执行会报错
root@manager1:~# docker service create --replicas 3 -p 8080:80 --name nginx nginx
// 查看创建的服务
root@manager1:~# docker service ls
其实它就是创建了一些容器,它会在你的不同节点,各自分配nginx服务
// 在查看创建的容器
root@manager1:~# docker ps
root@worker1:~# docker ps
为了测试集群成功了。我把nginx默认的index.html的内容改为manager1,worker1,worker2
这里不写具体步骤,因为学过docker的肯定会
基本就是:进入到对应的容器里,然后修改容器里nginx的内容
然后请求。可以看到,会一直轮询的方式进行分发请求,请求96和141分布是我的manager和worker服务器的公网地址。注意在浏览器上会有缓存所以可能会一直都刷出一样的结果。
方式二:docker-compose创建服务
- 注意conf nginx.conf 80.conf在worker节点也要生成,因为worker那些容器对应的是worker节点下的
// 写docker-compose文件
root@manager1:~# cd /usr/local/src/
root@manager1:/usr/local/src# mkdir conf
root@manager1:/usr/local/src# vim nginx.conf// 这是提前准备的nginx.conf。注意这里我改了加载conf的路径
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
# 注意这里我改了加载的路径
include /data/conf/*.conf;
}// 创建nginx配置文件
root@manager1:/usr/local/src# vim conf/80.conf// 80.conf
server {
listen 80;
server_name localhost;
location / {
root /data/;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}// 创建配置文件
root@manager1: docker config create nginx.conf nginx.confroot@manager1:/usr/local/src# vim docker-compose.yaml// docker-compose.yaml ,小心空格有要求
version: "3.6"
services:
nginx-cluster:
image: nginx
ports:
- "8081:80"
stdin_open: true
deploy:
mode: replicated
replicas: 5
networks:
- cluster
tty: true
configs:
- source: nginx.conf
target: /etc/nginx/nginx.conf
privileged: true
volumes: ["/usr/local/src:/data"]
configs:
nginx.conf:
external: true
networks:
cluster://表示创建5个
deploy:
mode: replicated
replicas: 5
// 共享的目录
volumes: ["/usr/local/src:/data"]// 创建服务
root@manager1: docker stack deploy -c docker-compose.yaml nginx