如何用Docker-compose快速搭建开发环境——以LNMP为例

2022-10-09 12:46:42

如果你换了新电脑或者买了台新服务器,想搭建自己的开发环境,比如说你想快速建站想搭建个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的项目。

  • 作者:羁士
  • 原文链接:https://blog.csdn.net/dianxin113/article/details/114947795
    更新时间:2022-10-09 12:46:42