传统的 Linux 替换 Docker 微服务运维-swarm,Portainer

1,103 阅读3分钟

Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。

Portainer是一款轻量级的Docker图形化管理的方案, 部署Portainer和Portainer Agent来管理Swarm集群很容易!您可以将Portainer作为服务直接部署在Docker集群中。请注意,此方法将自动部署Portainer Server的单个实例,并将Portainer Agent作为全局服务部署到群集中的每个节点上。

前提要求

  • 服务器上必须先装有docker, 因为各种版本,所以安装方法查看官方文档
  • 镜像服务使用的是阿里云的容器镜像服务,需要开通此服务。到时的自动构建都会借此服务。

初始化一个集群节点,并设置管理节点为本机的IP

docker swarm init --advertise-addr 192.168.0.150 #这个IP是你本机IP 可以ip -a查看

验证是否swarm是否初始化成功,查看节点是否挂载。

docker node ls
ID                            HOSTNAME                  STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
xbf82bf03t6r7mrvxzxmkv9mm *   iZbp12d0p2o2at8bmvb033Z   Ready               Active              Leader              19.03.5

创建一个专有网络

docker network create --driver overlay www_net

创建overlay www_net网络的用处,是给这些docker创建一个内网可相互访问的条件。

比如场景nginx,web,redis三个微应用。需求是nginx与web需要内网相互访问,但是nginx与redis不需要访问的,而web它与redis是需要访问的, 就可以配置nginx: a_net网络, web: a_net,b_net两个网络, redis: b_net网络。这样就可以达到需求了。

第三步:创建Portainer

也可以参照官方部署文档查看其它部署

$ curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml

上述命令会下载一个官方的 swarm 部署yml文件,并修改成配置如下:

version: '3.2'

services:
  agent:
    image: portainer/agent
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9000:9000"
      - "8000:8000" # 只用到web管理界面,此处的8000可以删除。
    volumes:
      - portainer_data:/data
    networks:
      - agent_network
      - www_net
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay
    attachable: true
  www_net:
    external: true

volumes:
  portainer_data:

上述配置要注意的就是portainer里面有两个网络,有一个是 www_netexternal: true 意思是使用外部创建的www_net, 如果不设置他会创建当前stack的网络,不设置名称会自动 名称_www_net

配置文件准备就绪现在就命令行中部署:

$ docker stack deploy --compose-file=portainer-agent-stack.yml portainer

验证是否部署成功:

docker service ls
ID                  NAME                  MODE                REPLICAS            IMAGE                        PORTS
td1uhbhmsb5f        portainer_agent       global              1/1                 portainer/agent:latest
aeoqcexzg7hu        portainer_portainer   replicated          1/1                 portainer/portainer:latest   *:9000->9000/tcp

替换国内镜像

如果 REPLICAS 0/1 时说明还在部署请等待。如果太慢,是因为你没有设置国内镜像。 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

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

上面的 48udk7jr.mirror.aliyuncs.com 使用的是专属的阿里云镜像,可以在阿里云控制面板里开通镜像服务。

登陆portainer

当部署完成后,就可以访问 http://ip:9000 来访问, 如果是一些云服务器,要先确定是否开放了9000端口

首次登陆他会让你设置密码, 这是登陆后的界面:

注意,后面的自动部署需要使用阿里云的容器镜像服务,而且使用的是私有的镜像,所以要给Portainer注册一个registries。要不然会授权不成功,导致镜像pull失败。 注意:

  • registry.cn-hangzhou.aliyuncs.com这个根据访问凭证后面使用的是哪个URL,我的这个是杭州的地域。
  • 账号密码,从阿里云的容器镜像服务的访问凭证获取。

之后部署的image镜像他会匹配registry.cn-hangzhou.aliyuncs.com这个前缀。他会自动使用这个注册的授权。

上面的配置相当于我们命令行部署stack是一样的:

  1. sudo docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com
  2. docker stack deploy -c xxx.yml web --with-registry-auth 中后面--with-register-auth的效果是一个原理。

示例图:

到此基础的管理环境搭建结束了。