欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

宁皓网 Docker:组合 有大用

使用 Compose 我们可以把多个服务组织到一块儿,去为应用提供一个完整的运行环境。

封面摄影:Sus Bogaerts

来自 https://ninghao.net/course/3826#info


介绍与准备

1)Compose

你的应用可能需要很多个服务,比如 Web 服务,缓存服务,数据库服务等等 .. 我们可以把这些服务放在单独的容器里面。手工的去配置这些服务的容器有些麻烦 .. Docker 的 Compose 可以帮我们解决这个问题 ..

你可以创建一个 Compose 文件,在这个文件上去描述你的应用都需要的服务,这些服务使用的镜像,数据卷,还有网络等等 .. 然后再用一条命令就可以启动所有的服务 ..

把配置保存成代码有很多好处,比如你可以把它们放在你的项目的版本控制里面保存起来 ..

来自 https://ninghao.net/video/3828#info


2)Compose 文件

在 Compose 文件里,你可以定义应用需要的服务,网络还有数据卷 .. 这个文件用的是 YAML 格式 .. Docker 规定了一些指令,使用它们你可以去设置对应的东西 ..

比如它主要分成三个区域,services .. 就是服务 .. 在它的下面,你可以去定义应用需要的一些服务 .. 每个服务都有一个自己的名字 .. 使用的镜像,挂载的数据卷,所属的网络 .. 它依赖的其它服务等等 ..

networks 是应用的网络 .. 在它的下面你可以定义应用使用的网络的名字,类型等等 ..

volumes 是数据卷,你可以在这里定义一些数据卷,然后可以把它们挂载到不同的服务上面去使用。

下面我们先去创建一个 Compose 文件 .. 进入到项目所在的目录 .. 为项目创建一个目录 .. 名字是 ninghao-docker .. 进入到这个目录的下面 ..

然后在它的下面再创建一个新的文件 .. 名字是 docker-compose.yml ..

在文件的一开始我们可以先指定一下 compose 的版本号 .. 用一个 version .. 现在的版本是 2 ...

下面我们会在这个文件里去定义应用需要的一些东西。

https://docs.docker.com/compose/compose-file

来自 https://ninghao.net/video/3829#info


Services

3)定义服务

在 Compose 文件里面,应用需要的服务,可以放在 services 的下面 .. 另起一行 .. 先是服务的名字 .. 比如我们叫它 phoenix .. phoenix 就是凤凰的意思 ..

在它的下面,可以更具体的去定义这个叫 phoenix 的服务, 比如这里我们用一个 image .. 指定一下服务要使用的镜像 .. 比如用一下 nginx 这个镜像 ..

另起一行可以继续去配置这个服务 .. 再用一个 ports ,去发布一些需要的端口 ... 它的值是一个列表 .. 让主机上的 8080 对应容器上的 80 ... 这个 80 是 nginx 公布的一个端口,是 http 默认使用的端口号 ..

下面我们使用类似的形式再去给应用定义一个服务 .. 注意这个服务的名字要跟上面的 phoenix 在同一个级别上 .. 名字是 dragon .. 也就是 龙 ..

这个服务用的 image ,同样是 nginx .. 再用一个 ports 发布一些端口 .. 让主机上的 8081 .. 对应容器上的 80 端口 ..

现在,我们在这个 compose 文件里面为应用定义了两个服务 .. 一个叫 phoenix .. 一个叫 dragon ..

docker-compose.yml的内容如下

version: '2'

services:

    phoenix:

        image: nginx

        ports :

            -"8080:80"

    dragon:

        image: nginx

        ports :

            -"8081 : 80"


来自   https://ninghao.net/video/3831#info


4)启动服务

下面我们可以去启动一下在 compose 文件里定义的服务 .. 在项目的根目录下面,也就是 docker-compose.yml 这个文件所在的那个目录 .. 执行一下

 docker-compose up ...

这样会启动在 compose 文件里面定义的所有的服务 .. 因为这是第一次启动它们,所以在这里会显示 Creating 也就是会先去创建了一些东西 ..

image.png

这里会显示先创建了一个叫 ninghaodocker_default 这样的一个网络 ..

下面又会显示创建了两个容器 .. 默认容器的名字会加上一个项目的名字作为它们的前缀 .. 因为我们没有单独去定义项目的名字,所以会使用项目的目录的名字 .. 后面还有一个数字后缀 ..

然后会显示 Attaching to .. 也就是连接到后面的这两个容器上 ..

打开浏览器 .. 访问一下主机的 ip .. 后面加上 8080 这个端口号 .. 这里会显示一个 nginx 的欢迎界面 .. 这个界面是 phoenix 提供的 ..

再试一下 .. 主机的 ip .. 加上 8081 .. 这里同样会显示一个 nginx 的欢迎界面 .. 这个页面是应用的 dragon 这个服务提供的 ..

回到终端 .. 这里会显示容器里的日志 .. 每条日志的前面会标注一下这个日志来自哪个容器 ..

ctrl + c 可以停止它们 .. 这些服务也可以在后台去运行 .. docker-compose up 再加上一个 -d 这个选项 .. 表示在后台去运行服务 

docker-compose up -d

.. -d 表示 Detached [dɪˈtætʃt]

查看一下正在运行的容器 .. 

docker ps

 .. 这里你会看到我们的应用里面的两个容器正在运行 ..

来自  https://ninghao.net/video/3832#info


5)服务的生命周期

查看应用的服务,可以执行一下 

docker-compose ps

 .. 这里有两个服务,状态现在都是 up ,表示正在运行 .. 停止它们可以使用 docker-compose stop ..

后面可以加上具体的要停止的服务 .. 比如 phoenix .. 

 docker-compose stop phoenix 

这样会把它停掉 .. 如果 stop 后面不加东西,

 docker-compose stop

会停止所有在 compose 文件里定义的服务 ..

现在这两个服务的状态都变成了 Exit ..

重新启动它们,可以使用

docker-compose start

 .. 你也可以选择只启动某个具体的服务 ..

要查看服务的日志,用的是 docker-compose logs .. 加上一个 -f 选项,

 docker-compose logs -f

(-f 是following的意思)可以持续的跟踪服务日志的变化 .. ctrl c 可以退出来 ..

想登录到某个服务容器里面,可以执行一下 docker-compose exec .. 加上服务的名字 .. 比如 phoenix .. 再用一下它的 bash ..

docker-compose exec phoenix bash 

现在我们的位置就是在 phoenix 这个容器的内部 .. exit 可以退出来 ..

要删除掉应用的服务,可以先把服务停掉 .. 

docker-compose stop 

..

再执行一下 

docker-compose rm 

.. 它可以删除掉所有的服务容器 .. 注意这个 rm 不会删除掉创建的网络还有数据卷 ..

比如我们可以查看一下网络的列表 .. 

docker network ls 

. 这个 ninghaodocker_default 就是我们的应用创建的一个网络 ..

如果你想删除掉所有这些东西,可以使用 

docker-compose down 

..

这里会提示我们删除掉了 ninghaodocker_default 这个网络 ...

来自 https://ninghao.net/video/3833#info


Networks

6)网络

网络决定了服务之间,还有外界跟服务之间怎么样进行沟通 .. 在执行 

docker-compose up 

的时候,docker 会给我们创建一个默认的网络,所有的服务也都会默认属于这个网络 .. 服务跟服务之间可以使用服务的名字进行相互的通信 ..

我们也可以去创建自己的网络,然后让指定的服务加入到这个网络里面,这样属于这个网络的服务之间可以相互通信,网络以外的服务就不能跟它们进行通信了 ..

这样会对服务有一个隔离的作用,让应用更安全一些 ..

我们先试一下默认的网络 ... 在 compose 文件所在的目录,执行一下 

docker-compose up -d 

.. 它会给我们创建一个默认的网络 .. 

docker network ls 

.. 可以查看主机上的网络列表 .. 这个 ninghaodocker_default 就是我们的项目默认使用的网络 .

再进入到一个服务的里面 .. 比如 phoenix 这个服务 .. 

docker-compose exec phoenix bash

 ... 在它里面去连接一下另外的一个服务 .. dragon ..

ping dragon 

你会发现,我们可以直接使用服务的名字连接到对方 .. 退出来 .. 再登录到 dragon 这个服务

docker-compose exec dragon bash

 ..

 再试一下,

ping phoenix 

去连接 phoenix 这个服务 .. 同样可以使用服务的名字连接到对方 ...

来自 https://ninghao.net/video/3835#info


7)定义网络

下面我们去为应用定义一个网络,定义网络可以在跟 services 同级别的这个位置上,用一个 networks ... 另起一行,然后是网络的名字 .. 比如 fairyland ..

下面可以再去配置一下这个网络 .. 比如它的 driver .. 也就是网络的类型 .. 这里我们设置成 bridge .. 桥接类型的网络 ..

现在我们可以在指定的服务里面去使用这个新的 fairyland 网络 .. 在服务这里,添加一个 networks ... 然后列出这个服务属于的网络 .. 让它属于 fairyland ..

我们再把 dragon 也加入到这个网络里面来 ..

为了测试一下这个网络 .. 我们可以再去添加一个服务 .. 名字是 monkey ... 把它放到 default ,也就是默认的这个网络里面 ..

docker-compose.yml修改后的内容如下

version: '2'

services:

    phoenix:

        image: nginx

        ports :

            -"8080:80"

        networks:

            -"fairyland" 

    dragon:

        image: nginx

        ports :

            -"8081 : 80"

        networks:

            -"fairyland" 

    monkey :

        image: nginx

        ports:

                -" 8082 : 80"

        networks :

                -"default'

networks:

    fairyland:

        driver: bridge



回到终端 .. 重新再执行一下 

docker-compose up -d 

.. 这里会提示,给我们创建了一个叫 fairyland 的网络 .. 然后重新创建了 phoenix .. 还有 dragon 这两个服务容器 ..

另外还创建了一个叫 monkey 的新服务 ..

下面我们先登录到 phoenix 这个服务容器里面 .. 

docker-compose exec phoenix bash 

然后去连接一下 dragon .. 它能够成功的连接到 dragon 这个服务 .. 因为 phoenix 还有 dragon 这两个服务在同一个网络里面,也就是我们新创建的 fairyland ..

再去连接一下 monkey 这个服务 .. 这里会提示 unknown host .. 未知的主机 .. 这是因为 monkey 是属于默认网络里面的一个服务 ...

如果你想让 phoenix 这个服务可以连接到 monkey ,你可以再给 phoenix 服务添加一个 default 这个网络 ..

来自  https://ninghao.net/video/3836#info



Volumes

8)命名的数据卷

在 compose 文件里面,我们可以去创建一些有名字的数据卷,然后把它们分配给指定的服务去使用 .. 在这个跟 services 还有 networks 同级别的位置上 .. 添加一个 volumes ..

然后是要创建的数据卷的名字 .. 比如 nest .. 下面可以再去配置一下它 .. 用一个 driver 指定一下这个数据卷的类型 .. 默认是 local ..

下面我们再把这个叫 nest 的数据卷交给一个服务去用 .. 在服务的下面,添加一个 volumes .. 在它的下面列出这个服务要使用的数据卷 ..

比如这里我们用一下 nest 这个数据卷 .. 冒号的右边是这个数据卷在服务容器里的位置 .. 也就是你要把这个数据卷挂载到的那个地方 .. 比如 /mnt ..

再用同样的方法,去设置一下 dragon 这个服务 .. 让它也使用一下 nest 这个数据卷 .. 挂载的位置同样是 /mnt ..

docker-compose.yml修改后的内容如下

version: '2'

services:

    phoenix:

        image: nginx

        ports :

            - "8080:80"

        networks:

            - "fairyland" 

        volumes:

            - nest: /mnt

    dragon:

        image: nginx

        ports :

            -"8081 : 80"

        networks:

            -"fairyland" 

        volumes:

            - nest: /mnt

    monkey :

        image: nginx

        ports:

                -" 8082 : 80"

        networks :

                -"default'

networks:

    fairyland:

        driver: bridge

volumes :

    nest :

        driver: local



回到终端 .. 执行一下 

docker-compose up -d

 ..

下面我们去试一下 .. 登录到 phoenix 这个服务容器里面 

docker-compose exec phoenix bash


... 进入到 /mnt 这个目录的下面 .. 创建一个文件 .. 名字是 phoenix_data_1 ..

touch phoenix_ data_ 1

退出来 .. 

exit

登录到 dragon 这个服务容器 .. 

docker-compose exec dragon bash

进入到 /mnt 这个目录 .. 查看一下它下面的东西 ..

ls

image.png

 这里会出现我们在 phoenix 上面创建的这个 phoenix_data_1 文件 ..

这是因为这两个服务都使用了 nest 这个数据卷 .. 挂载的位置都是这个 /mnt ..

来自 https://ninghao.net/video/3838#info


9)指定位置的数据卷

phoenix 还有 dragon 这两个服务都是一个 web 服务 .. 现在我想让他们把主机上的某个位置作为 web 服务的内容 .. 这样我们就可以去创建一个指定位置的数据卷 ..

先在项目的下面创建一个 html 文件,把它放在 app/web 这个目录的下面,名字是 index.html .. 在它里面添加一个基础的 html 结构 .. 修改一下标题 .. 再添加一个大标题 .. 文字是 hello ~ 保存一下 ..

image.png

再打开 compose 文件 ... 找到服务 .. 在它的 volumes 的下面,再去指定一个数据卷 .. 先是这个数据卷在主机上的位置 .. 这里就是当前目录下的 app 下面的 web .. 冒号的右边是数据卷挂载到的那个位置,/usr/share/nginx/html .. 这是 nginx 默认的那个主机的根目录 .. 也就是之前你看到的那个 nginx 欢迎界面所在的地方 ..

现在它里面的内容就是在我们自己主机上的,项目根目录下的 app 下面的 web 这个目录 ..

再把这个数据卷也交给 dragon 这个服务 ... 保存一下 ...

docker-compose.yml修改后的内容如下

version: '2'

services:

    phoenix:

        image: nginx

        ports :

            - "8080:80"

        networks:

            - "fairyland" 

        volumes:

            - nest: /mnt

            - ./app/web: /usr/share/nginx/html

    dragon:

        image: nginx

        ports :

            -"8081 : 80"

        networks:

            -"fairyland" 

        volumes:

            - nest: /mnt

            - ./app/web: /usr/share/nginx/html

    monkey :

        image: nginx

        ports:

                -" 8082 : 80"

        networks :

                -"default'

networks:

    fairyland:

        driver: bridge

volumes :

    nest :

        driver: local



回到终端 .. 重新执行一下 

docker-compose up -d

 .. 这样会重新创建有变化的服务容器 ..

打开浏览器 .. 访问一下 phoenix 提供的服务 ..

现在这里显示的就是我们的项目下面的 app ,web 里面的 index.html 这个文档的内容 ..

再打开 dragon 提供的这个服务 .. 会显示一样的内容 ..

来自  https://ninghao.net/video/3839#info


普通分类: