Docker
若未安裝Docker,可參考以下資料進行安裝:
https://books.studygolang.com/docker_practice/install/
Nginx
1. 拉取鏡像
docker pull nginx
2. 運行容器
(1)創建項目程序根目錄,編寫一個簡單測試的html文件:
cd /
mkdir www
cd www
vim index.html
index.html文件內容如下:
<html>
<head>
<title>Docker Nginx Testing</title>
</head>
<body>
<div>
<h3>When you see this message, it means the docker nginx is successfully running!</h3>
</div>
</body>
</html>
(2)創建nginx目錄,創建nginx配置文件nginx-test.conf:
cd /usr/local
mkdir nginx
cd nginx
mkdir conf
cd conf
vim nginx-test.conf
nginx-test.conf文件內容如下:
server {
listen 80;
location / {
root /www;
index index.html index.htm;
}
}
(3)宿主主機8080端口映射nginx容器80端口,宿主主機/usr/local/nginx/conf目錄映射nginx容器/etc/nginx/conf.d目錄,宿主主機/www目錄映射nginx容器/www目錄,啟動容器:
docker run --name nginx -p 8080:80 -v /usr/local/nginx/conf:/etc/nginx/conf.d -v /www:/www nginx
3. 瀏覽器訪問驗證
PHP
1. 拉取鏡像
docker pull php:7.1-fpm
2. 定制並構建鏡像
(1)創建php目錄
cd /usr/local
mkdir php
cd php
mkdir etc #此目錄需要放置一個php配置文件,命名php.ini
vim Dockerfile
注:關於php的配置文件,我的操作是先運行php容器,將其配置文件復制到宿主主機上,然后再進行目錄映射。復制指令:
docker cp php:/usr/local/etc/php/php.ini-development /usr/local/php/etc/php.ini
(2)Dockerfile文件內容:
FROM php:7.1-fpm #基於鏡像文件php:7.1-fpm構建
COPY ./etc/php.ini /usr/local/etc/php/php.ini #復制上下文目錄的php配置文件
RUN docker-php-ext-install pdo_mysql #使用鏡像提供的安裝擴展的快捷操作安裝pdo_mysql擴展
(3)構建鏡像:
docker build -t php:my-php .
3. 運行容器
宿主主機9000端口映射php容器9000端口,宿主主機/www目錄映射php容器/www目錄,啟動容器:
docker run --name php -p 9000:9000 -v /www:/www php:my-php
4. nginx支持php
(1)把nginx和php兩個容器通過網卡連接起來:
docker network create --driver bridge lnmp #新建一個橋接網卡,名為lnmp
docker network connect lnmp php #php容器連接網卡lnmp
docker network connect lnmp nginx #nginx容器連接網卡lnmp
docker network ls #查看網卡列表
docker network inspect lnmp #查看網卡lnmp詳情
(2)修改nginx配置文件nginx-test.conf,把PHP腳本轉發給php-fpm,php-fpm地址通過容器名進行識別:
server {
listen 80;
location / {
root /www;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /www;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
(3)讓nginx容器重新加載配置文件:
docker exec -it nginx nginx -s reload
5. 運行驗證
在宿主主機/www下創建文件phpinfo.php:
<?php
phpinfo();
保存,瀏覽器訪問:
MySQL
1. 拉取鏡像
docker pull mysql:5.7
2. 定制並構建鏡像
(1)創建mysql目錄:
cd /usr/local
mkdir mysql
cd mysql
(2)創建測試數據文件test.sql:
create table student(
id int not null primary key auto_increment comment '主鍵ID',
name varchar(20) not null comment '姓名',
age int not null comment '年齡'
)engine=InnoDB default charset=utf8 comment '學生數據表';
insert into student(name, age) values('小明', 18);
insert into student(name, age) values('啊俊', 28);
(3)創建Dockerfile:
FROM mysql:5.7 #基於鏡像文件mysql:5.7構建
ENV MYSQL_ROOT_PASSWORD=123456 MYSQL_DATABASE=test #設置root用戶密碼
COPY ./test.sql /var/data/test.sql #復制上下文目錄的SQL文件
(4)構建鏡像:
docker build -t mysql:my-mysql .
3. 運行容器
宿主主機3306端口映射mysql容器3306端口,啟動容器並加入網絡lnmp:
docker run --name mysql --network lnmp -p 3306:3306 mysql:my-mysql
4. 運行驗證
(1)進入容器,將測試數據導入mysql:
docker exec -it mysql bash
mysql -u root -p
mysql> use test
mysql> source /var/data/test.sql
(2)在宿主主機/www目錄創建測試文件testmysql.php:
<?php
$dsn = 'mysql:dbname=test;host=mysql';
$user = 'root';
$password = '123456';
try {
$dbh = new PDO($dsn, $user, $password);
$sql = 'SELECT * FROM student where id=?';
$sth = $dbh->prepare($sql);
$sth->execute([2]);
$result = $sth->fetch(PDO::FETCH_ASSOC);
var_dump($result);
} catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
}
(3)訪問運行:
至此,docker搭建lnmp環境大功告成!
查看運行中容器列表:
查看網絡lnmp信息:
上述實踐中,我們將nginx的配置文件放在宿主主機上,然后通過映射nginx容器目錄到宿主主機目錄,讓nginx使用宿主主機上的配置文件,這樣做的好處是當nginx容器被刪除時,配置文件中的更改不會丟失,以后創建的nginx容器可以繼續使用這個配置文件。
在實際項目中,我們應該把不希望隨着容器刪除而丟失的配置和數據都保存在宿主主機上,通過容器與宿主主機的目錄映射來使用這些配置和數據,例如php的配置,以及mysql的配置,特別是mysql的數據庫數據。
將MySQL數據庫數據保存在宿主主機的操作:首先運行mysql容器,然后將mysql容器的配置目錄文件和數據目錄文件都復制到宿主主機上,最后停止並刪除正在運行的mysql容器,映射相應目錄,重新創建並啟動一個mysql容器。這樣,即使mysql容器被刪除了,mysql數據庫的配置和數據還是不會丟失。
docker container start mysql
cd /usr/local/mysql
docker cp mysql:/var/lib/mysql .
mkdir data
mv ./mysql/* ./data
rmdir mysql
docker cp mysql:/etc/mysql .
mkdir etc
mv ./mysql/* ./etc
rmdir mysql
docker stop mysql
docker container rm mysql
docker run --name mysql --network lnmp -p 3306:3306 -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/etc:/etc/mysql mysql:my-mysql
參考:
https://books.studygolang.com/docker_practice/
https://www.cnblogs.com/justlikeheaven/p/11110671.html