系统实践第三次作业
第3次实践作业:基于 Docker compose 的多容器协同
计算机3班 041801516 李伟
相关文件见文末下载地址
-
Docker-compose的安装
- 参考官方文档 Docker Compose
使用以下命令下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 给文件授权
sudo chmod +x /usr/local/bin/docker-compose
- 创建软链
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
- 测试安装是否成功
docker-compose --version
- 文件编写
创建 compose_lnmp 文件夹,该文件夹结构如下,使用如下命令可查看
cd compose_lnmp tree # 如果未安装 tree 工具,需要先使用以下命令安装 # sudo apt-get install tree
-
各个镜像的 DockerFile
- dockerfile_nginx
#基础镜像 FROM nginx #作者 MAINTAINER Wei Li #暴露端口 EXPOSE 8021 #可以选择不装 vim RUN apt-get update && apt-get install -y vim
- dockerfile_mysql
#基础镜像 FROM mysql MAINTAINER Wei Li ENV MYSQL_ROOT_PASSWORD mysql ENV MYSQL_ALLOW_EMPTY_PASSWORD no #不允许免密登录
- dockerfile_php
FROM php:7.4-fpm MAINTAINER Wei Li 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
-
docker-compose.yml
version: "3" services: nginx: image: nginx_img #指定镜像名 container_name: nginx #指定容器名 build: context: . dockerfile: dockerfile_nginx #指定dockerfile文件 ports: - "2021:8021" #修改映射端口 volumes: - ./web/html:/web/html #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新 - ./nginx/default.conf:/etc/nginx/conf.d/default.conf #挂载配置文件 php: image: php_img container_name: php build: context: . dockerfile: dockerfile_php environment: MYSQL_PASSWORD: mysql #root登录密码 volumes: - ./web/php:/web/php mysql: image: sql_img container_name: sql build: context: . dockerfile: dockerfile_mysql ports: - "3306:3306" #映射端口 volumes: - ./mysql:/var/lib/mysql
-
nginx 配置文件
server { listen 8021; server_name localhost; location / { root /web/html; index index.html index.htm; } location ~ \.php$ { root /web/php; #代码目录 fastcgi_pass php:9000; #一定要修改为自己php容器的名字 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #修改为$document_root include fastcgi_params; } }
-
使用 Compose 实现多容器运行机制
docker-compose up -d --build
- 查看当前镜像和容器信息
- 浏览器查看结果
- 连接服务结果测试
-
在 compose_lnmp/web 目录添加check_connect.php 文件:
<?php $servername = "sql"; #注意这里要用自己自定义的Mysql的容器名 $username = "root"; $password = "mysql"; try { $conn = new PDO("mysql:host=$servername", $username, $password); echo "连接成功"; } catch(PDOException $e) { echo $e->getMessage(); } ?>
-
在 compose_lnmp/web 目录添加check_sql.php 文件:
<?php $servername = "sql"; #注意这里要用自己自定义的Mysql的容器名 $username = "root"; $password = "mysql"; try { $conn = new PDO("mysql:host=$servername", $username, $password); echo "连接成功"; } catch(PDOException $e) { echo $e->getMessage(); } ?>
-
在 compose_lnmp/web 目录添加check_sql.php 文件:
<?php $servername = "sql"; $username = "root"; $password = "mysql"; try { $conn = new PDO("mysql:host=$servername", $username, $password); //设置PDO错误模式异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "CREATE DATABASE mydb"; //使用exec(),因为没有结果返回 $conn->exec($sql); echo "数据库创建成功<br>"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
-
进入 mysql 容器检查数据库是否成功创建
-
- 参考官方文档 Docker Compose
-
Tomcat + Nginx 负载均衡
-
文件编写
创建 tomcat 文件夹,该文件夹结构如下,使用如下命令可查看cd tomcat tree # 如果未安装 tree 工具,需要先使用以下命令安装 # sudo apt-get install tree # 结构如下 . ├── docker-compose.yml ├── nginx │ └── default.conf ├── tomcat1 │ └── index.html ├── tomcat2 │ └── index.html └── tomcat3 └── index.html
-
运行
docker-compose up -d --build
- 查看当前镜像和容器信息
- python 脚本测试 (也可以用浏览器刷新检验)
-
轮询策略(默认策略)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。import requests url='http://localhost:2022/hello.html' for i in range(0,6): response=requests.get(url) print(response.text)
-
weight策略(权重策略)
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
需要修改 default.conf 配置文件:upstream tomcats { server tct1:8080 weight=1; server tct2:8080 weight=2; server tct3:8080 weight=3; }
-
-
- 实践时间:
- 估计共 12h ,主要花在处理一些很突然的 bug 和 php 的了解、yml 文件的学习上
- 难度
- 比较困难
- 针对本次实践任务中遇到的各类问题和解决办法进行总结(不少于3条)
- nginx 容器在构建完之后马上关闭,原因在于 nginx 配置文件写错,就是 php 部分那里要改成自己本地 php 容器的名字,这里花了特别多的时间。所以以后 nginx 容器出现闪退的问题,建议优先排查配置文件
- compose 之后,可以用
docker-compose down
来快速结束服务 - 注意多个文件的对应端口映射要保证一致,否则连问题出在哪里都不知道
- 由于容器使用了挂载,所以在本地修改了 web 中的 html 或 php 之后不需要重启服务
- 有时候可以在脚本中加入输出语句来帮助排错,使用
docker logs containerID
来输出日志
参考资料
【官方文档】Docker Compose
【个人博客相关地址】
【相关文件下载】