宿主機(jī)環(huán)境
系統(tǒng):ubuntu 18.04
docker版本:18.03.1-ce
docker的安裝請(qǐng)自行參考官方文檔。
前言
這篇文章用于介紹如何使用docker在ubuntu系統(tǒng)上搭建一個(gè)LNMP開(kāi)發(fā)環(huán)境,下面我們將會(huì)編寫(xiě)Dockerfile,基于官方docker hub鏡像,分別構(gòu)建我們自己的鏡像,然后運(yùn)行。要構(gòu)建的鏡像有:
- PHP-FPM 7.4
- Nginx 1.19
- MySQL 5.7
- Redis 6.2
為什么不直接使用官方鏡像,而是自己再構(gòu)建一個(gè)?
因?yàn)楣俜界R像一般安裝的東西都很少,例如PHP-FPM的官方鏡像,像redis、mysqli、pdo等等這些常用的擴(kuò)展都是沒(méi)有的,還有一些常用的系統(tǒng)命令也沒(méi)有安裝,例如ping、netstat、ps等等。
目錄結(jié)構(gòu)
我的項(xiàng)目路徑是/home/rockyliang/mydocker
,目錄結(jié)構(gòu)如下:
html目錄用于存放網(wǎng)頁(yè)文件和PHP文件,這個(gè)目錄后面會(huì)通過(guò)掛載的方式,掛載到 PHP-FPM容器 和 nginx容器 里面去,以便它們可以訪問(wèn)這些文件。
redis目錄下有一個(gè)redis.conf文件,這是從網(wǎng)上下載的redis配置文件,因?yàn)楣俜降膔edis鏡像默認(rèn)是沒(méi)有配置文件的,后面構(gòu)建redis鏡像時(shí),我們會(huì)把這個(gè)下載的配置文件復(fù)制進(jìn)去。這個(gè)文件的下載地址是:
https://raw.githubusercontent.com/antirez/redis/6.2/redis.conf
注意URL里的版本號(hào),因?yàn)槲覀円獦?gòu)建的redis鏡像版本是6.2,因此配置文件版本也要用6.2的。
創(chuàng)建網(wǎng)絡(luò)
因?yàn)楦鱾€(gè)容器之間需要通信,例如PHP-FPM容器需要跟MySQL、Redis容器連通,這樣PHP才能查詢數(shù)據(jù)庫(kù)數(shù)據(jù),因此我們先創(chuàng)建一個(gè)名為mynet
的網(wǎng)絡(luò):
sudo docker network create mynet
創(chuàng)建好網(wǎng)絡(luò)后,后續(xù)把各個(gè)容器加入到這個(gè)網(wǎng)絡(luò)里面來(lái)就可以。
構(gòu)建PHP-FPM鏡像
Dockerfile文件
# 從官方基礎(chǔ)版本構(gòu)建
FROM php:7.4-fpm-buster
# 鏡像信息
LABEL maintainer="ljfrocky" \
version="2020.03.30" \
description="PHP-FPM 7.4"
# 安裝install-php-extensions
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
# 設(shè)置系統(tǒng)時(shí)區(qū)
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 安裝常用命令工具包,根據(jù)自己的實(shí)際需要情況進(jìn)行安裝
# vim: vi、vim
# procps: ps
# iputils-ping: ping
# less: less
# net-tools: netstat
# iproute2: ss
RUN apt-get update && apt-get install -y --no-install-recommends vim procps iputils-ping less net-tools iproute2
# 安裝mysqli、pdo等PHP擴(kuò)展
# 如果需要安裝特定版本的擴(kuò)展,可以在擴(kuò)展名后加版本號(hào),例如:redis-5.1.1
RUN chmod +x /usr/local/bin/install-php-extensions \
&& install-php-extensions redis mysqli pdo_mysql pcntl gd mcrypt bcmath sockets zip
# 使用線上環(huán)境的php.ini配置文件
RUN cp "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
開(kāi)始構(gòu)建
執(zhí)行docker build
命令構(gòu)建FPM鏡像,鏡像名字設(shè)置為img-php-fpm
,標(biāo)簽(TAG)設(shè)置為7.4
:
cd /home/rockyliang/mydocker/php-fpm
sudo docker build -t img-php-fpm:7.4 .
因?yàn)閲?guó)內(nèi)訪問(wèn)github不太穩(wěn)定,構(gòu)建過(guò)程可能會(huì)在“安裝install-php-extensions”這一步驟發(fā)生錯(cuò)誤,一般重試構(gòu)建多幾次就可以解決。
構(gòu)建完成后,執(zhí)行docker images
命令,已經(jīng)能看到新的鏡像:
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
img-php-fpm 7.4 d511ba9f4c3d 2 minutes ago 456MB
php 7.4-fpm-buster c1bb99843706 3 days ago 389MB
執(zhí)行docker run
命令運(yùn)行新鏡像,容器名字設(shè)置為DOCKER_FPM
,為了讓容器能訪問(wèn)到宿主機(jī)的html目錄,還需要把宿主機(jī)的html目錄掛載到容器里的/var/www/html
目錄:
sudo docker run --name DOCKER_FPM \
-p 9000:9000 \
--network mynet \
-v /home/rockyliang/mydocker/html:/var/www/html:ro \
-d img-php-fpm:7.4
構(gòu)建nginx鏡像
Dockerfile文件
# 從官方基礎(chǔ)版本構(gòu)建
FROM nginx:1.19
# 鏡像信息
LABEL maintainer="ljfrocky" \
version="2020.03.30" \
description="Nginx 1.19"
# 設(shè)置系統(tǒng)時(shí)區(qū)
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 安裝常用命令工具包,根據(jù)自己的實(shí)際需要情況進(jìn)行安裝
# vim: vi、vim
# procps: ps
# iputils-ping: ping
# less: less
# net-tools: netstat
# iproute2: ss
RUN apt-get update && apt-get install -y --no-install-recommends vim procps iputils-ping less net-tools iproute2
開(kāi)始構(gòu)建
執(zhí)行docker build
命令構(gòu)建nginx鏡像,鏡像名字設(shè)置為img-nginx
,標(biāo)簽(TAG)設(shè)置為1.19
:
cd /home/rockyliang/mydocker/nginx
sudo docker build -t img-nginx:1.19 .
構(gòu)建完成后,執(zhí)行docker run
命令運(yùn)行新鏡像,容器名字設(shè)置為DOCKER_NGINX
,為了讓容器能訪問(wèn)到宿主機(jī)的html目錄,還需要把宿主機(jī)的html目錄掛載到容器里的/usr/share/nginx/html
目錄:
sudo docker run --name DOCKER_NGINX \
-p 80:80 \
--network mynet \
-v /home/rockyliang/mydocker/html:/usr/share/nginx/html:ro \
-d img-nginx:1.19
容器運(yùn)行起來(lái)后,進(jìn)入容器修改nginx的配置文件,讓nginx可以轉(zhuǎn)發(fā)PHP請(qǐng)求:
sudo docker exec -it DOCKER_NGINX bash
vim /etc/nginx/conf.d/default.conf
將配置文件里的這一段
去除前面的注釋,內(nèi)容替換成:
在容器里重啟nginx:nginx -s reload
測(cè)試
至此,nginx和PHP容器都搭建好了,測(cè)試一下看nginx能不能處理PHP請(qǐng)求,在宿主機(jī)的html目錄里新建一個(gè)phpinfo.php文件:
<?php
phpinfo();
在瀏覽器訪問(wèn)一下http://localhost/phpinfo.php,內(nèi)容顯示正常:
構(gòu)建MySQL鏡像
Dockerfile文件
# 從官方基礎(chǔ)版本構(gòu)建
FROM mysql:5.7
# 鏡像信息
LABEL maintainer="ljfrocky" \
version="2020.03.31" \
description="MySQL 5.7"
# 設(shè)置系統(tǒng)時(shí)區(qū)
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 安裝常用命令工具包,根據(jù)自己的實(shí)際需要情況進(jìn)行安裝
# vim: vi、vim
# procps: ps
# iputils-ping: ping
# less: less
# net-tools: netstat
# iproute2: ss
RUN apt-get update && apt-get install -y --no-install-recommends vim procps iputils-ping less net-tools iproute2
開(kāi)始構(gòu)建
執(zhí)行docker build
命令構(gòu)建MySQL鏡像,鏡像名字設(shè)置為img-mysql
,標(biāo)簽(TAG)設(shè)置為5.7
:
cd /home/rockyliang/mydocker/mysql
sudo docker build -t img-mysql:5.7 .
構(gòu)建完成后,執(zhí)行docker run
命令運(yùn)行新鏡像,容器名字設(shè)置為DOCKER_MYSQL
,root賬號(hào)密碼設(shè)置為123456
:
sudo docker run --name DOCKER_MYSQL \
-p 3306:3306 \
--network mynet \
-e MYSQL_ROOT_PASSWORD=123456 \
-d img-mysql:5.7
構(gòu)建Redis鏡像
Dockerfile文件
# 從官方基礎(chǔ)版本構(gòu)建
FROM redis:6.2-buster
# 鏡像信息
LABEL maintainer="ljfrocky" \
version="2020.03.31" \
description="Redis 6.2"
# 官方鏡像默認(rèn)是沒(méi)有redis.conf配置文件的,如果需要配置文件,需要自己編寫(xiě)或者到網(wǎng)絡(luò)上下載
# 6.2版本配置文件下載地址:https://raw.githubusercontent.com/antirez/redis/6.2/redis.conf
# 把宿主機(jī)上已下載好的配置文件復(fù)制到容器里去
COPY ./etc/redis.conf /usr/local/etc/redis/redis.conf
# 設(shè)置系統(tǒng)時(shí)區(qū)
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 安裝常用命令工具包,根據(jù)自己的實(shí)際需要情況進(jìn)行安裝
# vim: vi、vim
# procps: ps
# iputils-ping: ping
# less: less
# net-tools: netstat
# iproute2: ss
RUN apt-get update && apt-get install -y --no-install-recommends vim procps iputils-ping less net-tools iproute2
# 以指定配置文件的方式啟動(dòng)redis
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
開(kāi)始構(gòu)建
執(zhí)行docker build
命令構(gòu)建Redis鏡像,鏡像名字設(shè)置為img-redis
,標(biāo)簽(TAG)設(shè)置為6.2
:
cd /home/rockyliang/mydocker/redis
sudo docker build -t img-redis:6.2 .
構(gòu)建完成后,執(zhí)行docker run
命令運(yùn)行新鏡像,容器名字設(shè)置為DOCKER_REDIS
:
sudo docker run --name DOCKER_REDIS \
-p 6379:6379 \
--network mynet \
-d img-redis:6.2
容器運(yùn)行起來(lái)后,進(jìn)入容器修改redis配置文件:
sudo docker exec -it DOCKER_REDIS bash
vim /usr/local/etc/redis/redis.conf
將bind 127.0.0.1 -::1
這一行改為bind *
,保存,退出容器,然后重啟容器:
sudo docker restart DOCKER_REDIS
測(cè)試
在宿主機(jī)的html目錄里新建一個(gè)test.php文件,用于測(cè)試PHP是否能查詢MySQL和redis:
<?php
function display($msg) {
echo "{$msg}<br>";
}
/*
* 測(cè)試連接MySQL
*/
$mysqlConn = new mysqli();
$ok = $mysqlConn->real_connect('DOCKER_MYSQL', 'root', '123456');
if (!$ok) {
exit("MySQL connect failed:" . $mysqlConn->connect_error);
}
$mysqlConn->close();
display("測(cè)試MySQL連接:OK");
/*
* 測(cè)試連接redis
*/
$redis = new Redis();
try {
$redis->connect('DOCKER_REDIS', 6379, 2);
} catch (Throwable $e) {
exit("Redis connect failed:" . $e->getMessage());
}
$redis->close();
display("測(cè)試Redis連接:OK");
在瀏覽器訪問(wèn)一下http://localhost/test.php,連接數(shù)據(jù)庫(kù)正常:
日志/數(shù)據(jù)/配置文件路徑
在部署服務(wù)時(shí),我們一般都會(huì)關(guān)注日志路徑、數(shù)據(jù)存儲(chǔ)路徑、配置文件路徑,下面列一下上面幾個(gè)鏡像的一些默認(rèn)路徑:
鏡像 | 日志 | 配置文件 | 數(shù)據(jù) |
---|---|---|---|
php:7.4-fpm-buster | 默認(rèn)無(wú)日志文件,access log和error log都是輸出到標(biāo)準(zhǔn)輸出,需要使用docker logs 命令查看,如果需要將日志記錄到文件里,請(qǐng)參閱后面章節(jié)內(nèi)容 |
/usr/local/etc (php.ini和php-fpm.conf等配置文件都在這個(gè)路徑里) |
|
nginx:1.19 | /var/log/nginx/access.log /var/log/nginx/error.log 這兩個(gè)文件都是軟鏈接到標(biāo)準(zhǔn)輸出的,無(wú)法查看里面的內(nèi)容,只能通過(guò) docker logs 命令查看。解決方法見(jiàn)后面章節(jié)內(nèi)容 |
/etc/nginx | /usr/share/nginx/html |
mysql:5.7 | /var/log/mysql | /etc/mysql | /var/lib/mysql |
redis:6.2-buster | 默認(rèn)無(wú)日志文件,日志都是輸出到標(biāo)準(zhǔn)輸出,需要使用docker logs 命令查看,如果需要將日志記錄到文件里,請(qǐng)參閱后面章節(jié)內(nèi)容 |
默認(rèn)無(wú)配置文件,可以自己指定 | /data (rdb文件存放路徑) |
記錄日志到文件
通過(guò)上一章節(jié),我們知道PHP-FPM、nginx、redis的日志是不記錄到實(shí)體文件里的,只能通過(guò)docker logs {容器名稱或ID}
命令來(lái)查看,那么,如果我們想把日志記錄到實(shí)體文件里,可以怎么做呢?
PHP-FPM
進(jìn)入PHP-FPM容器,修改/usr/local/etc/php-fpm.d/zz-docker.conf
文件:
新增圖中兩行內(nèi)容,保存并重啟容器,這樣PHP-FPM的 access log 和 error log 就會(huì)記錄到我們指定的文件里了。
nginx
nginx容器里的日志文件是個(gè)軟鏈接:
root@adb13aee521c:/var/log/nginx# ls -l
total 0
lrwxrwxrwx 1 root root 11 May 12 2021 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 May 12 2021 error.log -> /dev/stderr
所以如果想把日志記錄到文件里去,把軟鏈接刪除即可:
cd /var/log/nginx
unlink access.log
unlink error.log
nginx -s reload
redis
因?yàn)樯厦嫖覀冊(cè)跇?gòu)建redis鏡像時(shí),有通過(guò)COPY指令復(fù)制了一個(gè)redis.conf配置文件進(jìn)去,我們通過(guò)修改配置文件來(lái)配置日志文件路徑即可。
假設(shè)我們希望把日志文件保存在/var/log/redis
目錄里,首先我們要?jiǎng)?chuàng)建好這個(gè)目錄,并確保redis用戶對(duì)這個(gè)目錄有寫(xiě)入的權(quán)限:
mkdir /var/log/redis
chown redis:redis /var/log/redis/
修改/usr/local/etc/redis/redis.conf
文件:
修改logfile參數(shù),指定日志文件路徑,保存退出,重啟redis容器。
docker-compose
如果你覺(jué)得像上面那樣一個(gè)一個(gè)的構(gòu)建鏡像和運(yùn)行太麻煩,可以試下用docker-compose來(lái)減輕工作量,在項(xiàng)目根目錄里編寫(xiě)一個(gè)docker-compose.yml
,內(nèi)容如下:
version: "3"
services:
nginx:
image: img-nginx:1.19
build:
context: ./nginx
dockerfile: Dockerfile
container_name: DOCKER_NGINX
ports:
- "80:80"
- "443:443"
networks:
- lnmp-network
volumes:
- ./html:/usr/share/nginx/html:ro
restart: always
depends_on:
- php-fpm
php-fpm:
image: img-php-fpm:7.4
build:
context: ./php-fpm
dockerfile: Dockerfile
container_name: DOCKER_FPM
volumes:
- ./html:/var/www/html
networks:
- lnmp-network
restart: always
depends_on:
- mysql
- redis
mysql:
image: img-mysql:5.7
build:
context: ./mysql
dockerfile: Dockerfile
container_name: DOCKER_MYSQL
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: '123456'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
networks:
- lnmp-network
restart: always
redis:
image: img-redis:6.2
build:
context: ./redis
dockerfile: Dockerfile
container_name: DOCKER_REDIS
ports:
- "6379:6379"
networks:
- lnmp-network
restart: always
networks:
lnmp-network:
driver: bridge
ipam:
config:
- subnet: '172.31.0.0/16'
然后執(zhí)行sudo docker-compose up -d
命令,docker-compose就會(huì)一次性把所有鏡像構(gòu)建好,并且運(yùn)行。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-412296.html
在搭建環(huán)境時(shí)遇到的一些坑
1.配置文件修改錯(cuò)了,導(dǎo)致容器啟動(dòng)不起來(lái)了
一般修改完配置文件,都需要重啟容器來(lái)讓新配置生效的,但如果不小心配置錯(cuò)了,導(dǎo)致容器起不來(lái)了就麻煩了,容器起不來(lái),就無(wú)法進(jìn)去重新修正配置文件。這時(shí)候可以通過(guò)docker cp
命令,把有問(wèn)題容器里的配置文件復(fù)制到宿主機(jī)上來(lái),然后在宿主機(jī)上修改,修改完后,再docker cp
回去容器里,這樣就可以解決這個(gè)問(wèn)題了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-412296.html
到了這里,關(guān)于使用docker搭建LNMP開(kāi)發(fā)環(huán)境的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!