Docker容器技术:多容器复杂应用的部署实践

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

这里我们会尝试利用之前的知识去部署一个涉及多个容器的应用

1. 应用了解

之前提到过有一个python-flask的应用,他会部署一个服务,你访问之后可以返回一个:“hello docker”。

这里我们进一步来使用这个flask,我们重新部署其中的服务,让其连接redis数据库来获取数据,同时需要对数据进行读写操作。

2. Dockerfile编写

这里源码同之前的flask的Dockerfile类似:

FROM python:2.7 //基于python镜像

LABEL xxx

COPY ./app //源码拷贝到根目录app下面

WORKDIR /app  // 改变工作目录

RUN pip install flask redis //安装依赖库

EXPOSE 5000 //改变对挖暴露接口

CMD ['python','app.py']

但是这里有一个问题,我们并没有启动redis服务,只是给python装了一个使用redis的依赖库,跟redis本身没关系。

所以这里其实一个App应用涉及到了多模块,建议是将其拆分为多个容器分别部署,然后进行容器相互访问

3. 多容器部署

3.1 创建redis容器

sudo docker run -d --name redis redis

此时我们的redis就在6379端口启动的服务,这里为啥端口是6379端口而我们没有通过-p 6379:6379来把端口做一个映射从而暴露出去呢?

这是因为我们这个redis服务是内部使用的,没有必要暴露出去,这样也不安全。

这里还有一个问题,之后flask容器访问这个redis容器时候如何知道他的IP地址呢?当然我可以通过docker命令进去看一下IP地址,但其实这里是不需要知道的,我们可以通过之前学习的link操作来让后面的容器可以通过名字直接访问redis。

后面你只需要告诉后面启动的flask容器名字+端口就可以了。

3.2 创建flask容器

这里我们先根据之前的Dockerfile来build出镜像:

sudo docker build -t xxxx/flask-redis .

接着创建新的container,这里命令比较复杂:

sudo docker run -d --link redis --name flask-redis -e REDIS_HOST=redis

这里我们和redis做link了。

-e 是在这个容器里面设置一个环境变量。

起来之后我们进去这个flask容器,看一下:

sudo docker exec -it flask-redis /bin/bash

进去之后执行env:

发现多了一个REDIS_HOST环境变量,同时也可以直接ping redis这个容器。

3.3 尝试在flask容器内部访问

我们在内部执行请求5000端口,发现服务可以进行了。

3.4 外部访问

这里5000端口没有暴露出来,所以访问不了。

这里我们把之前的容器服务停掉,然后重建一个,加个-p参数:

然后再访问就成功了。

3.5 实践

实际的应用基本都会分前后端,这里我们推荐一个模块一个容器,只需要搞明白各个模块之间的通信关系就可以了。

其实这个应用就是通过docker0这个bridge使得两者可以互相访问

4. 容器-e 环境变量参数

sudo docker run -d --name test1 -e PENG=pengxiao busybox /bin/sh -c "while true;do sleep 3600"

这个是很有用的,尤其是容器里面有一些程序通过读取环境变量来读取配置,然后就可以在容器启动时候通过这种方式去配,这样容器程序就会非常灵活了!

猜你喜欢

转载自juejin.im/post/7111683124030865439