[docker]使用docker-compose编排容器
前言
在完整上线一个php+nginx+mysql+redis架构的网站中,我全程用docker搭建了基于php+nginx+mysql+redis的站点。
我目前遇到了一些问题:
- 重启很繁琐
- 修改配置,需要先
docker stop
,然后docker rm
,再docker run
,麻烦! - 迁移到新站点麻烦。需要重复
docker run
,如果忘记了某一个命令,还要再查,麻烦!
为此,我打算,将容器使用docker-compose进行编排,达到一次命令,运行所有内容。
安装docker-compose
centos 下的安装(也可以点击这里查看)
$ yum install docker-compose
安装好后,使用-v
查看版本号:
$ docker-compose -v
docker-compose version 1.18.0, build 8dd22a9
centos8安装docker-compose
$ yum update
$ pip3 install docker-compose
分析整体配置项
docker-compose最重要的就是这个配置文件了,一切的容器都在这份文件中配置。
以完整上线一个php+nginx+mysql+redis架构的网站为例,我们将docker容器进行编排。
首先确认所有的服务名称:
服务名称 | 服务软件 | 用途 | 版本 | 网络 |
---|---|---|---|---|
djc8nginx | nginx | tcp/ip,代理转发 | nginx:1.18.0 | djc8net |
djc8php | php | 服务器编程支持 | php:8-fpm,djc8/php:8fpm | djc8net |
djc8mysql | mysql | 数据持久化 | mysql:8.0.22 | djc8net |
djc8redis | Redis | 高速缓存工具 | redis:6.0.9 | djc8net |
确认服务关系:
服务名称 | 依赖服务 |
---|---|
djc8mysql | 无依赖 |
djc8redis | 无依赖 |
djc8php | djc8mysql,djc8redis |
djc8nginx | djc8php |
确认服务挂载映射目录:
服务名称 | 宿主机地址1 | 容器地址1 | 宿主机地址2 | 容器地址2 |
---|---|---|---|---|
djc8mysql | /www/mysql/date | /var/lib/mysql | - | - |
djc8nginx | /www/nginx/logs | /var/log/nginx/ | /www/nginx/conf/nginx.conf | /etc/nginx/nginx.conf |
djc8nginx | /www/nginx/conf/vhost | /etc/nginx/vhost | /www/nginx/conf/cert/ | /etc/nginx/cert/ |
djc8nginx | /www/web/public_html | /www | - | - |
djc8php | /www/web/public_html | /var/www/html | /www/php/conf.d | /usr/local/etc/php/conf.d |
djc8php | /www/php/php-fpmconf/ | /usr/local/etc/php-fpm.d | - | - |
确认服务环境变量:
服务名称 | 环境变量名 | 环境变量值 |
---|---|---|
djc8mysql | MYSQL_ROOT_PASSWORD | djc8learndocker |
dockerfile编写
关于php的版本,因为还需要增加必要的插件,所以我自己弄了一个,dockerfile
,内容如下:
可以参考php的dockerfile文件先把镜像生成出来,或者直接在docker-compose中一起编译
创建dockerfile存放的路径:
$ mkdir -p /www/php
$ cd /www/php
创建dockerfile文件:
$ touch /www/php/Dockerfile
dockerfile内容如下:
FROM php:8-fpm
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
echo deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib >/etc/apt/sources.list && \
echo deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib >>/etc/apt/sources.list && \
echo deb http://mirrors.aliyun.com/debian-security stretch/updates main >>/etc/apt/sources.list && \
echo deb-src http://mirrors.aliyun.com/debian-security stretch/updates main >>/etc/apt/sources.list && \
echo deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib >>/etc/apt/sources.list && \
echo deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib >>/etc/apt/sources.list && \
echo deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib >>/etc/apt/sources.list && \
echo deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib >>/etc/apt/sources.list
RUN apt-get update
RUN pecl install redis-5.3.2 \
&& docker-php-ext-enable redis \
&& docker-php-ext-install mysqli pdo pdo_mysql
这里不多介绍Dockerfile文件的语法结构,只简单说下。
第一个RUN,执行结束后,会将apt-get的数据源修改为aliyun,加速国内访问,如果你是国外的机器,请取消这一条,否则会很慢。
第二个RUN则是安装必要的依赖,因为我这里使用redis做缓存,使用mysql做持久化,所以需要安装这两个扩展。
在/www/php/目录下,执行docker build -t djc8/php:8fpm .
进行镜像构建,这里-t
参数代表了这个镜像的名称,重要,后面会用到。
docker-compose.yml编写
首先是第一行,根据docker-compose版本对应的version
号快速对应关系,确认你的版本号
我摘抄了下来:
Compose file format | Docker Engine release |
---|---|
Compose specification | 19.03.0+ |
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.4 | 17.12.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
我这里按照第一步安装的时候查看的版本号是.1.18,详细的对应关系,也可以看这里compose-versioning。所以我这里选择了3.5
先新建一个文件
$ cd /www/php
$ touch docker-compose.yml
修改docker-compose.yml
这块内容是面向新手,所以,我会将每一步添加的内容,都贴出来,配置文件是属于递增方式,如果不想看,直接拉到最后一步。
- 增加版本号
version: "3.5"
- 增加网络:
version: "3.5"
networks:
djc8net:
driver: bridge
- 增加服务:
version: "3.5"
services:
djc8nginx:
djc8mysql:
djc8php:
djc8redis:
networks:
djc8net:
driver: bridge
- 增加服务中的使用镜像:
version: "3.5"
services:
djc8nginx:
image: nginx:1.18.0
djc8mysql:
image: mysql:8.0.22
djc8php:
image: djc8/php:8fpm
djc8redis:
image: redis:6.0.9
networks:
djc8net:
driver: bridge
- 增加服务中的网络:
version: "3.5"
services:
djc8nginx:
image: nginx:1.18.0
networks:
djc8net:
aliases:
- djc8nginx
djc8mysql:
image: mysql:8.0.22
networks:
djc8net:
aliases:
- djc8mysql
djc8php:
image: djc8/php:8fpm
networks:
djc8net:
aliases:
- djc8php
djc8redis:
image: redis:6.0.9
networks:
djc8net:
aliases:
- djc8redis
networks:
djc8net:
driver: bridge
- 增加服务与服务的依赖(依赖管理)
version: "3.5"
nservices:
djc8nginx:
image: nginx:1.18.0
networks:
djc8net:
aliases:
- djc8nginx
djc8mysql:
image: mysql:8.0.22
networks:
djc8net:
aliases:
- djc8mysql
djc8php:
image: djc8/php:8fpm
networks:
djc8net:
aliases:
- djc8php
depends_on:
- djc8mysql
- djc8redis
djc8redis:
image: redis:6.0.9
networks:
djc8net:
aliases:
- djc8redis
networks:
djc8net:
driver: bridge
- 增加对外端口(或者内部端口)
version: "3.5"
services:
djc8nginx:
image: nginx:1.18.0
networks:
djc8net:
aliases:
- djc8nginx
ports:
- 443:443
- 80:80
djc8mysql:
image: mysql:8.0.22
networks:
djc8net:
aliases:
- djc8mysql
djc8php:
image: djc8/php:8fpm
networks:
djc8net:
aliases:
- djc8php
depends_on:
- djc8mysql
- djc8redis
ports:
- 9000:9000
expose:
- "9000"
djc8redis:
image: redis:6.0.9
networks:
djc8net:
aliases:
- djc8redis
networks:
djc8net:
driver: bridge
- 增加服务与服务的链接
version: "3.5"
services:
djc8nginx:
image: nginx:1.18.0
networks:
djc8net:
aliases:
- djc8nginx
ports:
- 443:443
- 80:80
links:
- djc8php
djc8mysql:
image: mysql:8.0.22
networks:
djc8net:
aliases:
- djc8mysql
djc8php:
image: djc8/php:8fpm
networks:
djc8net:
aliases:
- djc8php
depends_on:
- djc8mysql
- djc8redis
ports:
- 9000:9000
expose:
- "9000"
links:
- djc8mysql
djc8redis:
image: redis:6.0.9
networks:
djc8net:
aliases:
- djc8redis
networks:
djc8net:
driver: bridge
- 增加服务的环境变量
version: "3.5"
services:
djc8nginx:
image: nginx:1.18.0
networks:
djc8net:
aliases:
- djc8nginx
ports:
- 443:443
- 80:80
links:
- djc8php
djc8mysql:
image: mysql:8.0.22
networks:
djc8net:
aliases:
- djc8mysql
environment:
MYSQL_ROOT_PASSWORD: djc8learndocker
djc8php:
image: djc8/php:8fpm
networks:
djc8net:
aliases:
- djc8php
depends_on:
- djc8mysql
- djc8redis
ports:
- 9000:9000
expose:
- "9000"
links:
- djc8mysql
djc8redis:
image: redis:6.0.9
networks:
djc8net:
aliases:
- djc8redis
networks:
djc8net:
driver: bridge
- 增加挂载路径
version: "3.5"
services:
djc8nginx:
image: nginx:1.18.0
networks:
djc8net:
aliases:
- djc8nginx
ports:
- 443:443
- 80:80
links:
- djc8php
volumes:
- /www/nginx/logs:/var/log/nginx
- /www/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /www/nginx/conf/vhost:/etc/nginx/vhost
- /www/nginx/conf/cert/:/etc/nginx/cert
- /www/web/public_html:/www
djc8mysql:
image: mysql:8.0.22
networks:
djc8net:
aliases:
- djc8mysql
environment:
MYSQL_ROOT_PASSWORD: djc8learndocker
volumes:
- /www/mysql/date:/var/lib/mysql
djc8php:
image: djc8/php:8fpm
networks:
djc8net:
aliases:
- djc8php
depends_on:
- djc8mysql
- djc8redis
ports:
- 9000:9000
expose:
- "9000"
links:
- djc8mysql
volumes:
- /www/web/public_html:/var/www/html
djc8redis:
image: redis:6.0.9
networks:
djc8net:
aliases:
- djc8redis
networks:
djc8net:
driver: bridge
以上便是docker-compose的内容
那么因为我们php是自己编写的dockerfile作为镜像,所以需要将编译一起放到docker-compose中,这样以后修改dockerfile的时候,直接用docker-compose进行更新就可以了。
修改上面的docker-compose
version: "3.5"
services:
djc8nginx:
image: nginx:1.18.0
networks:
djc8net:
aliases:
- djc8nginx
ports:
- 443:443
- 80:80
links:
- djc8php
volumes:
- /www/nginx/logs:/var/log/nginx
- /www/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /www/nginx/conf/vhost:/etc/nginx/vhost
- /www/nginx/conf/cert/:/etc/nginx/cert
- /www/web/public_html:/www
djc8mysql:
image: mysql:8.0.22
networks:
djc8net:
aliases:
- djc8mysql
environment:
MYSQL_ROOT_PASSWORD: djc8learndocker
volumes:
- /www/mysql/date:/var/lib/mysql
djc8php:
build: .
networks:
djc8net:
aliases:
- djc8php
depends_on:
- djc8mysql
- djc8redis
ports:
- 9000:9000
expose:
- "9000"
links:
- djc8mysql
volumes:
- /www/web/public_html:/var/www/html
djc8redis:
image: redis:6.0.9
networks:
djc8net:
aliases:
- djc8redis
networks:
djc8net:
driver: bridge
可以看到只修改了djc8php
服务的,image
镜像为build: .
。
部署并运行
在当前目录下输入命令:
$ docker-compose up -d
该命令会自动编译dockerfile,自动下载镜像,创建容器,创建网络等。
进入目录/www/web/public_html/,,如果没有该目录,可创建一个:
$ mkdir /www/web/public_html
$ touch /www/web/public_html/index.php
修改index.php文件为如下内容
<?
$mysqli = new mysqli("djc8mysql", "root", "djc8learndocker", "djc8db");
$sql = "SELECT * FROM djc8learndocker";
$result = $mysqli->query($sql);
$row = $result->fetch_assoc();
$redis = new Redis();
$redis->connect('djc8redis', 6379);
//$redis->auth('mypassword');
if(!$redis->exists("index.php")){
$redis ->set( "index.php" , 'this page by '.$row["author"].' | '.$row["mail"].' use redis');
}
echo $redis ->get( "index.php");
$result->free();
$mysqli->close();
不出所料,页面会出现:
this page by djc8 | admin@djc8.cn use redis
如果出现错误,可以使用命令查看:
docker-compose logs 服务名
最后
可以在这里复制/www目录所有的内容,该目录包含了配置域名,服务器路径等内容。
我已经提交到github上。
本文来自:[docker]使用docker-compose编排容器-小码农,转载请保留本条链接,感谢!
- 本文标签: mysql php docker
- 本文链接: https://djc8.cn/archives/docker-using-docker-compose-to-arrange-containers.html
- 版权声明: 本文由小码农原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权