Docker 学习 04
一、docker 网络
Bridge 模式
当docker容器启动时,会在主机上创建一个名为docker0的虚拟网桥
可以通过ip addr查看网络的地址,然后应为evth-pair技术,所以在docker容器中的地址和在宿主机的地址是成对出现的。
创建方式
$ docker run -d --net=bridge --name centos centos
Host 模式
如果启动容器时使用host,它将不会获得一个独立的Network NameSpace, 而是和宿主机共用一个。
创建方式
$ docker run -d --net=host --name centos centos
Container 模式
创建新的容器和已经存在的容器共享一个Network Namespace
创建方式
$ docker run -d --net=container:centos --name centos1 centos
None 模式
容器有自己的Network Namespace但是,容器没有任何的网络配置,需要我们自己手动配置
$ docker run -d --net=none --name centos centos
--link
使用名字访问容器,可以使用这命令
$ docker run -d -P --name tomcat03 --link tomact02 tomcat
然后可以通过--link建立两个容器之间的连接,但是它是单项连接,反向则是不行的
自定义网络
输入docker network ls可以查看docker中的网络,如:
NETWORK ID NAME DRIVER SCOPE
bdbcb6dabac3 bridge bridge local
55f24a2904d4 host host local
a320a2bc1201 none null local
- bridge: 桥接 docker(默认)
- none: 不配置网络
- host: 和宿主机共享网络
- container: 容器内网络
创建网络
# 配置容器模式为 bridge
$ docker run -d -P --name centos01 --net=bridge centos
# 创建一个网络 mynet
$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 查看网络
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
........
b1f43daf8df3 mynet bridge local
........
# 这个就是我们创建的网络
这个方式的好处是:
- 在同一个网络下,容器可以直接通过名字互相
ping通,而不用写--link
二、部署redis集群是实 一主二从架构
-
创建一个网络
$ docker network create redis --subnet 172.38.0.0/16 -
拉取
redis镜像$ docker pull redis不想烦了,直接拉最新的
-
创建三个
redis服务for port in $(seq 1 9); \ do \ mkdir -p /home/redis/node-${port}/conf touch /home/redis/node-${port}/conf/redis.conf cat << EOF >/home/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 doneps: redis集群创建时需要至少3个主节点
-
启动容器
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \ -v /home/redis/node-1/data:/data \ -v /home/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.11 redis redis-server /etc/redis/redis.conf docker run -p 6372:6379 -p 16372:16379 --name redis-2 \ -v /home/redis/node-2/data:/data \ -v /home/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.12 redis redis-server /etc/redis/redis.conf docker run -p 6373:6379 -p 16373:16379 --name redis-3 \ -v /home/redis/node-3/data:/data \ -v /home/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.13 redis redis-server /etc/redis/redis.conf # 使用脚本直接整 for port in $(seq 1 9); \ do \ docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \ -v /home/redis/node-${port}/data:/data \ -v /home/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.1${port} redis redis-server /etc/redis/redis.conf done -
集群部署
进入容器
输入
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 172.38.0.17:6379 172.38.0.18:6379 172.38.0.19:6379 --cluster-replicas 2然后在该回车地方回车,该输入yes的地方输入yes
-
连接集群
redis-cli -croot@e4f7f38f72f1:/data# redis-cli -c 127.0.0.1:6379> set name "asdf" -> Redirected to slot [5798] located at 172.38.0.12:6379 OK 172.38.0.12:6379> get name "asdf" 172.38.0.12:6379> shutdown not connected> exit root@e4f7f38f72f1:/data# redis-cli -c 127.0.0.1:6379> set name "sadf" -> Redirected to slot [5798] located at 172.38.0.18:6379 OK 172.38.0.18:6379> get name "sadf"可以看到我们每次被分配到的
redis服务都不一样部署完成