一、在指定网络中发布服务
1、创建Overlay网络
docker network create -d overlay tomcat-net
docker network ls
查看tomcat-net的详细信息
docker network inspect tomcat-net
说明:
创建名为tomcat-net的覆盖网络(Overlay Netowork),处于该网络下的docker容器,即使宿主机不一样,也能相互访问
2、使用新建网络创建服务
docker service create --name tomcat --network tomcat-net -p 8080:8080 --replicas 2 192.168.10.16/library/tomcat:9.0
--network tomcat-net 将服务连接到名为 tomcat-net 的 Docker 网络
查看服务容器运行所在的节点
docker service ls
docker service ps tomcat
在服务容器运行的节点上修改容器网页内容
服务1:
docker ps | grep tomcat
docker exec -it 9b4ab15e3a96 bash
mkdir /usr/local/tomcat/webapps/ROOT
echo "tomcat-test-page" > /usr/local/tomcat/webapps/ROOT/index.html
服务2:
docker ps | grep tomcat
docker exec -it 61a510949770 bash
mkdir /usr/local/tomcat/webapps/ROOT
echo "tomcat-test-page" > /usr/local/tomcat/webapps/ROOT/index.html
使用浏览器访问
192.168.10.11:8080
3、访问网络模式
服务网络模式一共有两种:Ingress和Host,如果不指定,则默认的是Ingress;Ingress模式下,到达Swarm任何节点的8080端口的流量,都会映射到任何服务副本的内部8080端口,就算该节点上没有tomcat服务副本也会映射。
docker service create --name tomcat --network tomcat-net -p 8080:8080 --replicas 2 192.168.10.16/library/tomcat:9.0
上面已经创建服务
查服务所在节点
docker service ps tomcat
docker ps | grep tomcat
docker ps | grep tomcat
各节点上都会开启8080端口
netstat -anpt | grep 8080
删除tomcat服务
docker service rm tomcat
Host模式下,仅在运行有容器副本的机器上开放端口
docker service create --name tomcat --network tomcat-net -p published=8080,target=8080,mode=host --replicas 3 192.168.10.16/library/tomcat:9.0
-p published=8080,target=8080,mode=host
published=8080:将宿主机的 8080 端口映射到服务。
target=8080:服务内部的容器监听 8080 端口。
mode=host:使用主机模式(host mode),即容器的端口直接绑定到宿主机的端口。
docker service ps tomcat
查看端口映射情况
netstat -anpt | grep 8080
服务容器所在节点才会开放映射端口
删除tomcat服务
docker service rm tomcat
二、服务数据持久化存储
1、本地存储
(1)在集群所有主机上创建本地目录(集群所有主机)
mkdir -p /data/nginxdata
(2)发布服务时挂载本地目录到容器中
docker service create --name nginx-svc --replicas 3 --mount "type=bind,source=/data/nginxdata,target=/usr/share/nginx/html" -p 80:80 192.168.10.16/library/nginx:v1
查看服务状态
docker service ls
查看容器所在节点
docker service ps nginx-svc
向容器所在服务器创建网页内容
echo "manager2 web" > /data/nginxdata/index.html
echo "manager3 web" > /data/nginxdata/index.html
echo "worker2 web" > /data/nginxdata/index.html
(3)验证是否使用本地目录
curl 192.168.10.11
存在数据一致性问题
删除nginx-svc服务
docker service rm nginx-svc
2、网络存储
网络存储卷可以实现跨docker宿主机的数据共享,数据持久保存到网络存储卷中,在创建service时添加卷的挂载参数,网络存储卷可以帮助自动挂载,但需要集群节点都创建该网络存储卷
(1)部署NFS存储(harbor)
本案例以NFS提供远程存储为例
在192.168.10.16服务器上部署NFS服务,共享目录为docker swarm集群主机使用。
mkdir /opt/docker_volume
yum -y install nfs-utils
vim /etc/exports
添加:
/opt/docker_volume *(rw,sync,no_root_squash)
systemctl start nfs-server
systemctl enable nfs-server
显示 NFS 服务器上共享的目录信息
showmount -e
(2)为集群所有主机安装nfs-utils软件(集群所有主机)
yum -y install nfs-utils
showmount -e 192.168.10.16
(3)创建一个基于 NFS(网络文件系统) 的 Docker 卷(集群所有主机)
docker volume create --driver local --opt type=nfs --opt o=addr=192.168.10.16,rw --opt device=:/opt/docker_volume nginx_volume
docker volume create 创建一个新的 Docker 卷
--driver local 指定卷的驱动为 local(本地驱动),但通过选项配置为使用 NFS
--opt type=nfs 指定卷的类型为 nfs,即使用 NFS 协议挂载远程目录
--opt o=addr=192.168.10.16,rw
addr=192.168.10.16:指定 NFS 服务器的 IP 地址为 192.168.10.16
rw:以读写模式挂载 NFS 目录
--opt device=:/opt/docker_volume 指定 NFS 服务器上共享的目录路径为 /opt/docker_volume
nginx_volume 为创建的卷指定名称为 nginx_volume
docker volume ls
(4)发布服务
docker service create --name nginx-svc --replicas 3 -p 80:80 --mount "type=volume,source=nginx_volume,target=/usr/share/nginx/html" 192.168.10.16/library/nginx:v1
--mount "type=volume,source=nginx_volume,target=/usr/share/nginx/html"
type=volume:指定挂载类型为 Docker 卷
source=nginx_volume:使用名为 nginx_volume 的 Docker 卷
target=/usr/share/nginx/html:将卷挂载到容器内的 /usr/share/nginx/html 目录(Nginx 默认的静态文件目录)
(5)验证
docker service ls
docker service ps nginx-svc
到服务容器运行所在节点查看挂载情况
df -hT | grep nfs
在nfs服务器(harbor)上传网页
echo "nfs test" > /opt/docker_volume/index.html
删除nginx-svc服务
docker service rm nginx-svc