實(shí)驗(yàn)前準(zhǔn)備
宿主機(jī):192.168.188.17,安裝docker、docker-compose
準(zhǔn)備以下壓縮包和配置文件nginx-1.12.0.tar.gz、wordpress-4.9.4-zh_CN.tar.gz、nginx.conf、mysql-boost-5.7.20.tar.gz、my.cnf、php-7.1.10.tar.bz2、php-fpm.conf、php.ini、www.conf
安裝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
這個(gè)下得很慢,自己想辦法搞一份也行,把它放到/usr/local/bin/目錄下
cp /opt/docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
可以看一下版本檢查能不能用
docker-compose --version
Nginx
準(zhǔn)備工作目錄
mkdir -p /opt/compose_lnmp/compose_nginx/nginx
cp /opt/nginx-1.12.0.tar.gz /opt/compose_lnmp/compose_nginx/nginx/
cp /opt/wordpress-4.9.4-zh_CN.tar.gz /opt/compose_lnmp/compose_nginx/nginx/
準(zhǔn)備Dockerfile腳本
vim /opt/compose_lnmp/compose_nginx/nginx/Dockerfile
FROM centos:7
MAINTAINER this is nginx image <lnmp>
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 -j 4 && 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;" ]
Dockerfile的解釋如下
#基礎(chǔ)鏡像
FROM centos:7
#維護(hù)者信息
MAINTAINER this is nginx image <lnmp>
#安裝依賴包,并且添加nginx用戶
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin nginx
#將Dockerfile所在目錄下的nginx-1.12.0.tar.gz壓縮包添加到容器中/usr/local/src/的目錄下(會(huì)自動(dòng)解壓)
ADD nginx-1.12.0.tar.gz /usr/local/src/
#進(jìn)入容器的/usr/local/src/nginx-1.12.0目錄
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 4 && make install
#添加環(huán)境變量
ENV PATH /usr/local/nginx/sbin:$PATH
#將Dockerfile所在目錄下的nginx.conf配置文件添加到容器中/usr/local/nginx/conf/的目錄下
ADD nginx.conf /usr/local/nginx/conf/
#將Dockerfile所在目錄下的wordpress-4.9.4-zh_CN.tar.gz添加到容器中/usr/local/nginx/html/的目錄下(自動(dòng)解壓)
ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html
#為/usr/local/nginx/html/賦權(quán)
RUN chmod 777 -R /usr/local/nginx/html/
#映射的容器端口
EXPOSE 80
#允許被掛載的目錄
VOLUME [ "/usr/local/nginx/html/" ]
#開啟容器后執(zhí)行的命令
CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]
準(zhǔn)備nginx.conf
搞一份nginx.conf配置文件
cp /opt/nginx.conf /opt/compose_lnmp/compose_nginx/nginx/
主要是增加一個(gè)動(dòng)態(tài)頁(yè)面的location塊,這里的IP要寫PHP服務(wù)的容器ip
主要配置代碼以及少量解釋
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.php
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
root html;
#這個(gè)ip和端口就是php容器的ip和服務(wù)端口
fastcgi_pass 172.20.0.30:9000;
fastcgi_index index.php;
#$fastcgi_script_name類似于外部變量,你在瀏覽器訪問(wèn)時(shí)輸?shù)膗ri是什么這里就是什么
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}
}
Mysql
準(zhǔn)備工作目錄
mkdir -p /opt/compose_lnmp/compose_mysql/mysql
cp mysql-boost-5.7.20.tar.gz /opt/compose_lnmp/compose_mysql/mysql/
編寫Dockerfile腳本
vim /opt/compose_lnmp/compose_mysql/mysql/Dockerfile
FROM centos:7
MAINTAINER this is mysql images <lnmp>
RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ 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 -j4;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" ]
Dockerfile解釋
#基礎(chǔ)鏡像
FROM centos:7
#維護(hù)者信息
MAINTAINER this is mysql images <lnmp>
#安裝依賴包,添加mysql用戶
RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin mysql
#向容器的/usr/local/src/目錄添加mysql-boost-5.7.20.tar.gz壓縮包(自動(dòng)解壓)
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
#進(jìn)入這個(gè)目錄
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 -j4;make install
#向容器的/etc/my.cnf目錄添加my.cnf
ADD my.cnf /etc/my.cnf
#映射端口
EXPOSE 3306
#改變所屬用戶
RUN chown -R mysql:mysql /usr/local/mysql/;chown mysql:mysql /etc/my.cnf
#進(jìn)入這個(gè)目錄
WORKDIR /usr/local/mysql/bin/
#初始化mysql數(shù)據(jù)庫(kù)
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
#添加環(huán)境變量
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
#允許掛載的目錄
VOLUME [ "/usr/local/mysql" ]
#容器啟動(dòng)后執(zhí)行
CMD [ "/usr/sbin/init" ]
準(zhǔn)備my.cnf
搞一份my.cnf配置文件
cp /opt/my.cnf /opt/compose_lnmp/compose_mysql/mysql/
my.cnf里設(shè)置大概如下
[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
PHP
準(zhǔn)備工作目錄
mkdir -p /opt/compose_lnmp/compose_php/php
cp /opt/php-7.1.10.tar.bz2 /opt/compose_lnmp/compose_php/php/
編寫Dockerfile腳本
vim /opt/compose_lnmp/compose_php/php/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 4 ; 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
Dockerfile解釋
#基礎(chǔ)鏡像
FROM centos:7
#維護(hù)者信息
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
#向容器的/usr/local/src/目錄添加php-7.1.10.tar.bz2 壓縮包(自動(dòng)解壓)
ADD php-7.1.10.tar.bz2 /usr/local/src/
#進(jìn)入這個(gè)目錄
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 4 ; make install
#添加環(huán)境變量
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
#向容器的/usr/local/php/lib/目錄添加php.ini
ADD php.ini /usr/local/php/lib/
#向容器的/usr/local/php/etc/目錄添加php-fpm.conf
ADD php-fpm.conf /usr/local/php/etc/
##向容器的/usr/local/php/etc/php-fpm.d/目錄添加www.conf
ADD www.conf /usr/local/php/etc/php-fpm.d/
#映射端口
EXPOSE 9000
#容器啟動(dòng)后執(zhí)行的命令
CMD /usr/local/php/sbin/php-fpm -F
準(zhǔn)備相關(guān)文件
cp /opt/php.ini /opt/compose_lnmp/compose_php/php/
vim /opt/compose_lnmp/compose_php/php/php.ini
進(jìn)行如下修改
取消注釋,修改時(shí)區(qū)
修改套接字路徑
cp /opt/php-fpm.conf /opt/compose_lnmp/compose_php/php/
vim /opt/compose_lnmp/compose_php/php/php-fpm.conf
php-fpm.conf需要進(jìn)行如下修改
取消注釋
cp /opt/www.conf /opt/compose_lnmp/compose_php/php/
vim /opt/compose_lnmp/compose_php/php/www.conf
www.conf需要進(jìn)行如下修改
修改用戶和組
修改監(jiān)聽ip和端口
編寫docker-compose.yml配置文件
這里坑很多,如果要自己修改,建議看懂了再改
version: '3'
services:
nginx:
container_name: nginx
hostname: nginx
build:
context: /opt/compose_lnmp/compose_nginx/nginx
dockerfile: Dockerfile
ports:
- 1216:80
- 1217:443
privileged: true
networks:
lnmp:
ipv4_address: 172.20.0.10
volumes:
- nginx-data:/usr/local/nginx/html/wordpress
mysql:
container_name: mysql
hostname: mysql
build:
context: /opt/compose_lnmp/compose_mysql/mysql
dockerfile: Dockerfile
ports:
- 1226:3306
privileged: true
networks:
lnmp:
ipv4_address: 172.20.0.20
php:
container_name: php
hostname: php
build:
context: /opt/compose_lnmp/compose_php/php
dockerfile: Dockerfile
ports:
- 1236:9000
privileged: true
networks:
lnmp:
ipv4_address: 172.20.0.30
volumes:
- nginx-data:/usr/local/nginx/html/wordpress
- mysql-data:/usr/local/mysql/
volumes:
nginx-data:
mysql-data:
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
解釋如下
#語(yǔ)法版本,這個(gè)版本不一樣可能會(huì)有一定影響
version: '3'
services:
#nginx的配置
nginx:
#容器名
container_name: nginx
#主機(jī)名
hostname: nginx
#用來(lái)指定dockerfile的模塊
build:
#dockerfile的路徑
context: /opt/compose_lnmp/compose_nginx/nginx
#dockerfile的名字
dockerfile: Dockerfile
#端口映射,前面是宿主機(jī)的端口,后面是容器端口
ports:
- 1216:80
- 1217:443
#給容器root權(quán)限
privileged: true
#網(wǎng)絡(luò)相關(guān)
networks:
lnmp:
ipv4_address: 172.20.0.10
#將nginx-data掛載到nginx容器的/usr/local/nginx/html/wordpress
volumes:
- nginx-data:/usr/local/nginx/html/wordpress
#mysql配置
mysql:
container_name: mysql
hostname: mysql
build:
context: /opt/compose_lnmp/compose_mysql/mysql
dockerfile: Dockerfile
ports:
- 1226:3306
privileged: true
networks:
lnmp:
ipv4_address: 172.20.0.20
#php的配置
php:
container_name: php
hostname: php
build:
context: /opt/compose_lnmp/compose_php/php
dockerfile: Dockerfile
ports:
- 1236:9000
privileged: true
networks:
lnmp:
ipv4_address: 172.20.0.30
#將nginx-data掛載到/usr/local/nginx/html/wordpress,將mysql-data掛載到/usr/local/mysql/
volumes:
- nginx-data:/usr/local/nginx/html/wordpress
- mysql-data:/usr/local/mysql/
#創(chuàng)建兩個(gè)卷用于掛載
volumes:
nginx-data:
mysql-data:
#自定義網(wǎng)絡(luò)
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
目錄結(jié)構(gòu)
啟動(dòng)
cd /opt/compose_lnmp/
docker-compose -f docker-compose.yml up -d
選項(xiàng)解釋
-f, --file FILE :使用特定的 compose 模板文件,默認(rèn)為 docker-compose.yml
-p, --project-name NAME :指定項(xiàng)目名稱,默認(rèn)使用目錄名稱
-d :在后臺(tái)運(yùn)行
在一段漫長(zhǎng)的等待之后
看一下容器有沒有都啟動(dòng)
測(cè)試
Mysql授權(quán)
進(jìn)入mysql容器
docker exec -it web02 bash
mysql -u root -p
create database wordpress;
grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
grant all privileges on *.* to 'root'@'%' identified by '123456';
flush privileges;
測(cè)試
瀏覽器訪問(wèn)http://192.168.188.17:1216/wordpress/index.php
問(wèn)題
在實(shí)驗(yàn)過(guò)程中有兩個(gè)問(wèn)題糾纏了我很久
Mysql容器無(wú)權(quán)訪問(wèn)問(wèn)題
具體報(bào)錯(cuò):Can t connect to local MySQL server through socket ‘/usr/local/mysql/mysql.soc’
報(bào)錯(cuò)分析:字面上看就是單純的沒找到.sock文件,根據(jù)網(wǎng)上的方法進(jìn)行排查,發(fā)現(xiàn)/etc/my.cnf中寫的是對(duì)的,但是.sock文件就是沒生成,當(dāng)我重啟mysqld服務(wù)時(shí)發(fā)現(xiàn)居然沒有權(quán)限,我才意識(shí)到可能是容器沒有root權(quán)限
解決方法:在vim docker-compose.yml中為mysql容器添加了權(quán)限,具體如下:
重新生成并測(cè)試,解決問(wèn)題文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-799920.html
瀏覽器訪問(wèn)file not found問(wèn)題
具體問(wèn)題:當(dāng)瀏覽器輸入http://192.168.188.17:1216/wordpress/index.php時(shí)出現(xiàn)File not found報(bào)錯(cuò),nginx容器中的nginx/logs/error.log日志報(bào)錯(cuò)為:FastCGI sent in stderr: “Primary script unknown” while reading response header from upstream, client: 192.168.188.1, server: localhost, request: “GET /wordpress/index.php HTTP/1.1”, upstream: “fastcgi://172.20.0.30:9000”, host: “192.168.188.17:1216”
報(bào)錯(cuò)分析:瀏覽器訪問(wèn)靜態(tài)頁(yè)面時(shí)正常訪問(wèn),所以排除nginx服務(wù)狀態(tài)問(wèn)題,nginx.conf的location規(guī)則也多次檢查沒有問(wèn)題,那么問(wèn)題大概率就是出在php容器里,經(jīng)過(guò)排查我發(fā)現(xiàn)問(wèn)題可能是因?yàn)閜hp容器沒有共享到nginx容器中的nginx/html/目錄導(dǎo)致的
解決方法:最簡(jiǎn)單的方法當(dāng)然是直接在vim docker-compose.yml中用volumes_from掛載到nginx容器,但是這個(gè)方法好像只支持版本2,那么其他版本該怎么解決。其實(shí)只要將宿主機(jī)、nginx、php三者相互掛載就能用volumes實(shí)現(xiàn)volumes_from的功能,具體實(shí)現(xiàn)如下:
重新生成并測(cè)試,解決問(wèn)題文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-799920.html
到了這里,關(guān)于Docker-Compose構(gòu)建lnmp的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!