Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
作为一个 PHP 开发者,Lnmp 环境往往是我们进行工作、学习的地方。本博文就是讲诉怎么使用 docker-compose 搭建一个开发环境。
现在大多 docker 桌面版环境中都预装了 docker-compose ,所以不需要单独安装了。若不确定可以在你的终端输入 docker-compose --version。 如提示没有该命令,请自行安装。
本文实例环境中安装了PHP、mariadb、nginx、redis、composer、swoole等。
其实建议大家把 Lnmp 环境统一到一个目录下,这样将来你需要移植到其他设备会方便一些。博主的目录树大致为下图所示,具体的目录含义大家结合名称大致是能明白的。
php dockerfile
本文仅使用 7.3 作为例子,若你需要其他版本或多版本请自行添加。本例子中也预安装了一些PHP扩展,若你需要其他的请自行填加。
# 镜像版本
ARG VERSION=7.3
# 基础镜像
FROM php:${VERSION}-fpm
# 给镜像添加一些元数据(metadata) 可省略
LABEL maintainer="ucwords" version=${VERSION}
# 配置文件 直接替换容器中默认文件,下面 CMD 就不需要指定了。
COPY ../../config/php/php.ini /usr/local/etc/php/php.ini
COPY ../../config/php/www.conf /usr/local/etc/php-fpm.d/www.conf
# 预装扩展包
COPY ../../src/composer.phar /work/src/composer.phar
COPY ../../src/redis-5.1.0.tgz /work/src/redis-5.1.0.tgz
COPY ../../src/swoole-4.6.0.tgz /work/src/swoole-4.6.0.tgz
# 更新、安装、配置环境 可以适当增删,看你的需求。
# deb http:*** 这些是为了加快数据改了镜像。若你的网络访问国外镜像OK。可以去掉哦。
RUN echo '' > /etc/apt/sources.list \
&& echo \
deb http://mirrors.aliyun.com/debian/ buster main non-free contrib \
deb http://mirrors.aliyun.com/debian-security buster/updates main \
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib \
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib \
deb-src http://mirrors.aliyun.com/debian-security buster/updates main \
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib \
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib \
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib \
> /etc/apt/sources.list \
&& apt-get update \
&& apt-get remove -y libssl1.1 \
&& apt-get install -y \
wget zlib1g-dev libzip-dev htop vim less curl make gcc pkg-config inetutils-ping dnsutils git \
openssl libssl-dev libmemcached-dev zlib1g-dev zlib1g ca-certificates \
libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev libxpm-dev \
&& docker-php-ext-configure gd --with-gd --with-webp-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-xpm-dir --with-freetype-dir \
&& docker-php-ext-install zip pdo pdo_mysql mysqli opcache sockets bcmath gd \
# 更新pecl
&& pecl channel-update pecl.php.net \
# redis
&& pecl install /work/src/redis-5.1.0.tgz \
&& docker-php-ext-enable redis \
&& rm /work/src/redis-5.1.0.tgz \
# swoole
&& mkdir swoole \
&& tar -xzf /work/src/swoole-4.6.0.tgz -C swoole --strip-components=1 \
&& rm /work/src/swoole-4.6.0.tgz \
&& ( \
cd swoole \
&& phpize \
&& ./configure --enable-mysqlnd --enable-sockets --enable-openssl --enable-http2 \
&& make -j$(nproc) \
&& make install \
) \
&& docker-php-ext-enable swoole \
&& rm -r swoole \
# composer
&& chmod u+x /work/src/composer.phar \
&& mv /work/src/composer.phar /usr/local/bin/composer \
&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer \
# 收尾清理
&& apt-get clean \
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
&& ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
# 指定工作目录
WORKDIR /work
# 声明端口
EXPOSE 9000
# 启动 php-fpm
CMD ["php-fpm", "-R"]
Mariadb dockerfile
这里使用的是 mariadb 而非 mysql, 请注意甄别,最好把配置文件和数据外挂出来。
# 指定版本
ARG VERSION=10.5
# 镜像
FROM mariadb:${VERSION}
# 给镜像添加一些元数据(metadata) 可省略
LABEL maintainer="ucwords" version="1.19.0"
# root default password
ENV MARIADB_ROOT_PASSWORD 你的密码
# 声明端口
EXPOSE 3306
# run
CMD ["mysqld"]
Nginx dockerfile
# 指定版本
ARG VERSION=1.19.0
# 镜像
FROM nginx:${VERSION}
# 给镜像添加一些元数据(metadata) 可省略
LABEL maintainer="ucwords" version="1.19.0"
# 配置文件
COPY ../../config/nginx/nginx.conf /etc/nginx/nginx.conf
# 声明端口
EXPOSE 80 443
# run
CMD ["nginx", "-g", "daemon off;"]
redis dockerfile
最好把配置文件和数据外挂出来,若想深究 redis 的源码可以看这系列文章《Redis 系列文章导航》。
# 镜像版本
ARG VERSION=6.2.0
# 基础镜像
FROM redis:${VERSION}
# 给镜像添加一些元数据(metadata) 可省略
LABEL maintainer="ucwords" version=${VERSION}
# 配置文件
COPY ../../config/redis/redis.conf /etc/redis/redis.conf
# 声明端口
EXPOSE 6379
# 在docker run 时运行, 为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD ["/usr/local/bin/redis-server", "/etc/redis/redis.conf"]
把上面的所有容器放到一个桥接的网路环境中(networks 部分指定),方便可以直接使用容器名称就可以进行通信。
version: '3'
services:
nginx:
build:
context: .
dockerfile: dockerfile/nginx/Dockerfile
image: nginx:1.19.0
restart: always
container_name: lnmp_nginx
volumes:
- ./config/nginx/vhosts:/etc/nginx/conf.d:rw
- ./work:/work:rw
networks:
- lnmp
depends_on:
- fpm_73
- mariadb
ports:
- "80:80"
- "443:443"
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
tty: true
#mem_limit: 512m #内存限制
fpm_73:
build:
context: .
dockerfile: dockerfile/php/Dockerfile_7.3
image: php:7.3-fpm
restart: always
container_name: lnmp_fpm_73
volumes:
- ./work:/work:rw
networks:
- lnmp
ports:
- "9500:9500"
- "9501:9501"
tty: true
#mem_limit: 512m #内存限制
redis:
build:
context: .
dockerfile: dockerfile/redis/Dockerfile
image: redis:6.2.0
restart: always
container_name: lnmp_redis
ports:
- "6379:6379"
volumes:
- ./data/redis:/data:rw
environment:
# 设置环境变量 时区上海 编码UTF-8
TZ: Asia/Shanghai
LANG: en_US.UTF-8
networks:
- lnmp
tty: true
#mem_limit: 512m #内存限制
mariadb:
build:
context: .
dockerfile: dockerfile/mysql/Dockerfile
image: mariadb:10.5
restart: always
container_name: lnmp_mariadb
volumes:
- ./data/mysql:/var/lib/mysql:rw
networks:
- lnmp
ports:
- "3306:3306"
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
tty: true
#mem_limit: 512m #内存限制
networks:
lnmp:
driver: bridge
请先按照文章的目录树、docker-file、YML 文件进行编写,也可以直接下载本文实例中的资源(点我)。
然后在和 docker-compose.yml 同级的目录下执行 docker-compose up -d ,等待安装完成,你就可以拥有一个开箱即用的环境了。
本文以图文、代码等角度进行了 Lnmp 环境的一键搭建教程的讲解,该环境有着很大的扩展性。该示例中请注意几个点。