项目xxx(后端),xxx-ui前端(前后端分离的项目)
依赖mysql,elasticsearch.
分别制作了四个镜像来做这件事。
希望可以制作跨主机的部署,使用了swarm,以下是学习记录。
参考 https://www.cnblogs.com/xishuai/p/docker-swarm.html
docker-machine create -d virtualbox manager1 &&
docker-machine create -d virtualbox manager2 &&
docker-machine create -d virtualbox worker1 &&
docker-machine create -d virtualbox worker2
#docker-machine ssh manager1 "docker swarm leave --force"
alias dm=docker-machine
docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.99.100"
export TOKEN=SWMTKN-1-67oknnrzlnt62wp5xecpz8nvodizd3mdtpvb2thsk6ldvolqx5-4srdcvj0vehcoc6gs8nhcp6lh
docker-machine ssh worker1 docker swarm join --token $TOKEN 192.168.99.100:2377
docker-machine ssh worker2 docker swarm join --token $TOKEN 192.168.99.100:2377
dm ssh manager1 docker swarm join-token manager
dm ssh manager2 docker swarm join --token SWMTKN-1-67oknnrzlnt62wp5xecpz8nvodizd3mdtpvb2thsk6ldvolqx5-6f3po7z2ih2n06qztl2fnj1wb 192.168.99.100:2377
#create a overlay network
当初始化 swarm 集群或将一个 Docker 主机加入已经存在的 swarm 集群时,Docker 主机上会创建两个新网络:
一个称为 ingress 的 overlay 网络,用来处理与 swarm 服务相关的控制和数据流。
当创建的 swarm 服务没有连接到用户自定义的 overlay 网络时,这个服务会默认连接到 ingress 网络。
一个称为 docker_gwbridge 的bridge 网络,用来将单个的 Docker 守护进程连接到 swarm 中的其他守护进程。
可以使用 docker network create 命令创建用户定义的 overlay 网络,就像可以创建用户定义的 bridge 网络一样。
服务或容器一次可以连接到多个网络。服务或容器只能通过它们各自连接的网络进行通信。
TCP 端口 2377:用于集群管理通信
TCP 和 UDP 端口 7946:用于节点之间通信
UDP 端口 4789:overlay 网络流量
要创建可以用于 swarm 服务和独立容器跟其他 Docker 守护进程中运行的独立容器通信的 overlay 网络,添加 --attachable 标志:
docker network create -d overlay --attachable my-overlay
连接到同一 overlay 网络的 swarm 服务可以有效地将所有端口暴露给对方
默认情况下,发布端口的 swarm 服务使用路由网格(routing mesh)来完成。
当连接到任何 swarm 节点上的已发布端口(无论是否运行给定服务)时,都会透明地将连接重定向到正在运行该服务的 worker 节点。
实际上,Docker 充当了 swarm 服务的负载平衡器。基于路由网格的服务以虚拟 IP(VIP)模式运行。
可以将 Docker 配置为使用单独的网络接口来处理两种不同类型的流量
初始化或加入 swarm 时,分别指定 --advertise-addr 和 --datapath-addr。
一开始在manager1上创建的这个overlay网络,只会同步到同为manager角色的机器上去,而worker节点,只会在分配到任务时才会创建刚才的网络。
#简单构建docker的私有他库
docker run -d -v /home/student/docker_registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry
默认拉取推送操作都是使用https协议来做的,做完这个之后,需要修改/etc/docker/daemon.json
以下是我本机的,主要是第一行,下面两行是配置拉取镜像时默认的地址,我使用的是阿里云的,阿里云加速,拉取镜像会快些。
我们需要在上面的四个虚机中执行
{
"insecure-registries":["192.168.99.1:5000"],
"registry-mirrors": ["https://85qcsfak.mirror.aliyuncs.com"],
"graph": "/home/student/docker_data"
}
在创建的所有虚机中执行如下命令:
sudo touch /etc/docker/daemon.json &&
sudo chmod 777 /etc/docker/daemon.json &&
sudo echo '{ "insecure-registries": ["192.168.99.1:5000"] }' > /etc/docker/daemon.json
#如何把从公有库中拉取的镜像推送到私有仓库
docker tag nginx 192.168.99.1:5000/nginx:latest
docker push 192.168.99.1:5000/nginx:latest
如上示例,需要先对镜像打个标签,然后就可以push到私服上去。
#删除某些名字相似的容器
docker rm --force $(docker ps -q -f name=abc*)
#查看私有仓库内容
curl http://192.168.99.1:5000/v2/_catalog
#经过测试,通过swarm集群建好后,可以直接使用standalone的docker run 的方式部署各自的服务,没有问题。
唯一的一个问题是,在docker-machine创立的虚机中开启es的时候,因为XMS过大,没法分配内存导致失败,
把es迁移到宿主机后开启成功,整个测试也成功了。
1.直接使用standalone的方式,使用docker run -itd --net my-overlay 的方式直接部署,也没有问题,可以跨主机互访,服务部署成功。
2.使用docker service的方式部署,这样可以使用--replicas 同时在多台主机上部署服务,可以解决单点故障问题。测试成功。
3.使用docker stack deploy的方式部署,暂时还有些问题,服务部署基本成功,没有测试通过。
docker run -itd --name mysql --net my-overlay
-e MYSQL_ROOT_PASSWORD=xxx
-e MYSQL_PASSWORD=xxx
-e MYSQL_USER=xxx
-e MYSQL_DATABASE=xxx
-p 3306:3306
192.168.99.1:5000/mysql:5.7
#elastic
docker run -itd --name elastic --net my-overlay -p 9200:9200 -p 9300:9300 elastic
#server backend
docker run -itd --name xxx-server --net my-overlay -p 8080:8080 192.168.99.1:5000/xxx
#ui front end
docker run -itd --name xxx-ui --net my-overlay -p 80:80 192.168.99.1:5000/xxx-ui
下面测试使用docker service ,这样可以自带负载均衡和多副本,提高了高可用和高吞吐量。
docker service create --name mysql
--network my-overlay --hostname mysql
--replicas 2
-e MYSQL_ROOT_PASSWORD=xxx
-e MYSQL_PASSWORD=xxx
-e MYSQL_USER=xxx
-e MYSQL_DATABASE=tss_log_insight_new_new
192.168.99.1:5000/mysql:5.7
docker service create --name xxx-server --network my-overlay
--replicas 2 --hostname xxx-server
-p 8080:8080 192.168.99.1:5000/xxx
docker service create --name xxx-ui --network my-overlay
--replicas 4 --hostname xxx-ui
-p 80:80 192.168.99.1:5000/xxx-ui
docker-compose.yaml内容:
version: '3'
services:
tssxxx-ui:
image: 192.168.99.1:5000/xxx-ui
ports:
- 80:80
deploy:
replicas: 5
tssxxx-server:
image: 192.168.99.1:5000/xxx
environment:
- SPRING_PROFILES_ACTIVE=dev,swagger
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/tssxxx?useUnicode=true&characterEncoding=utf8&useSSL=false
- SPRING_DATASOURCE_USERNAME=xxx
- SPRING_DATASOURCE_PASSWORD=xxx
- JHIPSTER_SLEEP=10 # gives time for the database to boot before the application
# - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=tssxxx-elasticsearch:9300
# - SPRING_DATA_ELASTICSEARCH_CLUSTER_NAME=elastic
ports:
- 8080:8080
container_name: xxx-server
hostname: xxx-server
tssxxx-mysql:
image: 192.168.99.1:5000/mysql:5.7
container_name: mysql
hostname: mysql
# volumes:
# - ~/volumes/jhipster/tssxxx/mysql/:/var/lib/mysql/
environment:
- MYSQL_USER=tss
- MYSQL_PASSWORD=tss
- MYSQL_DATABASE=tssxxx
- MYSQL_ROOT_PASSWORD=root
ports:
- 3306:3306
command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8mb4 --explicit_defaults_for_timestamp
networks:
default:
external:
name: my-overlay
my-overlay:
driver: overlay
docker stack deploy -c docker-compose.yaml xxx
docker stack ls
docker stack rm xxx
docker stack ps
下面是一个集群管理服务,可以尝试。
portainer:
image: 192.168.99.1:5000/portainer/portainer:latest
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
总结:
1.制作服务镜像,如mysql,es,后端和前端的应用
2.docker在各主机上的安装(本机使用最新的docker-ce 18.06),docker-compose单独安装
3.构建swarm集群,通过docker swarm init /docker swarm join 搭建集群
4.在manager角色的节点上创建overlay驱动的网卡
5.使用docker run -t --net 或docker service 或docker stack deploy来部署自己的服务