如果你换了新电脑或者买了台新服务器,想搭建自己的开发环境,比如说你想快速建站想搭建个LNMP开发环境,那你就要分别安装php,nginx,mysql,甚至还需要安装redis,memcache,mq等。
想想就很头疼是不是,这些环境幸运的话也要几个小时安装时间,不幸的话可能要捣鼓一天。
说到搭建环境大家肯定会想到Docker:build once,run anywhere。
但这只对单个应用有效啊,我还是要pull很多的镜像运行。
有没有可以将这些镜像一起下载下来安装的东西呢?
当然有,Docker-Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
也就是说你只需要有一个docker-compose.yml文件就够了。
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。
在Compose 中有两个重要的概念:
服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
一个项目可以由多个服务(容器)关联形成,Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose 项目调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
包括Windows,Mac和Linux都可以。
举个栗子,我们来看一下compose的常用写法:
模板文件:
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。
如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。
docker-compose.yml文档的常见语法:
常见命令:
build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
command
覆盖容器启动后默认执行的命令。
container_name
指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
devices
指定设备映射关系。
volumes
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。
depends_on
解决容器的依赖、启动先后的问题。比如web服务需要先启动 redis db 再启动 web
dns
自定义 DNS 服务器。可以是一个值,也可以是一个列表。
image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
labels
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
ports
暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
environment
设置环境变量。
Links
用于连接两个容器。格式:link <name or id>:alias。其中,name和id是源容器的name和id,alias是源容器在link下的别名。
有了这些命令之后,我们就可以来写一个简单的LNMP的docker-copose.yml文件了。
# web server
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
# app
- ./app/src:/usr/share/nginx/html
# nginx configs
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d/:/etc/nginx/conf.d/:ro
# certificates
- ./nginx/ca/server.crt/:/etc/nginx/server.crt:ro
- ./nginx/ca/server.key/:/etc/nginx/server.key:ro
links:
- fpm:__DOCKER_PHP_FPM__
# 这里的fmp用的是dockerfile文件进行build的
# php-fpm
fpm:
build: ./php-fpm
ports:
- "9000"
volumes:
- ./app/src:/usr/share/nginx/html
# Your php.ini
- ./php-fpm/php.ini-production:/usr/local/etc/php/php.ini:ro
links:
- mysql:mysql
# database
mysql:
image: mysql:latest
ports:
# Allow client to access 3306
- "3306:3306"
volumes:
# NOTE: your data will be stored in ./mysql
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=your_mysql_password
这样通过上面的文件我们的LNMP的搭建环境就写好了,当然要配合需要的dockerfile文件。
然后运行命令docker-compose up -d ,即可完成环境的搭建。
完整的代码可以参考github上的LNMP的项目。