该篇文章已经被专栏《从零开始学docker》收录

如何用名字而不用ip来访问容器,这个时候就要使用–link了!
因为上篇文章我们启动了两台tomcat,这里我们直接用这两台机子来测试一下。
docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
可以发现是ping不通的
如何解决两个容器直接用名字互通(把两个容器连接起来就行了)
docker run -d -P --name tomcat03 --link tomcat02 tomcat:7.0
我们新启一个tomcat,让他通过–link绑定tomcat02
docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.142 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.083 ms
直接链接就可以ping了!
docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
反向是不能ping通的,因为没有配置,然后我们使用命令查看一下所有网卡。
docker network ls
NETWORK ID NAME DRIVER SCOPE
3454234082a6 bridge bridge local
03fb70520a34 host host local
83eddbf8f273 none null local
ntwkid是本地的网卡(docker0),然后我们docker network inspect 3454234082a6查看bridge的网络配置信息

这就是docker0 上面可以看到ip和网段

这是其他容器,如果启动服务不指定ip会随机分配一个ip,这个ip是docker启动的时候分配的,其实tomcat03就是在本地配置了tomcat02的配置。

说白了–link就是在hosts配置中增加了一个tomcat02的映射,可以通过tomcat03ping通。也可以互相绑定,我们不推荐使用,太笨了,我们需要自定义网络(不用docker0,因为很多局限 不支持容器名连接访问)
我们来简单介绍一下四种常见的网络状态!
bridge:桥接,说白了就是在docker上面搭桥,比如之前一个路由器叫0.1,后面来了0203,但是他们不能互相访问,不过可以通过01作为一个桥就可以通过这个桥互相访问了。(默认)
none:不配置网络
host:主机模式(和宿主机共享网络)
container:容器内网络联通(用的少)
docker run -d -P --name tocmat01 --net bridge tomcat:7.0
docker run -d -P --name tocmat01 tomcat:7.0
这两条命令其实是一样的,因为默认的网络模式就是bridge
--net以及docker network就是我们的自定义网络模式了,服务在自定义网络下面使用。
然后我们看一下怎么用
docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
好的 可以看到增删查这种的基本操作,我们来试试体验一下。
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#--driver bridge 网络模式
#--subnet 192.168.0.0/16 子网
#--gateway 192.168.0.1 网关
docker network ls

可以看到我们设置的自定义网络。然后自己通过这个mynet启动两个tomcat,再次查看可以看到有两个新容器,ip也是自己分配的!
docker run -d -P --name tomcatzijide --net mynet tomcat:7.0
docker run -d -P --name tomcatzijide2 --net mynet tomcat:7.0

docker exec -it tomcatzijide ping tomcatzijide2
PING tomcatzijide2 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcatzijide2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.118 ms
64 bytes from tomcatzijide2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.070 ms
是可以通过容器名字ping的!现在不用--link就可以ping名字了
那么我们为什么要自己搭建呢?好处在哪里?
我们自定义的网络docker都已经帮着维护好了对应的关系,docker0没有这个功能,所以推荐自定义网络!比如搭建redis或者mysql的集群,要搭网络,网络是隔离的,都有自己的子网,不同的集群使用不同的网络保证安全。

docker0和mynet是两个网段不能ping通,我们要把docker0的容器可以连接到mynet而不是把两个网络打通(两个网络打通出问题,整个网络就变了)可以使用下面的命令
docker network connect mynet tomcat01
打通tomcat01到mynet

联通之后会把tomcat01加入到mynet网络下,两个打通了,也就是叫一个容器两个ip。腾讯服务也有两个:公网和私网ip
docker exec -it tomcat01 ping tomcatzijide
PING tomcatzijide (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcatzijide.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from tomcatzijide.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.066 ms
此时就可以ping通了,02也可以被打通。 如果跨网络操作别人,就要用connect联通!
然后我们用上面学到的知识做一个redis集群来熟悉这些指令。
docker network create redis --subnet 172.42.0.0/16
如果要自己弄的话要起好久,而脚本是帮助我们快速解决的工具!(直接复制到linux下就行)
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
之后去目录查看一下
cd /mydata/
cd redis/
ls
node-1 node-2 node-3 node-4 node-5 node-6
脚本或者一个一个启动,脚本:
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.42.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
done
一个一个启动:
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.42.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
一个一个启动记得把redis-1挨个换成-2-3-4-5-6
启动成功之后查看一下
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a29639299648 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 2 seconds ago Up 1 second 0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp redis-6
1eac8739a31a redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp redis-5
6ba5ef70d66f redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp redis-4
e54c22dc5bc5 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 3 seconds ago Up 3 seconds 0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp redis-3
029f10e823d4 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 31 seconds ago Up 30 seconds 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp redis-2
bdf03f1113f1 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp redis-1
进入容器
docker exec -it redis-1 /bin/sh redis没有bash 是sh 进去之后默认的pwd是data目录
redis-cli --cluster create 172.42.0.11:6379 172.42.0.12:6379 172.42.0.13:6379 172.42.0.14:6379 172.42.0.15:6379 172.42.0.16:6379 --cluster-replicas 1
然后输入yes就开始创建集群了
查看集群信息
redis-cli -c
cluster info

三主三从都没问题。

set a b之后是13处理的(master)数据也在里面,从机应该也有这个数据,就算主机挂了从机也可以顶上。这就是高可用

然后我们直接停了第三个主机,然后我们get a,因为高可用搭建成功了所以可以!

在14找到了,从机,没问题,故障转移了,14就变为master了。
创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!
目前正在更新的系列:从0开始的蓝桥杯省一之路,云原生系列。
感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~

我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我正在开发一个Rails应用程序,我需要在其中找到给定特定偏移量或时区的夏令时开始和结束日期。我基本上在我的数据库中保存了从用户浏览器接收到的时区偏移量(“+3”,“-5”),我想在它出现时修改它由于夏令时的变化。我知道Time实例变量有dst?和isdst方法,如果存储在它们中的日期在夏令时与否。>Time.new.isdst=>true但是使用它来查找夏令时的开始和结束日期会占用太多资源,而且我还必须为我拥有的每个时区偏移量执行此操作。我想知道更好的方法。 最佳答案 好的,基于你所说的和@dhouty'sanswer:您希望能够
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
我有一台生产机器和一台开发机器,都运行ubuntu8.10并且都运行最新的phusionpassenger。当我在osx上的本地开发机器上使用ruby1.9.1时,我想知道外面的人是否已经在使用带有ruby1.9.1甚至1.9.2的phusionpassenger?如果是这样,请告诉我们您的设置!此外,有没有办法在apache上使用phusionpassenger同时运行ruby1.8.7(ree)和1.9.1?感谢您的指点,我在任何地方都找不到任何提示... 最佳答案 是的,从某些2.2.x版本开始就正式支持它,我不记
date_select方法只能设置:start_year,但我想设置开始日期(例如3个月前的日期)(但没有这样的选项)。那么,我可以将开始日期设置为date_select方法吗?或者,要制作这样的选择框,我应该使用select_tag和options_for_select吗?或者,有什么解决办法吗?谢谢, 最佳答案 有可能……例如:start_year–设置年份选择的开始年份。默认为Time.now.year-5参见thisresource. 关于ruby-Rails3-我可以将开始日期
我想从特定索引开始遍历数组。我该怎么做?myj.eachdo|temp|...end 最佳答案 执行以下操作:your_array[your_index..-1].eachdo|temp|###end 关于ruby-从特定索引开始迭代数组,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/44151758/