docker compose部署nginx+php+mysql+phpmyadmin环境(LNMP环境)

docker compose 介绍与安装

docker-compose优点

已经有笔记记录了如何用docker搭建LNMP环境:DOCKER部署NGINX,PHP环境(步骤+注解),那为什么还要使用docker-compose呢?
考虑一个场景,我们搭建好了LNMPdocker环境,并且挂载/端口/网络都设置好了,但是在运行中我们发现有些容器配置需要改变,那我们只能docker stop container + docker rm container来删除此容器,然后用新的配置docker run。整个过程十分复杂。
但是通过docker-compose工具,我们就可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用;更重要的是,如果我们希望修改容器配置,只需修改compose配置文件重新一键部署即可。

docker-compose安装

下载docker-compose二进制文件至本地

sudo curl -L "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

修改二进制文件的可执行权限并创建软链(软链不是必需)

sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试一下是否安装成功

docker-compose version

返回版本信息即表示成功了。

挂载目录准备

挂载目录和笔记DOCKER部署NGINX,PHP环境(步骤+注解)里一样,目录的准备方式也相同:先run一个辅助容器,把需要挂载的文件夹复制 到主机准备好的映射路径,然后删除辅助容器即可。
注:进入内部查询容器内部文件使用命令:

docker exec -it container_name/id bash

php-fpm

docker run -p your_port:9000 -d --name php.0 php:7.4-fpm
docker cp php.0:/usr/share/nginx/html/. your_web_page_path
docker cp php.0:/usr/local/etc/php/. your_php_config_path
docker stop php.0 && docker rm php.0

nginx

docker run --name nginx.0 -p 80:80 -p 443:443 -d nginx
docker cp nginx.0:/usr/share/nginx/html/. your_web_page_path
docker cp nginx.0:/etc/nginx/conf.d/. your_nginx_config_path
docker cp nginx.0:/var/log/nginx/. your_nginx_log_path
docker stop nginx.0 && docker rm nginx.0

mysql

docker run -itd --name mysql.0 -p your_port:3306 --restart unless-stopped -e MYSQL_ROOT_PASSWORD=yourpassword mysql
docker cp mysql.0:/var/log/mysql/. your_db_log_path
docker cp mysql.0:/var/lib/mysql/. your_db_data_path
docker cp mysql.0:/etc/mysql/. your_db_config_path
docker stop mysql.0 && docker rm mysql.0

phpmyadmin

docker run --name phpmyadmin.0 -d -e PMA_ARBITRARY=1 -e PMA_HOST=mysql_ip -e PMA_PORT=mysql_port -p your_port:80 phpmyadmin
docker cp phpmyadmin.0:/etc/phpmyadmin/. your_phpadmin_path
docker stop phpmyadmin.0 && docker rm phpmyadmin.0

具体命令含义及文件夹含义可见上面提到的笔记。
这样我们对于LNMP环境的端口和挂载文件路径都已经设定好了,下面就是编写compose文件并部署。

部署文件编写与部署

docker-compose.yml文件编写

我们需要一个文件夹来作为工作空间放置我们的配置文件,新建文件夹mkdir lnmp && cd lnmp并创建docker-compose.yml文件。
显然这是yaml格式的配置文件,对缩进标点比较敏感,一定要注意。
docker-compose.yml

# Creat containers for LNMP + phpmyadmin
version: '3'
services:
  php-fpm:
    image: php:7.4-fpm              # 镜像名
    container_name: php.1           #容器名
    restart: unless-stopped         #重启策略
    volumes:                        #挂载路径
      - your_web_page_path:/usr/share/nginx/html
      - your_php_config_path:/usr/local/etc/php/
    environment:                    #环境变量
      - TZ=Asia/Shanghai            #时区
    ports:
      - "your_port:9000"            #端口映射
    logging:                        #日志设置
      driver: json-file
      options:
        max-size: "200k"
        max-file: "5"

  nginx:
    image: nginx
    container_name: nginx.1
    restart: unless-stopped
    depends_on:                     #依赖关系,被依赖的服务先启动才会启动此服务
      - php-fpm
    volumes:
      - your_web_page_path:/usr/share/nginx/html
      - your_nginx_config_path:/etc/nginx/conf.d
      - your_nginx_log_path:/var/log/nginx
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
      - "443:443"
    logging:
      driver: json-file
      options:
        max-size: "200k"
        max-file: "5"

  mysql:
    image: mysql
    container_name: mysql.1
    restart: unless-stopped
    volumes:
      - your_db_config_path:/etc/mysql
      - your_db_data_path:/var/lib/mysql
      - your_db_log_path:/var/log/mysql
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=yourpassword
    ports:
      - "your_port:3306"
    logging:
      driver: json-file
      options:
        max-size: "200k"
        max-file: "5"

  phpmyadmin:
    image: phpmyadmin
    container_name: phpmyadmin.1
    restart: unless-stopped
    volumes:
      - your_phpadmin_path:/etc/phpmyadmin
    environment:
      - TZ=Asia/Shanghai
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql_ip
      - PMA_PORT=mysql_port
    ports:
      - "your_port:80"
    logging:
      driver: json-file
      options:
        max-size: "200k"
        max-file: "5"

compose字段简介

重启策略restart:有这么几种:

restart: no                     #是默认的重启策略,在任何情况下都不会重启容器。
            always              #容器总是重新启动。
            on-failure          #在容器非正常退出时(退出状态非0),才会重启容器。
            unless-stopped  #在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

compose部署及常用命令

部署命令很简单,在当前lnmp目录,运行

docker-compose up
#或者
docker-compose up -d

这样就运行成功了,上面四个容器都会被启动。
当我们需要修改配置时,就把compose down掉,修改docker-compose.yml文件,然后重启up起来就好

docker-compose down
docker-compose up -d
#或者
docker-compose up -d --force-recreate

LNMP环境配置及测试

nginx和php的配置就和上面提到的笔记一样,修改default.conf即可。mysql与phpmyadmin的测试方法如下:
mysql
进入mysql.1容器内部,尝试登录mysql即可

docker exec -it mysql.1 bash
#进入容器内部
mysql -u root -p
输入your_password
成功登陆mysql,并显示:
mysql>

phpmyadmin
浏览器登录your_ip:your_port
显示phpmyadmin的登录界面,并且能够登录mysql即可。

这样就大功告成啦。