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

到如今为止,咱们会从 docker hub 拉取本身须要的 image 文件并执行起来. 还会基于已有的 image 来制做本身特殊须要的 image . 可是若是咱们完成一个功能须要多个 image 组合起来使用该怎么办呢?
虽然能够经过 Dockerfile 来制做一个这样的 image , 可是若是全部的功能都作在一个 image 中, 若是有一个模块需呀改变的话就须要从新构建整个 image.
做为一个程序员你知道,若是把全部的功能作到一个 image 里面至关于不断的"继承" 不一样 image 的功能, 显然这个而不是一个好方法. 并且有前人告诉咱们 "组合优于继承"!nginx

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

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

如何将两个 container 组合起来呢? 经过网络. docker 安装以后应建立一些 networkdocker

$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 下相互访问网路服务很是的麻烦.bash

$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 网路服务.3d

$ 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 的网络中去;同时映射对应的配置文件和端口.code

$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 服务了.server

但愿你们喜欢.

相关文章
相关标签/搜索