专栏首页企鹅号快讯docker连接两个容器

docker连接两个容器

容器是用来提供服务的,每个容器都是运行一个进程,或许是一个web程序,或许是一个数据库服务,而在每个容器之间都是需要相互访问的,从而在这里构建一个python的程序,一个容器运行python的应用程序,一个容器用来运行redis服务,在应用程序中访问redis,具体架构如下:

运行redis的容器

运行redis的时候,步骤如下:

首先下载到redis的镜像,然后根据镜像运行一个镜像的实例,也就是redis这个实例,在其中需要注意的是,容器对外暴露的端口就是6379端口,从而在主机上对应监听一个6379的端口,差不多就是端口映射了。

运行应用程序容器

构建应用程序的dockerfile如下:

[root@docker appdockerfile]# ls -l

total 12

-rw-r--r--. 1 root root 665 Dec 18 04:16 app.py

-rw-r--r--. 1 root root 146 Dec 18 04:18 dockerfile

-rw-r--r--. 1 root root 12 Dec 18 04:16 requirements.txt

[root@docker appdockerfile]# cat app.py

from flask import Flask

from redis import Redis, RedisError

import os

import socket

# Connect to Redis

redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")

def hello():

try:

visits = redis.incr("counter")

except RedisError:

visits = "cannot connect to Redis, counter disabled"

html = "Hello !" \

"Hostname:

" \

"Visits: "

return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":

app.run(host='0.0.0.0', port=80)

[root@docker appdockerfile]# cat dockerfile

FROM python:2.7-slim

WORKDIR /app

ADD . /app

EXPOSE 80

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

[root@docker appdockerfile]# cat requirements.txt

Flask

Redis

创建镜像:

查看生成的镜像:

运行应用程序容器并进行测试:

参数--link表示为tagname:alias,一个是标签的名称,一个是别名。

1、容器的内部网络

其实redis暴露不暴露端口是无所谓的,这个端口是给宿主机访问的,而app的容器和redis的容器的交互实际上是通过内部网络进行的,如下:

容器默认使用的都是那个桥接网络,而不是使用宿主机的IP来进行通信,如果你使用的是宿主机的IP,然后来访问容器暴露的端口的话,会显示没有路由到这个redis的主机。

在这里连接的是redis的主机名,容器的网络是可以解析这个主机名的:

2、 dockerfile里面进行yum显示权限不足

在构建dockerfile的时候,为了进行调试为啥无法连接到redis主机,从而需要进行安装相关的包进行调试,但是构建dockerfile的时候,总是出现如下报错:

要想使用root权限,必须在dockerfile中添加指令如下:

表示使用root的权限运行程序。

3、COPY和ADD的区别

在使用dockerfile的时候,ADD指令和COPY指令很相似,都是将文件复制到对应的路径之中。首先,源路径都必须是相对的路径,相对于dockefile的路径。而ADD所做的可以更多,ADD的源路径可以是一个url,而COPY必须是一个目录或者文件;ADD的源文件如果是一个压缩文件,那么在复制的时候,会自动进行解压,而COPY不会。

推荐使用COPY。

就算使用绝对路径,也会直接变成相对路径。

本文来自企鹅号 - 运维Linux和python媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 了解云容器的四方面

    对容器的大量需求使企业推出了各种云容器服务。而市场上这么多的选择,很难决定去使用哪一个容器平台或工具。在你了解云容器技术的选择之前,你必须先确定容器是否值得您的...

    企鹅号小编
  • 关于“机器学习”,医生们需要知道的5件事

    作者:麦子 转载请注明:解螺旋·临床医生科研成长平台 机器学习,简单可以理解为一种数据分析的方法。医生们对数据驱动型预测研究应该不陌生,比如利用风险评分来指导抗...

    企鹅号小编
  • 机器学习系统设计03-机器学习入门应用案例

    @[Markdown, 机器学习] Github源代码下载 参考书籍:《机器学习系统设计》 应用案例说明 我们有一个数据集,是一个网站每小时的web访问量,随着...

    企鹅号小编
  • Flask框架(二)

    1.app.befor_request装饰过得函数在真正的响应函数之前执行,可以有多个,当有多个的时候,执行顺序是谁在前面谁先执行。

    GH
  • Android 组件化开源app -开眼短视频(OpenEyes)

    该开源项目采用组件化的方式开发,使用MVVM + AndroidX + jetpack 组件为基本架构进行开发。

    darryrzhong
  • IOS学习1——IOS应用程序的生命周期及基本架构

    一、应用程序的状态和多任务 有时系统会从app一种状态切换另一种状态来响应系统发生的事件。例如,当用户按下home键、电话打入、或其他中断发生时,当前运行的应用...

    mukekeheart
  • Flask快速入门 flask快速入门

    zhang_derek
  • Java开发环境系列:前端利器angular安装与使用

    npm config set registry http://mirrors.tools.huawei.com/npm

    架构师小跟班
  • SpringBoot开发案例之分布式集群共享Session

    在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用。

    小柒2012
  • app中的webview通识篇(上)

    如果你还是第一次与app合作开发webview的页面,那么对于如何调试,可能有哪些问题可能是不够了解的。本文尝试性的根据自己的经验给大家一个入门级别的了解,如果...

    RobinsonZhang

扫码关注云+社区

领取腾讯云代金券