docker 常用命令
docker 常用命令
基本命令
/var/lib/docker/ #docker 默认存储路径systemctl start docker #启动docker服务systemctl stop docker #停止docker服务systemctl enable docker #设置docker开机启动docker stats #检查docker 守护进程是否在运行docker info #查看docker相关信息
docker images #列出镜像docker pull 镜像名 #拉取镜像#删除所有镜像docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)#删除为none的镜像docker images --no-trunc| grep none | awk '{print $3}' | xargs -r docker rmidocker save 镜像名 > /home/新镜像名.tar #保存镜像docker load < /home/自定义镜像 #加载自定义镜像docker tag 镜像名:标签名 新镜像名:标签名 #修改镜像名
docker ps -a #列出所有容器docker ps -l #最后一次运行的容器docker start 容器名(也可以使用容器ID) #重新启动已停止的容器docker logs 容器名 #获取容器的日志docker -f 容器名 #获取最后几条日志docker rm $(docker ps -a -q) #删除所有容器docker rm 容器名 #删除单个容器docker inspect 容器名 #获取容器更多信息docker top 容器名 #查看容器的进程运行命令
docker run [options] image [command][arg…] options 常用说明: —name=:给容器指定一个名称,不使用则会随机分配一个名称 -d:后台运行容器并返回一个容器 ID (后台守护式容器,部分容器会在启动后自杀,也就是启动未成功,如:ubuntu) -i:以交互模式运行容器,通常和-t 同时使用(前台交互式容器) -t:为容器重新分配一伪输入终端,通常和-i 同时使用(前台交互式容器) -P:随机端口映射,大写 P -p:指定端口映射,小写 p -v:指定容器卷
# -d 后台运行mysql容器# -p 3310:3306 将容器中的3306端口映射到主机的3310端口# -v 将容器中的/etc/mysql/conf.d挂载到容器的/etc/mysql/conf.d# -v 将容器中的/var/lib/mysql挂载到主机的/home/mysql/data# -e MYSQL_ROOT_PASSWORD=123456 启动mysql容器,并设置root密码为123456# --name mysql01 容器名:mysql01docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7进入正在运行的容器
两种方式: docker exec -it [容器ID] /bin/bash docker attach [容器ID](推荐使用docker exec命令,因为docker attach命令使用exit退出,会导致容器停止,而docker exec命令不会)退出容器
两种方式: exit:run 进去容器,exit 退出,容器停止 ctrl+p+q:run 进去容器,ctrl+p+q 退出,容器不停止根据容器生成一个新的镜像
语法:docker commit -m="[提交描述]" -a="[作者]" [容器 ID] [镜像名]:[版本号]数据卷容器
--volume-from:指定一个数据卷容器,该容器的数据卷将会被挂载到容器中。# 运行docker03容器,挂载docker01容器的数据卷,docker01和docker03的数据卷是共享的,改变docker03的数据卷中的内容,docker01的数据卷也会改变。docker run -it --name docker03 --volumes-from docker01 zzw/centos:1.0Dockerfile
FROM [image] #基础镜像(centos等)MAINTAINER [name] # 镜像作者,姓名+邮箱RUN [command] #镜像构建的时候需要的运行命令ADD [src] [dest] #步骤:tomcat镜像,这个tomcat压缩包!添加内容WORKDIR [path] #设置容器内工作目录的路径。VOLUME [path] #挂载目录,持久化容器文件EXPOSE [port] #暴露端口配置。CMD [command] #指定这个镜像启动时,容器内运行的命令。只有最后一个CMD命令生效,可被替代。ENTRYPOINT [command] #指定这个镜像启动时,容器内运行的命令。可追加命令行参数。ONBUILD [INSTRUCTION] #创建一个触发器,当使用FROM命令创建一个新的镜像时,会自动执行ONBUILD命令COPY [src] [dest] #将文件或目录从源路径复制到容器内的目标路径。ENV [key] [value] #设置环境变量的值,在容器内运行的进程可以访问这些变量。
# 创建一个Dockerfile(mydockerfile-centos)文件,内容如下:FROM centos:7MAINTAINER ZZW<zzw@qq.com>ENV MYPATH /usr/localWORKDIR $MYPAHTRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo "---end---"CMD /bin/bash
#构建自己的镜像mycentos:0.1 通过mydockerfile-centos文件#-f 文件路径#-t 镜像名称#.表示当前目录docker build -f mydockerfile-centos -t mycentos:0.1 .
#查看镜像构建历史docker history mycentos:0.1
#ENTRYPOINT新增dockerfile-cmdFROM mycentos7ENTRYPOINT ["ls","-a"]
#构建镜像docker build -f dockerfile-cmd -t testcmd .docker run testcmd #输出当前目录下文件名docker run testcmd -l #输出当前目录下所有文件详情信息,包括文件读写权限等,完整执行命令ls -al
#CMD新增dockerfile-cmdFROM mycentos7CMD ["ls","-a"]docker build -f dockerfile-cmd -t testcmd .docker run testcmd #输出当前目录下文件名docker run testcmd -l #会报错,因为CMD命令只能有一个,不能追加命令行参数
#tomcat jdk#ADD 自动解压
FROM centos:7MAINTAINER ZZW<zzw@qq.com>
ADD ./jdk-8u281-linux-x64.tar.gz /usr/local/ADD ./apache-tomcat-8.5.99.tar.gz /usr/local/
RUN yum -y install vim
Env MYPATH /usr/localWORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_281ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-8.5.99ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.99/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.99/logs/catalina.out
#构建镜像docker build -t diytomcat .
#启动zzwtomcat容器/usr/local/apache-tomcat-8.5.99/webappsdocker run -d -p 9090:8080 --name zzwtomcat -v /home/tomcat/test:/usr/local/apache-tomcat-8.5.99/webapps/test -v /home/tomcat/logs/:/usr/local/apache-tomcat-8.5.99/logs diytomcat发布镜像
DokcerHub
http://hub.docker.com/ #需要注册账号docker login -u [用户名] -p [密码] #登录dockerhubdocker push [镜像名]:[版本号] #上传镜像到dockerhubdocker pull [镜像名] #下载镜像到本地阿里云镜像仓库
1.登录阿里云镜像 2.找到容器镜像服务 3.创建命名空间




Docker 网络
Docker0 网络
本机

docker run -d -P --name tomcat01 tomcatdocker run -d -P --name tomcat02 tomcatdocker exec -it tomcat01 ip addr如果报错:OCI runtime exec failed: exec failed: unable to start container process: exec: “ip”: executable file not found in $PATH: unknown解决方案:进入容器指令 docker exec -it tomcat01 /bin/bash进入容器,执行 apt update && apt install -y iproute2 && apt-get install -y iputils-ping 命令容器不停止退出:Ctrl+P+Q然后再次执行 docker exec -it tomcat01 ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever126: eth0@if127: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe12:2/64 scope link valid_lft forever preferred_lft foreverlinux 可以 ping 通容器 ip 每启动一个容器,都会分配一个 ip 地址。我们只要安装了 docker,就会有一个 docker0 网卡,桥接模式。evth-pair

tomcat01 ping (tomcat02)172.18.0.3docker exec -it tomcat01 ping 172.18.0.3可以ping通[root@iZuf62nk2jdk5sw0yzab16Z logs]# docker exec -it tomcat01 ping 172.18.0.3PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.123 ms64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.048 ms64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.043 ms—link(不推荐使用)
docker run -d -P --name tomcat03 --link tomcat02 tomcatdocker exec -it tomcat03 ping tomcat02 #可ping通。但是tommcat02ping不通tomcat03
docker network ls #查看网络docker network inspect bridge #查看网络详情
docker exec -it tomcat03 cat /etc/hosts #查看tomcat03的hosts文件[root@iZuf62nk2jdk5sw0yzab16Z logs]# docker exec -it tomcat03 cat /etc/hosts127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.18.0.3 tomcat02 eb27d6339be9172.18.0.4 ab5996b2e84a
--link 操作相当于在hosts中做了配置自定义网络(容器互联,—net) 不使用 docker0 网络(—link)
# 创建网络 bridge:桥接 subnet:子网 gateway:网关docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet[root@iZuf62nk2jdk5sw0yzab16Z logs]# docker network lsNETWORK ID NAME DRIVER SCOPEc8dfd4fd86da bridge bridge local679fd6a4f48a host host localce0c01e2141b mynet bridge local # 自定义网络9baa05c12cec none null local# 使用自定义网络docker run -d -P --name tomcat04 --net mynet tomcatdocker run -d -P --name tomcat05 --net mynet tomcatdocker exec -it tomcat04 ping tomcat05 #可ping通网络连通
不同网段之间连通
将tomcat01连接到mynet网络docker network connnect mynet tomcat01docker exec -it tomcat01 ping tomcat04 #可ping通redis 单机集群
# 创建一个子网docker network create redis --subnet 172.38.0.0/16# 通过脚本创建六个redis配置for port in $(seq 1 6); \do \mkdir -p /mydata/redis/node-${port}/conftouch /mydata/redis/node-${port}/conf/redis.confcat << EOF >>/mydata/redis/node-${port}/conf/redis.confport 6379bind 0.0.0.0cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000cluster-announce-ip 172.38.0.1${port}Cluster-announce-port 6379cluster-announce-bus-port 16379appendonly yesEOFdone
for port in $(seq 1 6); \do \docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \-v /mydata/redis/node-${port}/data:/data \-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \done
#进入容器redis-1docker exec -it redis-1 /bin/sh
# 创建集群redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
#进入redis-cli 命令行/data # redis-cli -c127.0.0.1:6379> cluster infocluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_ping_sent:89cluster_stats_messages_pong_sent:93cluster_stats_messages_sent:182cluster_stats_messages_ping_received:88cluster_stats_messages_pong_received:89cluster_stats_messages_meet_received:5cluster_stats_messages_received:182# 查看集群节点85127.0.0.1:6379> cluster nodes0eed9fb0e030949c0009b327fe71ee396cf4db17 172.38.0.12:6379@16379 master - 0 1711433603596 2 connected 5461-10922012ec944df134a04ef0289dd990d03598f7b16e1 172.38.0.14:6379@16379 slave 00277877f2527d9609a20ceb9bf23d6f9e035547 0 1711433604000 4 connected00277877f2527d9609a20ceb9bf23d6f9e035547 172.38.0.13:6379@16379 master - 0 1711433605000 3 connected 10923-16383356536ca20561b96e5ad47d58aba8fcb7b88cbc9 172.38.0.15:6379@16379 slave 01f83065027133ebecd00e546970a4e7ab4aaa6e 0 1711433603997 5 connected978743c69a6ccaf102d111e793d0239935ce7c4d 172.38.0.16:6379@16379 slave 0eed9fb0e030949c0009b327fe71ee396cf4db17 0 1711433604000 6 connected01f83065027133ebecd00e546970a4e7ab4aaa6e 172.38.0.11:6379@16379 myself,master - 0 1711433603000 1 connected 0-5460127.0.0.1:6379> set a b-> Redirected to slot [15495] located at 172.38.0.13:6379OK#新开一个终端停止redis-3容器127.0.0.1:6379> get a-> Redirected to slot [15495] located at 172.38.0.14:6379"b"#查看集群节点#172.38.0.13:6379@16379 master,fail# 172.38.0.14:6379@16379 myself,master172.38.0.14:6379> cluster nodes01f83065027133ebecd00e546970a4e7ab4aaa6e 172.38.0.11:6379@16379 master - 0 1711434024000 1 connected 0-5460978743c69a6ccaf102d111e793d0239935ce7c4d 172.38.0.16:6379@16379 slave 0eed9fb0e030949c0009b327fe71ee396cf4db17 0 1711434023968 6 connected356536ca20561b96e5ad47d58aba8fcb7b88cbc9 172.38.0.15:6379@16379 slave 01f83065027133ebecd00e546970a4e7ab4aaa6e 0 1711434024969 5 connected012ec944df134a04ef0289dd990d03598f7b16e1 172.38.0.14:6379@16379 myself,master - 0 1711434022000 7 connected 10923-163830eed9fb0e030949c0009b327fe71ee396cf4db17 172.38.0.12:6379@16379 master - 0 1711434023000 2 connected 5461-1092200277877f2527d9609a20ceb9bf23d6f9e035547 172.38.0.13:6379@16379 master,fail - 1711433943096 1711433942000 3 connectedSpringBoot 微服务 docker 打包
在项目根目录写 Dockerfile 文件
FROM java:8COPY *.jar /app.jarCMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]将 jar 包和 Dockerfile 文件放到同一个目录下,执行
docker build -t springboot-docker:1.0 .docker run -d -p 8080:8080 --name springboot-docker springboot-docker:1.0portainer
docker run -d \ --name portainer \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /data/portainer/data:/data \ -p 9000:9000 \ --cpus 0.5 \ --memory 200M \ --restart on-failure \ portainer/portainerDocker swarm
swarm 是 docker 集群管理工具,可以管理多个 docker 主机,实现负载均衡,故障转移,自动扩容,自动缩容,自动升级,自动回滚等。 需要 4 台机器,每台机器安装 docker,并加入 swarm 集群
docker swarm init #初始化swarm集群,生成主节点docker swarm init --advertise-addr 10.45.232.126 #机器内网地址
docker swarm join --token SWMTKN-1-******************** 10.45.232.126:2377 #加入swarm集群,在其他节点运行docker node ls #在主节点查看节点docker swarm join-token worker #获取worker节点加入集群的tokendocker swarm join-token manager #获取manager节点加入集群的token
#删除master节点docker swarm leave -f #在要退出的机器上退出swarm集群
#创建 Docker Swarm 网络(如果尚未创建)docker network create --driver overlay redis-net
docker node update --availability drain j1c3rzz8w3pytmphh2h3on7p4 #将节点设置为不可用,在主节点上执行docker node demote j1c3rzz8w3pytmphh2h3on7p4 #降级节点,在主节点上执行docker node rm j1c3rzz8w3pytmphh2h3on7p4 #删除节点,id/hostnamedocker node rm -f fvbo2vmlx82gzzjc96ta13z4 #强制删除节点node 命令
hostnamectl set-hostname master1 #修改主机名docker node demote #从 swarm 群集管理器中降级一个或多个节点docker node inspect #显示一个或多个节点的详细信息docker node ls #列出 swarm 群集中的节点docker node promote #将一个或多个节点推入到群集管理器中docker node ps #列出在一个或多个节点上运行的任务,默认为当前节点docker node rm #从 swarm 群集删除一个或多个节点docker node update #更新一个节点docker service
创建应用服务
docker service create 创建服务docker service inspect 显示一个或多个服务的详细信息docker service logs 获取服务的日志docker service ls 列出服务docker service rm 删除一个或多个服务docker service scale 设置服务的实例数量docker service update 更新服务docker service rollback 恢复服务至update之前的配置
# 创建服务docker service create --name tomcat01 --replicas 4 --publish 8080:8080 tomcat:8.5.53-jre8-alpine# 查看服务docker service ls# 查看单个服务docker service ps tomcat01# 扩缩容docker service update --replicas 3 tomcat01# 扩容docker service scale tomcat01=5图形界面
docker pull dockersamples/visualizer:latest #拉取visualizer 镜像
docker run -itd --name visualizer -p 9001:8080 -e HOST=10.45.232.126 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer:latest#或者使用以下命令 可以通过集群中所有ip+port进行访问docker service create \--name=viz \--publish=9001:8080/tcp \--constraint=node.role==manager \--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \dockersamples/visualizerdocker stack
stack 是基于 swarm 的更高级的编排工具,可以管理多个 service,实现负载均衡,故障转移,自动扩容,自动缩容,自动升级,自动回滚等。
docker stack deploy 部署新的堆栈或更新现有堆栈docker stack ls 列出现有堆栈docker stack ps 列出堆栈中的任务docker stack rm 删除一个或多个堆栈docker stack services 列出堆栈中的服务部署 Redis 集群
机器配置:
10.45.232.126 master110.45.232.127 master210.45.232.128 master310.45.232.129 master4创建 Docker Swarm 网络(如果尚未创建)
docker network create --driver overlay redis-net设置 node 节点 hostname
#每台机器执行,对应的主机名,下面redis-stack.yml文件中的的master1、master2、master3、master4hostnamectl set-hostname master1
[root@iZm5eda25wlr41jilwmuzdZ redis]# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION676ij6puaiyhznxcxa8gus2qh * master1 Ready Active Reachable 26.0.0wgzd8qz4pfoczrxdc3e3aga6s master2 Ready Active Leader 26.0.07qnka9orpr2ksz3lw73t6tb76 master3 Ready Active Reachable 26.0.0l2e0n4t8958fqc79enzcqrkfe master4 Ready Active Reachable 26.0.0每台机器执行
#创建本地文件夹mkdir -p /data/redis/{7001,7002,7003,7004,7005,7006,7007,7008}/{data,conf} && chmod 777 -R /data/创建网络
docker network create --driver overlay reids_net新建配置文件
登录 manager 服务器(10.45.232.126),进入/data/redis/目录下,创建 redis-stack.yml 文件。
version: "3.8"services: redis7001: image: redis container_name: redis7001 #设置主机名 hostname: redis7001 restart: always #privileged: true #挂载目录,相当于 docker run -v 主机目录:容器目录 volumes: - /data/redis/7001/data:/data - /data/redis/7001/conf:/conf #启动容器执行命令,相当于docker run [镜像:tag] [命令], 登录redis: redis-cli -h 10.45.232.126 -p 6379 -a Dszn@2020 command: redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /conf/nodes.conf --cluster-announce-ip 10.45.232.126 --cluster-announce-port 7001 --cluster-announce-bus-port 17001 --io-threads-do-reads yes --io-threads 2 ports: - "7001:6379" - "17001:16379" #指定环境变量,相当于docker run -e 参数, 登录mysql: mysql -h10.45.232.126 -P3306 -uroot -pDs20Pwd@ environment: - TZ=Asia/Shanghai networks: - redis_net deploy: placement: constraints: - node.hostname == master1 - node.role == manager
redis7002: image: redis container_name: redis7002 #设置主机名 hostname: redis7002 restart: always volumes: - /data/redis/7002/data:/data - /data/redis/7002/conf:/conf command: redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /conf/nodes.conf --cluster-announce-ip 10.45.232.126 --cluster-announce-port 7002 --cluster-announce-bus-port 17002 --io-threads-do-reads yes --io-threads 2 ports: - "7002:6379" - "17002:16379" environment: - TZ=Asia/Shanghai networks: - redis_net deploy: placement: constraints: - node.hostname == master1
redis7003: image: redis container_name: redis7003 #设置主机名 hostname: redis7003 restart: always #privileged: true #挂载目录,相当于 docker run -v 主机目录:容器目录 volumes: - /data/redis/7003/data:/data - /data/redis/7003/conf:/conf #启动容器执行命令,相当于docker run [镜像:tag] [命令], 登录redis: redis-cli -h 10.45.232.127-p 6379 -a Dszn@2020 command: redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /conf/nodes.conf --cluster-announce-ip 10.45.232.127 --cluster-announce-port 7003 --cluster-announce-bus-port 17003 --io-threads-do-reads yes --io-threads 2 ports: - "7003:6379" - "17003:16379" #指定环境变量,相当于docker run -e 参数, 登录mysql: mysql -h10.45.232.127 -P3306 -uroot -pDs20Pwd@ environment: - TZ=Asia/Shanghai networks: - redis_net deploy: placement: constraints: - node.hostname == master2 - node.role == manager
redis7004: image: redis container_name: redis7004 #设置主机名 hostname: redis7004 restart: always volumes: - /data/redis/7004/data:/data - /data/redis/7004/conf:/conf command: redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /conf/nodes.conf --cluster-announce-ip 10.45.232.127 --cluster-announce-port 7004 --cluster-announce-bus-port 17004 --io-threads-do-reads yes --io-threads 2 ports: - "7004:6379" - "17004:16379" environment: - TZ=Asia/Shanghai networks: - redis_net deploy: placement: constraints: - node.hostname == master2
redis7005: image: redis container_name: redis7005 #设置主机名 hostname: redis7005 restart: always #privileged: true #挂载目录,相当于 docker run -v 主机目录:容器目录 volumes: - /data/redis/7005/data:/data - /data/redis/7005/conf:/conf #启动容器执行命令,相当于docker run [镜像:tag] [命令], 登录redis: redis-cli -h 10.45.232.128-p 6379 -a Dszn@2020 command: redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /conf/nodes.conf --cluster-announce-ip 10.45.232.128 --cluster-announce-port 7005 --cluster-announce-bus-port 17005 --io-threads-do-reads yes --io-threads 2 ports: - "7005:6379" - "17005:16379" #指定环境变量,相当于docker run -e 参数, 登录mysql: mysql -h10.45.232.128 -P3306 -uroot -pDs20Pwd@ environment: - TZ=Asia/Shanghai networks: - redis_net deploy: placement: constraints: - node.hostname == master3 - node.role == manager
redis7006: image: redis container_name: redis7006 #设置主机名 hostname: redis7006 restart: always volumes: - /data/redis/7006/data:/data - /data/redis/7006/conf:/conf command: redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /conf/nodes.conf --cluster-announce-ip 10.45.232.128 --cluster-announce-port 7006 --cluster-announce-bus-port 17006 --io-threads-do-reads yes --io-threads 2 ports: - "7006:6379" - "17006:16379" environment: - TZ=Asia/Shanghai networks: - redis_net deploy: placement: constraints: - node.hostname == master3
redis7007: image: redis container_name: redis7007 #设置主机名 hostname: redis70077 restart: always #privileged: true #挂载目录,相当于 docker run -v 主机目录:容器目录 volumes: - /data/redis/7007/data:/data - /data/redis/7007/conf:/conf #启动容器执行命令,相当于docker run [镜像:tag] [命令], 登录redis: redis-cli -h 10.45.232.129-p 6379 -a Dszn@2020 command: redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /conf/nodes.conf --cluster-announce-ip 10.45.232.129 --cluster-announce-port 7007 --cluster-announce-bus-port 17007 --io-threads-do-reads yes --io-threads 2 ports: - "7007:6379" - "17007:16379" #指定环境变量,相当于docker run -e 参数, 登录mysql: mysql -h10.45.232.129 -P3306 -uroot -pDs20Pwd@ environment: - TZ=Asia/Shanghai networks: - redis_net deploy: placement: constraints: - node.hostname == master4 - node.role == manager
redis7008: image: redis container_name: redis7008 #设置主机名 hostname: redis7008 restart: always volumes: - /data/redis/7008/data:/data - /data/redis/7008/conf:/conf command: redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /conf/nodes.conf --cluster-announce-ip 10.45.232.129 --cluster-announce-port 7008 --cluster-announce-bus-port 17008 --io-threads-do-reads yes --io-threads 2 ports: - "7008:6379" - "17008:16379" environment: - TZ=Asia/Shanghai networks: - redis_net deploy: placement: constraints: - node.hostname == master4#声明网桥networks: #定义服务网桥名称 redis_net: #指定网桥驱动,有bridge/overlay,默认是bridge driver: overlay #false-统自动创建网桥名,格式为: 目录名_网桥名,默认为false; true-使用外部创建的网桥,需要自己手动创建 external: true
#挂载目录,声明服务使用的创建卷名volumes: mysqldata: #false-系统自动创建的卷名,格式为: 目录名_卷名,默认为false; true-使用外部创建的卷面,需要自己手动创建 external: false# 检查集群状态redis-cli --cluster check 10.45.232.126:7001docker stack 部署
docker stack deploy -c redis-stack.yml redis创建 redis 集群
docker ps[root@iZm5eda25wlr41jilwmuzdZ redis]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa420eea48702 redis:latest "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 6379/tcp redis_redis7002a72a447cedb6 redis:latest "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 6379/tcp redis_redis7001#进入容器docker exec -it a72a447cedb6 /bin/bashcd /usr/local/bin/
redis-cli --cluster create 10.45.232.126:7001 10.45.232.126:7002 10.45.232.127:7003 10.45.232.127:7004 10.45.232.128:7005 10.45.232.128:7006 10.45.232.129:7007 10.45.232.129:7008 --cluster-replicas 1 --cluster-yes
redis-cli -c #使用redis-cli命令,127.0.0.1:6379> cluster nodes #查看集群节点部署 zookeeper 集群
新建文件夹
#在三台机器上运行docker pull zookeeperrm -rf /data/zookeeper/* && mkdir -p /data/zookeeper/2181/{data,conf,datalog} && chmod 777 -R /data/创建网络
docker network create --driver overlay zoo_netzoo_stack.yml
version: '3.8'
services: zoo1: image: zookeeper restart: always networks: - zoo_net hostname: zoo1 ports: # 端口 - 2181:2181 environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 volumes: - /data/zookeeper/2181/conf:/conf - /data/zookeeper/2181/data:/data - /data/zookeeper/2181/datalog:/datalog deploy: mode: replicated replicas: 1 placement: constraints: - "node.hostname==master4"
zoo2: image: zookeeper restart: always networks: - zoo_net hostname: zoo2 ports: # 端口 - 2182:2181 environment: ZOO_MY_ID: 2 ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181 volumes: - /data/zookeeper/2181/conf:/conf - /data/zookeeper/2181/data:/data - /data/zookeeper/2181/datalog:/datalog deploy: mode: replicated replicas: 1 placement: constraints: - "node.hostname==master2" zoo3: image: zookeeper restart: always networks: - zoo_net hostname: zoo3 ports: # 端口 - 2183:2181 environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181 volumes: - /data/zookeeper/2181/conf:/conf - /data/zookeeper/2181/data:/data - /data/zookeeper/2181/datalog:/datalog deploy: mode: replicated replicas: 1 placement: constraints: - "node.hostname==master3"#声明网桥networks: #定义服务网桥名称 zoo_net: #指定网桥驱动,有bridge/overlay,默认是bridge driver: overlay #false-统自动创建网桥名,格式为: 目录名_网桥名,默认为false; true-使用外部创建的网桥,需要自己手动创建 external: true启动集群
docker stack deploy -c zoo_stack.yml zookeeper查看集群状态
#列出容器列表[root@master4 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESea14cde83b3b zookeeper:latest "/docker-entrypoint.…" 57 seconds ago Up 57 seconds 2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp zookeeper_zoo1.1.zige4m021tf64y7ckp58sftxl8e19019d6f04 redis:latest "docker-entrypoint.s…" 25 hours ago Up 25 hours 6379/tcp redis_redis7007.1.h5t8rvd62gtkfxt2ew0xhtg3x99814e563766 redis:latest "docker-entrypoint.s…" 25 hours ago Up 25 hours 6379/tcp redis_redis7008.1.ihi3t2bj6ll0nqcb1230pt6l5#进入容器[root@master4 ~]# docker exec -it ea14cde83b3b /bin/bashroot@zoo1:/apache-zookeeper-3.9.2-bin# cd binroot@zoo1:/apache-zookeeper-3.9.2-bin/bin# lsREADME.txt zkCli.cmd zkEnv.cmd zkServer.cmd zkServer.sh zkSnapshotComparer.sh zkSnapshotRecursiveSummaryToolkit.sh zkSnapShotToolkit.sh zkTxnLogToolkit.shzkCleanup.sh zkCli.sh zkEnv.sh zkServer-initialize.sh zkSnapshotComparer.cmd zkSnapshotRecursiveSummaryToolkit.cmd zkSnapShotToolkit.cmd zkTxnLogToolkit.cmd#查看集群状态root@zoo1:/apache-zookeeper-3.9.2-bin/bin# zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: follower #表示从节点设置值测试
[root@master4 ~]# docker exec -it ea14cde83b3b /bin/bashroot@zoo1:/apache-zookeeper-3.9.2-bin# cd bin/root@zoo1:/apache-zookeeper-3.9.2-bin/bin# zkCli.sh # 进入客户端#创建/test[zk: localhost:2181(CONNECTED) 4] create /testCreated /test#获取/test 为null[zk: localhost:2181(CONNECTED) 5] get /testnull#设置值/test 为11[zk: localhost:2181(CONNECTED) 6] set /test 11[zk: localhost:2181(CONNECTED) 7] get /test11
##去到集群另一台机器上[root@master2 ~]# docker exec -it b97847daa0c5 /bin/bashroot@zoo2:/apache-zookeeper-3.9.2-bin# cd bin/root@zoo2:/apache-zookeeper-3.9.2-bin/bin# zkCli.sh
[zk: localhost:2181(CONNECTED) 0] get /test11[zk: localhost:2181(CONNECTED) 1] set /test 444[zk: localhost:2181(CONNECTED) 2] get /test444zookeeper集群配置成功
部署mongo集群
docker pull mongo
新建文件夹
#在三台机器上运行docker pull mongorm -rf /data/mongo/* && mkdir -p /data/mongo/data/db && chmod 777 -R /data/创建网络
docker network create --driver overlay mongo_netmongo_stack.yml
node.hostname==iot-32 为自己的docker node ls 中的hostname
version: '3.8'services: mongo1: image: mongo command: mongod --storageEngine wiredTiger --profile=1 --port 27017 --bind_ip_all --slowms=50 --replSet mongo --dbpath /data/db ports: - "27017:27017" networks: - mongo_net volumes: - /data/mongo/data/db:/data/db deploy: restart_policy: condition: on-failure replicas: 1 placement: constraints: - node.hostname==iot-32# endpoint_mode: dnsrr# resources:# limits:# cpus: "2"# memory: 1200M# reservations:# cpus: "0.8"# memory: 800M mongo2: image: mongo command: mongod --storageEngine wiredTiger --profile=1 --port 27017 --bind_ip_all --slowms=50 --replSet mongo --dbpath /data/db ports: - "27018:27017" networks: - mongo_net volumes: - /data/mongo/data/db:/data/db deploy: restart_policy: condition: on-failure replicas: 1 placement: constraints: - node.hostname==iot-33# endpoint_mode: dnsrr mongo3: image: mongo command: mongod --storageEngine wiredTiger --profile=1 --port 27017 --bind_ip_all --slowms=50 --replSet mongo --dbpath /data/db ports: - "27019:27017" networks: - mongo_net volumes: - /data/mongo/data/db:/data/db deploy: restart_policy: condition: on-failure replicas: 1 placement: constraints: - node.hostname==iot-34# endpoint_mode: dnsrrnetworks: mongo_net: driver: overlay external: truedocker stack 部署
docker stack deploy -c mongo-stack.yml mongo_cluster启动集群
#进入容器[root@iot-32 mongo]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES71e093a630c1 mongo:latest "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 27017/tcp mongo_cluster_mongo1.1.hsbms8e5n9likecljqin8po78
docker exec -it 71e093a630c1 /bin/bash
# 进入命令行mongoshroot@71e093a630c1:/# mongoshCurrent Mongosh Log ID: 661c9b3dab16df54397b2da8Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.2Using MongoDB: 7.0.8Using Mongosh: 2.2.2**************************************************************************************************************# 定义configtest> config={_id:"mongo",members:[{_id:0,host:"mongo1:27017"},{_id:1,host:"mongo2:27017"},{_id:2,host:"mongo3:27017","arbiterOnly" : true}]}{ _id: 'mongo', members: [ { _id: 0, host: 'mongo1:27017' }, { _id: 1, host: 'mongo2:27017' }, { _id: 2, host: 'mongo3:27017', arbiterOnly: true } ]}# 初始化test> rs.initiate(config){ ok: 1 }# 查看集群状态mongo [direct: secondary] test> rs.status(){ set: 'mongo', date: ISODate('2024-04-15T03:14:32.851Z'), 。。。 members: [ { _id: 0, name: 'mongo1:27017', 。。。 { _id: 1, name: 'mongo2:27017', 。。。 }, { _id: 2, name: 'mongo3:27017', 。。。 } ], ok: 1, 。。。}# 接下来修改mongodb 权重 因为不想集群重启之后主节点改变# 重新赋值mongo [direct: secondary] test>cfg=rs.config(){ _id: 'mongo', version: 1, term: 1, members: [ { _id: 0, host: 'mongo1:27017', arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1, tags: {}, secondaryDelaySecs: Long('0'), votes: 1 }, { _id: 1, host: 'mongo2:27017', arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1, tags: {}, secondaryDelaySecs: Long('0'), votes: 1 }, { _id: 2, host: 'mongo3:27017', arbiterOnly: true, buildIndexes: true, hidden: false, priority: 0, tags: {}, secondaryDelaySecs: Long('0'), votes: 1 } ], protocolVersion: Long('1'), writeConcernMajorityJournalDefault: true, settings: { chainingAllowed: true, heartbeatIntervalMillis: 2000, heartbeatTimeoutSecs: 10, electionTimeoutMillis: 10000, catchUpTimeoutMillis: -1, catchUpTakeoverDelayMillis: 30000, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 }, replicaSetId: ObjectId('661c9b91e68c823d44507a9a') }}# 修改权重mongo [direct: primary] test> cfg.members[0].priority = 33# 修改权重mongo [direct: primary] test> cfg.members[1].priority = 22# 重新加载权重信息mongo [direct: primary] test> rs.reconfig(cfg){ ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1713150935, i: 1 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1713150935, i: 1 })}# 查看权重信息mongo [direct: primary] test> rs.config(){ _id: 'mongo', version: 2, term: 1, members: [ { _id: 0, host: 'mongo1:27017', arbiterOnly: false, buildIndexes: true, hidden: false, priority: 3, tags: {}, secondaryDelaySecs: Long('0'), votes: 1 }, { _id: 1, host: 'mongo2:27017', arbiterOnly: false, buildIndexes: true, hidden: false, priority: 2, tags: {}, secondaryDelaySecs: Long('0'), votes: 1 }, { _id: 2, host: 'mongo3:27017', arbiterOnly: true, buildIndexes: true, hidden: false, priority: 0, tags: {}, secondaryDelaySecs: Long('0'), votes: 1 } ], protocolVersion: Long('1'), writeConcernMajorityJournalDefault: true, settings: { chainingAllowed: true, heartbeatIntervalMillis: 2000, heartbeatTimeoutSecs: 10, electionTimeoutMillis: 10000, catchUpTimeoutMillis: -1, catchUpTakeoverDelayMillis: 30000, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 }, replicaSetId: ObjectId('661c9b91e68c823d44507a9a') }}创建用户
// 切换到admin数据库use admin
// 创建拥有集群管理权限的用户db.createUser({ user: "clusterAdmin", pwd: "clusterPassword", roles: [ { role: "clusterAdmin", db: "admin" } ]})
// 创建拥有数据库管理权限的用户db.createUser({ user: "dbAdmin", pwd: "dbPassword", roles: [ { role: "dbAdmin", db: "admin" } ]})
// 创建拥有读写权限的用户db.createUser({ user: "readWriteUser", pwd: "rwPassword", roles: [ { role: "readWrite", db: "yourDatabase" } ]})
# 创建数据库mongo [direct: primary] admin> use iotswitched to db iot
mongo [direct: primary] iot> show tables
mongo [direct: primary] iot> db.createCollection("sensor_data"){ ok: 1 }mongo [direct: primary] iot> show tablessensor_datamongo [direct: primary] iot> show dbsadmin 188.00 KiBconfig 264.00 KiBiot 8.00 KiBlocal 876.00 KiBrunoob 40.00 KiBmongo [direct: primary] iot>
db.runoob.insert({title: 'MongoDB 教程', description: 'MongoDB 是一个 Nosql 数据库', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100})部署mysql
docker pull mysql
新建文件夹
#在iot-34机器上运行docker pull mysqlrm -rf /data/mysql/* && mkdir -p /data/mysql/{data,config} && chmod 777 -R /data/创建网络
docker network create --driver overlay mysql_netmysql_stack.yml
node.hostname==iot-34 为自己的docker node ls 中的hostname
version: "3.8"services: mysql: image: mysql hostname: mysql restart: always environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: xxxxxx #设置root密码 networks: - mysql_net volumes: - /data/mysql/data:/var/lib/mysql - /data/mysql/config:/etc/mysql/mysql.conf.d ports: - "3306:3306" deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == iot-34networks: mysql_net: driver: overlay external: true启动
docker stack deploy -c mysql_stack.yml mysql
部署emqx (mqtt服务器)
docker pull emqx
新建文件夹
#在iot-33机器上运行docker pull emqxrm -rf /data/emqx/* && mkdir -p /data/emqx/{data,log} && chmod 777 -R /data/创建网络
docker network create --driver overlay emqx_netemqx_stack.yml
version: "3.8"services: emqx: image: emqx hostname: emqx restart: always networks: - emqx_net volumes: - /data/emqx/data:/opt/emqx/data - /data/emqx/log:/opt/emqx/log ports: - "18083:18083" - "1883:1883" - "4370:4370" - "5369:5369" - "8083:8083" - "8084:8084" - "8883:8883" deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == iot-33networks: emqx_net: driver: overlay external: true启动
docker stack deploy -c emqx_stack.yml emqx
链接测试
使用mqttx工具测试
访问地址:http://iot-33:18083默认账号密码:adminpublic部署rabbitmq
docker pull rabbitmq
新建文件夹
#在iot-33机器上运行docker pull rabbitmqrm -rf /data/rabbitmq/* && mkdir -p /data/rabbitmq/{data,conf} && chmod 777 -R /data/创建网络
docker network create --driver overlay rabbitmq_netrabbitmq_stack.yml
version: "3.8"services: rabbitmq: image: rabbitmq hostname: rabbitmq restart: always networks: - rabbitmq_net volumes: - /data/rabbitmq/data:/var/lib/rabbitmq - /data/rabbitmq/conf:/etc/rabbitmq/conf.d ports: - "15691:15691" - "15692:15692" - "25672:25672" - "5672:5672" - "15672:15672" #管理页面端口 deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == iot-32networks: rabbitmq_net: driver: overlay external: true启动
docker stack deploy -c rabbitmq_stack.yml rabbitmq
启动管理页面
# 进入容器docker exec -it a7f72708b24b /bin/bash# 开启管理页面插件rabbitmq-plugins enable rabbitmq_management# 去除警告rabbitmqctl enable_feature_flag all
# 修改配置文件,解决不显示total## 版本差异,因此文件名使用*进行通配root@idooy-rabbit:/# cat /etc/rabbitmq/conf.d/*management_agent.disable_metrics_collector.confmanagement_agent.disable_metrics_collector = true
root@idooy-rabbit:/# cd /etc/rabbitmq/conf.d/root@idooy-rabbit:/etc/rabbitmq/conf.d# echo management_agent.disable_metrics_collector = false > *management_agent.disable_metrics_collector.conf
root@idooy-rabbit:/etc/rabbitmq/conf.d# exit
docker restart 容器ID
# 访问网址http://iot-32:15672账号密码:guestguest支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

苏公网安备32021402002558号