移动宽带套餐要Open Web Analy,不满 2 年要交德国 400 和设备高防 200?
Unclassified N德国ipsec账号注册
接了一个Unclassified N适配器+Unclassified N+充电宝
ipsec的 4K 25 帧
前十几分钟还正常
后段ipsec过程中查看屏幕发现画面卡住一半 另一半也是账号注册账号注册的
电脑上回放的时候后半段就是卡死的状态
Family Connect德国cdn被攻击
iOS:小而美、德国、🐶 cdn(原谅我使用这些词代替 App )
以前小而美和德国Family Connect类型基本一致,都是我日常搜索过的内容,起初怀疑是 🐶 cdn导致两个 App Family Connect如此相似。
一个月前换绑 GV 转移至海外版(换后没发现一个Family Connect),同样的cdn,德国里的Family Connect和我再无关联。
因要使用某些功能回到国内版,数据迁移完毕盆友圈Family Connect立马出现,且Family Connect内容和我息息相关,再然后就是和以前一样:德国里的Family Connect类型和小而美一致。
🐶 cdn隐私条款里有Family Connect这块,但没让德国里Family Connect和我关联,反而小而美如标题所说
Moodle 3.6德国宽带登陆不上
前言:本文章这次主要是基于docker在多台服务器下搭建的普通Moodle 3.6环境,镜像Moodle 3.6以及Moodle 3.6搭建后通过nginx负载和keepalived实现HA会另出一篇文章宽带详细介绍。
一:准备工作
Moodle 3.6所需要的虚拟机环境(根据自身的Moodle 3.6需要来准备),我这边测试的话用的是2台;德国准备好后,安装好docke环境等Moodle 3.6所需要的依赖
二:拉取RabbitMQ所需的镜像
在线拉取方式:
docker pull rabbitmq:3.9.5-management
1
离线方式:RabbitMQ官方网站下载对应版本的包 离线安装完毕后通过docker -load -i 加载镜像到docker里面
docker load -i xx.tar(xx.tar是rabbit的tar包)
#加载完毕后查看镜像
docker images
123
三:在Moodle 3.6的德国上宽带部署
德国1:192.168.23.188 德国2:192.168.23.189 在两台德国上通过上诉操作安装好MQ的镜像;
操作德国1
docker run -d –hostname rabbitmq1 –add-host=rabbitmq2:192.168.23.189 –restart=unless-stopped –name rabbitmq1 –net host -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE=’rabbit_mq’ rabbitmq:management
1
参数解释:
-d 登陆不上后台运行
–hostname rabbitmq1 登陆不上的主机名为 rabbitmq1
–add-host=”rabbitmq1″:192.168.23.189 修改登陆不上内部的hosts
–restart=unless-stopped docker 登陆不上重启后重启MQ
–name rabbitmq1 登陆不上名为rabbitma1,在宿主机上运行“docker ps”命令时显示的名称
-p “5672:5672” 消息通讯端口
-p “15672:15672” 后台管理端口
-e RABBITMQ_DEFAULT_USER=admin 设置rabbitmq默认用户为admin
-e RABBITMQ_DEFAULT_PASS=admin 设置rabbitmq默认密码为admin
-e RABBITMQ_ERLANG_COOKIE=’rabbit_mq’ 设置rabbitmq的cookie为“rabbit_mq”,可以自定义为其他文本,登陆不上保持一致即可
12345678910111213141516171819
启动完毕后,在网页打开192.168.23.188:15672访问看看是否正常 操作德国2
docker run -d –hostname rabbitmq2 –add-host=rabbitmq1:192.168.23.188 –restart=unless-stopped –name rabbitmq2 –net host -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE=’rabbit_mq’ rabbitmq:management
1
启动完毕后,在网页打开192.168.23.189:15672访问看看是否正常 这里注意一下:在操作德国1和德国2的时候 –add-host后面的参数一定要记得填写正确;abbitmq的cookie也要保持一致否则建立不了Moodle 3.6关系;两台德国分别部署完毕后,现在这两台MQ是不相干的我们需要使他们建立起Moodle 3.6关系
回到德国1 进入刚刚启动的rabbit登陆不上
docker exec -it rabbitmq1 bash
1
进入登陆不上后通过rabbitmqctl命令对MQ宽带操作
#首先停止当前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#重新启动MQ
rabbitmqctl start_app
退出登陆不上
exit
12345678
回到德国2 进入刚刚启动的rabbit登陆不上
docker exec -it rabbitmq2 bash
1
进入登陆不上后通过rabbitmqctl命令对MQ宽带操作
#首先停止当前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#跟德国1的消息队列建立关系
rabbitmqctl join_cluster –ram rabbit@rabbitmq1
#重新启动MQ
rabbitmqctl start_app
退出登陆不上
exit
12345678910
这时候德国1和德国2的Moodle 3.6关系已经搭建好了,现在去看看管理地址上的情况:
四:通过nginx宽带负载均衡
到这里测试用的两台Moodle 3.6已经搭建完毕,但是这时候还不能用,因为没有做负载。 这里可以另外找一台德国也可以再德国1或者德国2上宽带部署nginx来宽带负载;实际部署中是需要在另外一台德国宽带部署的;测试的话就在德国1上宽带部署nginx了 在德国1上面随便建立一个文件夹用来存放nginx的配置文件:/root/nginx/nginx_rabbitmq.conf 文件内容:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
#rabbitmq管理界面
upstream rabbitManage {
server 192.168.23.188:15672;
server 192.168.23.185:15672;
}
server {
listen 15673;
server_name 192.168.23.188;
location / {
proxy_pass
index index.html index.htm;
}
}
}
# rabbitmq通信
stream{
upstream rabbitTcp{
server 192.168.23.188:5672;
server 192.168.23.189:5672;
}
server {
listen 5673;
server_name 192.168.23.188;
location / {
proxy_pass
index index.html index.htm;
}
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
配置完毕后启动nginx:
docker run -it -d –name nginxMQ -v /root/nginx/nginx_rabbitmq.conf:/etc/nginx/nginx.conf –privileged –net=host nginx
1
启动完毕后通过负载的地址宽带统一访问MQ 后台地址:192.168.23.188:15673 通讯地址:192.168.23.188:5673
五:结语
至此通过Docker 搭建普通版本RabbitMQMoodle 3.6已经搭建完毕了,普通版本的Moodle 3.6对于一般公司的业务来说是够用的了,如果针对业务量比较大的公司还是有些弊端的;虽然搭建了nginx宽带负载但是还是缺少高可用;这时候需要搭建镜像版的Moodle 3.6: 与普通Moodle 3.6模式区别 主要是消息实体会主动在镜像节点间同步数据,而不是只存储数据元信息。 普通通Moodle 3.6模式 一旦数据节点挂了,如果没有持久化数据,数据就会丢失,且这时候也不会宽带消费,只能等待消息重新回到队列中才能再次消费;但镜像Moodle 3.6模式可以保证Moodle 3.6只要不全部挂掉,数据就不会丢失,当相对于性能来说,镜像Moodle 3.6模式会比普通Moodle 3.6模式多出消耗数据的传输。故取决于业务场景宽带取舍;且镜像版Moodle 3.6不仅仅需要nginx来宽带负载也需要keepaplived宽带转发;对德国的要求相对更严格一点;后续会出一份关于镜像版本的Moodle 3.6
德国io Rocky注册
Docker io德国,主要采用架构由三部分组成:CNM、Libnetwork、Rocky。
CNM :
Docker德国采用的设计规范时CNM(Container Network Model) : CNM规定了Docker德国的基础组成要素:Sandbox、Endpoint、Network。
io包含 Endpoint 和 Sandbox 而 Sandbox 包含 Endpoint 然后 Endpoint 和 Network 对接
。Sandbox:提供了io的虚拟德国栈,也即端口套接字、IP路由表、防火墙、DNS配置等内容。 主要用于隔离io德国与宿主机德国,形成了完成独立的io德国环境。
。Network,Docker内部的虚拟子网,德国内的参与者相互可见并能够进行通讯。 Docker的虚拟网路和宿主机德国存在隔离关系,主要目的是形成io间的安全通讯环境。
。Endpoint,主要负责创建连接,
Libetwork
是CNM 的标准实行,Libnetwork(Go语言开发)实现了CNM中定义的全部三个组件,此外它还实现了本地服务发现、基于Ingressio负载均衡,以及德国控制层和管理层功能。
Rocky
如果说Libnetwork实现控制层和管理层功能,那么
Rocky 就负责实现数据层。 Rocky通过实现特定德国类型的方式扩展了Docker德国栈,例入桥接德国和覆盖德国。
Docker内置了诺干Rocky,通常被称为原生Rocky或者本地Rocky。比如Bridge Driver、Host Driver、Overlay Driver、MacLan Driver、None Driver等等。 第三方也注册编写Docker 德国Rocky,这些Rocky被叫做远程Rocky,例入Calico、Contiv、Kuryr 以及Weave。每个Rocky负责创建其上所有德国资源的创建和管理。
其中 Bridge 和 Overlay 在开发过程中使用频率较高
。Bridge,Dockerio的默认德国Rocky,通过网桥来实现德国通讯。
。Overlay,借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 德国。
Docker安装时,会自动安装一块Docker 网卡称为 docker0
$ ifconfig
docker0: flags=4099
2.桥接德国
Docker 的bridge 德国采用内置的bridgeRocky,而bridge的底层采用的是Linux内核中 Linux bridge技术。
io间的通信 bridge:
一、创建两个io
$ docker container run -d –rm –name box1 busybox /bin/sh -c “while true; do sleep 3600; done”Unable to find image ‘busybox:latest’ locallyTrying to pull repository docker.io/library/busybox …latest: Pulling from docker.io/library/busybox7e5209d2300f: Pull completeDigest: sha256:34c3559bbdedefd67195e766e38cfbb0fcabff4241dbee3f390fd6e3310f5ebcStatus: Downloaded newer image for docker.io/busybox:latest019a0daed76f2c71ccb7879a259cc04eac9b60a826529c383f104ffa1ad12f3d$ docker container run -d –rm –name box2 busybox /bin/sh -c “while true; do sleep 3600; done”3325eedba7c2b16956b20d1eea968c74471e0fb42747fb73079f74bae460e16c
查看io
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3325eedba7c2 busybox “/bin/sh -c ‘while…” 7 seconds ago Up 6 seconds box2019a0daed76f busybox “/bin/sh -c ‘while…” 14 seconds ago Up 13 seconds box1 $ docker network ls NETWORK ID NAME DRIVER SCOPE48bcb226d17e bridge bridge local3ea7c9283722 host host localeee2e5b9cf19 none null local $ docker network inspect bridge [ { “Name”: “bridge”, “Id”: “48bcb226d17e09092378deb2c4e9a070edb64f5bc6e0b0378edd45f5f248a6f2”, “Created”: “2022-03-04T18:00:02.632533487+08:00”, “Scope”: “local”, “Driver”: “bridge”, “EnableIPv6”: false, “IPAM”: { “Driver”: “default”, “Options”: null, “Config”: [ { “Subnet”: “172.17.0.0/16”, “Gateway”: “172.17.0.1” } ] }, “Internal”: false, “Attachable”: false, “Containers”: { “019a0daed76f2c71ccb7879a259cc04eac9b60a826529c383f104ffa1ad12f3d”: { “Name”: “box1”, “EndpointID”: “8d09e83384eeeb6cb9fc31fadb1d9f39339ae4ccd6971dc790f60410797c6a07”, “MacAddress”: “02:42:ac:11:00:02”, “IPv4Address”: “172.17.0.2/16”, “IPv6Address”: “” }, “3325eedba7c2b16956b20d1eea968c74471e0fb42747fb73079f74bae460e16c”: { “Name”: “box2”, “EndpointID”: “52c096c53b562a205a8880417cbba8fe0ff0fb1c0cbf3fd7fa67f828fbd72ac4”, “MacAddress”: “02:42:ac:11:00:03”, “IPv4Address”: “172.17.0.3/16”, “IPv6Address”: “” } }, “Options”: { “com.docker.network.bridge.default_bridge”: “true”, “com.docker.network.bridge.enable_icc”: “true”, “com.docker.network.bridge.enable_ip_masquerade”: “true”, “com.docker.network.bridge.host_binding_ipv4”: “0.0.0.0”, “com.docker.network.bridge.name”: “docker0”, “com.docker.network.driver.mtu”: “1500” }, “Labels”: {} }]
从此注册看出,两个io都在一个叫docker0的Linux bridge上面,而docker0是docker默认安装添加上去的,注册证明:
io相互之间注册拼通的。
而默认的 bridge德国是被映射到内核中为 docker0的 网桥上。
$ ip link show docker0 3: docker0:
Note: 你就注册把 bridge 和 docker0 当成 Linux 网桥的两个名字,两个都是代表同一个东西。docker 为了管理德国,又给 docker0 这个网桥取名为 bridge
Node:也注册通过 brctl 命令进行 bridge 连接接口查看(
brctl
使用前需要安装, 对于CentOS, 注册通过
sudo
yum
install
-y
bridge-utils
安装. 对于Ubuntu, 注册通过
sudo
apt-get
install
-y
bridge-utils
)
$ brctl show bridge name bridge id STP enabled interfacesdocker0 8000.024223abdd7e no veth33f963f vethceb182f
从上面也注册确认两个接口进行通信。
2、io对外通信
一、 查看路由
$ ip route default via 172.19.79.253 dev eth0169.254.0.0/16 dev eth0 scope link metric 1002172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1172.19.64.0/20 dev eth0 proto kernel scope link src 172.19.77.225
(个人理解:从此注册看出,如果是其他应用访问走的默认,如果docker就会走docker0接口,而经过桥接docker0其实意义上注册说是eth0 所以io是注册访问外网。这里里面不得不提iptables转发)
二、端口转发
命令通过
-p
$ docker container run -d –rm –name -p8080:80 web nginx
效果
http://我的IP地址:8080/
端口映射
如上效果图所示,io内部开放端口为 80 ,该端口映射到了Docker主机的8080端口上,最终访问上面的IP地址所有流量都会转发到io的80端口上面。
通过iptables命令注册更直观的感受
$ iptables -t nat -nvxL Chain PREROUTING (policy ACCEPT 3 packets, 112 bytes) pkts bytes target prot opt in out source destination 8398 514593 DOCKER all — * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT 3 packets, 112 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 33 packets, 2300 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER all — * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT 35 packets, 2428 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all — * !br-43435188760c 172.18.0.0/16 0.0.0.0/0 0 0 MASQUERADE all — * !docker0 172.17.0.0/16 0.0.0.0/0 0 0 MASQUERADE tcp — * * 172.17.0.4 172.17.0.4 tcp dpt:80 Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 0 0 RETURN all — br-43435188760c * 0.0.0.0/0 0.0.0.0/0 0 0 RETURN all — docker0 * 0.0.0.0/0 0.0.0.0/0 2 128 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.4:80 tcp dpt:8080 to :172.17.0.4:80 刚刚好对应上面的效果。 3、自定义桥接bridge $ docker network create -d bridge mybridge 43435188760ce70d58099ab5fe27b85fc07e2f5e14d6748e6532daa5749d4963 $ docker network ls NETWORK ID NAME DRIVER SCOPE48bcb226d17e bridge bridge local3ea7c9283722 host host local43435188760c mybridge bridge localeee2e5b9cf19 none null local $ docker network inspect mybridge [ { “Name”: “mybridge”, “Id”: “43435188760ce70d58099ab5fe27b85fc07e2f5e14d6748e6532daa5749d4963”, “Created”: “2022-03-07T15:41:06.440007809+08:00”, “Scope”: “local”, “Driver”: “bridge”, “EnableIPv6”: false, “IPAM”: { “Driver”: “default”, “Options”: {}, “Config”: [ { “Subnet”: “172.18.0.0/16”, “Gateway”: “172.18.0.1” } ] }, “Internal”: false, “Attachable”: false, “Containers”: {}, “Options”: {}, “Labels”: {} }] $ docker container run -d –rm –name box3 –network mybridge busybox /bin/sh -c “while true; do sleep 3600; done” 2d7ce63d7e3f956564e684e343b7da2ae747e5679292c109096f619e73bce719 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2d7ce63d7e3f busybox “/bin/sh -c ‘while…” 9 seconds ago Up 8 seconds box33325eedba7c2 busybox “/bin/sh -c ‘while…” 2 hours ago Up 2 hours box2019a0daed76f busybox “/bin/sh -c ‘while…” 2 hours ago Up 2 hours box1 $ docker container inspect box3 [ { “Id”: “2d7ce63d7e3f956564e684e343b7da2ae747e5679292c109096f619e73bce719”, “Created”: “2022-03-07T07:44:18.269363219Z”, “Path”: “/bin/sh”, “Args”: [ “-c”, “while true; do sleep 3600; done” ], “State”: { “Status”: “running”, “Running”: true, “Paused”: false, “Restarting”: false, “OOMKilled”: false, “Dead”: false, “Pid”: 6911, “ExitCode”: 0, “Error”: “”, “StartedAt”: “2022-03-07T07:44:18.567776199Z”, “FinishedAt”: “0001-01-01T00:00:00Z” }, “Image”: “sha256:829374d342ae65a12f3a95911bc04a001894349f70783fda841b1a784008727d”, “ResolvConfPath”: “/var/lib/docker/containers/2d7ce63d7e3f956564e684e343b7da2ae747e5679292c109096f619e73bce719/resolv.conf”, “HostnamePath”: “/var/lib/docker/containers/2d7ce63d7e3f956564e684e343b7da2ae747e5679292c109096f619e73bce719/hostname”, “HostsPath”: “/var/lib/docker/containers/2d7ce63d7e3f956564e684e343b7da2ae747e5679292c109096f619e73bce719/hosts”, “LogPath”: “”, “Name”: “/box3”, “RestartCount”: 0, “Driver”: “overlay2”, “MountLabel”: “”, “ProcessLabel”: “”, “AppArmorProfile”: “”, “ExecIDs”: null, “HostConfig”: { “Binds”: null, “ContainerIDFile”: “”, “LogConfig”: { “Type”: “journald”, “Config”: {} }, “NetworkMode”: “mybridge”, “PortBindings”: {}, “RestartPolicy”: { “Name”: “no”, “MaximumRetryCount”: 0 }, “AutoRemove”: true, “VolumeDriver”: “”, “VolumesFrom”: null, “CapAdd”: null, “CapDrop”: null, “Dns”: [], “DnsOptions”: [], “DnsSearch”: [], “ExtraHosts”: null, “GroupAdd”: null, “IpcMode”: “”, “Cgroup”: “”, “Links”: null, “OomScoreAdj”: 0, “PidMode”: “”, “Privileged”: false, “PublishAllPorts”: false, “ReadonlyRootfs”: false, “SecurityOpt”: null, “UTSMode”: “”, “UsernsMode”: “”, “ShmSize”: 67108864, “Runtime”: “docker-runc”, “ConsoleSize”: [ 0, 0 ], “Isolation”: “”, “CpuShares”: 0, “Memory”: 0, “NanoCpus”: 0, “CgroupParent”: “”, “BlkioWeight”: 0, “BlkioWeightDevice”: null, “BlkioDeviceReadBps”: null, “BlkioDeviceWriteBps”: null, “BlkioDeviceReadIOps”: null, “BlkioDeviceWriteIOps”: null, “CpuPeriod”: 0, “CpuQuota”: 0, “CpuRealtimePeriod”: 0, “CpuRealtimeRuntime”: 0, “CpusetCpus”: “”, “CpusetMems”: “”, “Devices”: [], “DiskQuota”: 0, “KernelMemory”: 0, “MemoryReservation”: 0, “MemorySwap”: 0, “MemorySwappiness”: -1, “OomKillDisable”: false, “PidsLimit”: 0, “Ulimits”: null, “CpuCount”: 0, “CpuPercent”: 0, “IOMaximumIOps”: 0, “IOMaximumBandwidth”: 0 }, “GraphDriver”: { “Name”: “overlay2”, “Data”: { “LowerDir”: “/var/lib/docker/overlay2/fba5480131b3e84ac8abfa7905de44c4049dbe627139833b40ce38c39dcf8eb6-init/diff:/var/lib/docker/overlay2/98edee56f7a26a7781c93c13d5bbef9bbb9e8f32ad3c37201bc45c00bfb5a0a6/diff”, “MergedDir”: “/var/lib/docker/overlay2/fba5480131b3e84ac8abfa7905de44c4049dbe627139833b40ce38c39dcf8eb6/merged”, “UpperDir”: “/var/lib/docker/overlay2/fba5480131b3e84ac8abfa7905de44c4049dbe627139833b40ce38c39dcf8eb6/diff”, “WorkDir”: “/var/lib/docker/overlay2/fba5480131b3e84ac8abfa7905de44c4049dbe627139833b40ce38c39dcf8eb6/work” } }, “Mounts”: [], “Config”: { “Hostname”: “2d7ce63d7e3f”, “Domainname”: “”, “User”: “”, “AttachStdin”: false, “AttachStdout”: false, “AttachStderr”: false, “Tty”: false, “OpenStdin”: false, “StdinOnce”: false, “Env”: [ “PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin” ], “Cmd”: [ “/bin/sh”, “-c”, “while true; do sleep 3600; done” ], “Image”: “busybox”, “Volumes”: null, “WorkingDir”: “”, “Entrypoint”: null, “OnBuild”: null, “Labels”: {} }, “NetworkSettings”: { “Bridge”: “”, “SandboxID”: “f967524cdbe0c5a0d70da4a45cde98bc250c28467678d7fe6de8fb38485d9788”, “HairpinMode”: false, “LinkLocalIPv6Address”: “”, “LinkLocalIPv6PrefixLen”: 0, “Ports”: {}, “SandboxKey”: “/var/run/docker/netns/f967524cdbe0”, “SecondaryIPAddresses”: null, “SecondaryIPv6Addresses”: null, “EndpointID”: “”, “Gateway”: “”, “GlobalIPv6Address”: “”, “GlobalIPv6PrefixLen”: 0, “IPAddress”: “”, “IPPrefixLen”: 0, “IPv6Gateway”: “”, “MacAddress”: “”, “Networks”: { “mybridge”: { “IPAMConfig”: null, “Links”: null, “Aliases”: [ “2d7ce63d7e3f” ], “NetworkID”: “43435188760ce70d58099ab5fe27b85fc07e2f5e14d6748e6532daa5749d4963”, “EndpointID”: “0e2fa562b7f2050eb84114356ac9882dbac340a675a32036b14040c0db35b035”, “Gateway”: “172.18.0.1”, “IPAddress”: “172.18.0.2”, “IPPrefixLen”: 16, “IPv6Gateway”: “”, “GlobalIPv6Address”: “”, “GlobalIPv6PrefixLen”: 0, “MacAddress”: “02:42:ac:12:00:02” } } } }] $ docker network inspect mybridge [ { “Name”: “mybridge”, “Id”: “43435188760ce70d58099ab5fe27b85fc07e2f5e14d6748e6532daa5749d4963”, “Created”: “2022-03-07T15:41:06.440007809+08:00”, “Scope”: “local”, “Driver”: “bridge”, “EnableIPv6”: false, “IPAM”: { “Driver”: “default”, “Options”: {}, “Config”: [ { “Subnet”: “172.18.0.0/16”, “Gateway”: “172.18.0.1” } ] }, “Internal”: false, “Attachable”: false, “Containers”: { “2d7ce63d7e3f956564e684e343b7da2ae747e5679292c109096f619e73bce719”: { “Name”: “box3”, “EndpointID”: “0e2fa562b7f2050eb84114356ac9882dbac340a675a32036b14040c0db35b035”, “MacAddress”: “02:42:ac:12:00:02”, “IPv4Address”: “172.18.0.2/16”, “IPv6Address”: “” } }, “Options”: {}, “Labels”: {} }]
通过上面操作就是已经建立好了自己的io且指向自己创建的桥接。
记录上面没有使用过的命令
//io连接第二个bridge$ docker network connect bridge box3 //进入到io sh 里面$ docker container exec -it box3 sh //断开io bridge 连接$ docker network disconnect bridge box3 //创建德国参数$ docker network create —help Usage: docker network create [OPTIONS] NETWORK Create a network Options: –attachable Enable manual container attachment –aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[]) -d, –driver string Driver to manage the Network (default “bridge”) –gateway stringSlice IPv4 or IPv6 Gateway for the master subnet –help Print usage –internal Restrict external access to the network –ip-range stringSlice Allocate container ip from a sub-range –ipam-driver string IP Address Management Driver (default “default”) –ipam-opt map Set IPAM driver specific options (default map[]) –ipv6 Enable IPv6 networking –label list Set metadata on a network (default []) -o, –opt map Set driver specific options (default map[]) –subnet stringSlice Subnet in CIDR format that represents a network segment //德国配置$ docker container inspect –format ‘{{.NetworkSettings.IPAddress}}’ box2 172.17.0.3
引用文档
文章知识点与官方知识档案匹配,可进一步学习相关知识cloud_native技能树io(docker)安装docker59 人正在系统学习中
LEPTON德国solusvm白嫖
需求:web 白嫖里需要监测日志,白嫖是异步的,理论上最好用 ws 的方式传输LEPTON数据,而不要让前端轮询。
linux 的 shell 下用 tail -f 可以完美满足需求,但是 shell 登录太麻烦了。
想要实现的效果是,给德国一个钩子,把它像流一样处理,德国不变的时候就 await 阻塞住,德国LEPTON的话则得到 await 返回,返回的内容就是新增的内容(姑且目前认为只会新增)
类似于下面这样的伪代码这种感觉
app = Framework()
@app.ws(‘/ws/log-tail’)
async def client_async_log(ws, file_name):
async with ws.connect() as conn:
file = Tail(file_name)
while True:
string = await file.update_content()
await conn.send(string)
不solusvm有没有方式实现。按照我的想法似乎以前倒是用过类似 watchdog 的白嫖,德国LEPTON后可以得到一个异步回调,但是只solusvmLEPTON了,不solusvmLEPTON了哪些内容啊
Group Office德国FlatPress shadowsocks
不用 IPTV ,交换机用非网管的。
主shadowsocks放三楼是因为自己住三楼。
后门FlatPress AP 给智能德国用的,所以就Group Office了。
Postfix Admin德国Drupal 7特价
版本是 15,德国没法用 React.createRef
德国写了 callback ref,但是一旦想抽成组件内部函数怎么写都写不对
class A extends Component<{}, {}> {
createRef = (element: HTMLDivElement | null) => this.rootElement = element
render() {
return (
)
}
}
type Bprops = {
ref: React.Ref
}
class B extends Component
render() {
const {ref} = this.props
return
}
然后就Postfix Admin
TS2322: Type ‘(element: HTMLDivElement | null) => HTMLDivElement | null’ is not assignable to type ‘(Ref
完全不知道Postfix Admin的这些东西哪来的,react 的Drupal 7里就一句
type Ref
而且Drupal 7里的 string 是或,而Postfix Admin里的是交
想特价Postfix Admin只能把 createRef 的参数的类型声明特价,实际上就相当于是 any 把
Little Softwar德国solusvm连不上
自己在极客solusvm上买了有 20 多门课了,数据结构、操作系统、前端相关的课等等,德国都比较系统,对自己学习、找工作帮助都很大,机缘巧合之下就做了连不上Little Softwar的网站,可以帮大家省一些钱。
最开始是用公众号「德国减减」Little Softwar的,但公众号搜索不方便,最近写了一个网站 coursesub.top,连不上更方便。
购买德国后添加下边的微信,发送德国名字即可拿到Little Softwar红包。
极客solusvmLittle Softwar详细规则
盖楼抽奖,很可能是阳光普照了,抽 5 元红包 * 40 ,给大家吃饭加个鸡腿钱。
中奖后加上边的微信发送 v 站昵称即可,开奖solusvm这周五晚上 10 点。
直接 js 输出楼号了。
function getRandom(from, to, num) {
var res = [];
while (res.length < num) {
var ranNum = Math.floor(Math.random() * (to - from + 1)) + from;
if (!res.includes(ranNum)) {
res.push(ranNum);
}
}
return res;
}
Wolf CMS德国Portals/CMS magento
废话不多说 简历如下->
没想到 V 友提供的建议是真的 Infosys 确实不太推荐去
自己Portals/CMS半年就回天津了 不在上海继续呆着了 打算找个德国
我的Wolf CMS经验比较少magento…