您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
docker-compose一键构建(非直接使用docker官方hub中的php、mysql、nginx镜像而是自己拆分Dockerfile)lnmp
发布时间:2023-07-11 14:22:04编辑:雪饮阅读()
-
构建背景
基于上篇
docker一键构建lnmp(非docker-compose) (gaojiupan.cn)
这次主要是实现以docker-compose的方式进行构建。
并且不是直接依赖docker官方的nginx、php、mysql进行构建的。
而是之前的DockerFile进行拆分各自的Dockerfile的。
Dockerfile及启动脚本拆分与相关文件改动
php那我就拆分为
Dockerfile_php7433
那么启动脚本也就对应拆分如
start_services_php7433.sh
由于php和nginx分离,而这里暂时没有使用挂载卷的形式,所以php容器中也要建立和nginx中相同的web根目录路径,及站点内相关的文件也拷贝(其实可以使用卷的方式,这里暂时就先不使用卷了)
否则nginx中向php-fpm发过来的文件路径会在php这边因为找不到对应路径而出错。
那么到时候和mysql拆分的Dockerfile以及相关文件里面也要考虑到这个问题,比如socket文件路径
nginx那我就拆分为
Dockerfile_nginx181
对应的启动脚本拆分为
start_services_nginx181.sh
由于使用docker-compose部署,所以nginx中连接php-fpm这里就目前来说不能使用默认的127.0.0.1,而是更换为docker-compose.yaml中php服务对应的service的名称了。
所以这里nginx.conf也是需要修改的。
由于php和nginx分离,而这里暂时没有使用挂载卷的形式,所以php容器中也要建立和nginx中相同的web根目录路径,及站点内相关的文件也拷贝过来
否则nginx中向php-fpm发过来的文件路径会在php这边因为找不到对应路径而出错。
mysql那我就拆分为
Dockerfile_mysql5733
对应启动脚本拆分为
start_services_mysql5733.sh
另外由于mysql中的my.cnf中bind-address只能绑定ip地址,不能绑定主机名,所以这里容器名(服务名)不能直接使用
并且mysql默认情况下不能直接跨容器(主机)连接,即便bind_address配置为0.0.0.0
所以my.cnf中mysqld配置段中这里除了bind_address配置为0.0.0.0,暂时也以最简单的方式也配置了skip-grant-tables
另外就是说阿里云的repo中gcc每次yum时候网络请求有点慢,对于gcc-4.8.5-44.el7.x86_64.rpm
我是单独优化为复制到容器内,然后如
yum install -y /lnmp/gcc-4.8.5-44.el7.x86_64.rpm
另外就是之前那个test2.php也就得修改下连接mysql的地址,不能用之前的localhost了。
原因同上面是一样的,就是因为在不同的容器里面了。
再这里比如就修改为mysql5733,这是这里我定义的mysql容器的服务名。
那么最后汇总的docker-compose.yml定义如:
version: '2.3'
services:
nginx181:
build:
context: .
dockerfile: Dockerfile_nginx181
ports:
- 80:80
depends_on:
- php7433
php7433:
build:
context: .
dockerfile: Dockerfile_php7433
depends_on:
- mysql5733
mysql5733:
build:
context: .
dockerfile: Dockerfile_mysql5733
相关附件会在末尾给出
Docker-compose部署
部署那就简单了,一个命令如
docker-compose up
这个命令就是运行在这里如test目录中的,默认没有指定目录就是在docker-compose.yaml所在目录的同级目录中,以这个所在目录为构建基础依赖的各种相对路径之类的咯。
本次折腾的一些收获(收获较多,可能记录的不够全):
清除系统镜像占用(慎用,清理的有点彻底了,最好先按顺序停止容器=》删除容器=》删除镜像)
docker system prune -a
这个有时候还能解决类似这样的问题:
ERROR: failed to solve: centos:7: failed to do request: Head "https://registry-1.docker.io/v2/library/centos/manifests/7": net/http: TLS handshake timeout (did you mean centos?)
这个错误通常是由网络连接问题引起的,导致 Docker 无法访问 Docker Hub 上的镜像仓库。
貌似可以直接这样
FROM docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
这样像是精确FROM某个镜像的某个详细版本了。
构建php7433
docker build -f Dockerfile_php7433 -t php7433 .
运行php7433(虽然映射了,但是宿主机未必能够访问到,内部相当于是bind到127.0.0.1而非0.0.0.0,除非手动修改,这里先不修改)
docker run -p 9000:9000 -d php7433
exec在后台运行时候进入某个容器
docker exec -it ce29ed4ef24d853bc6314ac4f4cb24a052bcace1fd9dc8238865a9e333a1ea4f /bin/bash
构建nginx181
docker build -f Dockerfile_nginx181 -t nginx181 .
运行nginx181
docker run -p 80:80 -d nginx181
安装docker-compose
yum install epel-release -y
yum install docker-compose -y
docker-compose版本信息
[root@localhost test]# docker-compose --version
docker-compose version 1.18.0, build 8dd22a9
docker-compose中的多个服务(容器/镜像)的运行方式
在 Docker Compose 中,docker-compose up 命令默认情况下会将每个服务以前台方式运行,并在终端中显示输出。这意味着如果您有多个服务(例如 Nginx 和 PHP),它们将会同时在终端中显示输出。
当服务同时输出时,终端可能会混合显示它们的日志和输出内容。这可能导致信息变得难以阅读和理解。
为了更好地控制多个服务的输出,您可以使用 docker-compose logs 命令查看指定服务的日志。例如,要查看 Nginx 服务的日志,可以运行 docker-compose logs nginx。这将只显示 Nginx 服务的日志输出。
另外,如果您希望将所有服务以后台模式运行,并在需要时手动查看日志,您可以使用 docker-compose up -d 命令将服务置于后台,并根据需要使用 docker-compose logs 查看特定服务的日志。
docker-compose.yaml中自定义网络的问题。。。
首先是定义一个自定义网络,主机名就直接叫nginx181_php7433
networks:
nginx181_php7433:
然后php7433和nginx181的service都引用
networks:
- nginx181_php7433
这样好像有坑,说是自定义网络时候一般需要手动指定如:
my_network:
driver: bridge
subnet: 172.18.0.0/16
gateway: 172.18.0.1
就是说子网掩码这些东西。
容器 DNS 配置:如果您使用的是默认的 Docker 网络模式,容器之间的 DNS 解析应该是自动进行的。但是,如果您使用了自定义网络,可能需要手动配置容器的 DNS 设置。可以尝试将容器的 DNS 设置为 Docker 守护进程使用的 DNS 服务器地址,通常是 127.0.0.11。
对于默认的 Docker 网络模式,容器之间可以使用主机名进行通信。但是,请注意,在默认模式下,每个容器都有自己的网络命名空间,因此容器的主机名并不是 127.0.0.1,而是容器自身的 IP 地址。
在默认模式下,Docker 分配给容器的 IP 地址是动态的,并且容器可以使用其 IP 地址或主机名进行通信。比如,如果您有两个容器 A 和 B,A 可以通过容器 B 的 IP 地址或主机名来与容器 B 进行通信,反之亦然。
需要注意的是,在自定义网络模式中,容器之间的主机名和 IP 地址取决于您在创建网络时指定的设置。如果您使用自定义网络,请确保在容器之间使用正确的主机名或 IP 地址来进行通信。
总结一下,对于默认模式的 Docker 网络,容器的主机名不是 127.0.0.1,而是容器自身的 IP 地址。对于自定义网络,请使用正确的主机名或 IP 地址进行容器间的通信。
相关附件
关键字词:docker,lnmp