使用docker-compose编排Lnmp(dockerfile) 完成Wordpress

目录

[一、 Docker-Compose](#一、 Docker-Compose)

1.1Docker-Compose介绍

1.2环境准备

1.2.1准备容器目录及相关文件

1.2.2关闭防火墙关闭防护

1.2.3下载centos:7镜像

[1.3Docker-Compose 编排nginx](#1.3Docker-Compose 编排nginx)

1.3.1切换工作目录

[1.3.2编写 Dockerfile 文件](#1.3.2编写 Dockerfile 文件)

1.3.3修改nginx.conf配置文件

[1.4Docker-Compose 编排mysql](#1.4Docker-Compose 编排mysql)

1.4.1切换工作目录

[1.4.2编写 Dockerfile 文件](#1.4.2编写 Dockerfile 文件)

1.4.3准备my.cnf文件

[1.5Docker-Compose 编排php](#1.5Docker-Compose 编排php)

1.5.1切换工作目录

[1.5.2编写 Dockerfile 文件](#1.5.2编写 Dockerfile 文件)

[1.5.3准备 php.ini、php-fpm.conf、www.conf 配置文件](#1.5.3准备 php.ini、php-fpm.conf、www.conf 配置文件)

1.5.3.1修改php.ini

1.5.3.2修改php-fmp.conf

1.5.3.3修改www.conf

[1.6下载 Docker Compose 并安装](#1.6下载 Docker Compose 并安装)

1.7编写docker-compose.yml文件

1.7.1启动服务

1.7.2查看镜像和容器

[1.8进入容器登录 mysql 授权](#1.8进入容器登录 mysql 授权)

[1.9创建一个新的配置文件 wp-config.php](#1.9创建一个新的配置文件 wp-config.php)

[1.10浏览器访问 wordpress](#1.10浏览器访问 wordpress)


一、 Docker-Compose

1.1Docker-Compose介绍

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)

Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。

1.2环境准备

1.2.1准备容器目录及相关文件

1.2.2关闭防火墙关闭防护

复制代码
systemctl stop firewalld
setenforce 0

1.2.3下载centos:7镜像

复制代码
docker pull centos:7 

1.3Docker-Compose 编排nginx

1.3.1切换工作目录

1.3.2编写 Dockerfile 文件

复制代码
FROM centos:7
MAINTAINER this is nginx image <zzz1>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make && useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.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;" ]

1.3.3修改nginx.conf配置文件

1.3.4创建html文件夹,并解压wordpress

1.4Docker-Compose 编排mysql

1.4.1切换工作目录

1.4.2编写 Dockerfile 文件

复制代码
FROM centos:7
MAINTAINER this is mysql image <zzz2>
RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
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 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j 4 && make install
ADD my.cnf /etc/
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
RUN useradd -M -s /sbin/nologin  mysql && chown mysql:mysql /etc/my.cnf && chown -R mysql:mysql /usr/l
ocal/mysql/ && /usr/local/mysql/bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data && cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/
systemd/system/
EXPOSE 3306
CMD ["/usr/local/mysql/bin/mysqld"]

1.4.3准备my.cnf文件

复制代码
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock

[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock
auto-rehash

[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
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
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

1.5Docker-Compose 编排php

1.5.1切换工作目录

1.5.2编写 Dockerfile 文件

复制代码
FROM centos:7
MAINTAINER this is php image <zzz3>
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 && useradd -M -s /sbin/nologin nginx
ADD php-7.1.10.tar.bz2 /usr/local/src/
WORKDIR /usr/local/src/php-7.1.10
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 -j2 && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
ADD php.ini /usr/local/php/lib/
ADD php-fpm.conf /usr/local/php/etc/
ADD www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE 9000
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]

1.5.3准备 php.ini、php-fpm.conf、www.conf 配置文件

1.5.3.1修改php.ini
复制代码
[root@localhost php]# vim php.ini
 939 date.timezone = Asia/Shanghai  # 取消注释,修改
1170 mysqli.default_socket = /usr/local/mysql/mysql.sock
# MySQL数据库的默认socket文件路径,用于PHP连接MySQL数据库时寻找MySQL服务器的通信端口
[root@localhost php]# egrep -v "^;" php.ini | egrep -v "^$"
# 显示php.ini文件中的非注释和非空行内容,即显示出配置文件中的有效配置项
1.5.3.2修改php-fmp.conf
1.5.3.3修改www.conf

1.6下载 Docker Compose 并安装

复制代码
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# `uname -s`-`uname -m`也可以写成$(uname -s) 和 $(uname -m):分别会自动替换为你的系统类型(如:Linux)和机器架构(如:x86_64),确保你下载的是适合你系统的版本。
# curl -L:这部分表示使用curl命令进行下载,并且使用-L参数来跟随重定向
# -o /usr/local/bin/docker-compose: 表示将下载的文件保存为/usr/local/bin目录下的docker-compose文件



#安装
chmod +x /usr/local/bin/docker-compose
 
#查看版本
docker-compose --version

1.7编写docker-compose.yml文件

复制代码
#定义docker-compose版本,可以是2 或 3
version: '3'
services:
  nginx:
    container_name: nginx
    hostname: nginx
    build:
      context: /opt/compose_lnmp/nginx/
      dockerfile: Dockerfile
    ports:
      - 80:80
      - 443:443
    #设置数据卷挂载
    volumes:
      - /opt/compose_lnmp/nginx/html:/usr/local/nginx/html
    networks:
      lnmp:
        ipv4_address: 172.18.0.10

  mysql:
    container_name: mysql
    build:
      context: /opt/compose_lnmp/mysql
      dockerfile: Dockerfile
    ports:
      - 3306:3306
    networks:
      lnmp:
        ipv4_address: 172.18.0.20
volumes:
      - db-data:/usr/local/mysql
    privileged: true

  php:
    container_name: php
    build:
      context: /opt/compose_lnmp/php
      dockerfile: Dockerfile
    ports:
      - 9000:9000
    networks:
      lnmp:
        ipv4_address: 172.18.0.30
    volumes:
      - db-data:/usr/local/mysql
      - ./nginx/html:/usr/local/nginx/html
    depends_on:
      - nginx
      - mysql

networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

volumes:
  db-data:

内容解释如下:

复制代码
#定义docker-compose版本,可以是2 或 3
version: '3' 定义版本
services:  定义服务
  nginx:   
    container_name: nginx     #指定容器的名称为nginx
    hostname: nginx           #容器的主机名为nginx
    build:                   #构建上下文和Dockerfile的位置
      context: /opt/compose_lnmp/nginx/ 指明Dockerfile文件目录
      dockerfile: Dockerfile   dockerfile文件名称
    ports:           暴露端口
      - 80:80
      - 443:443            #将宿主机的80端口映射到容器的80端口,将宿主机的443端口映射到容器的443端口
    #设置数据卷挂载
    volumes:
      - /opt/compose_lnmp/nginx/html:/usr/local/nginx/html   
    networks:
      lnmp:                #将该服务连接到名为lnmp的网络,并指定了容器的IPv4地址
        ipv4_address: 172.18.0.10

  mysql:   定义第二个服务
    container_name: mysql   
    build:
      context: /opt/compose_lnmp/mysql
      dockerfile: Dockerfile
    ports:
      - 3306:3306         #将宿主机的3306端口映射到容器的3306端口
    networks:    给容器自定义ip地址
      lnmp:
        ipv4_address: 172.18.0.20
volumes:       通过顶级卷创建数据卷
      - db-data:/usr/local/mysql
    privileged: true            #使容器内的root拥有真正的root权限

  php:   第三个服务是php
    container_name: php
    build:
      context: /opt/compose_lnmp/php
      dockerfile: Dockerfile
    ports:
      - 9000:9000               #将宿主机的9000端口映射到容器的9000端口
    networks:
      lnmp:
        ipv4_address: 172.18.0.30
    volumes:
      - db-data:/usr/local/mysql
      - ./nginx/html:/usr/local/nginx/html
    depends_on:                    # 声明了该服务依赖于nginx和mysql服务
      - nginx
      - mysql

networks:                        # 定义了一个叫做lnmp的网络,使用了bridge驱动
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16           # 指定了IP地址池的子网范围

volumes: 创建顶级卷,因为在版本3不支持volumes_from,需要通过顶级卷来实现容器之间的数据共享
  db-data:      #db-data 用于 MySQL 数据

1.7.1启动服务

保存到一个名为 docker-compose.yml 的文件中,然后在包含该文件的目录中运行 docker-compose up -d 命令来启动这个环境

1.7.2查看镜像和容器

1.8进入容器登录 mysql 授权

复制代码
docker exec -it mysql bash
mysql -u root -p
回车
create database wordpress;
grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123123';
grant all privileges on *.* to 'root'@'%' identified by '123123';
flush privileges;

1.9创建一个新的配置文件 wp-config.php

1.10浏览器访问 wordpress

再次去浏览器访问http://192.168.246.13/wordpress/index.php

如果遇到问题,报错,镜像拉去不下来

复制代码
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"  报错
 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum makecache
# 如果遇到类似dns问题,可修改dns、替换阿里源尝试解决

添加下面的
vim /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p

在ens33网卡中加入
DNS2=114.114.114.114然后重启网卡
systemctl restart network

systemctl restart docker
相关推荐
少妇的美梦15 小时前
logstash教程
运维
容器魔方15 小时前
Bloomberg 正式加入 Karmada 用户组!
云原生·容器·云计算
chen94515 小时前
k8s集群部署vector日志采集器
运维
chen94515 小时前
aws ec2部署harbor,使用s3存储
运维
muyun280020 小时前
Docker 下部署 Elasticsearch 8 并集成 Kibana 和 IK 分词器
elasticsearch·docker·容器
東雪蓮☆20 小时前
深入理解 LVS-DR 模式与 Keepalived 高可用集群
linux·运维·服务器·lvs
qq_2642208920 小时前
LVS负载均衡群集和LVS+Keepalived群集
运维·负载均衡·lvs
乌萨奇也要立志学C++21 小时前
【Linux】进程概念(二):进程查看与 fork 初探
linux·运维·服务器
雨落Liy21 小时前
Nginx 从入门到进阶:反向代理、负载均衡与高性能实战指南
运维·nginx·负载均衡
Nazi621 小时前
k8s的dashboard
云原生·容器·kubernetes