外观
自定义网络
如何自定义网络
由于容器之间的隔离性,不同容器之间无法访问,而宿主机和容器之间可以访问。
这里解释一下,如我在容器1中存储了一个可以下载的资源,并将其暴露在公网中,正常状态下,能访问互联网的所有客户端都可以下载此资源,即容器2也能获得此资源。不过按照这种方式,容器2是先到互联网中寻找资源,并在容器1中找到该资源,通俗地来说,这个网络的流向是先出去再进去,这样的方式就很奇怪。
Docker 提供了一个机制,就是默认的网络,它在 Docker 刚安装时就有了。
执行 ip a 命令,可以看到所有的网卡。

图中的 docker0 就是这个网卡,它的 ip 是 127.17.0.1。
运行 docker inspect nginx 可以查看容器 nginx 的细节。

Networks 就是 nginx 容器的一个配置,可以从图中看到,它配有网关、自己的 ip 地址等。
我们创建两个容器,每个容器各自使用一个 nginx 进程,同时将它们映射到宿主机的不同端口中。
docker run -d -p 88:80 --name nginx01 nginx
docker run -d -p 99:80 --name nginx02 nginx
docker ps然后进入 nginx01 容器中,使用 curl 访问 nginx02 容器的 80 端口。
为什么是 80 端口不是 99 端口呢,因为我们要直接访问 nginx02 ,因此要使用的应是它的 ip 和端口。80 端口是容器的端口,而 99 是主机的端口。
接下来我们查看容器 nginx01 的ip,然后进入容器 nginx02 访问它。
docker inspect nginx01
然后,进入容器 nginx02,访问 nginx01。
$ docker exec -it nginx02 bash
root@nginx02$ curl http://172.17.0.2:80Docker 为每个容器分配唯一 ip,使用 容器ip+容器端口 可以互相访问。但如果容器被删除、更改,ip 很容易改变。Docker0 默认不支持主机域名,而我们可以自己创建一个主机域名,相当于局域网内的 DNS。
使用 docker network 相关命令来操作网络资源。
首先我们来创建一个自定义网络,代码是 docker network create mynet 。执行后,可使用 docker network ls 查看所有已创建的网络。

接下来,我们重新创建这两个容器。不同的是,这两个容器都是用了自定义网络 mynet。
docker run -d -p 88:80 --name nginx01 --network mynet nginx
docker run -d -p 99:80 --name nginx02 --network mynet nginx
docker ps再查看一下两个容器的细节。
docker container inspect nginx01
可以看到,容器 nginx01 加入到了 mynet 网络中。这时候进入 nginx02,就可以通过容器名称直接访问 nginx01,而不需要再输入 ip。
$ docker exec -it mynginx02 bash
---
$ curl http://mynginx01:88 # 直接使用容器名实际应用 - Redis 主从同步集群
目的:设计一个主 Redis 和一个从 Redis,将所有外部与集群之间的更新,都通过主 Redis 实现,而从 Redis 会自动同步至主 Redis,实现读写分离。
为实现这个目的,我们使用两个 Redis 容器,第一个使用 6379 端口,并映射到主机的 6379 端口,然后将 bitnami/redis/data 目录映射到 /app/rd1 上,以便于操作数据。第二个使用 6379 端口,并映射到主机的 6380 端口,然后将 bitnami/redis/data 目录映射到 /app/rd2 上。
除此之外,我们需要设置两个变量,主 Redis 的如下:
REDIS_REPLICATION_MODE=master
REDIS_PASSWORD=123456第一个是设置主从之间的复制模式,以主机为准,第二个变量给主 Redis 设置个密码。
从机设置:
REDIS_REPLICATION_MODE=slave
REDIS_MASTER_HOST=redis01
REDIS_MASTER_PORT_NUMBER=6379
REDIS_MASTER_PASSWORD=123456
REDIS_PASSWORD=123456这里使用到的镜像也不是官方镜像,因为使用官方的镜像实现主从同步集群还需要修改配置文件,比较麻烦,这里我们使用一个民间大神已经封装好的镜像。我们在 Docker Hub 中搜 bitnami redis ,进入镜像说明,可以看到我们不需要修改配置文件,而是输入环境变量即可实现配置修改的操作。

现在我们启动这两个容器。
$ docker run -d -p 6379:6379 -v ~/rd1:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=master \
-e REDIS_PASSWORD=123456 --network mynet --name redis01 bitnami/redis
$ docker run -d -p 6380:6379 -v ~/rd2:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=slave -e REDIS_MASTER_HOST=redis01 \
-e REDIS_MASTER_PORT_NUMBER=6379 -e REDIS_MASTER_PASSWORD=123456 \
-e REDIS_PASSWORD=123456 --network mynet --name redis02 bitnami/redis在容器创建时,容器没有启动成功,查看日志发现如下报错:Can't open or create append-only dir appendonlydir: Permission denied。我们手动创建这两个映射目录,并修改它们的权限。
$ mkdir ~/rd1 ~/rd2
mkdir: 无法创建目录 "/home/qi1/rd1": 文件已存在
mkdir: 无法创建目录 "/home/qi1/rd2": 文件已存在
$ sudo chmod -R 777 ~/rd1 ~/rd2
$ docker restart redis01 redis02
$ docker ps然后使用 Redis 客户端尝试链接主 Redis 和 从 Redis。

我们接下来测试主从同步功能,我们为主机更新一条数据。
GET key
SET key value
GET key执行成功后,我们应该可以看到主机和从机数据已被更新。
