• 【docker】docker容器搭建分布式LNMP,附错误及解决方案



    前言

    本博客内容仅为记录博主思路,仅供参考,一切以自己实践结果为准。


    一、架构/环境

    服务器IP地址所需软件包所需配置文件
    宿主机192.168.13.10centos:7镜像、docker容器/
    nginx容器172.13.0.10nginx-1.12.0.tar.gz、wordpress-4.9.4-zh_CN.tar.gzDockerfile、nginx.conf
    mysql容器172.13.0.20mysql-boost-5.7.20.tar.gzDockerfile、my.cnf
    php容器172.13.0.30php-7.1.10.tar.bz2Dockerfile、php.ini、php-fpm.conf、www.conf

    二、搭建步骤

    2.1 宿主机环境搭建

    systemctl disable --now firewalld
    setenforce 0
    
    #安装docker并启动
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum install -y docker-ce
    systemctl enable --now docker
    
    #修改网络转发功能(如果不修改,可能造成容器连不上外网,没办法下载环境)
    vim /etc/sysctl.conf
    	net.ipv4.ip_forward=1
    sysctl -p
    #注:若是后面在线源下载还是报错,则考虑清除/重新加载在线源,或者更新在线源
    
    #从官网获取centos:7的镜像源
    docker pull centos:7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.2 创建nginx容器

    mkdir -p /data/nginx
    cd /data/nginx
    #获取nginx-1.12.0.tar.gz wordpress-4.9.4-zh_CN.tar.gz源码包
    
    #编写Dockerfile配置文件(尽可能把命令放在一行,减少镜像层数,缩小镜像内存)
    vim Dockerfile
    FROM centos:7
    MAINTAINER this is nginx image <lnmp>
    RUN yum install -y 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 -j 2 && 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
    VOLUME [ "/usr/local/nginx/html/" ]
    CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]
    
    
    #创建nginx配置文件
    vim nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  localhost;
            charset utf-8;
            location / {
                root   html;
                index  index.html index.php;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            location ~ \.php$ {
                root           html;
                fastcgi_pass   172.13.0.30:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
                include        fastcgi_params;
            }
        }
    }
    
    #创建nginx镜像(注意最后有个点,不可省略)
    docker build -t nginx:lnmp .
    docker images
    
    #通过镜像为nginx创建docker1容器,并制定网段为172.88.0.0/16
    docker network create --subnet=172.13.0.0/16 --opt "com.docker.network.bridge.name"="docker1" lnmp
    #查看现有的容器网络模式
    docker network ls
    
    #启动nginx容器并且为容器指定IP地址
    docker run -d --name nginx -p 80:80 -m 500m --memory-swap 1g --net lnmp --ip 172.13.0.10 nginx:lnmp
    
    #验证nginx容器是否搭建成功
    curl 192.168.13.10:80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    2.3 创建mysql容器

    #创建mysql容器
    mkdir -p /data/mysql
    #下载mysql源码包,wget,直接拖入都可
    
    #编写Dockerfile配置文件
    vim Dockerfile
    FROM centos:7
    MAINTAINER this is mysql image <lnmp>
    RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make;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_EXTRA_CHARSETS=all \
    -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
    ADD my.cnf /etc/my.cnf
    EXPOSE 3306
    RUN chown -R mysql:mysql /usr/local/mysql/;chown mysql:mysql /etc/my.cnf
    WORKDIR /usr/local/mysql/bin/
    RUN ./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/;systemctl enable mysqld
    ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
    VOLUME [ "/usr/local/mysql" ]
    CMD ["/usr/sbin/init"]
    
    #编写mysql配置文件
    vim my.cnf
    [client]
    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
    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
    
    #生成mysql镜像文件并启动镜像容器(需要在对应目录中完成)
    docker build -t mysql:lnmp .
    docker run --name=mysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net lnmp --ip 172.13.0.20 mysql:lnmp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    2.4 创建php容器

    #搭建php容器
    mkdir /data/php
    cd /data/php
    
    vim Dockerfile
    FROM centos:7
    MAINTAINER this is php image <lnmp>
    RUN yum install -y 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 -j 2 ; 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
    CMD /usr/local/php/sbin/php-fpm -F
    
    #可以从别的电脑安装配置文件后靠复制过来,只需要修改939行时区,1170行mysql路径指向
    	939行:date.timezone = Asia/Shanghai
    	1170行:mysqli.default_socket = /usr/local/mysql/mysql.sock
    vim php.ini
    [PHP]
    engine = On
    short_open_tag = Off
    precision = 14
    output_buffering = 4096
    zlib.output_compression = Off
    implicit_flush = Off
    unserialize_callback_func =
    serialize_precision = -1
    disable_functions =
    disable_classes =
    zend.enable_gc = On
    expose_php = On
    max_execution_time = 30
    max_input_time = 60
    memory_limit = 128M
    error_reporting = E_ALL
    display_errors = On
    display_startup_errors = On
    log_errors = On
    log_errors_max_len = 1024
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    report_memleaks = On
    track_errors = On
    html_errors = On
    variables_order = "GPCS"
    request_order = "GP"
    register_argc_argv = Off
    auto_globals_jit = On
    post_max_size = 8M
    auto_prepend_file =
    auto_append_file =
    default_mimetype = "text/html"
    default_charset = "UTF-8"
    doc_root =
    user_dir =
    enable_dl = Off
    file_uploads = On
    upload_max_filesize = 2M
    max_file_uploads = 20
    allow_url_fopen = On
    allow_url_include = Off
    default_socket_timeout = 60
    [CLI Server]
    cli_server.color = On
    [Date]
    date.timezone = Asia/Shanghai
    [filter]
    [iconv]
    [intl]
    [sqlite3]
    [Pcre]
    [Pdo]
    [Pdo_mysql]
    pdo_mysql.cache_size = 2000
    pdo_mysql.default_socket=
    [Phar]
    [mail function]
    SMTP = localhost
    smtp_port = 25
    mail.add_x_header = On
    [SQL]
    sql.safe_mode = Off
    [ODBC]
    odbc.allow_persistent = On
    odbc.check_persistent = On
    odbc.max_persistent = -1
    odbc.max_links = -1
    odbc.defaultlrl = 4096
    odbc.defaultbinmode = 1
    [Interbase]
    ibase.allow_persistent = 1
    ibase.max_persistent = -1
    ibase.max_links = -1
    ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
    ibase.dateformat = "%Y-%m-%d"
    ibase.timeformat = "%H:%M:%S"
    [MySQLi]
    mysqli.max_persistent = -1
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.cache_size = 2000
    mysqli.default_port = 3306
    mysqli.default_socket = /usr/local/mysql/mysql.sock
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    [mysqlnd]
    mysqlnd.collect_statistics = On
    mysqlnd.collect_memory_statistics = On
    [OCI8]
    [PostgreSQL]
    pgsql.allow_persistent = On
    pgsql.auto_reset_persistent = Off
    pgsql.max_persistent = -1
    pgsql.max_links = -1
    pgsql.ignore_notice = 0
    pgsql.log_notice = 0
    [bcmath]
    bcmath.scale = 0
    [browscap]
    [Session]
    session.save_handler = files
    session.use_strict_mode = 0
    session.use_cookies = 1
    session.use_only_cookies = 1
    session.name = PHPSESSID
    session.auto_start = 0
    session.cookie_lifetime = 0
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly =
    session.serialize_handler = php
    session.gc_probability = 1
    session.gc_divisor = 1000
    session.gc_maxlifetime = 1440
    session.referer_check =
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.sid_length = 26
    session.trans_sid_tags = "a=href,area=href,frame=src,form="
    session.sid_bits_per_character = 5
    [Assertion]
    zend.assertions = 1
    [COM]
    [mbstring]
    [gd]
    [exif]
    [Tidy]
    tidy.clean_output = Off
    [soap]
    soap.wsdl_cache_enabled=1
    soap.wsdl_cache_dir="/tmp"
    soap.wsdl_cache_ttl=86400
    soap.wsdl_cache_limit = 5
    [sysvshm]
    [ldap]
    ldap.max_links = -1
    [mcrypt]
    [dba]
    [opcache]
    [curl]
    [openssl]
    
    vim php-fpm.conf
    [global]
    pid = run/php-fpm.pid
    include=/usr/local/php/etc/php-fpm.d/*.conf
    
    vim www.conf
    [www]
    user = nginx
    group = nginx
    listen = 172.13.0.30:9000
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    
    #构建php容器镜像
    docker build -t php:lnmp .
    docker images
    
    #根据php镜像创建容器并启动
    docker run -itd --name php --net lnmp --ip 172.13.0.30 -p 9000:9000 --volumes-from nginx --volumes-from mysql php:lnmp
    docker ps -a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218

    2.5 进入mysql容器进行授权

    
    #进入mysql容器进行授权
    mysql -u root -p
    	create database wordpress;
    	grant all privileges on wordpress.* to 'wordpress'@'%' identified by 'abc123';
    	grant all privileges on *.* to 'root'@'%' identified by 'abc123';
    	flush privileges;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    三、验证

    • 访问:http://192.168.13.10/wordpress/index.php
    • 出现如下画面则表示安装
      在这里插入图片描述

    四、错误集

    • 创建容器的时候,容器无法连通外网,导致下载不了make等编译程序(解决:宿主机打开路由转发功能)
    • 编译时找不到CMakeLists.txt文件(解决:ADD命令会将本机压缩文件复制到容器中并且直接解压,mysql压缩文件解压后名称会变,粗心导致WORKDIR移动的目录错误,找不到对应的文件)
  • 相关阅读:
    IT行业就业方向如何选择?
    PowerShell禁止运行脚本
    JavaScript:来一波Promise用法实例,可能是面试题吧
    k8s核心操作_构建一键上云001_K8S容器+harbor容器本地化搭建云原生环境_一键部署SpringCloud Alibaba 分布式微服务+Vue前端---分布式云原生部署架构搭建030
    聚N-乙烯基乙酰胺接枝聚苯乙烯微球PNVA-g-PSt/磺化聚苯乙烯/壳聚糖复合微球探究
    怎样通过 Etherscan 验证智能合约
    RocketMQ(20)——整合Spring Boot
    Java反射工具类
    Ubuntu18.04 ROS Melodic的cv_bridge指向问题(四种方式,包括opencv4)(转载)
    基于JavaSSM和微信小程序的智能二维码门禁管理系统
  • 原文地址:https://blog.csdn.net/H875035681/article/details/125485665