用 Consul 和 Traefik 实现 Docker 容器的服务注册与发现

docker 实现应用的容器化 consul 集群实现服务的注册、发现 traefik 处理外部流量的负载均衡与路由 启动 consul 集群与 docker 通过 vagrant 起三台虚拟机实现基本的 consul 集群环境(为了节约资源把 docker 也运行在这上面了)。 consul 的 vagrant 配置文件如下: # -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| $script = <<SCRIPT echo "Installing" yum install -y wget wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all yum makecache yum install -y jq unzip vim wget net-tools bind-utils dnsmasq sudo cp /vagrant/consul /usr/bin/consul echo "Installing docker.." sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker echo "success" SCRIPT # The most common configuration options are documented and commented below. # For a complete reference, please see the online documentation at # https://docs.vagrantup.com. # Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. config.vm.box = "centos/7" config.vm.provision "shell", inline: $script config.vm.define "node1" do |node1| node1.vm.hostname = "node1" node1.vm.network "private_network", ip: "172.17.17.11" end config.vm.define "node2" do |node2| node2.vm.hostname = "node2" node2.vm.network "private_network", ip: "172.17.17.12" end config.vm.define "node3" do |node3| node3.vm.hostname = "node3" node3.vm.network "private_network", ip: "172.17.17.13" end # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. config.vm.box_check_update = false # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # NOTE: This will enable public access to the opened port # config.vm.network "forwarded_port", guest: 80, host: 8080 # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine and only allow access # via 127.0.0.1 to disable public access # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network "private_network", ip: "192.168.33.10" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network" # Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. # config.vm.synced_folder "../data", "/vagrant_data" # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # config.vm.provider "virtualbox" do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # # Customize the amount of memory on the VM: vb.memory = "1024" end # # View the documentation for the provider you are using for more # information on available options. # Enable provisioning with a shell script. Additional provisioners such as # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the # documentation for more information about their specific syntax and use. # config.vm.provision "shell", inline: <<-SHELL # apt-get update # apt-get install -y apache2 # SHELL end 为了节省时间我直接下载好了 consul 的可执行文件放到了 vagrant 配置文件同目录下,vagrant 会把当前目录下的文件都复制进虚拟机的 /vagrant 目录下,还有三个节点的 consul 配置文件。 ...

February 6, 2020 · 9 min · 1788 words · Nick

容器服务化方向的一些探索

本文参考使用Docker打造自己的云平台编写 本文基于 Docker Swarm Mode 实现容器化,虽然目前 k8s 更火一些,但实在是太重了,以后再折腾。 使用 traefik 来实现反向代理、负载均衡,traefik 还自带了服务发现、后端断路器、健康检查等,相当于是自带服务发现的 nginx。当然它还支持其他的容器编排工具如,服务发现工具如 Consul。 使用 Portainer 来管理 Docker 容器,可以兼容 Docker Swarm 模式。 Docker 的安装就不说了。装完初始化 Swarm 模式。 $ docker swarm init 先设置一下环境变量。 $ export DOCKER_DEV_PATH=/usr/local/src/docker-dev 日志文件都会统一存到 ${DOCKER_DEV_PATH}/logs。 traefik 新建一个编排文件 traefik.yml。 version: '3.3' services: reverse-proxy: image: traefik:1.7-alpine command: --web --docker --docker.domain=cloud-labs.io --docker.watch --docker.swarmmode=true --loglevel=INFO --accesslog --accesslog.filepath=/logs/access.log --traefiklog --traefiklog.filepath=/logs/traefik.log deploy: mode: replicated replicas: 1 labels: - traefik.enable=true - traefik.backend=traefik - traefik.frontend.rule=Host:monitor.cloud-labs.io - traefik.port=8080 - traefik.docker.network=traefik_proxy networks: - proxy ports: - 8081:80 volumes: - /var/run/docker.sock:/var/run/docker.sock - ${DOCKER_DEV_PATH}/logs/traefik:/logs - /dev/null:/traefik.toml networks: proxy: 简单解释下 labels 中配置的含义 ...

August 28, 2019 · 2 min · 361 words · Nick