dockercompose安装使用,及搭建nginx+php+mysql基础应用实例(代码片段)

the丶only the丶only     2022-12-12     727

关键词:

当在容器搭建多个实例时,如果用run命令,需要很多遍,如搭建LNMP(nginx+php+mysql),这时可以考虑用Compose这个服务来搭建配置。

一、 Docker Compose简介:

Docker-Compose 是 Docker 的一种编排服务,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。compose、machine 和 swarm 是docker 原生提供的三大编排工具,又称docker三剑客。

通过 Docker-Compose 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。

Compose 中有两个重要的概念:

  • 服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

运用Docker-Compose前提还要知道Dockerfile的运用,可参考另一篇文章中有介绍:docker安装使用

二、 Docker Compose的安装使用:

1:安装

Docker Compose是独自产品,需要在安装docker后单独安装。相关官方文档查看:Compose
在github地址查看版本安装:Compose版本
目前为止最新为1.29.2,安装此版本。

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

#添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose

安装完成,查看版本

docker-compose --version


注意:如果安装完成后,docker-compose命令无法使用,请检查您的路径。您还可以/usr/bin在路径中创建一个软链接如下。

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

2:基本命令使用

docker-compose up //启动yml文件定义的 container
docker-compose up -d //后台运行
docker-compose up --help //查看up帮助
docker-compose -f docker-compose.yml up //-f 指定yml文件
docker-compose stop //停止
docker-compose start 
docker-compose ls  //查看
docker-compose down //停止删除
docker-compose ps
docker-compose images
docker-compose exec service_name bash

三、Compose搭建nginx+php+mysql实例

安装版本如下:
centos 8 ,docker 20.10.7,docker-compose 1.29.2,nginx 1.20.1,php 8,mysql 5.7.34

1:构建目录结构

镜像版本,默认选择标签Tag为latest 最新版本,别写错了,写错直接报错read: connection reset by peer

创建目录lnmp_compose,将相关配置文件放在此目录。
目录结构如下:

[root@localhost lnmp_compose]# tree
.
|-- docker-compose.yml
|-- mysql
|   `-- conf.d
|       `-- my.cnf
|-- nginx
|   |-- conf.d
|   |   `-- www.conf
|   `-- Dockerfile
|-- php
|   `-- Dockerfile
`-- www
    |-- conn.php
    `-- index.php

6 directories, 7 files

2:配置php的Dockerfile

因为php涉及到很多扩展库,所以我们需要用到Dockerfile配置扩展创建新的镜像。

vim /lnmp_compose/php/Dockerfile

输入以下内容,从centos镜像采用yum安装php8的版本。内容参考:yum方式安装php最新版

FROM centos
RUN groupadd -g 1002 www && useradd -u 1001 -g www -s /sbin/nologin www \\
        && yum -y install epel-release yum-utils \\
        && yum -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm \\
        && dnf -y module list php \\
        && dnf -y module enable php:remi-8.0 \\
        && dnf -y install php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mbstring php-curl php-xml php-pear php-bcmath php-json php-redis --skip-broken \\
        && sed -i 's/user = apache/user = www/g' /etc/php-fpm.d/www.conf \\
        && sed -i 's/group = apache/group = www/g' /etc/php-fpm.d/www.conf \\
        && sed -i 's/listen = \\/run\\/php-fpm\\/www.sock/listen = 0.0.0.0:9000/g' /etc/php-fpm.d/www.conf \\
        && sed -i 's/listen.allowed_clients = 127.0.0.1/;listen.allowed_clients/g' /etc/php-fpm.d/www.conf \\
        && mkdir /run/php-fpm

CMD ["php-fpm","--nodaemonize"]

Dockerfile相关参数解释,创建www用户及www用户组,安装php扩展包。

需注意的坑:

  1. 创建www用户和组,uid和gid需要和宿主机www用户一致,宿主机 id www 查看gid和uid。这里宿主机gid 1002,uid 1001。
  2. /etc/php-fpm.d/www.conf配置文件,默认监听listen = run/php-fpm/www.sock改为listen = 0.0.0.0:9000,网上很多写127.0.0.1:9000也行,但是可能版本原因,我亲测不行。
  3. /etc/php-fpm.d/www.conf配置文件,默认只允许本机IP,需要将listen.allowed_clients = 127.0.0.1改注释掉。
  4. 缺少/run/php-fpm文件夹,无法启动php-fpm,无法创建PID文件,在容器中php-fpm启动报错:ERROR: Unable to create the PID file (/run/php-fpm/php-fpm.pid).: No such file or directory (2)ERROR: FPM initialization failed,需自己创建mkdir /run/php-fpm

3:配置nginx的Dockerfile

由于也需要更改www用户,所以需要Dockerfile文件重建镜像。
有两种,可自行根据自己需求配置。
1:第一种,可以直接nginx官方镜像,默认最新版本,在里面更改配置文件。
同时更新apt-get,和安装vi,以便后续在容器中简单编辑配置文件。配置如下:

FROM nginx
RUN groupadd -g 1002 www && useradd -u 1001 -g www -s /sbin/nologin www \\
        && apt-get -y update && apt-get -y install vi \\
        && sed -i 's/user  nginx/user  www/g' /etc/nginx/nginx.conf

2:第二种,直接从centos镜像安装nginx指定版本,构建新的nginx镜像。
这种无需安装vi等命令,已具备基础的命令可操作行强一点。这里采用yum安装方式。配置如下:

FROM centos
RUN groupadd -g 1002 www && useradd -u 1001 -g www -s /sbin/nologin www \\
        && yum install -y yum-utils \\
    && echo -e "[nginx-stable] \\
    \\nname=nginx stable repo \\
    \\nbaseurl=http://nginx.org/packages/centos/\\$releasever/\\$basearch \\
    \\ngpgcheck=1 \\
    \\nenabled=1 \\
    \\ngpgkey=https://nginx.org/keys/nginx_signing.key \\
    \\nmodule_hotfixes=true \\
    \\n[nginx-mainline] \\
    \\nname=nginx mainline repo \\
    \\nbaseurl=http://nginx.org/packages/mainline/centos/\\$releasever/\\$basearch \\
    \\ngpgcheck=1 \\
    \\nenabled=0 \\
    \\ngpgkey=https://nginx.org/keys/nginx_signing.key \\
    \\nmodule_hotfixes=true" > /etc/yum.repos.d/nginx.repo \\
    && yum install -y nginx-1.20.1 \\
        && sed -i 's/user  nginx/user  www/g' /etc/nginx/nginx.conf

CMD ["nginx", "-g", "daemon off;"]

需注意的坑:

  1. 同php一样,www用户和组,uid和gid需要和宿主机www用户一致。
  2. 配置文件/etc/nginx/nginx.conf中替换用户时,user nginx中间是两个空格,不是一个。

4:配置nginx的www.conf文件

在宿主机,创建的nginx/conf.d中配置 www.conf 文件,内容如下:

server 
    listen       80;
    server_name  localhost;

    location / 
        root   /usr/share/nginx/html;
                index  index.html index.htm index.php;
    

    error_page   500 502 503 504  /50x.html;
    location = /50x.html 
        root   /usr/share/nginx/html;
    

    location ~ \\.php$ 
        root           /var/www/html;
        fastcgi_pass   php_compose:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
        include        fastcgi_params;
    

需注意的坑:

  1. 路径问题,location ~ \\.php$ 的root为php容器中的路径,location /中的root为nginx容器中的路径,不能像装在同一机器下配置一样的路径,因为现在动静分离,需要考虑到对应容器是否存在这个默认路径,否则报404错误。
  2. fastcgi_pass配置为 “容器名:端口” 方式。

5:配置yml文件

这里yml已命名为docker-compose.yml

vim docker-compose.yml

输入以下内容:

version: '3.8'
services:
    nginx:
      build: ./nginx
      container_name: nginx_compose
      ports:
        - "80:80"
        - "443:443"
      volumes:
        - "$PWD/nginx/conf.d:/etc/nginx/conf.d"
        - "$PWD/www:/usr/share/nginx/html"
      depends_on:
        - "php"
        - "mysql"
      networks:
        - lnmp
    php:
      build: ./php
      container_name: php_compose
      volumes:
        - "$PWD/www:/var/www/html"
      ports:
        - "9000:9000"
      networks:
        - lnmp

    mysql:
      image: mysql:5.7.34
      container_name: mysql_compose
      ports:
        - "3306:3306"
      volumes:
        - "$PWD/mysql/conf.d/my.cnf:/etc/mysql/conf.d/mysql.cnf"
      networks:
        - lnmp
      command: --character-set-server=utf8
      environment:
        MYSQL_ROOT_PASSWORD: 123456
        MYSQL_DATABASE: wordpress
        MYSQL_USER: lnmp
        MYSQL_PASSWORD: lnmp123

networks:
    lnmp:

相关参数说明:

  • version: ‘3’:指的docker-compose 的版本,有1,2,3版本,对应docker版本,可参考:https://docs.docker.com/compose/compose-file/compose-file-v3/
  • services:指的安装哪些服务,lnmp服务
  • container_name:容器的名字,docker ps -a 中的
  • image:引入镜像,若是本地没有,就去官网下载
  • networks:自定义网络,默认是桥接模式,可以用docker images ls 看
  • volumes:相当于bind这样的数据卷挂载,可以使用绝对或者相对路径
  • build:通过Dockerfile构建镜像
  • ports: 开放端口,比如3306:3306 ,那这样宿主机也可以连接管理
  • depends_on:依赖启动,先启动php,mysql,再启动nginx
  • environment :mysql参数设置,这里例子为,设置root密码,创建wordpress数据库,创建user用户及密码。

6:创建测试网页

在www创建index.php页面,测试php和nginx是否连接成功:

vim www/index.php

内容:

<?php
        phpinfo();
?>

创建conn.php页面,测试php和mysql是否连接成功:

vim www/conn.php

内容:

<?php
$servername = "mysql_compose";
$username = "lnmp";
$password = "lnmp123";
try 
    $conn = new PDO("mysql:host=$servername;", $username, $password);
    echo "连接mysql成功";

catch(PDOException $e)

    echo $e->getMessage();

?>

7:启动docker-compose并测试

后台启动:

docker-compose up -d

查看状态为up成功:

docker-compose ps


打开浏览器分别输入自己的服务器地址如:127.0.0.1/index.php127.0.0.1/conn.php 地址连接测试,成功如下图所示:


配置成功完成!!!

dockercompose一键搭建lnmp开发环境

参考技术Adockercompose是用来配置和运行多容器服务的工具(适用于单机,集群请使用k8s),通过docker-compose命令可轻松对多个容器进行如下操作:安装dockercompose,官方文档:https://docs.docker.com/compose/install/执行dockercompose准备步骤dockerco... 查看详情

dockercompose编排(写法格式及实验)(代码片段)

目录一、DockerCompose前言二、Dockercompose的文件结构1、dockercompose配置常用字段2、dockercompose常用命令三、使用compose编排1、使用compose编排安装运行tomcat容器2、使用compose编排创建容器(以tomcat为例)一、DockerCompose前言DockerCo... 查看详情

二用dockercompose搭建kafka集群

...现。在另一篇两种方式搭建Zookeeper伪集群:纯手工或使用Dockercompose里,尝试了如何用dockercompose来搭建一个zookeeper集群。在此基础上,我们用dockercompose搭建一个kafka集群。 查看详情

企业——dockercompose的搭建

...和运行多容器的应用,可以一条命令启动多个容器,使用DockerCompose不再需要使用shell脚本来启动容器。   Compose通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚... 查看详情

010.dockercompose构建wordpress实战(代码片段)

...MySQL数据库5.7Docker已安装,参考《002.Docker版本及安装》。DockerCompose已安装,参考《009.DockerCompose基础使用》。二 正式构建2.1 创建目录1[email protected]:~#mkdirmy_wordpress2[email protect 查看详情

docker|第七章:dockercompose服务编排介绍及使用(代码片段)

前言前面章节,我们学习了如何构建自己的镜像文件,如何保存自己的镜像文件。大多都是一个镜像启动。当一个系统需要多个子系统进行配合时,若每个子系统也就是镜像需要一个个手动启动和停止的话,那估计实施人员也会... 查看详情

使用docker-compose搭建consul集群环境!!!(代码片段)

...mpose搭建consul集群环境一.Composeconsul的概述1.什么是Compose2.DockerCompose容器编排3.DockerCompose配置常用字段字段描述4.DockerCompose常用命令二.Consul的概述1.什么是consul2.Consul的特性3.Consul容器服务更新与发现三.Compose的部署1.服务器准备2.... 查看详情

使用docker-compose搭建consul集群环境!!!(代码片段)

...mpose搭建consul集群环境一.Composeconsul的概述1.什么是Compose2.DockerCompose容器编排3.DockerCompose配置常用字段字段描述4.DockerCompose常用命令二.Consul的概述1.什么是consul2.Consul的特性3.Consul容器服务更新与发现三.Compose的部署1.服务器准备2.... 查看详情

centos7系统安装docker及dockercompose组件(代码片段)

1 概述本章将详细介绍在CentOS7.0系统下如何安装docker,分为在线安装和离线安装两部分。目前,CentOS仅发行版本中的内核支持Docker。推荐使用CentOS7.0及以上版本,64位操作系统、系统内核版本为3.10以上。2 在线安装Docker1)... 查看详情

docke及dockercompose于微服务的实践

DockerCompose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用DockerCompose不再需要使用shell脚本来启动容器。?Compose通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容... 查看详情

docker------dockercompose编排(代码片段)

目录前言一.Docker-compose简介二.Compose部署1.DockerCompose环境安装2.YAML文件格式及编写注意事项3.DockerCompose配置常用字段4.DockerCompose常用命令5.DockerCompose文件结构三.使用Compose编排创建Nginx容器1.准备依赖文件2.编写配置文件docker-compose... 查看详情

docker------dockercompose编排(代码片段)

目录前言一.Docker-compose简介二.Compose部署1.DockerCompose环境安装2.YAML文件格式及编写注意事项3.DockerCompose配置常用字段4.DockerCompose常用命令5.DockerCompose文件结构三.使用Compose编排创建Nginx容器1.准备依赖文件2.编写配置文件docker-compose... 查看详情

构建dockercompose服务堆栈(代码片段)

1.安装了docker-compose,现在我们要使用docker-compose来运行容器栈。这个地方会有两个容器,一个容器中使用Flask搭建的简单应用,另一个容器是Redis,Flash会向redis写入数据。因此设计到容器之间的通信。之前我们讲到了,容器之间... 查看详情

dockercompose安装使用教程(代码片段)

DockerCompose一、安装DockerCompose#Compose目前已经完全支持Linux、MacOS和Windows,在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。curl-Lhttps://github.com/docker/compose/releases/download/1.22.0/d 查看详情

graylog环境搭建及使用

...业版;2、开源版下面使用开源版本搭建日志中心,graylog安装方式有很多,开发、测试环境可以使用docker方式安装,快捷方便。在安装graylog前,需要先将docker环境配置起来。1、安装docker2、配置docker镜像加速,镜像加速的。使用... 查看详情

java环境搭建及eclipse的安装与使用

JAVA实验环境的搭建1.下载安装JDK,若想要调用速度快点,可以安装到C盘,安装文件夹要用英文命名。2.搭建JAVA_HOME,,环境变量地址写为本地文件夹(既安装JDK时候的文件夹)。3.搭建ClassPath,,环境变量地址是本地JDK文件夹中lib文件... 查看详情

01rf环境搭建及简介

目录[TOC]一、RF安装1.1Ride安装安装Python2.7,配置好环境变量安装wxPython2.8.12.1(目前只有这个版本是官方支持的),一键式安装安装ride,下载安装包后,解压后使用pythonsetup.pyinstall安装安装RF,下载安装包后,解压使用pythonsetup.pyi... 查看详情

milvus向量数据库搭建及可视化(代码片段)

正文官方文档https://milvus.io/docs/install_standalone-docker.md安装dockercompose2.10.0sudocurl-L“https://github.com/docker/compose/releases/download/v2.10.0/docker-compose-(uname−s)−(uname-s)-(uname−s)−(uname 查看详情