文章目录
- 一、Docker Compose 概述
- 1、Docker Compose 是什么
- 2、Docker Compose 核心概念
- 3、Docker Compose 使用步骤
- 4、Docker 与 Docker Compose 文件版本对应关系
- 二、Docker Compose 安装与卸载
- 1、二进制包安装
- 1.1、下载Docker Compose V2 版本
- 1.2、添加可执行权限
- 1.3、设置软链接
- 1.4、查看版本
- 2、yum安装
- 2.1、安装EPEL库
- 2.2、yum安装Docker Compose
- 2.3、查看版本
- 3、pip安装
- 3.1、安装python3
- 3.2、安装python3-pip并更新
- 3.3、pip安装Docker Compose
- 3.4、查看版本
- 4、卸载(针对二进制包安装)
- 三、Docker Compose命令
- 1、指令格式
- 2、常见选项
- 3、常见命令
- 四、YAML文件格式及注意事项
- 1、YAML文件格式
- 2、注意事项
- 3、数据结构
- 五、Docker Compose模板文件
- 1、environment
- 1.1、数组格式
- 1.2、字典格式
- 2、volumes
- 2.1、数据卷挂载的绝对路径和相对路径
- 2.2、使用别名挂载容器数据卷
- 3、build
- 3.1、context指定Dockerfile所在路径
- 4、depends_on
- 5、env_file
- 5.1、环境变量文件要求
- 6、networks
- 7、ports
- 8、expose
- 9、restart
- 六、示例
- 1、启动单个容器
- 1.1、创建目录
- 1.2、编写docker-compose.yml文件
- 1.3、启动容器
- 2、启动多个容器
- 2.1、编写docker-compose.yml文件
- 2.2、启动容器
- 3、定义数据卷挂载
- 3.1、创建数据卷目录和文件
- 3.2、编写docker-compose.yml文件
- 3.3、访问测试
- 七、案例
- 1、Docker Compose部署MySQL(5.7版本)
- 1.1、创建项目目录
- 1.2、拉取MySQL镜像
- 1.3、创建挂载目录
- 1.4、添加配置文件my.cnf
- 1.5、编写docker-compose.yml文件
- 1.6、运行docker-compose
- 1.7、查看启动的容器状态
- 1.8、进入容器连接测试
- 1.9、小问题:进入容器显示bash-4.2#
- 1.10、成功登入MySQL
- 2、Docker Compose 搭建 LNMP
- 2.1、目录结构
- 2.2、创建项目目录,服务子目录
- 2.3、上传wordpress源码包,准备测试页面
- 2.4、上传nginx源码包,编写nginx的Dockerfile
- 2.5、上传MySQL源码包,编写MySQL的Dockerfile
- 2.6、编写MySQL配置文件my.cnf
- 2.7、上传php的源码包,编写php的Dockerfile
- 2.8、编写docker-compose.yml文件
- 2.9、运行docker-compose
- 2.10、进入MySQL容器,进行用户授权
- 2.11、访问测试
一、Docker Compose 概述
1、Docker Compose 是什么
Docker Compose
是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker compose
是一个定义和运行多个 Docker
应用的工具,只需要定义一个 YAML 格式的配置文件docker-compose.yml
,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
2、Docker Compose 核心概念
docker-compose将所管理的容器分为三层,分别是工程(project),服务(service),以及容器(container)。
docker compose运行目录下的所有yml文件组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务可包括多个容器实例。docker-compose就是docker容器的编排工具,主要就是解决相互有依赖关系的多个容器的管理。
3、Docker Compose 使用步骤
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
4、Docker 与 Docker Compose 文件版本对应关系
二、Docker Compose 安装与卸载
安装Docker Compose的前提是基于Docker环境的,所以得提前安装Docker
1、二进制包安装
1.1、下载Docker Compose V2 版本
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-L
: 是curl
的一个选项,表示跟随重定向。如果下载链接是重定向的,这个选项会让curl
自动跟踪到最后的目标地址。"https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(uname -m)"
: 这是Docker Compose的下载URL,其中v2.5.1
指定了要下载的Docker Compose版本号。$(uname -s)
和$(uname -m)
是shell命令,分别返回当前系统的类型(如Linux
)和机器的硬件架构(如x86_64
),这样可以确保下载与当前系统架构相匹配的Docker Compose二进制文件。-o /usr/local/bin/docker-compose
:-o
或--output
指定了下载文件的保存位置及名称。这里,文件会被保存为/usr/local/bin/docker-compose
,这是Docker Compose常见的安装路径,将其放在此处可以使其在PATH环境变量中,从而可以直接在命令行中通过docker-compose
命令调用。
1.2、添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
1.3、设置软链接
sudo ln -s /usr/local/bin/docker-compose /usr/lib/docker-compose
1.4、查看版本
docker-compose --version
2、yum安装
2.1、安装EPEL库
yum install epel-release.noarch -y
2.2、yum安装Docker Compose
yum install docker-compose.noarch -y
2.3、查看版本
docker-compose version
3、pip安装
3.1、安装python3
yum install python3
3.2、安装python3-pip并更新
yum install -y python3-pip
pip3 install --upgrade pip
3.3、pip安装Docker Compose
pip3 install docker-compose
3.4、查看版本
docker-compose version
4、卸载(针对二进制包安装)
rm -rf /usr/local/bin/docker-compose
删除二进制文件即可
三、Docker Compose命令
1、指令格式
docker compose [OPTIONS] COMMAND
2、常见选项
常见选项 | 描述 |
---|---|
–ansi | 控制何时打印ANSI控制字符以格式化输出,可选值:“never”(从不)、“always”(总是)、“auto”(自动,默认)。 |
–compatibility | 使Docker Compose以向后兼容模式运行,适用于旧版Compose文件或特性。 |
–env-file | 指定一个文件来加载环境变量至Compose环境,用于配置。 |
-f, --file | 指定Compose配置文件路径,可多次使用以合并多个配置。 |
–profile ` | 启用配置文件中的特定配置概要,便于环境间切换。 |
–project-directory | 设置一个替代的工作目录作为Compose文件的基准路径。 |
-p, --project-name | 自定义项目名称,用于隔离不同项目的服务和网络命名空间。 |
3、常见命令
常见命令 | 描述 |
---|---|
build | 构建或重建服务所指定的Docker镜像。 |
convert | 将Compose文件转换为平台标准格式,增强跨环境兼容性。 |
cp | 在服务容器与本地文件系统间复制文件或目录。 |
create | 创建服务容器而不启动它们。 |
down | 停止并移除容器、网络等,清理项目环境。 |
events | 实时监控并接收容器事件。 |
exec | 在运行的容器内部执行命令。 |
images | 列出Compose管理的容器所使用的镜像。 |
kill | 强制终止服务容器。 |
logs | 查看服务容器的日志输出。 |
ls | 列出当前正在运行的Compose项目。 |
pause | 暂停服务容器的运行。 |
port | 查询服务容器端口映射到宿主机的端口。 |
ps | 列出项目中所有容器的状态。 |
pull | 拉取服务所需的镜像到本地。 |
push | 推送服务镜像到远程仓库。 |
restart | 重启服务容器。 |
rm | 删除已停止的服务容器。 |
run | 在服务上执行一次性命令,不创建新容器。 |
start | 启动已停止的服务容器。 |
stop | 停止服务容器。 |
top | 显示容器内部运行的进程信息。 |
unpause | 取消暂停状态的服务容器。 |
up | 创建并启动所有服务容器,部署项目的核心命令。 |
version | 显示当前Docker Compose的版本信息。 |
docker-compose -h # 查看帮助
docker-compose up # 创建并运行所有容器
docker-compose up -d # 创建并后台运行所有容器
docker-compose -f docker-compose.yml up -d # 指定模板
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose logs # 查看容器输出日志
docker-compose logs -f 容器名 查看容器实时日志
docker-compose pull # 拉取依赖镜像
dokcer-compose config # 检查配置
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
docker-compose up -d nginx #构建并启动nignx容器
docker-compose exec nginx bash #登录到nginx容器中
docker-compose ps #显示所有容器
docker-compose build nginx #构建镜像
docker-compose build --no-cache nginx #不带缓存的构建
docker-compose config -q #验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose events --json nginx #以json的形式输出nginx的docker日志
docker-compose pause nginx #暂停nignx容器
docker-compose unpause nginx #恢复ningx容器
docker-compose rm nginx #删除容器(删除前必须关闭容器)
四、YAML文件格式及注意事项
由于Docker Compose默认使用YAML文件 docker-compose.yml来定义多服务的应用,所以我们这里需要熟悉YAML文件的编写
1、YAML文件格式
YAML是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 json 数据描述语言,语法比 json简单的很多。
-
缩进:YAML 使用空格进行缩进,而不是制表符。缩进用来表示层级关系,通常推荐使用2个空格。
-
键值对:YAML 中的数据结构主要由键值对组成,键和值之间使用冒号(:)分隔,例如
key: value
。 -
列表(数组):使用短横线(-)开始每一项来表示列表,每个项目可以是简单的值、对象或者嵌套的列表,例如:
services:- web- db
-
对象(字典/映射):键值对集合,键必须唯一,例如:
service:name: webports:- "8080:80"
-
字符串:单引号(')和双引号(")都可以用来包围字符串,但双引号支持转义字符和变量插值。
-
布尔值和特殊值:YAML 支持
true
,false
,null
,~
(表示null),以及yes
,no
等。 -
**数组:**用中括号[]括起来
-
**hash:**用花括号{}括起来
2、注意事项
-
大小写敏感
-
空白敏感:YAML 对空白非常敏感,错误的缩进会导致解析错误。
-
行内和块样式:对于列表和对象,可以使用行内风格(紧凑在一列)或块样式(更易读)。例如,块样式的服务定义:
services:web:image: example/webports:- "8080:80"
-
注释:YAML 支持行尾注释,使用井号(#)开始,例如:
# 这是一个注释 key: value
-
字符串引号:虽然不是必需的,但在某些情况下使用引号可以避免解析错误,尤其是在字符串中包含特殊字符(如冒号、逗号等)或需要保留空白时。
-
环境变量:在 Docker Compose 中,可以在值中引用环境变量,使用
${VARIABLE}
或$VARIABLE
形式,例如:environment:- PASSWORD=${PASSWORD_ENV}
-
**符号字符后缩进1个空格:**如"冒号 : "、 "逗号 , "、"横杠 - "
-
特殊字符处理:
-
包含特殊字符用单引号(’ ')引起来会作为普通字符串处理,双引号(" "):特殊字符作为本身想表示的意思
-
#双引号示例: name: "hello, \nworld" 最后name值是两行内容 name: hello,world #单引号示例: name: 'hello, \nworld' 只会作为普通字符 name: hello,\nworld
-
3、数据结构
#对象: 键值对的字典
animal: pets#数组: 一组按次序排列的列表
- cat
- dog
- goldfish#布尔值
debug: "true"
debug: "false"#Yaml示例
languages: #序列的映射- Java- Golang- Python
websites: #映射的映射(键的值,仍然是键值对)Baidu: www.baidu.comWangyi: www.163.comSouhu: www.souhu.com
#或者
languages: ["Java","Golong","Python"]
websites: Baidu: www.baidu.comWangyi: www.163.comSouhu: www.souhu.com
#Json格式
{languages: ['Java','Golong','Python',],websites: [Baidu: 'www.baidu.com',Wangyi: 'www.163.com',Souhu: 'www.souhu.com',]
}
五、Docker Compose模板文件
1、environment
设置环境变量,主要是用来配置容器中程序所需要配置的一些参数。
1.1、数组格式
services:mysql:image: mysql:latestports:- 3307:3306environment: # 使用数组格式- MYSQL_ROOT_PASSWORD=root
1.2、字典格式
services:mysql:image: mysql:latestports:- 3307:3306environment: # 使用字典格式,类似于 docker run -e MYSQL_ROOT_PASSWORD=rootMYSQL_ROOT_PASSWORD: root
2、volumes
数据卷所挂载路径设置,挂载数据卷的默认权限是读写(rw)。
你可以在主机上挂载绝对路径,或者挂载相对路径.
相对路径是相对于当前正在使用的compose配置文件的目录进行扩展。 相对路径应始终以 . 或者 … 开始。
2.1、数据卷挂载的绝对路径和相对路径
services:mysql:image: mysql:latestports:- 3307:3306environment: # 使用字典格式,类似于 docker run -e MYSQL_ROOT_PASSWORD=rootMYSQL_ROOT_PASSWORD: rootvolumes: # 挂载绝对路径映射,没有这个路径的话会自动创建- /root/docker/composetest/tomcat/app_data:/var/lib/mysql# 或者使用相对路径映射,也会自动创建- ./app_data:/var/lib/mysql
2.2、使用别名挂载容器数据卷
可以跨多个服务并重用挂载卷,当然使挂载绝对路径或相对路径也可以重用挂载卷
但要注意一点,使用别名的方式挂载需要在顶级volumes关键字中声明挂在卷,否则启动会报错。
services:mysql:image: mysql:latestports:- 3307:3306environment:MYSQL_ROOT_PASSWORD: rootvolumes:- my_app_data:/var/lib/mysqlweb1:volumes: # 重用my_app_data- my_app_data:/var/lib/mysqlweb2:volumes: # 重用my_app_data- my_app_data:/var/lib/mysqlvolumes:my_app_data:
3、build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。
Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
services:webapp:build: ./ # 从当前目录下寻找Dockerfile文件
3.1、context指定Dockerfile所在路径
services:webapp:build:context: ./dirdockerfile: Dockerfile_flaskargs:buildno: 1
4、depends_on
解决容器的依赖、启动先后的问题
services:webapp:build: .depends_on:- db- redisredis:image: redis:latestdb:image: mysql:latest
启动顺序:redis -> db -> web
5、env_file
从文件中获取环境变量,可以为单独的文件路径或列表。
services:mysql:image: mysql:latestports:- 3307:3306env_file: .env # 仅使用单个env文件env_file: # 通过数组来使用多个env文件- ./common.env- ./apps/web.env- /opt/secrets.env
5.1、环境变量文件要求
环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
# common.env: Set development environment
MYSQL_ROOT_PASSWORD=root
6、networks
配置容器连接的容器
services:webapp:networks:- flask-netnetworks: # 在顶级networks关键字中需要声明,才会在启动时自动创建该网络,否则报错。flask-net:
7、ports
暴露端口信息。
格式宿主端口:容器端口 (HOST:CONTAINER) 。
ports:2. "80:80" # 绑定容器的80端口到主机的80端口3. "9000:8080" # 绑定容器的8080端口到主机的9000端口4. "443" # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号
8、expose
暴露端口,但是不会映射到宿主机
和ports的区别是,expose暴露容器给link到当前容器的容器,不会将端口暴露给主机。
9、restart
docker容器服务总是运行
services:webapp:networks:- flask-netrestart: always
六、示例
1、启动单个容器
1.1、创建目录
mkdir /opt/docker
cd /opt/docker/
1.2、编写docker-compose.yml文件
vim docker-compose.ymlservices:service-nginx:image: mycentos_nginx:v1container_name: nginx_v1ports:- "8080:80"
1.3、启动容器
docker-compose up -d
2、启动多个容器
2.1、编写docker-compose.yml文件
vim docker-compose.ymlservices:service-nginx:image: mycentos_nginx:v1container_name: nginx_v1ports:- "8080:80"service-tomcat:image: tomcatcontainer_name: tomcat_v1ports:- "8081:8080"
2.2、启动容器
docker-compose up -d
3、定义数据卷挂载
3.1、创建数据卷目录和文件
mkdir -p /data/nginx
echo "hello docker-compose" > /data/nginx/index.html
3.2、编写docker-compose.yml文件
vim docker-compose.ymlservices:service-nginx:image: nginxcontainer_name: nginx_v2volumes:- /data/nginx/:/usr/share/nginx/htmlports:- "80:80"service-tomcat:image: tomcatcontainer_name: tomcat_v1ports:- "8080:8080"
3.3、访问测试
curl localhost
curl `docker exec nginx_v2 hostname -i`
七、案例
1、Docker Compose部署MySQL(5.7版本)
1.1、创建项目目录
mkdir -p /opt/compose_mysql
1.2、拉取MySQL镜像
docker pull mysql:5.7
1.3、创建挂载目录
mkdir -p /home/docker/mysql:5.7/{log,data,conf.d}
1.4、添加配置文件my.cnf
vim /home/docker/mysql\:5.7/conf.d/my.cnf[client]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock[mysql]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock[mysqld]
port=3306
user=mysql
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id = 1
default_authentication_plugin=mysql_native_password
symbolic-links=0
max_connections=1000
character-set-server=utf8mb4
default-storage-engine=INNODB
lower_case_table_names=0
max_allowed_packet=16M
default-time_zone='+8:00'
1.5、编写docker-compose.yml文件
version: '3'
services:mysql:image: mysql:5.7container_name: mysql5.7environment:- MYSQL_ROOT_PASSWORD=123456volumes:- /home/docker/mysql8/log:/var/log/mysql- /home/docker/mysql8/data:/var/lib/mysql- /home/docker/mysql8/conf.d:/etc/mysql/conf.d- /etc/localtime:/etc/localtime:roports:- 3306:3306restart: always
1.6、运行docker-compose
docker-compose -f docker-compose.yml up -d
1.7、查看启动的容器状态
docker-compose ps
1.8、进入容器连接测试
docker exec -it mysql5.7 bash
1.9、小问题:进入容器显示bash-4.2#
出现上述问题是因为在/root/目录下缺少**.bash_profile .bashrc** 这两个文件
[root@localhost mysql:5.7]# docker exec -it b3f7b6800038 /bin/bash
bash-4.2# cd /etc/skel/
bash-4.2# cp .bash_profile /root/
bash-4.2# cp .bashrc /root
1.10、成功登入MySQL
mysql -uroot -p
#交互式输入登录密码
2、Docker Compose 搭建 LNMP
2.1、目录结构
yum install -y tree
tree -L 3 /opt/compose_lnmp/
2.2、创建项目目录,服务子目录
mkdir -p /opt/compose_lnmp/{mysql,nginx,php,wwwroot}
2.3、上传wordpress源码包,准备测试页面
wordpress源码包
[root@localhost ~]# cd /opt/compose_lnmp/wwwroot/
[root@localhost wwwroot]# ls
wordpress-4.9.4-zh_CN.tar.gz
[root@localhost wwwroot]# tar xzvf wordpress-4.9.4-zh_CN.tar.gz
[root@localhost wwwroot]# echo "hello docker-compose_wordpress" > /opt/compose_lnmp/wwwroot/index.html
2.4、上传nginx源码包,编写nginx的Dockerfile
nginx源码包
[root@localhost ~]# cd /opt/compose_lnmp/nginx/
[root@localhost nginx]# ls
nginx-1.18.0.
[root@localhost nginx]# vim DockerfileFROM centos:7
MAINTAINER this is nginx image
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make && useradd -M -s /sbin/nologin nginx
ADD nginx-1.18.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.18.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make -j2 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx.conf /usr/local/nginx/conf/
#ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html/
RUN chmod 777 -R /usr/local/nginx/html/
EXPOSE 80
EXPOSE 443
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
2.5、上传MySQL源码包,编写MySQL的Dockerfile
MySQL源码包
[root@localhost ~]# cd /opt/compose_lnmp/mysql/
[root@localhost mysql]# ls
mysql-boost-5.7.20.tar.gz
[root@localhost mysql]# vim DockerfileFROM centos:7MAINTAINER misakivv 2830909671@qq.comRUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
RUN useradd -M -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/WORKDIR /usr/local/src/mysql-5.7.20/RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j 2 && make installRUN chown -R mysql:mysql /usr/local/mysql/
ADD my.cnf /etc/
RUN chown mysql:mysql /etc/my.cnf
ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATHWORKDIR /usr/local/mysql/RUN bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/dataRUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/EXPOSE 3306CMD /usr/local/mysql/bin/mysqld
2.6、编写MySQL配置文件my.cnf
[root@localhost mysql]# vim my.cnf[client]
port = 3306
socket = /usr/local/mysql/mysql.sock[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
2.7、上传php的源码包,编写php的Dockerfile
php源码包
[root@localhost ~]# cd /opt/compose_lnmp/php/
[root@localhost php]# ls
php-7.4.5.tar.gz
[root@localhost php]# vim DockerfileFROM centos:7MAINTAINER misakivv 2830909671@qq.comRUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel
RUN useradd -M -s /sbin/nologin nginx
ADD php-7.4.5.tar.gz /usr/local/src/
WORKDIR /usr/local/src/php-7.4.5
RUN ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make && make installENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATHRUN \cp /usr/local/src/php-7.4.5/php.ini-development /usr/local/php/lib/php.ini \
&& sed -i 's#mysqli.default_socket =#mysqli.default_socket = /usr/local/mysql/mysql.sock#' /usr/local/php/lib/php.ini \
&& sed -i '939 s#;date.timezone =#date.timezone = Asia/Shanghai#' /usr/local/php/lib/php.ini
RUN \cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf \
&& sed -i '17 s/^;//' /usr/local/php/etc/php-fpm.conf
RUN \cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf \
&& sed -i 's#user = nobody#user = nginx#' /usr/local/php/etc/php-fpm.d/www.conf \
&& sed -i 's#group = nobody#group = nginx#' /usr/local/php/etc/php-fpm.d/www.conf \ && sed -i 's#listen = 127.0.0.1:9000#listen = 172.18.0.30:9000#' /usr/local/php/etc/php-fpm.d/www.confEXPOSE 9000ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]
2.8、编写docker-compose.yml文件
[root@localhost compose_lnmp]# docker pull centos:7version: '2'
services:nginx:container_name: nginxhostname: nginxbuild:context: ./nginxdockerfile: Dockerfileports:- 1315:80- 1316:443networks:lnmp:ipv4_address: 172.18.0.10volumes:- ./wwwroot/:/usr/local/nginx/htmlmysql:container_name: mysqlhostname: mysqlbuild:context: ./mysqldockerfile: Dockerfileports:- 3306:3306networks:lnmp:ipv4_address: 172.18.0.20volumes:- /usr/local/mysqlphp:hostname: phpbuild:context: ./phpdockerfile: Dockerfilecontainer_name: phpports:- 9000:9000networks:lnmp:ipv4_address: 172.18.0.30volumes_from:- nginx- mysqldepends_on:- nginx- mysqllinks:- nginx- mysql
networks:lnmp:driver: bridgeipam:config:- subnet: 172.18.0.0/16
2.9、运行docker-compose
[root@localhost compose_lnmp]# docker-compose -f docker-compose.yml up -d
2.10、进入MySQL容器,进行用户授权
docker exec -it mysql /bin/bash
mysql -uroot -p
mysql> create database wordpress;
mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456';
mysql> flush privileges;
2.11、访问测试
192.168.112.60:1315/wordpress/wp-admin/setup-config.php