百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Docker Compose安装使用,及搭建nginx+php+mysql基础应用实例

mhr18 2024-11-30 12:48 25 浏览 0 评论

当在容器搭建多个实例时,如果用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后单独安装。

相关官方文档查看: https://docs.docker.com/compose/

在github地址查看版本安装:https://github.com/docker/compose/releases

目前为止(2021年8月)最新为1.29.2,安装此版本。(现在最新为2.0版本)

下载

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.php 127.0.0.1/conn.php 地址连接测试,成功如下图所示:

配置成功完成!!!

相关推荐

Spring Boot 分布式事务实现简单得超乎想象

环境:SpringBoot2.7.18+Atomikos4.x+MySQL5.71.简介关于什么是分布式事务,本文不做介绍。有需要了解的自行查找相关的资料。本篇文章将基于SpringBoot...

Qt编写可视化大屏电子看板系统15-曲线面积图

##一、前言曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观...

Doris大数据AI可视化管理工具SelectDB Studio重磅发布!

一、初识SelectDBStudioSelectDBStudio是专为ApacheDoris湖仓一体典型场景实战及其兼容数据库量身打造的GUI工具,简化数据开发与管理。二、Select...

RAD Studio 、Delphi或C++Builder设计代码编译上线缩短开发时间

#春日生活打卡季#本月,Embarcadero宣布RADStudio12.3Athens以及Delphi12.3和C++Builder12.3,提供下载。RADStudio12.3A...

Mybatis Plus框架学习指南-第三节内容

自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理自动填充功能通过实现com.baomidou.myba...

「数据库」Sysbench 数据库压力测试工具

sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以...

如何选择适合公司的ERP(选erp系统的经验之谈)

很多中小公司想搞ERP,但不得要领。上ERP的目的都是歪的,如提高效率,减少人员,堵住财务漏洞等等。真正用ERP的目的是借机提升企业管理能力,找出管理上的问题并解决,使企业管理更规范以及标准化。上ER...

Manus放开注册,但Flowith才是Agent领域真正的yyds

大家好,我是运营黑客。前天,AIAgent领域的当红炸子鸡—Manus宣布全面放开注册,终于,不需要邀请码就能体验了。于是,赶紧找了个小号去确认一下。然后,额……就被墙在了外面。官方解释:中文版...

歌浓酒庄总酿酒师:我们有最好的葡萄园和最棒的酿酒师

中新网1月23日电1月18日,张裕董事长周洪江及总经理孙健一行在澳大利亚阿德莱德,完成了歌浓酒庄股权交割签约仪式,这也意味着张裕全球布局基本成型。歌浓:澳大利亚年度最佳酒庄据悉,此次张裕收购的...

软件测试进阶之自动化测试——python+appium实例

扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...

为什么说Python是最伟大的语言?看图就知道了

来源:麦叔编程作者:麦叔测试一下你的分析能力,直接上图,自己判断一下为什么Python是最好的语言?1.有图有真相Java之父-JamesGoshlingC++之父-BjarneStrou...

如何在Eclipse中配置Python开发环境?

Eclipse是著名的跨平台集成开发环境(IDE),最初主要用来Java语言开发。但是我们通过安装不同的插件Eclipse可以支持不同的计算机语言。比如说,我们可以通过安装PyDev插件,使Eclip...

联合国岗位上新啦(联合国的岗位)

联合国人权事务高级专员办事处PostingTitleIntern-HumanRightsDutyStationBANGKOKDeadlineOct7,2025CategoryandL...

一周安全漫谈丨工信部:拟定超1亿条一般数据泄露属后果严重情节

工信部:拟定超1亿条一般数据泄露属后果严重情节11月23日,工信部官网公布《工业和信息化领域数据安全行政处罚裁量指引(试行)(征求意见稿)》。《裁量指引》征求意见稿明确了行政处罚由违法行为发生地管辖、...

oracle列转行以及C#执行语句时报错问题

oracle列转行的关键字:UNPIVOT,经常查到的怎么样转一列,多列怎么转呢,直接上代码(sshwomeyourcode):SELECTsee_no,diag_no,diag_code,...

取消回复欢迎 发表评论: