到目前为止,已经安排了两次实践作业,通过前两次的实践作业,我们已经完成了docker的入门和单个容器服务的定制,这是一个很好的开始。现在我们更进一步。
一个最终的应用通常需要组装多个容器提供的多个服务。以web服务为例,需要完成web服务器、数据库、开发程序等服务的组装,典型的如LAMP(Linux+Apache+Mysql+PHP)或LNMP(Linux+Nginx+Mysql+PHP)。Docker compose是作为定义和运行多容器的工具,用户可以使用 YML 文件来配置应用程序需要的所有服务。本次作业需要各位实践Docker compose,各位可以在第二次实践作业的基础之上开展,要求如下:
(1)完成Docker-compose的安装
参考资料:Docker-compose
docker-compose下载、安装、查看是否成功
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #下载安装
sudo chmod +x /usr/local/bin/docker-compose #赋予权限
docker-compose --version #查看是否安装成功
(2)Dockerfile编写
要求:
LNMP/LAMP选择一种;
分别构建web、php应用、数据库等镜像服务,php镜像亦有提供php:-apache的变体;
提示:php连接数据库需要安装必要的核心扩展部件(PHP Core Extensions)安装方法可参考官方镜像介绍。
搭建LNMP-nginx:latest、mysql:latest、php:7.4-fpm
基于前两次实验已经下载了前两个镜像,现只需下载php:7.4-fpm
sudo docker pull php:7.4-fpm
*在主目录下构建一下配置文件和目录(部分配置文件可以在第二次实验配置文件的基础上 用cp命令复制过去,在进行修改,工作量会减少哦)
编写配置文件
*dockerfile_nginx
#基于什么镜像
FROM nginx
#作者,联系方式
MAINTAINER ruinzly <1511490721@qq.com>
#COPY default.conf /etc/nginx/conf.d/
#COPY web/ /usr/share/nginx/myweb/
CMD ["nginx","-g","daemon off;"]
#暴露端口2506
EXPOSE 2506
*dockerfile_php
FROM php:7.4-fpm
MAINTAINER ruinzly
RUN apt-get update && apt-get install -y
libfreetype6-dev
libjpeg62-turbo-dev
libpng-dev
&& docker-php-ext-install pdo_mysql
&& docker-php-ext-configure gd --with-freetype --with-jpeg
&& docker-php-ext-install -j$(nproc) gd
*dockerfile_mysql
FROM mysql
MAINTAINER ruinzly
#配置环境变量
ENV USERNAME root #定义用户名称
ENV MYSQL_ALLOW_EMPTY_PASSWORD no #设置不允许免密登录
ENV MYSQL_ROOT_PASSWORD 123456 #设置root下mysql登录密码
*default.conf
#nginx的配置文件
server {
listen 2506; #修改映射端口
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /web/html; #修改工作目录,访问自定义该目录下的文件(./web/html)
index index.html index.htm;
autoindex on;
}
#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 /usr/share/nginx/html;
}
location ~ .php$ {
root /web/php; ##修改工作目录,访问自定义该目录下的文件(./web/html)
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# include fastcgi.conf;
}
}
*docker-compose.yml
php:
image: compose_php:test
container_name: compose_php
build:
context: .
dockerfile: dockerfile_php
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- ./web:/web/php
mysql:
image: compose_sql:test
container_name: compose_sql
build:
context: .
dockerfile: dockerfile_mysql
ports:
- 3306:3306
# environment:
# - MYSQL_ROOT_PASSWORD=123456
volumes:
- ./data_mysql:/var/lib/mysql
- index.html
Welcome,you are sucessfully visit static html!
- index.php
<?php phpinfo();?>
(3)使用Compose实现多容器运行机制
编写compose文件,完成上述LNMP/LAMP的微服务组合部署。
参考资料:Get started with Docker Compose
开启docker-conpose
docker-compose up -d --build
(执行成功的样子)
查看镜像、正在运行的容器
docker images
docker ps
保证三个容器正常运行的前提下,火狐访问localhost/index.html和localhost/inden.php
4)服务测试
要求和提示:
包括但不限于测试数据库连接、数据库新建、表新建、表记录的插入修改和删除是否成功(pdo或mysqli均可);
相关测试代码可直接参考PHP与MySQL的教程。
测试数据库连接
*修改index.php
<?php
$servername = "compose_sql";
$username = "root";
$password = "123456";
try {
$conn = new PDO("mysql:host=$servername;", $username, $password);
echo "恭喜你终于连接成功!";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
*创建数据库myDBPDO
<?php
$servername = "compose_sql";
$username = "root";
$password = "123456";
try {
$conn = new PDO("mysql:host=$servername", $username, $password);
// 设置 PDO 错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE myDBPDO";
// 使用 exec() ,因为没有结果返回
$conn->exec($sql);
echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
*进入容器查看是否真的生成了数据库
*创建表格Ruin_table_2,往里面插入数据
<?php
$servername = "compose_sql";
$username = "root";
$password = "123456";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式,用于抛出异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 使用 sql 创建数据表
$sql = "CREATE TABLE Ruin_table_2 (
id INT(10) PRIMARY KEY,
sex VARCHAR(20) NOT NULL,
username VARCHAR(30) NOT NULL
)";
// 使用 exec() ,没有结果返回
$conn->exec($sql);
echo "数据表 Ruin_table_2 创建成功!";
}
catch(PDOException $e)
echo $sql . "<br>" . $e->getMessage();
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式,用于抛出异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO Ruin_table_2 (id, sex, username)
VALUES (031702506, 'female', 'Zhong Luying')";
// 使用 exec() ,没有结果返回
$conn->exec($sql);
echo "新记录插入成功!";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
*进入compose_sql查看是否生成表格Ruin_table和插入数据
#进入root权限
sudo su
mysql -u root -p
use myDBPDO;
show tables;
select * from Ruin_table_2;
*修改数据和删除数据
再插入一条数据
<?php
$servername = "compose_sql";
$username = "root";
$password = "123456";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式,用于抛出异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO Ruin_table_2 (id, sex, username)
VALUES (031702504, 'female', 'LinRui')";
// 使用 exec() ,没有结果返回
$conn->exec($sql);
echo "新记录插入成功!";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
删除数据
做完记得docker-compose down
docker-compose down
(5)总结
途中遇到的问题
- docker-compose up后查看容器nginx启动后立马关闭;
解决方式:
查看nginx的日志
docker log compose_nginx
查看完后发现相关的配置文件有错
- 在访问localhost/index.php 出现file not found错误
解决方式:
查看cmpose_php日志
docker log compose_php
[error] 1507#0: *22 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 10.0.0.1, server: www.wordpress.com, request: "GET /info.p
解决方式:修改php的配置文件参照该文
感想
这次实验大概花了24小时左右,中间因为滥用chmod导致很多文件的权限有问题,只能够恢复各种文件,重头来过。做的过程中有点不太顺利,因为不熟练造成的,但是做出来还是很开心的!