前言
服務(wù)器技術(shù)日益高大上,docker持續(xù)火熱。作為一個(gè)開發(fā)者,不使用docker,那就太落后。從去年就開始接觸docker,在本地的開發(fā)中也使用了dokcer.但是還是處于不熟練狀態(tài)。這2天抽空研究了docker-compose,將docker多容器組合進(jìn)行了實(shí)踐,以方便后期的軟件部署的需要。
文件地址
問(wèn)題
使用docker-compose 實(shí)現(xiàn)Lnmp的搭建。
linux+nginx+mysql+php
docker 好處:
- 環(huán)境的一致性。本地,測(cè)試,生產(chǎn)環(huán)境不再存在差異。
- 生產(chǎn)環(huán)境下,運(yùn)維的自動(dòng)化和擴(kuò)容方便。容易復(fù)制和遷移。
docker-compose的好處:
- 批量管理docker,省時(shí)省力。
解決
- 在本地創(chuàng)建一個(gè)文件夾,里面結(jié)構(gòu)如下:
├── README.md
├── db_data 數(shù)據(jù)庫(kù)文件存儲(chǔ)目錄
├── docker-compose.yml docker-compose的配置文件
├── mysql
│ └── Dockerfile mysql的dockfile文件。這里沒(méi)用到。是空白
├── nginx
│ ├── Dockerfile nginx的dockfile文件
│ └── default.conf nginx的配置
├── php-fpm
│ ├── Dockerfile php的dockfile文件
│ ├── php.ini php的配置文件
│ ├── php.ini-development php的開發(fā)配置文件
│ └── php.ini-production php的生產(chǎn)配置文件
└── web php項(xiàng)目代碼
├── db.sql 數(shù)據(jù)庫(kù)文件
├── index.html
├── index.php
└── mysql.php
- 介紹下docker-compose的配置文件
#版本號(hào)
version: "3"
#服務(wù)
services:
#mysql服務(wù)
db:
#服務(wù)器鏡像
image: mysql:latest
#磁盤映射。./db_data 是宿主的目錄。后者是容器里的目錄。
volumes:
- ./db_data:/var/lib/mysql
restart: always
# 端口映射。前者是宿主的。后者是容器里端口
ports:
- "3307:3306"
#環(huán)境變量
environment:
#mysql的root密碼
MYSQL_ROOT_PASSWORD: 123456
#容器會(huì)創(chuàng)建的數(shù)據(jù)庫(kù)
MYSQL_DATABASE: testdb
#test用戶
MYSQL_USER: test
#test用戶的密碼
MYSQL_PASSWORD: 123456
#php-fpm服務(wù)
php:
volumes:
- ./web:/www/web
#依賴的服務(wù)。會(huì)在容器里的host文件里添加 一條記錄。訪問(wèn)db,即可訪問(wèn)mysql的服務(wù)。
depends_on:
- db
#服務(wù)器鏡像構(gòu)建的目錄。會(huì)在該目錄下尋找dockerfile構(gòu)建鏡像。
build: ./php-fpm
restart: always
#nginx服務(wù)
nginx:
depends_on:
- php
volumes:
- ./web:/www/web
build: ./nginx
ports:
- "81:80"
restart: always
- 安裝步驟
nginx的基礎(chǔ)鏡像
docker pull daocloud.io/library/nginx:1.13.0
php的基礎(chǔ)鏡像
docker pull daocloud.io/library/php:7.0.20-fpm
mysql的基礎(chǔ)鏡像
docker pull mysql:latest
執(zhí)行服務(wù)編排,創(chuàng)建容器,啟動(dòng)php mysql nginx
docker-compose up -d
- 訪問(wèn)測(cè)試
測(cè)試nginx
http://localhost:81/
測(cè)試phpinfo
http://localhost:81/index.php
測(cè)試數(shù)據(jù)庫(kù)
http://localhost:81/mysql.php
- 遇到的坑
- php找不到文件路徑。
nginx服務(wù)和php服務(wù)需要映射相同的路徑。例如這里都是/www/web
配置如下:
- php找不到文件路徑。
location ~ \.php$ {
root /www/web;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/web/$fastcgi_script_name;
include fastcgi_params;
}
- nginx轉(zhuǎn)發(fā)php解析失敗。
主要問(wèn)題是php的服務(wù)需要修改配置,默認(rèn)的配置php-fpm只監(jiān)控127.0.0.1地址。需要修改監(jiān)控任意地址。
RUN sed -i -e 's/listen = 127.0.0.1:9000/listen = 9000/' /usr/local/etc/php-fpm.d/www.conf
- php服務(wù)無(wú)法連接mysql配置。
主要是php擴(kuò)展的問(wèn)題。這個(gè)問(wèn)題其實(shí)很奇怪,按理基礎(chǔ)鏡像里應(yīng)該包含這個(gè)。不知道為何沒(méi)有。
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
- 補(bǔ)充命令。
停止容器
docker-compose stop
刪除容器
docker-compose rm