概述

在本地开发机上使用docker的同学你肯定有这样的烦恼,搞了一堆命令来启动docker,错了一个字母就需要重来,非常的不方便,让人抓狂,解决这种烦恼使用docker-compose就可以迎刃而解了。

声明式与命令式

在说docker-compose之前,一定要介绍一个提前的知识,方便更好的理解和使用docker-compose,以及后面可能使用的Kubernetes,Kubernetes就是使用声明式的yaml语言对pod进行管理和通信。

Docker 命令和 Dockerfile 就属于命令式,它的特点是交互性强,注重顺序和过程,你必须告诉计算机每步该做什么,所有的步骤都列清楚,这样程序才能够一步步走下去,最后完成任务。

命令式完全相反,不关心具体的过程,更注重结果。我们不需要教计算机该怎么做,只要告诉它一个目标状态,它自己就会想办法去完成任务,相比起来自动化、智能化程度更高。

YAML 是 JSON 的超集,支持整数、浮点数、布尔、字符串、数组和对象等数据类型。也就是说,任何合法的 JSON 文档也都是 YAML 文档,如果你了解 JSON,那么学习 YAML 会容易很多。

好了关于docker-compose文件的声明式与命令式就说这么多。

docker-compose文件编写

使用2个镜像,alpine:1.0 是作为挂载映射磁盘文件盘使用,nginx:proxy_v2.0 是我提前编译安装好的nginx+php-fpm的镜像。

$ docker images
REPOSITORY       TAG               IMAGE ID       CREATED         SIZE
nginx            proxy_v2.0        7a60e18d4d3d   21 hours ago    3.4GB
alpine           1.0               a24bb4013296   2 years ago     5.57MB

www容器的作用是映射文件的作用,ports配置端口,volumes映射虚拟机到本地的文件,command是需要执行的命令。

  • image : 需要镜像的名字,优先使用本地,本地不存在,去dockerHub仓库远程获取。
  • container_name : 容器名称,启动后的容器名称,和docker run --name xxx作用是一样的。
  • restart : 设置 always ,这样开机启动,失败也会一直重启。
  • privileged:true : 是否使用对镜像使用root权限操作。
  • user: 操作用户。
  • depends_on:www启动之后再启动,这个镜像。
  • ports : 设置宿主机和docker实例中的端口映射。
  • volumes : 设置宿主机数据卷和docker实例数据卷的映射。
  • command : 启动后执行的命令。

注意:
1.需要放在一个单独的文件夹下,文件名 .yaml 或者 yml
2.所有的操作命令都是在这个文件夹下操作

version: '3'
services:
  www:
    image: alpine:1.0  #镜像
    container_name: www  #定义容器名称
    restart: always  #开机启动,失败也会一直重启
    privileged: true
    user: root
    volumes:
      - /Users/stark/server/K8s/Code/www:/home/work/www
  gzcpserver:
    image: nginx:proxy_v2.0
    container_name: web
    restart: always
    privileged: true
    user: root
    depends_on:
      - www #www启动之后再启动
    ports:
      - 80:80
      - 443:443 
      - 11211:11211
      - 6379:6379 
      - 27017:27017 
      - 8100:8100 
      - 8101:8101
    volumes:
      - /Users/stark/server/K8s/Code/www/cpserver/conf/:/usr/local/nginx/conf/servers
      - /Users/stark/server/K8s/Code/www/:/home/work/www/
    command: /bin/sh /usr/local/src/run.sh

docker-compose 启动和停止

#启动命令
$ docker-compose up -d 
Starting www ... done
Starting web ... done
#停止命令
$ docker-compose stop
Stopping web ... done
Stopping www ... done

至此

启动过程中遇到了一个,docker-compose编排容器踩坑之容器一直处于Restarting状态的问题。

解决办法: 是因为指定路径下的权限或者是目录不存在都会产生docker 启动状态一直在 restarting状态,使用 docker logs web检查错误日志,都会清楚的打印出来。

$ docker logs web
nginx: [emerg] open() "/usr/local/nginx/conf/nginx.conf" failed (2: No such file or directory)