Docker Compose

目录

一、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简单的很多。

  1. 缩进:YAML 使用空格进行缩进,而不是制表符。缩进用来表示层级关系,通常推荐使用2个空格。

  2. 键值对:YAML 中的数据结构主要由键值对组成,键和值之间使用冒号(:)分隔,例如 key: value

  3. 列表(数组):使用短横线(-)开始每一项来表示列表,每个项目可以是简单的值、对象或者嵌套的列表,例如:

    services:
      - web
      - db
    
  4. 对象(字典/映射):键值对集合,键必须唯一,例如:

    service:
      name: web
      ports:
        - "8080:80"
    
  5. 字符串:单引号(')和双引号(")都可以用来包围字符串,但双引号支持转义字符和变量插值。

  6. 布尔值和特殊值:YAML 支持 true, false, null, ~(表示null),以及 yes, no 等。

  7. 数组:用中括号[]括起来

  8. hash:用花括号{}括起来

2、注意事项

  • 大小写敏感

  • 空白敏感:YAML 对空白非常敏感,错误的缩进会导致解析错误。

  • 行内和块样式:对于列表和对象,可以使用行内风格(紧凑在一列)或块样式(更易读)。例如,块样式的服务定义:

    services:
      web:
        image: example/web
        ports:
          - "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.com
  Wangyi: www.163.com
  Souhu: www.souhu.com
#或者 
languages: ["Java","Golong","Python"]
websites: 
  Baidu: 
    www.baidu.com
  Wangyi: 
    www.163.com
  Souhu: 
    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:latest
    ports:
      - 3307:3306
    environment:	# 使用数组格式
      - MYSQL_ROOT_PASSWORD=root

1.2、字典格式

services:
  mysql:
    image: mysql:latest
    ports:
      - 3307:3306
	environment:	# 使用字典格式,类似于 docker run -e MYSQL_ROOT_PASSWORD=root
	  MYSQL_ROOT_PASSWORD: root

2、volumes

数据卷所挂载路径设置,挂载数据卷的默认权限是读写(rw)。

你可以在主机上挂载绝对路径,或者挂载相对路径.

相对路径是相对于当前正在使用的compose配置文件的目录进行扩展。 相对路径应始终以 . 或者 … 开始。

2.1、数据卷挂载的绝对路径和相对路径

services:
  mysql:
    image: mysql:latest
    ports:
      - 3307:3306
	environment:	# 使用字典格式,类似于 docker run -e MYSQL_ROOT_PASSWORD=root
	  MYSQL_ROOT_PASSWORD: root
    volumes:	
   	  # 挂载绝对路径映射,没有这个路径的话会自动创建
      - /root/docker/composetest/tomcat/app_data:/var/lib/mysql

      # 或者使用相对路径映射,也会自动创建
      - ./app_data:/var/lib/mysql

2.2、使用别名挂载容器数据卷

可以跨多个服务并重用挂载卷,当然使挂载绝对路径或相对路径也可以重用挂载卷

但要注意一点,使用别名的方式挂载需要在顶级volumes关键字中声明挂在卷,否则启动会报错。

services:
  mysql:
    image: mysql:latest
    ports:
      - 3307:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - my_app_data:/var/lib/mysql
  web1:
    volumes:	# 重用my_app_data
      - my_app_data:/var/lib/mysql
  web2:
    volumes:	# 重用my_app_data
      - my_app_data:/var/lib/mysql

volumes:
  my_app_data:

3、build

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。

Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

services:

  webapp:
    build: ./		# 从当前目录下寻找Dockerfile文件

3.1、context指定Dockerfile所在路径

services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile_flask
      args:
        buildno: 1

4、depends_on

解决容器的依赖、启动先后的问题

services:
  webapp:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis:latest

  db:
    image: mysql:latest

启动顺序:redis -> db -> web

5、env_file

从文件中获取环境变量,可以为单独的文件路径或列表。

services:
  mysql:
    image: mysql:latest
    ports:
      - 3307:3306
	env_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-net

networks:	# 在顶级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-net
	restart: always

六、示例

1、启动单个容器

1.1、创建目录

mkdir /opt/docker
cd /opt/docker/

1.2、编写docker-compose.yml文件

vim docker-compose.yml

services:
  service-nginx:
    image: mycentos_nginx:v1
    container_name: nginx_v1
    ports:
      - "8080:80"

1.3、启动容器

docker-compose up -d

2、启动多个容器

2.1、编写docker-compose.yml文件

vim docker-compose.yml

services:
  service-nginx:
    image: mycentos_nginx:v1
    container_name: nginx_v1
    ports:
      - "8080:80"
  service-tomcat:
    image: tomcat
    container_name: tomcat_v1
    ports:
      - "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.yml

services:
  service-nginx:
    image: nginx
    container_name: nginx_v2
    volumes:
      - /data/nginx/:/usr/share/nginx/html
    ports:
      - "80:80"
  service-tomcat:
    image: tomcat
    container_name: tomcat_v1
    ports:
      - "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.7
    container_name: mysql5.7
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - /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:ro
    ports:
      - 3306:3306
    restart: 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 Dockerfile

FROM 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 Dockerfile

FROM centos:7

MAINTAINER misakivv [email protected]

RUN 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 install

RUN 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:$PATH

WORKDIR /usr/local/mysql/

RUN bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/

EXPOSE 3306

CMD /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 = 1

sql_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 Dockerfile

FROM centos:7

MAINTAINER misakivv [email protected]

RUN 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 install

ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH

RUN \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.conf

EXPOSE 9000

ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]

2.8、编写docker-compose.yml文件

[root@localhost compose_lnmp]# docker pull centos:7

version: '2'
services:
  nginx:
    container_name: nginx
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1315:80
      - 1316:443
    networks:
      lnmp:
        ipv4_address: 172.18.0.10
    volumes:
      - ./wwwroot/:/usr/local/nginx/html
  mysql:
    container_name: mysql
    hostname: mysql
    build:
      context: ./mysql
      dockerfile: Dockerfile
    ports:
      - 3306:3306
    networks:
      lnmp:
        ipv4_address: 172.18.0.20
    volumes:
      - /usr/local/mysql
  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php
    ports:
      - 9000:9000
    networks:
      lnmp:
        ipv4_address: 172.18.0.30
    volumes_from:
      - nginx
      - mysql
    depends_on:
      - nginx
      - mysql
    links:
      - nginx
      - mysql
networks:
  lnmp:
    driver: bridge
    ipam:
      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

热门相关:恶魔总裁霸道宠:老婆,太腹黑   我真不是学神   来自地狱的男人   极品仙师   女王嫁到:老公,太凶了