Docker Compose安装使用,及搭建nginx+php+mysql基础应用实例
mhr18 2024-11-30 12:48 19 浏览 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 地址连接测试,成功如下图所示:
配置成功完成!!!
相关推荐
- 使用 Docker 部署 Java 项目(通俗易懂)
-
前言:搜索镜像的网站(推荐):DockerDocs1、下载与配置Docker1.1docker下载(这里使用的是Ubuntu,Centos命令可能有不同)以下命令,默认不是root用户操作,...
- Spring Boot 3.3.5 + CRaC:从冷启动到秒级响应的架构实践与踩坑实录
-
去年,我们团队负责的电商订单系统因扩容需求需在10分钟内启动200个Pod实例。当运维组按下扩容按钮时,传统SpringBoot应用的冷启动耗时(平均8.7秒)直接导致流量洪峰期出现30%的请求超时...
- 《github精选系列》——SpringBoot 全家桶
-
1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...
- Nacos简介—1.Nacos使用简介
-
大纲1.Nacos的在服务注册中心+配置中心中的应用2.Nacos2.x最新版本下载与目录结构3.Nacos2.x的数据库存储与日志存储4.Nacos2.x服务端的startup.sh启动脚...
- spring-ai ollama小试牛刀
-
序本文主要展示下spring-aiollama的使用示例pom.xml<dependency><groupId>org.springframework.ai<...
- SpringCloud系列——10Spring Cloud Gateway网关
-
学习目标Gateway是什么?它有什么作用?Gateway中的断言使用Gateway中的过滤器使用Gateway中的路由使用第1章网关1.1网关的概念简单来说,网关就是一个网络连接到另外一个网络的...
- Spring Boot 自动装配原理剖析
-
前言在这瞬息万变的技术领域,比了解技术的使用方法更重要的是了解其原理及应用背景。以往我们使用SpringMVC来构建一个项目需要很多基础操作:添加很多jar,配置web.xml,配置Spr...
- 疯了!Spring 再官宣惊天大漏洞
-
Spring官宣高危漏洞大家好,我是栈长。前几天爆出来的Spring漏洞,刚修复完又来?今天愚人节来了,这是和大家开玩笑吗?不是的,我也是猝不及防!这个玩笑也开的太大了!!你之前看到的这个漏洞已...
- 「架构师必备」基于SpringCloud的SaaS型微服务脚手架
-
简介基于SpringCloud(Hoxton.SR1)+SpringBoot(2.2.4.RELEASE)的SaaS型微服务脚手架,具备用户管理、资源权限管理、网关统一鉴权、Xss防跨站攻击、...
- SpringCloud分布式框架&分布式事务&分布式锁
-
总结本文承接上一篇SpringCloud分布式框架实践之后,进一步实践分布式事务与分布式锁,其中分布式事务主要是基于Seata的AT模式进行强一致性,基于RocketMQ事务消息进行最终一致性,分布式...
- SpringBoot全家桶:23篇博客加23个可运行项目让你对它了如指掌
-
SpringBoot现在已经成为Java开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通...
- 开发好物推荐12之分布式锁redisson-sb
-
前言springboot开发现在基本都是分布式环境,分布式环境下分布式锁的使用必不可少,主流分布式锁主要包括数据库锁,redis锁,还有zookepper实现的分布式锁,其中最实用的还是Redis分...
- 拥抱Kubernetes,再见了Spring Cloud
-
相信很多开发者在熟悉微服务工作后,才发现:以为用SpringCloud已经成功打造了微服务架构帝国,殊不知引入了k8s后,却和CloudNative的生态发展脱轨。从2013年的...
- Zabbix/J监控框架和Spring框架的整合方法
-
Zabbix/J是一个Java版本的系统监控框架,它可以完美地兼容于Zabbix监控系统,使得开发、运维等技术人员能够对整个业务系统的基础设施、应用软件/中间件和业务逻辑进行全方位的分层监控。Spri...
- SpringBoot+JWT+Shiro+Mybatis实现Restful快速开发后端脚手架
-
作者:lywJee来源:cnblogs.com/lywJ/p/11252064.html一、背景前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础。SpringBoot使编码配置...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)