MENU

docker进阶:docker-compose

2018 年 11 月 26 日 • 应用服务器

docker三剑客之一,是一个用来把docker自动化的东西,属于一个应用层服务,使用yml文件可以定义哪个容器组运行哪应用,支持动态改变应用,并在需要时扩展,可以对一组容器通过一条命令启动,停止,重启等服务,可以理解为是一个脚本工具,使用配置文件管理容器组,下面简单介绍一下使用方法。

docker-compose 安装

安装

[root@docker-1 ~]# curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@docker-1 ~]# chmod +x /usr/local/bin/docker-compose
[root@docker-1 ~]# docker-compose --version

docker-compose.yml 文件命令说明

使用yml文件,ansibleplaybook用的也是这个,类似XML数据描述语言,简单说一下YAML文件格式的注意事项

  1. 不支持制表符tab键缩进,需要使用空格
  2. 通常开头缩进两个空格
  3. 字符后缩进一个空格,如冒号,逗号,横杠
  4. 用井号注释
  5. 如果包含特殊字符用单引号引起来
  6. 布尔值(true.false.yes.no.on.off),必须用引号引起来,分析器会解释字符串

标准的配置文件应该包含versionservicesnetwork三大部分,关键就是servicesnetworks两个部分,下面介绍一下services的书写规则,一个最简单的例子,其实docker-compose很多命令和docker的命令效果一样,现在构建一个nginx,将容器的端口映射一下,开撸。

最简单的栗子

使用yml文件启用一个nginx服务,阔以对外服务的那种。

[root@docker-1 ~]# mkdir /docker-compose -p
[root@docker-1 ~]# cd /docker-compose/
[root@docker-1 /docker-compose]# vim nginx.yml
version: '2'
services: 
  nginx: 
    image: nginx
    ports:
      - "80:80"
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Creating nginx_nginx_1_2f9e6d9126ff ... done
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
           Name                    Command          State         Ports       
------------------------------------------------------------------------------
nginx_nginx_1_65be600b7a4f   nginx -g daemon off;   Up      0.0.0.0:80->80/tcp
[root@docker-1 /docker-compose]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.15.6
Date: Thu, 22 Nov 2018 08:44:41 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 06 Nov 2018 13:32:09 GMT
Connection: keep-alive
ETag: "5be197d9-264"
Accept-Ranges: bytes

emmmmm,大概就是这样,说一下上面yml文件所用到参数。

yml参数

参数含义
version定义版本
services定义服务名称
image使用哪个镜像,如果不存在会pull
posts要映射的端口

命令参数

参数含义
-f指定配置文件,默认使用当前目录的docker-compose.yml
up启动服务
-d后台运行
ps查看长在运行的服务

接下来把他删了吧,留着没啥子用

[root@docker-1 /docker-compose]# docker-compose -f nginx.yml stop
Stopping nginx_nginx_1_65be600b7a4f ... done
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml rm
Going to remove nginx_nginx_1_65be600b7a4f
Are you sure? [yN] y
Removing nginx_nginx_1_65be600b7a4f ... done
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name   Command   State   Ports
------------------------------

最简单的例子就是这样,下面是services部分常用参数。

services部分

一些比较常用的参数,不是全部的撒

build

这个类似上面的image参数,也是指定一个镜像,不同的是他可以基于Dockerfile去构建,Compose会利用Dockerfile去构建这个镜像,然后使用这个镜像去启动服务容器。
栗子
我博客现在也是跑在容器上的,之前在做的时候也写过Dockerfile,所以就拿之前写的nginx试一下,Dockerfile内容如下

[root@docker-1 /docker-compose]# cat Dockerfile 
FROM centos:latest
ENV LANG en_US.utf8
ADD nginx.tar.gz /usr/local/
RUN useradd www-data -u 33 -s /sbin/nologin
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo Asia/Shanghai > /etc/timezone \
ENV PATH /usr/local/nginx/sbin:$PATH
CMD ["nginx", "-g", "daemon off;"]

nginx.yml内容

[root@docker-1 /docker-compose]# cat nginx.yml 
version: '3'
services: 
  nginx: 
    build: .
    image: centos7-nginx
    ports:
      - "80:80"
      - "443:443"

build这里的话可以写相对路径,绝对路径,我是放在当前目录的,所用的.,下面构建试试

[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps

输入如下。

访问的话应该是直接301rj-bai.com

[root@docker-1 /docker-compose]# curl -i -s 127.0.0.1 | head 
HTTP/1.1 301 Moved Permanently
Server: rj-bai
Date: Thu, 22 Nov 2018 10:09:24 GMT
Content-Type: text/html
Content-Length: 163
Connection: keep-alive
Location: https://rj-bai.com

没问题,就是我现在用的nginx,上面buildimage同时出现,结果就是使用Dockerfile构建镜像,使用image指定的参数会成为镜像名称,现在有的镜像应该是三个,分别是nginx&centos&centos7-nginx,看一下。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7-nginx       latest              a630ad02d409        14 minutes ago      208MB
nginx               latest              62f816a209e6        2 weeks ago         109MB
centos              latest              75835a67d134        6 weeks ago         200MB

command

替换容器默认命令,和写在Dockerfile里的CMD功能一致,没啥子卵用,一般都会在Dockerfile中定义,查看默认命令。

[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
           Name                    Command          State                    Ports                  
----------------------------------------------------------------------------------------------------
nginx_nginx_1_b60a4e38c609   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

container_name

指定容器名称,阔以随便写,但不能重复

    container_name: nginx
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name          Command          State                    Ports                  
-------------------------------------------------------------------------------
nginx   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

hostname

用户指定容器主机名

    hostname: nginx
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml exec nginx /bin/bash -c "hostname"
nginx

depends_on

定义容器的先后启动顺序,栗子,加一个PHP服务,先启动php服务再启动nginx服务,效果就是先创建php,在创建nginx

[root@docker-1 /docker-compose]# cat nginx.yml 
version: '3'
services: 
  nginx: 
    build: .
    image: centos7-nginx
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - php

  php: 
    image: php:7.2-fpm
    hostname: php
    container_name: php
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Creating php ... done
Creating nginx ... done
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name               Command              State                    Ports                  
----------------------------------------------------------------------------------------
nginx   nginx -g daemon off;            Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
php     docker-php-entrypoint php-fpm   Up      9000/tcp                                

DNS

用于指定容器DNS服务器地址,也没啥子卵用,栗子。

[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services: 
  nginx: 
    build: .
    image: centos7-nginx
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    dns: 
      - 202.106.0.20
      - 223.5.5.5
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Recreating nginx ... done
[root@docker-1 /docker-compose]# docker inspect 005ba758c836 | grep -i "dns" -C 3
            "Dns": [
                "202.106.0.20",
                "223.5.5.5"

tmpfs

挂载临时目录到容器内,与run --tmpfs效果一致,栗子。

[root@docker-1 /docker-compose]# cat nginx.yml 
version: '3'
services: 
  nginx: 
    build: .
    image: centos7-nginx
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    dns: 
      - 223.5.5.5
      - 202.106.0.20
    tmpfs: 
      - /data
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Recreating nginx ... done
[root@docker-1 /docker-compose]# docker inspect e1e1c61a6e61 | grep -i "tmpfs" -A 1
            "Tmpfs": {
                "/data": ""

entrypoint

也就是Dockerfile中的entrypoint,和CDM的区别,看这里,栗子。

[root@docker-1 /docker-compose]# cat nginx.yml
version: '3'
services:
  nginx:
    build: .
    image: centos7-nginx
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    dns:
      - 223.5.5.5
      - 202.106.0.20
    tmpfs:
      - /data
    entrypoint:
      - /bin/bash
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml ps
Name     Command    State    Ports
----------------------------------
nginx   /bin/bash   Exit 0        

environment

环境变量,也就是docker -e的效果,最简单的一个栗子,启动一个mysql,设置root密码为Sowhat?,映射端口,能正常使用的那种。

[root@docker-1 /docker-compose]# cat mysql.yml 
version: '3'
services:
  mysql: 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    ports: 
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
Creating mysql ... done
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml ps
Name              Command             State                 Ports              
-------------------------------------------------------------------------------
mysql   docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp, 33060/tcp

用别的服务器连一下试试撒

[root@nginx ~]# mysql -uroot -pSowhat? -h192.168.1.93 -e "show databases ;"
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

大概就这样。

expose

添加要暴露端口,栗子。

[root@docker-1 /docker-compose]# cat mysql.yml 
version: '3'
services:
  mysql: 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    ports: 
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?
    expose: 
      - "3307"
      - "3308"
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
Creating mysql ... done
[root@docker-1 /docker-compose]# docker inspect 4c7f8416e054 | grep -i "Port" -C 6
            "Ports": {
                "3306/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "3306"
                    }
                ],
                "33060/tcp": null,
                "3307/tcp": null,
                "3308/tcp": null
            },

external_links

用于连接使用docker run启动的容器,栗子,先用docker run去启动一个容器,就redis吧

[root@docker-1 /docker-compose]# docker run -d -p 6379:6379 --hostname redis --name redis redis
[root@docker-1 /docker-compose]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d3b1602bb896        redis               "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        0.0.0.0:6379->6379/tcp   redis

redis容器是我用docker run启动的,我现在想用docker-compose启动一个MySQL,需要和redis进行连接,操作如下。

[root@docker-1 /docker-compose]# cat mysql.yml 
version: '3'
services:
  mysql: 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    ports: 
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?
    expose: 
      - "3307"
      - "3308"
    external_links: 
      - redis
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
[root@docker-1 /docker-compose]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                              NAMES
c8a833534bb6        mysql:5.7           "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        3307-3308/tcp, 0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
d3b1602bb896        redis               "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        0.0.0.0:6379->6379/tcp                             redis
[root@docker-1 /docker-compose]# docker inspect c8a833534bb6 | grep -i "links" -A 3
                    "Links": [
                        "redis:redis"
                    ],
                    "Aliases": [

建立连接的前提是容器都在同一个网络内才可以

extra_hosts

向容器的/etc/hosts添加记录,类似--add-host,现在把redis添加到mysql容器的hosts文件中

[root@docker-1 /docker-compose]# cat mysql.yml 
version: '3'
services:
  mysql: 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    ports: 
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?
    expose: 
      - "3307"
      - "3308"
    external_links: 
      - redis
    extra_hosts: 
      - "redis:192.168.1.93"
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml exec mysql /bin/bash -c "cat /etc/hosts"
192.168.1.93    redis

links

容器之间互联,和docker run --link效果一致,栗子。

[root@docker-1 /docker-compose]# cat mysql.yml 
version: '3'
services:
  mysql: 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    ports: 
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?
    links: 
      - redis

  redis: 
    image: redis
    hostname: redis
    container_name: redis
    ports: 
      - "6379:6379"
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml up -d
[root@docker-1 /docker-compose]# docker-compose -f mysql.yml exec mysql ping -c 1 redis
PING redis (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: icmp_seq=0 ttl=64 time=0.098 ms

posts

这个就是端口映射,上面写过了,栗子。

    ports: 
      - "3306:3306"

前面的3306是宿主机的端口,后面的3306是容器的端口,映射用的就是iptablesnat

volumes

挂在一个文件或目录到容器中,和docker -v一样,栗子。

[root@docker-1 /docker-compose]# mkdir /data/www -p
[root@docker-1 /docker-compose]# echo rj-bai > /data/www/index.html
[root@docker-1 /docker-compose]# cat nginx.yml 
version: '3'
services: 
  nginx: 
    image: nginx
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes: 
      - /data/www:/var/www/html
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Recreating nginx ... done
[root@docker-1 /docker-compose]# curl 127.0.0.1
rj-bai

默认权限为rw,需要只读使用ro

volumes_from

从其他容器挂载数据卷,和--volumes-from一致,可以是容器的名称,也可以是服务的名称,很简单,栗子。

  volumes_from: 
    - nginx

网络部分

docker默认情况下采取的网络模式就是bridge,指定网络模式主要作用就是为了隔离,提升安全性,查看当前存在的网络有哪些,可以用以下命令查看。

[root@docker-1 ~]# docker network ls
NETWORK ID          NAME                     DRIVER              SCOPE
343d2d507baf        bridge                   bridge              local
1a61bbca48e9        docker-compose_default   bridge              local
2906cfa53bd0        docker_default           bridge              local
d60de66fa405        host                     host                local
d3fcdc0b06ff        nginx_default            bridge              local
ea4a1a6961f0        none                     null                local

查看每个网络的详情用下面的命令去看。

[root@docker-1 ~]# docker network inspect {网络名称}

之前看到过一篇介绍docker网络非常好文章,地址,可以去了解一下,这里的话大概介绍一下如何使用yml去定义容器组的网络,栗子,使用新网络。

使用现有网络

现在吧之前启动的容器全部删掉,包括添加的网络,随便写个服务启动。

[root@docker-1 /docker-compose]# cat lnmp.yml 
version: '3'
services: 
  lnmp: 
    image: nginx
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"

  mysql: 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    ports: 
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?

  php: 
    image: php:7.2-fpm
    hostname: php
    container_name: php
[root@docker-1 /docker-compose]# docker-compose -f lnmp.yml up -d
Creating network "docker-compose_default" with the default driver
Creating mysql ... done
Creating nginx ... done
Creating php   ... done
[root@docker-1 /docker-compose]# docker network ls
NETWORK ID          NAME                     DRIVER              SCOPE
343d2d507baf        bridge                   bridge              local
7a9007f760ca        docker-compose_default   bridge              local
d60de66fa405        host                     host                local
ea4a1a6961f0        none                     null                local

我刚刚启动了三个容器,分别是nginx&mysql&php,启动命令后输出第一行提示创建了一个名为docker-compose_default的网络,上面能看到是一个bridge模式的网络,看一下详情,输入过长,捡重点

[root@docker-1 /docker-compose]# docker network inspect docker-compose_default
            "Config": [
                {
                    "Subnet": "172.26.0.0/16",
                    "Gateway": "172.26.0.1"
                }
            ]

这是默认创建的,下面去指定一下网络,新建一个网络叫lnmp给这个容器组使用,看一下当前容器的地址是什么

[root@docker-1 /docker-compose]# docker inspect nginx | grep -i "ipaddress"
                    "IPAddress": "172.26.0.2",

现在是172网段的,现在手动创建一个,一会切换到这里

[root@docker-1 ~]# docker network create --driver bridge --subnet 12.13.14.0/24 --gateway 12.13.14.254 lnmp
4dcb829c1a60fe38f10aa6f527341bacaf0017871b7fc12f0ef7db2915ea9e1f
4dcb829c1a60        lnmp                     bridge              local
[root@docker-1 ~]# docker network inspect lnmp
            "Config": [
                {
                    "Subnet": "12.13.14.0/24",
                    "Gateway": "12.13.14.254"
                }
            ]

现在网络创建好了,然后去改yml文件

[root@docker-1 /docker-compose]# cat lnmp.yml 
version: '3'
services: 
  lnmp: 
    image: nginx
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    networks:
      - lnmp

  mysql: 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    ports: 
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?
    networks:
      - lnmp

  php: 
    image: php:7.2-fpm
    hostname: php
    container_name: php
    networks:
      - lnmp

networks: 
  lnmp: 
    external:
      name: lnmp
[root@docker-1 /docker-compose]# docker-compose -f lnmp.yml up -d
Recreating php   ... done
Recreating nginx ... done
Recreating mysql ... done
[root@docker-1 /docker-compose]# docker inspect nginx | grep -i "ipaddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "12.13.14.1",

现在已经切换lnmp网络了,如果以后新建容器组不指定网络使用lnmp,就无法和lnmp服务容器组通讯,这就是一个最简单的隔离,也可以使用yml直接新建网络,不用手动去创建的,改一下就好。

使用新建网络

[root@docker-1 /docker-compose]# cat lnmp.yml 
version: '3'
services: 
  lnmp: 
    image: nginx
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    networks:
      - lnmp

  mysql: 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    ports: 
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?
    networks:
      - lnmp

  php: 
    image: php:7.2-fpm
    hostname: php
    container_name: php
    networks:
      - lnmp

networks:
  lnmp:
    driver: bridge
[root@docker-1 /docker-compose]# docker-compose -f lnmp.yml up -d
Creating network "docker-compose_lnmp" with driver "bridge"
Recreating nginx ... done
Recreating php   ... done
Recreating mysql ... done

使用driver参数指定网络类型,一般就是host&bridge&overlay等,我这里用的bridge,看一下有没有切换过来。

[root@docker-1 /docker-compose]# docker network inspect docker-compose_lnmp
                    "Subnet": "172.29.0.0/16",
                    "Gateway": "172.29.0.1"
[root@docker-1 /docker-compose]# docker inspect nginx | grep -i "ipaddress"
                    "IPAddress": "172.29.0.3",

切换过来了,对于网络命名这一块,大概说一下,一般情况下你不指定网络类型会这样。

[root@docker-1 ~]# pwd
/root
[root@docker-1 ~]# cat redis.yml 
version: '3'
services: 
  redis: 
    image: redis
    hostname: redis
    container_name: redis
    ports:
      - "6379:6379"
[root@docker-1 ~]# docker-compose -f redis.yml up -d
Creating network "root_default" with the default driver
Creating redis ... done

我在root家目录,启动了一个redis,他给我添加了一个名为root_default的网络,我移动到/tmp再试试

[root@docker-1 /tmp]# cat redis.yml 
version: '3'
services: 
  redis1: 
    image: redis
    hostname: redis
    container_name: redis1
    ports:
      - "6380:6379"
[root@docker-1 /tmp]# docker-compose -f redis.yml up -d
Creating network "tmp_default" with the default driver
Creating redis1 ... done

又给我添加了一个名为tmp_default的网络,也就是一个目录一个默认网络,而且网段也不一样,不同目录的容器组都自动隔离了,像刚刚我创建的redis&redis1就无法互通,除非其中一个指定网络切换就可以了,网络这里的话大概就是这样。

使用scale

这个东西的功能就相当于是复制容器,我先启动一个容器服务,接下来就可以根据这个容器服务去再启动多少个一模一样的东西出来,具体操作如下。

[root@docker-1 /docker-compose]# cat nginx.yml 
version: '3'
services: 
  nginx: 
    image: nginx
    hostname: nginx
[root@docker-1 /docker-compose]# docker-compose -f nginx.yml up -d
Creating docker-compose_nginx_1_148c468cbfe8 ... done

现在一个nginx服务创建完了,然后再复制出2份。

[root@docker-1 /docker-compose]# docker-compose -f nginx.yml scale nginx=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting docker-compose_nginx_1_35469025cb9f ... done
Creating docker-compose_nginx_2_b371af537b86 ... done
Creating docker-compose_nginx_3_58937cb04357 ... done
[root@docker-1 /docker-compose]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
cd4888c8f389        nginx               "nginx -g 'daemon of…"   15 seconds ago      Up 13 seconds       80/tcp              docker-compose_nginx_3_844aeb94c806
8ebb2a990a6e        nginx               "nginx -g 'daemon of…"   15 seconds ago      Up 13 seconds       80/tcp              docker-compose_nginx_2_9930e1634431
cfabcfb3726d        nginx               "nginx -g 'daemon of…"   39 seconds ago      Up 38 seconds       80/tcp              docker-compose_nginx_1_35469025cb9f

现在一共是三个了,有两个问题,第一个这样做不能指定容器名称,第二个就是不能映射容器端口了,这个很简单,结束。

实践

构建LNMP

现在结合上面所提到的东西,使用docker-compose去构建一个lnmp平台,这个比较简单,哈哈,还是直接拿我博客为例吧,现在也是跑在容器上的,但是之前做的时候是一个一个去启动的,这次用docker-compose去写一个lnmp的服务,说搞就搞,开撸。

添加网络

添加一个名为lnmp的网络,一会直接用这个。

[root@rj-bai ~]# docker network create --driver bridge --subnet 12.13.14.0/24 --gateway 12.13.14.254 lnmp
[root@rj-bai ~]# docker network inspect lnmp
            "Config": [
                {
                    "Subnet": "12.13.14.0/24",
                    "Gateway": "12.13.14.254"
                }
            ]

编写lnmp.yml

这个其实上面写的差不多了,改改就行了,镜像这块直接用我的私有仓库了,我用的阿里云容器镜像服务,我一些常用的镜像已经传上去了,我所使用镜像的构建方式看这里

[root@rj-bai ~]# mkdir /data/lnmp -p
[root@rj-bai ~]# cd /data/lnmp/
[root@rj-bai /data/lnmp]# cat lnmp.yml
version: '3'
services: 
  nginx: 
    image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:blogs-nginx-1.15.6
    hostname: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    depends_on: 
      - phpfpm
    links: 
      - phpfpm
    volumes: 
      - /www/nginx:/var/www/html
    restart: always
    networks:
      - lnmp

  mysql: 
    image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:blogs-mysql5.7
    hostname: mysql
    container_name: mysql
    environment: 
      MYSQL_ROOT_PASSWORD: Sowhat?
    volumes: 
      - /data/mysql:/var/lib/mysql
    restart: always
    networks:
      - lnmp

  phpfpm: 
    image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:blogs-php7.2
    hostname: phpfpm
    container_name: phpfpm
    depends_on:
      - mysql
    links:
      - mysql
    volumes:
      - /www/nginx:/var/www/html
    links: 
      - mysql
    restart: always
    networks:
      - lnmp

networks: 
  lnmp: 
    external:
      name: lnmp

内容就这样,启动

启动容器组

[root@rj-bai /data/lnmp]# docker-compose -f lnmp.yml up -d --build

执行后就开始自动构建了,构建完成后容器也就启动了,最终结果如下。

只要是写好yml文件,用docker-compose -d命令就能像执行脚本一样去安装部署容器,总之要做的一切都写到yml文件里了,比起手动docker run方便了太多。

构建zabbix

之前还写过一个容器跑zabbix的,也就是这个,之前都是一个个手动启的,现在用docker-compose去启动试试,也是在私有仓库直接pull的镜像,随便写了一下,大概这样。

编译zabbix.yml

[root@docker-1 /docker-compose]# cat zabbix.yml 
version: '3'
services: 
  mysql: 
    image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:mysql-5.7-aliyun
    environment: 
      MYSQL_USER: zabbix
      MYSQL_DATABASE: zabbix
      MYSQL_PASSWORD: zabbix
      MYSQL_ROOT_PASSWORD: Sowhat?
    volumes: 
      - /data/mysql/zabbix:/var/lib/mysql
    ports:
      - 3306:3306
    restart: always
    networks: 
      - zabbix
  
  zabbix-java-gateway:
    image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:zabbix-java-gateway-aliyun
    ports: 
      - 10052:10052
    restart: always
    networks: 
      - zabbix

  zabbix-server: 
    image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:zabbix-server-aliyun
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      MYSQL_ROOT_PASSWORD: Sowhat?
    links: 
      - mysql
    ports: 
      - 10051:10051
    depends_on: 
      - mysql
    restart: always
    networks: 
      - zabbix

  zabbix-web: 
    image: registry.cn-beijing.aliyuncs.com/rj-bai/rj-bai:zabbix-web-aliyun 
    environment:
      PHP_TZ: Asia/Shanghai
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      MYSQL_ROOT_PASSWORD: Sowhat?
    links:
      - mysql   
    ports: 
      - 80:80
    depends_on: 
      - zabbix-server
      - mysql
    restart: always
    networks: 
      - zabbix

networks: 
  zabbix:
    driver: bridge

内容就这样,启动

[root@docker-1 /docker-compose]# docker-compose -f zabbix.yml up -d --build
[root@docker-1 /docker-compose]# docker-compose -f zabbix.yml ps

web页面

随便加了个监控主机,有数据

大概就这样,溜了。

最后编辑于: 2019 年 01 月 02 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码