概述
在本地开发机上使用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)