#云原生征文# Docker网络与Docker Compose 原创 精华
这一章我来总结docker网络,docker网络实质上是由 Docker 为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等与网络相关的模块。
-安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host
-
host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口(
和宿主机共享网络
)。 -
Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围(
局限很大·,不常用
)。 -
None:该模式关闭了容器的网络功能(
不配置网络
)。 -
Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信(
默认
)。
以上都是不用动手的,真正需要配置的是自定义网络。
docker0
首先我们就得先知道docker0,那么啥是docker0呢,docker0是桥接模式的。docker中的每一个默认生成的容器都会通过docker0生成ip并桥接起来,所以使得容器之间可以通过ip ping通。同时宿主机也能ping通容器。
通过ip addr 我们就能看见。最下面两个就是容器的ip详情。
如何查看容器的ip地址呢,我们可以通过docker network inspect Network id 来查看,首先我们先用docker network ls进行查看。
NAME 为bridge的就是docker 0,我们通过上面的命令就能看到容器的IP地址
可以看到这就是我们两个容器的IP地址,同时这两个容器的IP地址也是互通的,并且只要是在docker0默认环境下创建的容器ip地址都会由docker0进行分配地址也就是都会出现在这,所以这些容器之间都可以通过ip地址互通。
但是这样也会有一个问题,如果这个容器挂掉了是不就意味着ip消失了,那这就对我们上线的服务很不利,我们上线的服务就很不健康,那是否可以让ping ip改为ping 域名呢,这样只要ping 域名了他就会自动去找该域名底下的ip这样就算这个域名服务中有个ip挂了那么依然会有另一个ip可以完成业务。
–link
容器互联,我们可以通过–link 命令来使的容器之间通过域名联通
docker run -d -P --name 容器名 --link 需要联通的容器名 镜像名
这样容器就能直接ping需要联通的容器名,也就是说可以直接通过容器的名称进行通讯(通过域名访问),但是这样做很麻烦,所以不推荐使用这个方法。这里推荐自定义网络
自定义网络
我们可以通过
docker network create --driver bridge --subnet 192.168.0.0/(16或24) --gateway 192.168.0.1 net01
16和24,简单来说就是,16的话可以有255*255个ip地址能用,24的话可以有255个IP地址能用。这些知识不懂得可以去看看计算机网络。
这里由于默认创建的模式就是bridge所以这里写不写都一样。
可以看到创建成功了,我们去network inspect 看看我们自己创建的网络信息。
这就是我们配置的网络初始信息。
现在我们再来创建自定义网络下的容器,只需加
--net net01
既可。
docker run -d -P --net net01 --name 容器名 镜像名
我们再network inspect 看看自定义的网络里的信息
可以看到已经自动分配了IP地址。
自定义的网络是具备通过名称进行联通的修复了不能通过名称进行联通的缺点。所以这时这两个容器之间是可以通过容器名进行ping通的。这里由于我下载的tomcat是阉割般的没有ping命令这里就不演示了。
所以推荐大家使用自定义网络。同时建议大家建不同集群时用不同的网络。像我这里,docker0是一个网络,net01也是一个网络。这样这两个网络就是互相隔离的安全网络。那么这两个网络之间怎么通信呢?
在docker network 中有这样一个命令,我们通过docker network --help
查看一下。
看完上面的图应该很容易就知道咋写了吧。
可以看到两个不同网络之间的容器也能通过名称ping通了。再去docker network inspect net01
看看里面有啥变化
可以看到,这个docker0网络里的容器也被配置到了net01里并且自定义网络可以通过名称互通所有成功通信。
Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
大家应该也知道我们设计的一个系统肯定是涉及多个方面的,比如说你的系统中有nginx,有redis,有数据库服务等等,那这时我们要进行部署的话,是不得一个一个去run,如果服务少的话还好说,多了的话运维的忙死,所有就诞生了compose,他能很好的帮助我们实现一键多启。高效的运行多个容器。
安装
首先我们进入官网查看。
curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
但是上面这个下载速度有的慢,所以这里推荐使用下面这个
curl -SL https://get.daocloud.io/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
下面完成后
sudo chmod +x /usr/local/bin/docker-compose
然后再用docker-compose --version
检查是否安装完成
然后跟着官网来,大家一定要记住,官网永远都是最全最详细的,只不过大家看见英文就觉得烦所以不肯看,但是其实大家都是从官网中学习出来的,所以我这里就和大家一起从官网出发,其实不难,compose就是一个yml文件,对所需要的服务进行编排执行罢了。
进入composetest之后创建一个名为app.py的文件
这是里面的内容。
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
创建好了之后我们再创建一个requirements.txt的文件,熟悉python的同学应该就很清楚这个是干嘛的了。就是一个需要安装的库的声明。然后再加入以下的内容,列出需要安装的库。
flask
redis
这些准备工作做好之后是不就可以开始构建镜像了。接下来就开始操作吧,直接根据官方文档的进行操作,我来进行说明。
构建镜像Dockerfile
# 下载最基础的镜像
FROM python:3.7-alpine
# 设置工作路径为/code,后续方便卷挂载
WORKDIR /code
# 环境配置
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
# 将本地的该txt文件复制到docker引擎中并名为requirements.txt
COPY requirements.txt requirements.txt
# 下载里面所需的库或文件
RUN pip install -r requirements.txt
# 暴露端口为5000
EXPOSE 5000
# 将当前目录复制到镜像的workdir .目录下
COPY . .
# 运行flask
CMD ["flask", "run"]
创建docker-compose
接下来就可以创建docker-compose.yml
version: "3.9"
services:
web:
# 构建,记住后面那个点不能少
build: .
# 设置本机端口8000映射至5000
ports:
- "8000:5000"
redis:
# 找redis的镜像
image: "redis:alpine"
启动
启动compose
docker-compose up
ok启动成功我们去页面看看
成功了。
接下来我们修改一下compose文件加一个卷挂载,让我们可以更好的修改文件。设置环境,它告诉flask run在开发模式下运行并在更改时重新加载代码。
version: "3.9"
services:
web:
# 构建,记住后面那个点不能少
build: .
# 设置本机端口8000映射至5000
ports:
- "8000:5000"
# 挂载这样我们就能在不重启镜像的情况下修改文件
volumes:
- .:/code
# 设置环境,它告诉flask run在开发模式下运行并在更改时重新加载代码。这种模式应该只在开发中使用。
environment:
FLASK_ENV: development
redis:
# 找redis的镜像
image: "redis:alpine"
.:/code中间不能空开
我们试着去修改一个app.py文件看看能不能动态修改。去到目录底下
vim app.py
页面查看。成功了
最后
我们还可以使用
docker-compose up -d
来后台启动
docker-compose ps
查看 web服务可以使用哪些环境变量
docker-compose run web env
停止服务
docker-compose stop
完全删除容器down,删除数据卷
docker-compose down --volumes
【本文正在参加云原生有奖征文活动】,活动链接:https://ost.51cto.com/posts/12598