• 首页
  • Docker
  • Docker Compose 事半功倍,容器部署更方便简洁

Docker Compose 事半功倍,容器部署更方便简洁


文章目录



Docker Compose是什么

Docker Compose 是一个工具,这个工具可以通过一个 yml 文件定义多容器的 Docker 应用.
通过一条命令就可以根据 yml 文件的定义去创建或者管理多个容器.


什么是yml文件

YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,
YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互.


如何定义yml文件

新建 docker-compose.yml 文件

version: '3.7'
services:
  mongodb:
    container_name: mongodb
    image: mongo
    ports:
      - 27037:27037
    volumes:
      - /Users/zhangzhi/mongodb:/data/db
      - /Users/zhangzhi/docker/mongodb/mongo.conf:/data/configdb/mongo.conf
    networks:
      - mynet
    command: mongod -f /data/configdb/mongo.conf
  redis:
    container_name: redis
    image: redis
    ports:
      - 6379:6379
    volumes:
      - /Users/zhangzhi/docker/redis/redis01/conf/redis.conf:/etc/redis/redis.conf
      - /Users/zhangzhi/docker/redis/redis01/data:/data
    networks:
      - mynet
    command: redis-server /etc/redis/redis.conf --appendonly yes
  lingpaoapi:
    build: . #构建容器 dockerfile所在目录
    container_name: lingpaoapi
    image: lingpao-server:1.0
    depends_on:
      - mongodb
      - redis
    working_dir: /usr/src/app
    volumes:
      - /Users/zhangzhi/code/lingpao/lingpao-server:/usr/src/app
    ports: 
      - 7000:7000
    environment: 
      - NODE_ENV=production
    networks:
      - mynet
    links: 
      - "mongodb"
      - "redis"
    command: npm start
networks:
  mynet:
    driver: bridge

注意:
yml 格式有严格的格式要求,不能使用 tab键,必须空格打头,每一个层级必须对齐,前面可以2个空格,或者4个空格.
上面的文件内容拷贝后不一定符合格式要求,
因为页面经过markdown编辑器渲染,还有css 的控制,拷贝后要自己检查语法格式!


docker compose文件详解

yaml文件第一层节点:

  • version: 用于指定当前docker-compose.yml语法遵循哪个版本
  • services:服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、镜像、挂载的映射、所属网络、依赖哪些服务等等。
  • networks:应用的网络,在它下面可以定义应用的名字、使用的网络类型等,可以给docker服务指定网络

version

用于指定当前compose文件语法遵循哪个版本,
下面这张表是不同的Compose文件版本兼容的Docker版本,
根据你使用的docker 软件版本选择对应版本的 compose 文件版本


services

  • container_name 该容器定义的别名
  • image 镜像名称,如果本地不存在,会从线上pull 一个下来,注意 如果本地项目,自己制作的镜像,镜像名称后面加版本号,否则可能会去线上拉取
  • build 指定Dockerfile文件的路径,compose会通过Dockerfile构建并生成镜像,然后使用该镜像
  • ports 暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到宿主机上的端口随机
  • depends_on 当前服务启动时,依赖的服务,当前服务会在依赖的服务启动后启动
  • working_dir 服务这容器中的工作目录 (涉及到代码部署,一般回用到此项)
  • environment 服务启动时对应的环境变量
  • networks 给服务指定一个网络 ,一版多个容器互相连接时,需要设置相同网络,当网络定义相同,容器相当于这一个局域网工作
  • links 链接其他容器,可以指定服务名称或者链接的别名, - db:database db是容器服务名称,database就是别名
  • volumes 指定映射关系 格式是: <宿主机目录或者文件 : 容器中的目录或者文件>

networks

网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认网络,创建的服务也会默认的使用这个默认网络.
可以自己创建网络,并将服务加入到这个网络之中, 这样可以使用服务的名字进行通信,服务之间可以相互通信,而外界不能够与这个网络中的服务通信,可以保持隔离性.

networks:
  mynet:
    driver: bridge

上面定义的 networks 是yml文件一部分,我们定义了名称为 mynet ,类型为 brideg 的网络,同时让 mongodb,redis和node服务同时加入了这个网络.


docker compose 指令使用

build       构建或重建服务
help        命令帮助
kill           杀掉容器
logs        显示容器的输出内容
port        打印绑定的开放端口
ps          显示容器
pull        拉取服务镜像
restart    重启服务
rm          删除停止的容器
run         运行一个一次性命令
scale      设置服务的容器数目
start       开启服务
stop       停止服务
up          创建并启动容器

启动服务

在docker-compose.yml 文件目录下执行:

docker-compose up -d

-d 参数:后台静默执行

# zhangzhi @ ZhangZhi-MacBook-Pro in ~/code/lingpao/lingpao-server on git:master x [11:36:48] 
$ docker-compose up -d
Creating network "lingpao-server_mynet" with driver "bridge"
Creating redis   ... done
Creating mongodb ... done
Creating lingpaoapi ... done

服务启动后,首先创建自定义网络 mynet
然后根据服务依赖关系,node 服务依赖 redis 和 mongodb
所以首先启动 redis 容器
接着启动 mongodb 容器
最后启动 node 容器


可以看到 docker-compose 启动了3个容器
node 服务正常启动,可以访问 localhost:7000 来查看

因为node是 api服务器, localhost:7000 此路由下无接口内容返回,返回 not found,说明了服务正常启动

注意
容器相互关联依赖时,和我们上面定义的yml文件中 link 参数有关系;
比如 node 服务要连接 mongodb, redis 服务;
所以 services 下面 node 节点 link 关联了 mongodb,redis;
那么 node 项目代码中如何连接 mongodb 数据库呢?

上图配置文件中连接mongodb的字符串中 host 位置应该是mongodb所在服务器的ip地址,我们这里 mongodb 就是 link 中关联的 mongodb 服务容器,其实原理是这对应的容器 hosts 中做了指向,比如 mongodb 指向了 172.90.0.2 地址.

redis 服务同上,我们直接看配置文件:

同样host 地址部分被 link 参数中的 redis 来代替.

image.png

出自:Docker Compose 事半功倍,容器部署更方便简洁

回到顶部