前言
上一篇《docker入門(mén)——安裝(CentOS)、鏡像嫂侍、容器》講了docker鏡像獲取殴胧、啟動(dòng)容器等基本使用,本篇講講常用的php戳鹅、nginx均驶、mysql容器安裝及關(guān)聯(lián)。
鏡像選擇
nginx
nginx使用latest
tag枫虏。
php
由于php比較多版本妇穴,讀者在php offical選一個(gè)tag
,本文使用7.2-fpm
(筆者使用latest
啟動(dòng)不起來(lái)隶债,不知道為什么)腾它。
PHP Dockerfile
要讓php連接mysql,還要在docker官方的php鏡像上死讹,安裝插件瞒滴。于是,我們使用Dockerfile來(lái)構(gòu)建一個(gè)新鏡像赞警。
新建php-mysqli
目錄:
$ mkdir php-mysqli
$ cd php-mysqli
$ vi Dockerfile
編輯Dockerfile
妓忍,內(nèi)容如下:
FROM php:7.2-fpm
RUN apt-get update \
&& apt-get install iputils-ping \
&& docker-php-ext-install mysqli && docker-php-ext-enable mysqli
FROM php:7.2-fpm
表示基于php:7.2-fpm
tag鏡像;
RUN
后面的指令仅颇,是創(chuàng)建完該鏡像的容器后单默,再在容器上執(zhí)行這些指令。
這里先不用手動(dòng)build
鏡像忘瓦,等會(huì)用docker-compose
會(huì)自動(dòng)build
。
關(guān)于Dockerfile參考 《Docker — 從入門(mén)到實(shí)踐》——使用 Dockerfile 定制鏡像引颈。
mysql
mysql offical耕皮,本文選5.7
tag。
docker compose
安裝
1.下載最新版(本文使用1.19.0):
sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
讀者可以到Compose GitHub查看所有發(fā)布版本蝙场。
2.設(shè)置權(quán)限
sudo chmod +x /usr/local/bin/docker-compose
3.測(cè)試是否安裝成功
$ docker-compose --version
docker-compose version 1.19.0, build 1719ceb
構(gòu)建目錄結(jié)構(gòu)
我們做一個(gè)demo凌停,新建如下目錄結(jié)構(gòu):
php-nginx-compose/
├── conf.d
│ └── nginx.conf
├── docker-compose.yml
├── html
│ └── index.php
└── php-mysqli
└── Dockerfile
php-mysqli
就是剛才在PHP Dockerfile中創(chuàng)建的目錄,直接放在php-nginx-compose
目錄中售滤。
docker-compose.yml:
version: '3'
services:
nginx:
image: nginx:latest
# 端口映射
ports:
- "80:80"
# 依賴關(guān)系 先跑php
depends_on:
- "php"
# 數(shù)據(jù)卷
volumes:
# 映射主機(jī)./conf.d目錄到容器/etc/nginx/conf.d目錄
- "$PWD/conf.d:/etc/nginx/conf.d"
- "$PWD/html:/usr/share/nginx/html"
networks:
- app_net
# 容器名稱
container_name: "compose-nginx"
php:
build: ./php-mysqli
# image指定build Dockerfile生成鏡像的名稱
image: php:7.2-fpm-mysqli
ports:
- "9000:9000"
volumes:
- "$PWD/html:/var/www/html"
networks:
- app_net
container_name: "compose-php"
mysql:
image: mysql:5.7
ports:
- "3306:3306"
# 環(huán)境變量
environment:
# mysql密碼
- MYSQL_ROOT_PASSWORD={自己填密碼}
networks:
app_net:
# 固定子網(wǎng)ip罚拟,網(wǎng)段必須在子網(wǎng)絡(luò)10.10.*.*
ipv4_address: 10.10.10.1
container_name: "compose-mysql"
networks:
# 配置docker network
app_net:
driver: bridge
ipam:
config:
# 子網(wǎng)絡(luò)
- subnet: 10.10.0.0/16
關(guān)于Compose file
配置,官方詳細(xì)說(shuō)明完箩。網(wǎng)上還有一篇中文配置說(shuō)明《如何寫(xiě)docker-compose.yml赐俗,Docker compose file 參考文檔》。筆者建議先看官方文檔弊知,不懂了再找翻譯阻逮。
conf.d/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
}
html/index.php
<?php
phpinfo();
啟動(dòng)服務(wù)
$ docker-compose up -d
Creating compose-php ... done
Creating compose-nginx ... done
Creating compose-mysql ...
Creating compose-nginx ...
查看是否啟動(dòng)成功:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aeb1f626516b nginx:latest "nginx -g 'daemon of…" 5 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp compose-nginx
4e681d94c146 php:7.2-fpm-mysqli "docker-php-entrypoi…" 7 seconds ago Up 5 seconds 0.0.0.0:9000->9000/tcp compose-php
fcdf6ac20bac mysql:5.7 "docker-entrypoint.s…" 7 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp compose-mysql
nginx
、php
秩彤、mysql
容器都啟動(dòng)了叔扼。如果三者沒(méi)全啟動(dòng)事哭,嘗試再docker-compose up -d
;如果還啟動(dòng)不成功瓜富,就排查一下是否配置有誤鳍咱。
瀏覽index.php
:
這個(gè)畫(huà)面出現(xiàn),證明nginx
與php
容器關(guān)聯(lián)起來(lái)了与柑。
可以用Navicat
等數(shù)據(jù)庫(kù)工具連接mysql流炕,賬號(hào):root
,密碼是剛才配置的MYSQL_ROOT_PASSWORD
環(huán)境變量的值仅胞,端口:3306
每辟。
停止服務(wù)
1.docker-compose停止
2.docker命令停止
docker-compose停止
用docker-compose up -d
。即使用docker命令停止部分容器干旧,也可以用docker-compose up
來(lái)啟動(dòng)未成功啟動(dòng)的容器渠欺。
$ docker-compose stop
Stopping compose-nginx ... done
Stopping compose-php ... done
Stopping compose-mysql ... done
docker命令停止
docker stop 容器名/容器id
重啟服務(wù)
直接用docker-compose up -d
重啟即可,即使停止了部分容器椎眯。
php連接mysql
在php-nginx-compose/html/
目錄挠将,新建connect_mysql.php
:
<?php
// mysqli_connect參數(shù):ip:port、賬號(hào)编整、密碼舔稀、數(shù)據(jù)庫(kù)
$link = mysqli_connect("10.10.10.1:3306", "root", "密碼", "mysql");
if (!$link) {
echo "Error: Unable to connect to MySQL." . PHP_EOL . "</br>";
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL. "</br>";
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL. "</br>";
exit;
}
echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL. "</br>";
echo "Host information: " . mysqli_get_host_info($link) . PHP_EOL;
mysqli_close($link);
?>
ip是剛才docker-compose.yml
配置的子網(wǎng)ip ipv4_address: 10.10.10.1
。php語(yǔ)法參考官方文檔:mysqli_connect掌测。
瀏覽connect_mysql.php
:
出現(xiàn)Success: A proper connection to MySQL was made! The my_db database is great. Host information: 10.10.10.1:3306 via TCP/IP
證明連接mysql成功内贮。
Demo
kkmike999/docker-compose-php-nginx-mysql
關(guān)于作者
我是鍵盤(pán)男。
在廣州生活汞斧,在互聯(lián)網(wǎng)公司上班夜郁,猥瑣文藝碼農(nóng)。喜歡科學(xué)粘勒、歷史竞端,玩玩投資。