持续创作,加速成长!这是我参与「掘金日新计划 · 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"
这个是很有用的,尤其是容器里面有一些程序通过读取环境变量来读取配置,然后就可以在容器启动时候通过这种方式去配,这样容器程序就会非常灵活了!