接上一篇

docker-compose 学习:通过 image 指令指定镜像搭建一个简单LNMP

https://blog.csdn.net/u010953609/article/details/89337660

docker-compose 理解:

每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。
本次通过 Dockerfile 和 build 指令搭建 LNMP
Dockerfile 写得很简单,重点在学习docker-compose 构造过程

环境:

visualbox ubuntu 1804 本地删除了 mysql

1、建立一个新项目:LNMP2

1- 单独建立一个 compose 学习的目录
$ tree lnmp2 -d
lnmp2
├── mysql
│ └── data
│ ├── mysql
│ ├── performance_schema
│ └── sys
├── nginx
│ ├── conf.d
│ └── www
│ └── html
└── phpfpm

2- 编写 Dockerfile

  • nginx 的 Dockerfile
    只有一条
    ~/compose/lnmp2$ cat ./nginx/Dockerfile
    FROM nginx:latest

  • php 的 Dockerfile
    ** 我是从之前学习 Dockerfile 的抄写过来的,里面大量的 php 扩展
    学习时可以去掉后面的那些
    也可以只有一条

    ~/compose/lnmp2$ cat ./phpfpm/Dockerfile

     FROM php:5.6.37-fpm-alpine3.7RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \&& apk update\&& apk add --no-cache libmcrypt-dev freetype-dev libjpeg-turbo-dev \git \# libfreetype6-dev \# libjpeg62-turbo-dev \libpng-dev \&& docker-php-ext-install mcrypt mysqli pdo pdo_mysql mbstring bcmath zip opcache\&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ \&& docker-php-ext-install -j$(nproc) gd
    
  • mysql 的 Dockerfile
    实际也只有一条
    ~/compose/lnmp2$ cat ./mysql/Dockerfile
    FROM mysql:5.7

    RUN apt update && apt install vim

  1. 分别测试 nginx、php、mysql 镜像和容器运行
    只需要测试 image 和 docker run 可以正确运行即可,详细配置放在 compose 模版里面

  2. 编写模版
    ss -tlnp |grep 3306
    ss -tlnp |grep 82
    确认好可以使用的端口,本次我使用 3308 和 82 端口来分别对应 mysql 和 nginx

    ~/compose/lnmp2$ cat docker-compose.yml

     version: "3"services:web_server:build: ./nginx  container_name: nginxlinks:- php:php72ports:- "82:80"- "443:443"volumes:- ./nginx/www/html:/var/www/html- ./nginx/conf.d:/etc/nginx/conf.d  db_server:build: ./mysql  container_name: mysql57environment:MYSQL_ROOT_PASSWORD: 123456ports:- "3308:3306"volumes:- ./mysql/data:/var/lib/mysqlphp:build: ./phpfpm  container_name: php72links:- db_server:mysql57ports:- "9000:9000"volumes:- ./nginx/www/html:/var/www/html- ./nginx/conf.d:/etc/nginx/conf.d
    
  3. 运行测试
    ** 为了看得清晰,可以将之前学习的项目都 down 掉之后进行
    因为运行时会产生新的 images 和新的 docker 容器
    docker-compose down

    在当前目录下
    ~/compose/lnmp2$ docker-compose up -d

     Creating network "lnmp2_default" with the default driverCreating mysql57 ... doneCreating php72   ... doneCreating nginx   ... done
    

    测试

    curl 127.0.0.1:82
    http://192.168.1.193:82/

4、 错误处理

  1. 第一次 up 之后,检查运行的容器,发现只有 2 个 ,nginx 容器没有起来!

     docker ps -sCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES               SIZEd07a05bdc966        lnmp2_php           "docker-php-entrypoi…"   26 seconds ago      Up 25 seconds       0.0.0.0:9000->9000/tcp              php72               0B (virtual 77.4MB)9018c7da0706        lnmp2_db_server     "docker-entrypoint.s…"   27 seconds ago      Up 25 seconds       33060/tcp, 0.0.0.0:3308->3306/tcp   mysql57             4B (virtual 372MB)
    

查看 nginx 容器日志
docker logs nginx

 2019/04/17 01:47:18 [emerg] 1#1: invalid number of arguments in "fastcgi_pass" directive in /etc/nginx/conf.d/default.conf:23
nginx: [emerg] invalid number of arguments in "fastcgi_pass" directive in /etc/nginx/conf.d/default.conf:23

** 因为我是从前一天的 lnmp 直接 cp 过来目录和 conf.d 的 default.conf
里面的 php 容器名字改变了,修改后又忘记了后面分号

** 修改 default.conf 之后,直接启动 nginx 容器即可,无需再次 up
以下是本次的 nginx 配置文件内容

~/compose/lnmp2$ cat ./nginx/conf.d/default.conf

 server {listen       80;server_name  localhost;  location / {root   /var/www/html;index  index.html index.htm index.php;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /var/www/html;}location ~ \.php$ {root           /var/www/html;# fastcgi_pass   127.0.0.1:9000;    # 必须修改为compose模版文件中php容器名字fastcgi_pass   php72:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; # 修改为$document_rootinclude        fastcgi_params;}
}

5、容器互联

*** 前面的 docker-compose.yml 存在一些问题,
1. 使用了老式的 link
2. 测试只涉及到了 nginx 和 php ,没有验证 mysql
3. 验证 mysql 时发现容器之间连接不上
4. 重新学习 docker-compose 命令

修改后的模版文件内容如下:
** 主要修改的地方
1. 去掉 link,改用 depends_on
2. 新建一个networks,名字 new (名字可以随意自行定义)
3. 3 个容器都连接到该networks

~/compose/lnmp3$ cat docker-compose.yml

version: "3"
services:web_server:build: ./nginx  container_name: nginxnetworks:- new#links:#    - php:php72depends_on:- php    ports:- "82:80"- "443:443"volumes:- ./nginx/www/html:/var/www/html- ./nginx/conf.d:/etc/nginx/conf.d  db_server:build: ./mysql  container_name: mysql57networks:- newenvironment:MYSQL_ROOT_PASSWORD: 123456ports:- "3308:3306"volumes:- ./mysql/data:/var/lib/mysqlphp:build: ./phpfpm  container_name: php72networks:- new#links:#    - db_server:mysql57depends_on:- db_server ports:- "9000:9000"volumes:- ./nginx/www/html:/var/www/html- ./nginx/conf.d:/etc/nginx/conf.d
networks:new:

6、测试验证 mysql

新建 2 个 php 文件,分别使用 mysqli 和 pdo 连接 mysql

~/compose/lnmp3/nginx/www/html$ cat mysqli.php

<?php
//$servername = "localhost:3308";
//$servername = "127.0.0.1:3308";
//$servername = "172.19.0.2:3306";
$servername = "mysql57:3306";
$username = "root";
$password = "123456";echo " begin connect ... by mysqli ...\n";
// 创建连接
$conn = new mysqli($servername, $username, $password);// 检测连接
if ($conn->connect_error) {die("连接失败: " . $conn->connect_error);
}
echo "连接成功\n";
$conn->close();
echo " \n closed now ..\n";
?>

~/compose/lnmp3/nginx/www/html$ cat pdo.php

<?php
//$servername = "localhost:3308";
//$servername = "127.0.0.1:3308";
//$servername = "172.19.0.2:3306";
$servername = "mysql57:3306";$username = "root";
$password = "123456";echo "begin connect by pdo ......!\n";try {$conn = new PDO("mysql:host=$servername;", $username, $password);echo "连接成功";
}
catch(PDOException $e)
{echo $e->getMessage();
}$conn = null;
echo "\nclose now!\n";
?>

本地测试:
curl 127.0.0.1:82
curl 127.0.0.1:82/mysqli.php
curl 127.0.0.1:82/pdo.php

浏览器测试
http://192.168.1.193:82/pdo.php

http://192.168.1.193:82/mysqli.php

后记

整体从头运行测试一次
docker-compose build --force-rm --no-cache
docker-compose up -d

docker-compose 学习:通过 Dockerfile 和 build 指令搭建 LNMP相关推荐

  1. Docker Compose学习之docker-compose.yml编写规则 及 实战案例

    [Docker那些事]系列文章 docker 安装 与 卸载 centos Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT ...

  2. Docker 学习总结(71)—— Docker、Docker Compose、Docker Swarm 之间的区别

    什么是 Docker Docker 是市场上最流行的基于容器的应用程序之一.Docker 是一个用于构建.部署和管理容器化应用程序的开源平台.使用 Docker,我们可以很容易地将应用程序打包到容器中 ...

  3. Docker Compose配置springboot微服务项目

    [Docker那些事]系列文章 docker 安装 与 卸载 centos Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT ...

  4. Docker最全总结,DockerFile,Docker编排容器,Docker镜像,Docker-compose构建

    文章目录 Docker 简介 为什么使用docker: Docker引擎: Docker系统镜像: Docker容器: Docker仓库: ubuntu安装docker: ubuntu脚本自动安装: ...

  5. 使用Docker Compose 搭建lnmp

    文章目录 一: Docker-compose 简介 1.1 为什么使用 Docker-compose 1.2 Docker-compose概述 二: compose 的部署 2.1 Docker Co ...

  6. Docker Compose编排(写法格式及实验)

    目录 一.Docker Compose前言 二.Docker compose 的文件结构 1.docker compose配置常用字段 2.docker compose常用命令 三.使用compose ...

  7. Docker 的数据管理(Dockerfile的概述和构建)

    文章目录 1 Docker 的数据管理 1.1 数据卷 1.2 数据卷容器 2 端口映射(2:31) 3 容器互联(使用 centos 镜像) 4 Docker 镜像的创建 4.1 基于现有镜像创建 ...

  8. Dockerfile中的指令与使用教程

    一.概述 Dockerfile是Docker用来构建镜像的文本文件,包括自定义的指令和格式.可以通过docker build命令从Dockerfile中构建镜像.用户可以通过统一的语法命令来根据需求进 ...

  9. Docker核心技术之Docker Compose

    一.Docker Compose 简介 Docker Compose是什么? Docker Compose是一个能一次性定义和管理多个Docker容器的工具. 详细地说: Compose中定义和启动的 ...

  10. Docker 学习笔记 - 进阶四 Docker网络和 Docker compose

    Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...

最新文章

  1. JWT: 基于Token的验证
  2. 关于for循环里边是否可以用return语句
  3. TComboBox下拉取值
  4. IIS7.5配置对PHP的支持
  5. 在js语法中使用jsx标签
  6. Finally语句块的执行
  7. Tensorflow2.0(1):加载图片数据集--TFRecord
  8. php手工注入拿webshell
  9. 使用datagrid时json的格式
  10. 一个react项目案例02 注册和登陆实现原理分析
  11. 利用BIRT ReportEngine API开发报表
  12. 【每晚20点红包雨】2018天猫聚划算99大促欢聚盛典活动介绍
  13. 为什么我们不能坚持到底?
  14. 恒温烙铁使用注意事项
  15. win10开启自带的手机投屏功能方式
  16. 诗词大全给力版_热卖20万套的网红古诗词日历来了!全新开启2021诗意生活
  17. 调用的目标发生异常 targetinvocationexception
  18. 幕客网学习摘要记录2----vim
  19. 单独给axios设置请求头
  20. PyTorch导入报错:ValueError: module functions cannot set METH_CLASS or METH_STATIC

热门文章

  1. selenium控制浏览器
  2. canvas的beginPath和closePath分析总结,包括多段弧的情况
  3. UItextInput-Protocol
  4. 项目中的常量是放在接口里还是放在类里呢?
  5. android自动化(appium)
  6. Android基于ksoap2调用WCF服务(二):Android篇
  7. 图像处理控件ImageGear for .NET教程如何为应用程序 添加DICOM功能(2)
  8. ubuntu 搭建 php 环境
  9. centos环境安装storm
  10. scrollLeft,scrollTop,滚动代码的总结