目录
Compose介绍
Compose是一个定义和管理多容器的工具,也是一种容器编排工具,前身是Pig,使用Python语言编写。使用Compose配置文件描述多个容器应用的架构,build使用什么镜像,数据卷,映射端口等;然后一条命令管理所有服务,比如启动,停止,重启。简化部署多个容器的操作。
Docker-compose是一个定义和管理多容器的工具,主要用来编排相关联的容器。
Docker Compose 安装
最新下载地址:Overview | Docker Documentation
安装方案
1.下载二进制文件
[root@docker-server2 ~]# curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@docker-server2 ~]# docker-compose --version
Docker-compose部署LNMP
下载镜像
[root@docker-server2 ~]# docker pull nginx:1.23.3
[root@docker-server2 ~]# docker pull mysql:8.0.32
[root@docker-server2 ~]# docker pull php:8.1-fpm
拷贝nginx配置文件
[root@docker-server2 lnmp]# mkdir -p /usr/local/nginx/{conf,log,html}
[root@docker-server2 lnmp]# docker run -itd --name=web1 -p 81:80 nginx:1.23.3
ce794b3be3a26c738258e48a28ef6bace2aa51579ff3f55dcd51711a7ce85cd0
[root@docker-server2 lnmp]# docker cp web1:/etc/nginx/nginx.conf /usr/local/nginx/conf/
Successfully copied 2.56kB to /usr/local/nginx/conf/
[root@docker-server2 lnmp]# docker cp web1:/var/log/nginx /usr/local/nginx/log/
Successfully copied 2.56kB to /usr/local/nginx/log/
[root@docker-server2 lnmp]# docker cp web1:/usr/share/nginx/html /usr/local/nginx/
Successfully copied 4.1kB to /usr/local/nginx/
[root@docker-server2 lnmp]# docker cp web1:/etc/nginx/conf.d /usr/local/nginx/
Successfully copied 3.58kB to /usr/local/nginx/
[root@docker-server2 lnmp]#
[root@docker-server2 lnmp]#
[root@docker-server2 lnmp]# ls /usr/local/nginx/
conf conf.d html log
[root@docker-server2 lnmp]# vim /usr/local/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;
include fastcgi_params;
}
}
拷贝PHP文件
[root@docker-server2 ~]# docker run -d --name=php111 php:8.1-fpm
12b854387314f08eb837d9c9fb46b9810e157064a144880a9c0c8771e6e816fa
[root@docker-server2 ~]# docker exec -it php111 bash
root@12b854387314:/var/www/html# cd /usr/local/etc/php
root@12b854387314:/usr/local/etc/php# cp php.ini-development php.ini
root@12b854387314:/usr/local/etc/php# exit
[root@docker-server2 ~]# docker cp php111:/usr/local/etc/php/php.ini /usr/local/php/
MySQL文件准备
[root@docker-server2 ~]# mkdir -p /usr/local/mysql/{conf,data}
创建compose
[root@docker-server2 ~]# mkdir lnmp
[root@docker-server2 ~]# cd lnmp/
[root@docker-server2 lnmp]# vim docker-compose.yml
#Nginx部分
version: '3.8'
services:
web:
image: nginx:1.23.3
hostname: web
ports:
- "80:80"
volumes:
- /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /usr/local/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
- /usr/local/nginx/log/nginx:/var/log/nginx
- /usr/local/nginx/html:/usr/share/nginx/html
links:
- php
php:
image: php:8.1-fpm
hostname: php
volumes:
- /usr/local/php/www:/www
- /usr/local/php/pip.ini:/usr/local/etc/php/pip.ini
#编辑一个PHP页面
[root@docker-server2 lnmp]# vim /usr/local/php/www/index.php
<?php
echo phpinfo();
?>
[root@docker-server2 lnmp]# cp /usr/local/php/www/index.php /usr/local/nginx/html/
#写到这里测试一下
[root@docker-server2 lnmp]# docker-compose up -d
浏览器访问192.168.100.6/index.php
#这时如果想让PHP连接到MySQL的话需要进到容器里面安装mysql插件
[root@docker-server2 lnmp]# docker-compose exec php bash
root@php:/var/www/html# cd /usr/local/bin/
root@php:/usr/local/bin# ./docker-php-ext-install pdo_mysql
root@php:/usr/local/bin# ./docker-php-ext-install mysqli
#在php.ini添加进去
[root@docker-server2 lnmp]# vim /usr/local/php/php.ini
#在最后添加
extension=mysqli
extension=pdo_mysql
#然后继续写compose
[root@docker-server2 lnmp]# vim docker-compose.yml
version: '3.8'
services:
web:
image: nginx:1.23.3
hostname: web
ports:
- "80:80"
volumes:
- /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /usr/local/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
- /usr/local/nginx/log/nginx:/var/log/nginx
- /usr/local/nginx/html:/usr/share/nginx/html
links:
- php
php:
image: php:8.1-fpm
hostname: php
volumes:
- /usr/local/php/www:/www
- /usr/local/php/php.ini:/usr/local/etc/php/php.ini
links:
- mysql
mysql:
image: mysql:8.0.32
hostname: mysql
ports:
- "3306:3306"
volumes:
- /usr/local/mysql/conf:/etc/mysql/conf.d
- /usr/local/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123123
#测试
[root@docker-server2 lnmp]# docker-compose up -d
[+] Running 3/3
⠿ Container lnmp-mysql-1 Started 2.0s
⠿ Container lnmp-php-1 Started 1.9s
⠿ Container lnmp-web-1 Started 1.9s
#编辑一个页面验证PHP是否连接了mysql
#编辑之前首先需要查一下mysql容器的ip
[root@docker-server2 lnmp]# docker ps
#找到mysql容器的名字或id号
#然后用inspect查, 最下面有一个IPAddress就是
[root@docker-server2 lnmp]# docker inspect lnmp-mysql-1
[root@docker-server2 lnmp]# vim /usr/local/php/www/mysql.php
<?php
$conn = mysqli_connect("172.18.0.4", "root", "123123");
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
echo "success";
mysqli_close($conn);
?>
[root@docker-server2 lnmp]# cp /usr/local/php/www/mysql.php /usr/local/nginx/html/
浏览器访问192.168.100.6/mysql.php
如果访问时报类似于
Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /www/mysql.php:2 Stack trace: #0 {main} thrown in /www/mysql.php on line 2
的错误,那可能是你PHP在装mysql插件的时候没装上去,需要进到容器里再装一遍,然后退出来重启PHP容器
最后完整的docker-compose.yml
version: '3.8'
services:
web:
image: nginx:1.23.3
hostname: web
ports:
- "80:80"
volumes:
- /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /usr/local/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
- /usr/local/nginx/log/nginx:/var/log/nginx
- /usr/local/nginx/html:/usr/share/nginx/html
links:
- php
php:
image: php:8.1-fpm
hostname: php
volumes:
- /usr/local/php/www:/www
- /usr/local/php/php.ini:/usr/local/etc/php/php.ini
links:
- mysql
mysql:
image: mysql:8.0.32
hostname: mysql
ports:
- "3306:3306"
volumes:
- /usr/local/mysql/conf:/etc/mysql/conf.d
- /usr/local/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123123
最后用docker-compose批量启动,停止,重启
#重启
[root@docker-server2 lnmp]# docker-compose restart
[+] Running 3/3
⠿ Container lnmp-php-1 Started 1.1s
⠿ Container lnmp-mysql-1 Started 1.4s
⠿ Container lnmp-web-1 Started 1.0s
#停止
[root@docker-server2 lnmp]# docker-compose stop
[+] Running 3/3
⠿ Container lnmp-web-1 Stopped 0.4s
⠿ Container lnmp-php-1 Stopped 0.4s
⠿ Container lnmp-mysql-1 Stopped 0.8s
[root@docker-server2 lnmp]# docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
lnmp-mysql-1 "docker-entrypoint.s…" mysql exited (0)
lnmp-php-1 "docker-php-entrypoi…" php exited (0)
lnmp-web-1 "/docker-entrypoint.…" web exited (0)
#启动
[root@docker-server2 lnmp]# docker-compose start
[+] Running 3/3
⠿ Container lnmp-mysql-1 Started 0.9s
⠿ Container lnmp-php-1 Started 0.8s
⠿ Container lnmp-web-1 Started 0.9s
[root@docker-server2 lnmp]# docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
lnmp-mysql-1 "docker-entrypoint.s…" mysql running 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
lnmp-php-1 "docker-php-entrypoi…" php running 9000/tcp
lnmp-web-1 "/docker-entrypoint.…" web running 0.0.0.0:80->80/tcp, :::80->80/tcp
#当环境搭好了以后
[root@docker-server2 lnmp]# docker-compose up -d
和
[root@docker-server2 lnmp]# docker-compose down
就要慎用了,使用这两个命令后,PHP里的插件需要重新下载,并且mysql的ip会变动