资讯专栏INFORMATION COLUMN

[afterCode] docker 速成班 5: 组合 container

neuSnail / 654人阅读

摘要:到现在为止我们会从拉取自己需要的文件并执行起来还会基于已有的来制作自己特殊需要的但是如果我们完成一个功能需要多个组合起来使用该怎么办呢虽然可以通过来制作一个这样的但是如果所有的功能都做在一个中如果有一个模块需呀改变的话就需要重新构建整个作为

到现在为止,我们会从 docker hub 拉取自己需要的 image 文件并执行起来. 还会基于已有的 image 来制作自己特殊需要的 image . 但是如果我们完成一个功能需要多个 image 组合起来使用该怎么办呢?
虽然可以通过 Dockerfile 来制作一个这样的 image , 但是如果所有的功能都做在一个 image 中, 如果有一个模块需呀改变的话就需要重新构建整个 image.
作为一个程序员你知道,如果把所有的功能做到一个 image 里面相当于不断的"继承" 不同 image 的功能, 显然这个而不是一个好方法. 而且有前人告诉我们 "组合优于继承"!

那我们就试试如何组合使用 container.

在前一节,我们做好了一个 hello world 的 http 服务器工作在3000端口上. 现在我想用 nginx
作为反向代理到8080端口上访问这个服务.

如何将两个 container 组合起来呢? 通过网络. docker 安装之后应创建一些 network

$docker network ls
NETWORK ID          NAME                     DRIVER              SCOPE
a3ccacd179e5        bridge                   bridge              local
10768aaf02ae        host                     host                local
c2df063c31ab        none                     null                local

其中最常用的就是这个叫 bridge 的网络. 通过命令 docker network inspect bridge 来查看 network 的具体情况. 可以发现默认方式启动的 continer 都是在这个 bridge 的网络下. 而这些container 之间是相同的. 只是相互之间访问必须才用 ip 的方式来访问, 而且每次 container 启动的时候 ip 地址会是变化的. 所以要在 bridge network 下相互访问网路服务非常的麻烦.

$docker network inspect bridge
[
    {
        "Name": "bridge",
# 忽略....
        "Containers": {
            "91c3adde0212956c4cc2800dc9795165b1aea2a59547f74b441ec27e2427ac5a": {
                "Name": "graphite",
                "EndpointID": "f1e4c35371035e7149d80b9bb567282e686ae99cb118bc81bb6e7996efbe1993",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "d7ae7809b8530b4ee473991bd65cb6446c382c462e7d4702b7b81b8ec58b4362": {
                "Name": "grafana",
                "EndpointID": "9341a8a43bff28fb9077ba1a3d2b6609fd6a91214109e075658acbd9ba7ef840",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
# 忽略...
    }
]

好在 docker 在用户自己创建的网络中提供了从 container 名字到对应 ip 的解析. 换句话说, 可以直接通过 container 的名字来访问需要的服务.

完成刚才的例子

首先我们为我们的 nginx 和 helloworld 网络服务器创建一个叫 "supernet" 的网络.

$docker network create supernet

然后通过--network--name 启动一个加入到 supernet 网络的 hello world 网路服务.

$ docker  run --network supernet --name hello  --rm  pshu/helloworld:1.0.0

接着创建一个 default.conf 文件作为 nginx 服务器的反向代理配置文件, 将所有http 请求代理到 hello 容器的3000端口上.

server {
    listen       8080;
    server_name  localhost;

    location / {
        proxy_pass   http://hello:3000;
    }
}

同样采用 --network 将运行 nginx 的容器也加入到 supernet 的网络中去;同时映射对应的配置文件和端口.

$docker run -it --rm  --network supernet  
            -v $PWD/conf.d:/etc/nginx/conf.d -p 8080:8080 nginx

最后我就能通过 http://127.0.0.0:8080 访问到来自 hello container 中的 http 服务了.

希望大家喜欢.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27080.html

相关文章

  • [afterCode] docker 成班 6: docker-compose

    摘要:通过的我们可以将多个有机的组合起来构建出自己需要的服务但是这里有几个小问题就是不利于分享步骤麻烦需要自己创建指定使用那如何解决上面的两个问题呢第节例子中的服务可以通过创建一个这样的文件来解决通过下面的命令就能将所有需要的启动起来 通过docker 的 network我们可以将多个 container 有机的组合起来构建出自己需要的服务. 但是这里有几个小问题就是 不利于分享. 步骤麻...

    Integ 评论0 收藏0
  • [afterCode] docker 成班 7: 实战 构建基于graphtie/grafana监

    摘要:由于公司没有运维又需要监控服务器的一些数据信息想尽快的启动一个数值监控系统技术评估了下打算的方式来建设是一个时间数列数据库并且自带一些简单图形展示功能虽然展示方面不是很完美但是在收集时间数据上非常的方便和简单根据官网的例子只需要一个连接就能 由于公司没有运维, 又需要监控服务器的一些数据信息, 想尽快的启动一个数值监控系统. 技术评估了下打算 graphite + grafana 的...

    jhhfft 评论0 收藏0
  • [afterCode] docker 成班 3: 使用 container 中的功能

    摘要:通过将执行起来了不是为了看看容器的状态而是想使用中的功能介绍两种方式来使用容器中的功能通过端口访问中的服务通过端口的方式来使用提供的服务是最简单的了只要通过或者选项来向宿主机暴露服务端口就可以了比如我们可以这样在后台启动一个服务并将中 通过docker 将 container 执行起来了,不是为了看看容器的状态,而是想使用 container 中的功能.介绍两种方式来使用容器中的功能....

    Rainie 评论0 收藏0
  • [afterCode] docker 成班 2: container

    摘要:本来想在一篇里面就写完所有的内容的但是考虑考虑到文章太长会和风格相背离所以就按连载的形式来容器是物质基础有了这个才能让能运行起来运行起来的称之为容器它使用中的一等公民直接启动使用启动一个容器如果你没有下载过的话会自动下载一个的指定方法和删除 本来想在一篇 blog 里面就写完所有的内容的,但是考虑考虑到文章太长会和 egghead 风格相背离,所以就按连载的形式来. 容器 contai...

    stormjun 评论0 收藏0
  • [afterCode] docker 成班 4: 自建 Image

    摘要:通过能获得很多别人定制好的但是如果自己想制作一个自己容器该怎么弄呢用就像一个脚本文件告诉如何创建一个新的下面举例来用来制作一个服务器的指令刚才提到了社区已经有很多很好用的那我们要构建自己的的话就可以在这些的基础上来做我们要做一个基于的服务器 通过 docker hub 能获得很多别人定制好的image, 但是如果自己想制作一个自己容器该怎么弄呢? 用 Dockerfile Docker...

    Charles 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<