2020系统综合实验 第3次实践作业
一个最终的应用通常需要组装多个容器提供的多个服务。以web服务为例,需要完成web服务器、数据库、开发程序等服务的组装,典型的如LAMP(Linux+Apache+Mysql+PHP)或LNMP(Linux+Nginx+Mysql+PHP)。Docker compose是作为定义和运行多容器的工具,用户可以使用 YML 文件来配置应用程序需要的所有服务。本次作业需要各位实践Docker compose,各位可以在第二次实践作业的基础之上开展,要求如下:
(1)完成Docker-compose的安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /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(linux,nginx,mysql,php)
各文件如下
default.conf
server {
listen 8010; #修改映射端口
server_name localhost;
location / {
root /home/docker-web/html; #修改工作目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /home/docker-web/php; #修改工作目录
fastcgi_pass sphp:9000; #修改为容器名
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
dockerfile_nginx
FROM nginx
MAINTAINER sayoko
EXPOSE 8010
dockerfile_php
FROM php:7.4-fpm
MAINTAINER sayoko
FROM php:7.4-fpm
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 sayoko
ENV MYSQL_ROOT_PASSWORD 123456
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
(3)使用Compose实现多容器运行机制
- 编写compose文件,完成上述LNMP/LAMP的微服务组合部署。
- 参考资料:Get started with Docker Compose
docker-compose.yml
version: "3"
services:
nginx:
image: snginx_image #指定镜像名
container_name: snginx #指定容器名
build:
context: .
dockerfile: dockerfile_nginx #指定dockerfile文件
ports:
- "80:8010" #修改端口映射
volumes:
- ./web:/home/docker-web/html #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新;
- ./default.conf:/etc/nginx/conf.d/default.conf #挂载配置文件
php:
image: sphp_image
container_name: sphp
build:
context: .
dockerfile: dockerfile_php
environment:
MYSQL_PASSWORD: 123456 #设置好环境变量,在php代码中使用变量名直接引用
volumes:
- ./web:/home/docker-web/php #挂载工作目录到本机web目录
mysql:
image: mysql_image
container_name: mysql
build:
context: .
dockerfile: dockerfile_mysql
ports:
- "3306:3306"
volumes:
- ./mysql_data:/var/lib/mysql #挂载容器卷,实现数据同步,防止数据丢失
phpmyadmin:
image: myphpmyadmin_image
container_name: myphpmyadmin
build:
context: .
dockerfile: dockerfile_phpmyadmin
ports:
- "8050:80" # phpmyadmin默认监听80
environment:
PMA_HOST: mysql #指定mysql服务所在的host
(4)服务测试
要求和提示:
- 包括但不限于测试数据库连接、数据库新建、表新建、表记录的插入修改和删除是否成功(pdo或mysqli均可);
- 相关测试代码可直接参考PHP与MySQL的教程。
修改index.php文件
连接成功:
创建数据库成功:
创建表成功:
插入数据成功:
修改数据成功:
删除数据成功:
(5)选做
- 增加一个phpmyadmin容器,实现web端的数据库管理。
dokcerfile_phpmyadimin
FROM phpmyadmin/phpmyadmin
MAINTAINER sayoko
EXPOSE 8050
打开8050口
(6)总结问题以及解决方法
Q:光荣的在第一步安装就出小问题了,用教程里的太慢了慢到卡掉
解决:使用了其他命令,成功完成安装。
Q:执行docker-compose build时候的错误,应该是php那里什么地方没写好(我忘记了)(因为改了好多好多好多次了)
解决:重新把每个文件重新认真检查了一下
Q:打开网页发现显示 SQLSTATE[HY000] [2002] No such file or directory
解决:
[这里](https://segmentfault.com/q/1010000007356940/a-1020000007367966 里这么说) 这么说
以及其实很多地方我都不懂,看别人博客都不知道为什么要这样的,去学习了很多比如容器挂载,mysql和php的连接,yml文件的书写规则,简单的了解了一下php语言,收获还是挺多的。总用时记不清了,因为中间有时候失败了就隔两天再重新继续做,但我估计应该是2个下午+1个晚上+1个早上(写博客)的时间。
还有就不知道为啥我下载东西(比如开头这个)就特别慢,执行docker-compose build命令的时候也特别特别特别慢,装东西慢然后我去干其他事情,回来就发现失败的事情发生了好多好多好多次。
希望下次作业能做的顺利(每次都祈祷)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· Tinyfox 简易教程-1:Hello World!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!