在 Ubuntu 上使用 Docker-Compose 对 LEMP 栈进行 Docker 化
在此页
- 第 1 步 - 安装 Docker
- 第 2 步 - 安装 Docker-Compose
- 第 3 步 - 创建和配置 Docker 环境
- 第 4 步 - 配置 docker-compose.yml 文件
- 第 5 步 - 运行 Docker-Compose
- 第 6 步 - 测试
- 参考资料
Docker-Compose 是一个命令行工具,用于定义和管理多容器 docker 应用程序。 Compose 是一个 python 脚本,可以使用 pip 命令轻松安装(pip 是从 python 包存储库安装 Python 软件的命令)。使用 compose,我们可以使用一个命令运行多个 docker 容器。它允许您创建容器即服务,非常适合您的开发、测试和暂存环境。
在本教程中,我将逐步指导您使用 docker-compose 创建一个 LEMP Stack 环境(LEMP=Linux - Nginx - MySQL - PHP)。我们将在不同的 Docker 容器中运行所有组件,我们设置了 Nginx 容器、PHP 容器、PHPMyAdmin 容器和 MySQL/MariaDB 容器。
先决条件
- Ubuntu 服务器 16.04 -64 位
- 根权限
第 1 步 - 安装 Docker
在此步骤中,我们将安装 Docker。 Docker 在 Ubuntu 存储库中可用,只需更新您的存储库然后安装它。
更新 ubuntu 存储库并升级:
sudo apt-get update
sudo apt-get upgrade从 ubuntu 存储库安装最新的 Docker。
sudo apt-get install -y docker.io
启动 docker 并使其在引导时启动:
systemctl start docker
systemctl enable dockerDocker 服务正在运行。
接下来,您可以尝试使用 docker 和下面的命令来测试它:
docker run hello-world
来自 docker 的世界,你好。
第 2 步 - 安装 Docker-Compose
在第一步中,我们已经安装了 Docker。现在我们将安装 docker-compose。
我们需要 python-pip 来进行 compose 安装,使用 apt 安装 python 和 python-pip:
sudo apt-get install -y python python-pip
安装完成后,使用 pip 命令安装 docker-compose。
pip install docker-compose
现在检查 docker-compose 版本:
docker-compose --version
Docker-compose 已经安装。
第 3 步 - 创建和配置 Docker 环境
在这一步中,我们将构建我们的 docker-compose 环境。我们将使用非根用户,因此我们现在需要创建该用户。
添加一个名为 hakase 的新用户(如果您愿意,可以在此处选择您自己的用户名):
useradd -m -s /bin/bash hakase
passwd hakase接下来,将新用户添加到 docker 组并重新启动 docker。
usermod -a -G docker hakase
sudo systemctl restart docker现在用户 hakase 可以在没有 sudo 的情况下使用 docker。
接下来,从 root 用户使用 su 登录到 hakase 用户。
su - hakase
为撰写环境创建一个新目录。
mkdir lemp-compose/
cd lemp-compose/这是我们的 docker-compose 环境,所有应该在 Docker 容器中的文件都必须在这个目录中。当我们使用 docker-compose 时,我们需要一个名为 docker-compose.yml 的 .yml 文件。
在 lemp-compose 目录中,创建一些新目录和一个 docker-compose.yml 文件:
touch docker-compose.yml
mkdir -p {logs,nginx,public,db-data}- logs:Nginx 日志文件的目录。
- nginx:包含 Nginx 配置,如虚拟主机等。
- public:网络文件、index.html 和 PHP 信息文件的目录。
- db-data:MariaDB 数据目录卷。
在日志目录中创建日志文件 error.log 和 access.log。
touch logs/{error,access}.log
在nginx目录下新建一个nginx虚拟主机配置文件:
vim nginx/app.conf
下面粘贴配置:
upstream php {
server phpfpm:9000;
}
server {
server_name 193.70.36.50;
error_log "/opt/bitnami/nginx/logs/myapp-error.log";
access_log "/opt/bitnami/nginx/logs/myapp-access.log";
root /myapps;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}保存文件并退出 vim。
在公共目录中创建一个新的 index.html 文件和 PHP 信息文件。
echo '<h1>LEMP Docker-Compose</h1><p><b>hakase-labs</b>' > public/index.html
echo '<?php phpinfo(); ?>' > public/info.php现在可以看到环境目录如下图:
tree
第 4 步 - docker-compose.yml 文件的配置
在上一步中,我们创建了容器所需的目录和文件。在这一步中,我们要编辑文件 docker-compose.yml。在 docker-compose.yml 文件中,我们将为 LEMP 堆栈、每个容器的基础映像和 docker 卷定义我们的服务。
登录 hakase 用户并使用 vim 编辑 docker-compose.yml 文件:
su - hakase
cd lemp-compose/
vim docker-compose.yml- 定义 Nginx 服务
粘贴下面的 nginx 配置:
nginx:
image: 'bitnami/nginx'
ports:
- '80:80'
links:
- phpfpm
volumes:
- ./logs/access.log:/opt/bitnami/nginx/logs/myapp-access.log
- ./logs/error.log:/opt/bitnami/nginx/logs/myapp-error.log
- ./nginx/app.conf:/bitnami/nginx/conf/vhosts/app.conf
- ./public:/myapps在该配置中,我们已经定义了:
- nginx:服务名称
- 图像:我们使用的是 bitnami/nginx docker 图像
- 端口:将容器端口 80 暴露给主机端口 80
- 链接:将 nginx 服务容器链接到 phpfpm 容器
- volumes:将本地目录挂载到容器中。挂载日志文件目录,挂载 Nginx 虚拟主机配置和挂载 web 根目录。
- 定义 PHP-fpm 服务
将配置粘贴到 Nginx 块下方:
phpfpm:
image: 'bitnami/php-fpm'
ports:
- '9000:9000'
volumes:
- ./public:/myapps我们在这里定义:
- phpfpm:定义服务名称。
- 图像:使用 bitnami/php-fpm 图像为 phpfpm 服务定义基础图像。
- 端口:我们使用 TCP 端口 9000 运行 PHP-fpm,并将端口 9000 暴露给主机。
- volumes:挂载 web 根目录 public 到容器上的 myapps。
- 定义MySQL服务
在第三块中,为 MariaDB 服务容器粘贴以下配置:
mysql:
image: 'mariadb'
ports:
- '3306:3306'
volumes:
- ./db-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=hakase-labs123在这里你可以看到我们正在使用:
- mysql:作为服务名。
- 图像:容器基于 mariadb docker 图像。
- ports:服务容器使用端口 3306 连接 MySQL,并在端口 3306 上将其暴露给主机。
- volumes: db-data 目录 mysql
- environment:设置环境变量 MYSQL_ROOT_PASSWORD 为 docker images 的 mysql root 密码,在构建容器时执行。
- PHPMyAdmin服务配置
最后一块,粘贴下面的配置:
phpmyadmin:
image: 'phpmyadmin/phpmyadmin'
restart: always
ports:
- '8080:80'
links:
- mysql:mysql
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: hakase-labs123
PMA_HOST: mysql我们正在使用 phpmyadmin docker 镜像,将容器端口 80 映射到主机上的 8080,将容器链接到 mariadb 容器,设置始终重启并设置 docker 镜像的一些环境变量,包括设置 PMA_HOST。
保存文件并退出 vim。
你可以在 github 上看到完整的例子。
第 5 步 - 运行 Docker-Compose
现在准备运行 docker-compose。注意:当你想运行docker-compose时,你必须在docker-compose项目目录下,并确保有包含compose配置的yml文件。
运行以下命令以启动 LEMP 堆栈:
docker-compose up -d
-d:作为守护进程或后台运行
您将看到已创建新容器的结果,使用以下命令检查它:
docker-compose ps
现在我们有四个运行 Nginx、PHP-fpm、MariaDB 和 PHPMyAdmin 的容器。
第 6 步 - 测试
检查主机上 docker-proxy 使用的端口。
netstat -plntu
我们可以看到 Nginx 容器的端口 80、MariaDB 容器的端口 3306、php-fpm 容器的端口 9000 和 PHPMyAdmin 容器的端口 8080。
从网络浏览器访问端口 80,您将看到我们的 index.html 文件。
确保 PHP-fpm 正在运行,从网络浏览器访问它。
docker-compose exec mysql bash
mysql -u root -p
TYPE MYSQL PASSWORD: hakase-labs123现在创建一个新的数据库:
create database hakase_db;
exitMariaDB mysql shell 容器是可以访问的,我们已经创建了一个新的数据库 hakase_db。
接下来,在端口 8080 上访问 PHPMyAdmin:http://serverip-address:8080/。
您将看到 PHPMyAdmin 登录页面,只需输入用户名 root,密码为 hakase-labs123。
您将自动连接到已在 PMA_HOST 环境变量中定义的 mysql 容器。
单击 Go,您将看到连接到 mysql 容器的 phpmyadmin 仪表板。
成功! LEMP Stack 在 docker-compose 设置下运行,由四个容器组成。
参考
- https://hub.docker.com/r/bitnami/nginx/
- https://hub.docker.com/r/bitnami/php-fpm/
- https://hub.docker.com/_/mariadb/
- https://hub.docker.com/r/phpmyadmin/phpmyadmin/
- https://docs.docker.com/compose/
- https://github.com/yuzukiseo/hakase-labs/tree/master/lemp-compose
- https://linux教程/tutorial/how-to-create-docker-images-with-dockerfile/