1. 程式人生 > >使用docker搭建LAMP環境

使用docker搭建LAMP環境

環境:Centos7.4
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

Get the most up-to-date version of Docker
https://get.docker.com

(This script is meant for quick & easy install via:)
[[email protected] ~]# curl -fsSL https://get.docker.com -o get-docker.sh
[[email protected]

~]# sh get-docker.sh

[[email protected] ~]# service docker start
Redirecting to /bin/systemctl start docker.service
[[email protected] ~]# docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:48:22 2018
OS/Arch: linux/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:19:08 2018
OS/Arch: linux/amd64
Experimental: false

[[email protected] ~]# docker search -s 10 lamp
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
linode/lamp LAMP on Ubuntu 14.04.1 LTS Container 157
tutum/lamp Out-of-the-box LAMP image (PHP+MySQL) 108
greyltc/lamp a super secure, up-to-date and lightweight L猞 92 [OK]
mattrayner/lamp A simple LAMP docker image running the prere猞 55 [OK]
fauria/lamp Modern, developer friendly LAMP stack. Inclu猞 46 [OK]
janes/alpine-lamp lamp base on alpine linux 36 [OK]
nickistre/ubuntu-lamp LAMP server on Ubuntu 26 [OK]
nickistre/centos-lamp LAMP on centos setup 24 [OK]
dgraziotin/lamp 11 [OK]
lioshi/lamp Docker image for LAMP + MySql under debian 10 [OK]

到docker hub的官網去搜索linode/lamp這個映象,可以檢視到他的具體使用說明(檢視具體使用說明,避免走彎路)
https://hub.docker.com/r/linode/lamp

[[email protected] ~]# docker pull linode/lamp (下載映象)
Using default tag: latest
latest: Pulling from linode/lamp
a3ed95caeb02: Pull complete
76a4cab4eb20: Pull complete
d2ff49536f4d: Pull complete
f94adccdbb9c: Pull complete
808b5278afbb: Pull complete
ab367f87d978: Pull complete
Digest: sha256:4b7af614899c795aa30cb60b62c28b978201c2dca3fb1352a60fec206edb92de
Status: Downloaded newer image for linode/lamp:latest

[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
linode/lamp latest 2359fa12fded 3 years ago 372MB

建立docker卷
[[email protected] ~]# docker volume create lamp_www
[[email protected] ~]# docker volume create lamp_apache_conf
[[email protected] ~]# docker volume create lamp_mysql_conf
[[email protected] ~]# docker volume create lamp_mysql_data

在宿主機建立 /var/lib/docker/volumes目錄
[[email protected] ~]# mkdir /var/lib/docker/volumes

啟動映象
[[email protected] ~]# docker run -it -p 80:80 -p 3306:3306 -v lamp_www:/var/www -v lamp_apache_conf:/etc/apache2 -v lamp_mysql_conf:/etc/mysql -v lamp_mysql_data:/var/lib/mysql --name lamp linode/lamp /bin/bash
(docker run:執行一個container,如果後面要繫結宿主主機的0-1024埠需要使用sudo,因為是Ubuntu)
( -p port1:port2: 將宿主機的埠port1對映到容器中的port2)
(-v volume:path: 將宿主機的docker卷對映到容器中的指定的路徑)
( -t -i linode/lamp /bin/bash:使用linode/lamp生成容器,並開啟shell)
現在已經進入到了容器內。如果想退出容器,請不要使用exit或ctrl+d.這樣會將容器直接關閉.
退出請使用ctrl + p ,然後 ctrl + q
上面的啟動命令中一共映射了四個路徑,分別是apache的web根目錄,apache和MySQL的兩個主配置檔案,及MySQL的資料目錄.這些都是為了方便我們後續直接在宿主機上對配置檔案和web檔案的修改進行的操作,利用docker卷映射了資料庫的目錄也能保證映象再次執行的時候資料不會丟失.

[[email protected] ~]# ls -la /var/lib/docker/volumes
total 24
drwx------. 8 root root 255 Dec 1 13:41 .
drwx--x--x. 15 root root 200 Dec 1 10:56 ..
drwxr-xr-x. 3 root root 19 Dec 1 13:41 lamp_apache_conf
drwxr-xr-x. 3 root root 19 Dec 1 13:41 lamp_mysql_conf
drwxr-xr-x. 3 root root 19 Dec 1 13:41 lamp_mysql_data
drwxr-xr-x. 3 root root 19 Dec 1 13:41 lamp_www

進入lamp_mysql_data這個卷的目錄,可以看到映象中的資料庫目錄已經對映到宿主機裡了. 這個卷只要不刪除,其資料就一直存在其中.這樣避免了映象重啟後資料丟失的情況.
[[email protected] ~]# ls -la /var/lib/docker/volumes/lamp_mysql_data
total 0
drwxr-xr-x. 3 root root 19 Dec 1 13:41 .
drwx------. 8 root root 255 Dec 1 13:41 ..
drwx------. 5 102 106 164 Dec 1 13:43 _data

[[email protected] ~]# ls -la /var/lib/docker/volumes/lamp_mysql_data/_data
total 28684
drwx------. 5 102 106 164 Dec 1 13:43 .
drwxr-xr-x. 3 root root 19 Dec 1 13:41 ..
-rw-r--r--. 1 root root 0 Feb 20 2015 debian-5.5.flag
drwx------. 2 102 106 20 Dec 1 13:43 exampleDB
-rw-rw----. 1 102 106 18874368 Feb 20 2015 ibdata1
-rw-rw----. 1 102 106 5242880 Feb 20 2015 ib_logfile0
-rw-rw----. 1 102 106 5242880 Feb 20 2015 ib_logfile1
drwx------. 2 102 root 4096 Dec 1 13:43 mysql
-rw-------. 1 root root 6 Feb 20 2015 mysql_upgrade_info
drwx------. 2 102 106 4096 Dec 1 13:43 performance_schema

在終端中對lamp環境作個性化配置
[[email protected] ~]# docker exec -i -t lamp bash

啟動apache2和mysql
[email protected]:/#service apache2 start
[email protected]:/#service mysql start
( 可以通過netstat -naltp 命令檢視80和3306埠有沒有開啟成功)
[email protected]:/# netstat -naltp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0: LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:
LISTEN 100/apache2

設定mysql允許root遠端登入,及設定root的密碼
[email protected]:/#smysql -u root -p
#初始密碼:Admin2015

#修改root可遠端登入:
mysql>use mysql;
mysql>update user set host = '%' where user = 'root' and host='127.0.0.1';

#修改密碼:
mysql>update user set password=password("123456") where user='root';

#重新整理許可權
FLUSH PRIVILEGES;

mysql> quit
Bye

安裝php擴充套件
[email protected]980e:/# apt-get update
[email protected]:/# apt-get install -y php5-mysql
[email protected]:/# apt-get install -y php5-gd

#然後重啟apache2:
[email protected]:/# service apache2 restart

#再次確認mysql和apache2有沒有安裝成功:
[email protected]:/# netstat -naltp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0: LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:
LISTEN 2899/apache2

可以通過下面的命令檢視伺服器上有哪些php的擴充套件:
[email protected]:/# apt-cache search php5-*

測試結果:
[[email protected] ~]# ip add
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:6b:22:a9 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.203/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
valid_lft 2619sec preferred_lft 2619sec
inet6 fe80::9375:cddb:5162:50f/64 scope link noprefixroute
valid_lft forever preferred_lft forever

[[email protected] ~]# curl http://192.168.1.203
<!DOCTYPE html>
<html>
<body>

<br>
<br>

<center>
<p>
The Docker LAMP stack is working.
</p>
</center>

<center>
<p>
The configuration information can be found <a href="https://registry.hub.docker.com/u/linode/lamp/">here</a>; or <a href="https://www.linode.com/docs/websites/hosting-a-website">here</a>;
</p>
</center>

<center>
<p>
This index.html file is located in the "/var/www/example.com/public_html" directory.
</p>
</center>

</body>
</html>

訪問http://192.168.1.203/

測試例項
[[email protected] ~]# docker exec -i -t lamp bash

建立資料庫資料
[email protected]:/# mysql -uroot -p
mysql> show databases;
mysql> create database example default charset=utf8;
mysql> show create database example \G
mysql> use example;
mysql> create table tbl (idx integer(3), UserName varchar(30), LastName varchar(50), FreeText varchar(100)) ENGINE=InnoDB AUTO_INCREMENT=1 default charset=utf8;
mysql> show create table tbl \G
mysql> show columns from tbl;
mysql> select from tbl;
mysql> insert into tbl values (1,'Rafi','Ton','Just a test');
mysql> update tbl set UserName='Berber' where UserName='Rafi';
mysql> select
from tbl;
mysql> delete from tbl where idx=1 limit 1;
mysql> insert into tbl values (1,'Rafi','Ton','Just a test');
mysql> select * from tbl;

資料庫建立完成後在宿主機上檢視,能看到上面容器中建立的資料庫example
[[email protected] _data]# cd /var/lib/docker/volumes/lamp_mysql_data/_data
[[email protected] _data]# ls
debian-5.5.flag example exampleDB ibdata1 ib_logfile0 ib_logfile1 mysql mysql_upgrade_info performance_schema

建立PHP檔案
[email protected]:/# cd /var/www/example.com/public_html

[email protected]:/var/www/example.com/public_html# vi links.x
<p></p>
<ul>
<li><a href="index.php">Home</a>
<li><a href="add.php">Add a new entry to the DataBase</a>
<li><a href="edit.php">Edit an entry</a>
<li><a href="del.php">Delete an entry from the DataBase</a>
</ul>

[email protected]:/var/www/example.com/public_html# vi index.php
<html>
<head><title>Web Database Sample Index</title>
</head>
<body bgcolor=#ffffff>
<h2>Data from tbl</h2>
<?php
$connect = mysql_connect("localhost","root","123456") or die ("Problem connecting to DataBase");
$select = mysql_select_db('example', $connect);
$sql="select * from tbl";
$result = mysql_query($sql, $connect);
if ($result) {
echo "Found these entries in the database:<br><p></p>";
echo "<table width=90% align=center border=1><tr>
<td align=center bgcolor=#00FFFF>User Name</td>
<td align=center bgcolor=#00FFFF>Last Name</td>
<td align=center bgcolor=#00FFFF>Domain Name</td>
<td align=center bgcolor=#00FFFF>Request Date</td>
</tr>";
while ($r = mysql_fetch_array($result))
{
$idx = $r["idx"];
$user = $r["UserName"];
$last = $r["LastName"];
$text = $r["FreeText"];
echo "<tr>
<td>$idx</td>
<td>$user</td>
<td>$last</td>
<td>$text</td>
</tr>";
}
echo "</table>";
}
else
{
echo "No data.";
}
mysql_free_result($result);
include ('links.x');
?>
</body>
</html>

開啟http://192.168.1.203/index.php,已經能看到資料

[email protected]:/var/www/example.com/public_html# vi add.php
<html>
<head><title>Add an entry to the database</title>
</head>
<body bgcolor=#ffffff>
<h1>Add an entry</h1>
<form method="post" action="add2tbl.php">
<table width=90% align=center>
<tr><td>Index:</td><td><input type=text name="idx" size=3 maxlength=3></td></tr>   
<tr><td>UserName:</td><td><input type=text name="UserName" size=40
maxlength=100></td></tr>
<tr><td>LastName:</td><td><input type=text name="LastName" size=40
maxlength=100></td></tr>   
<tr><td>FreeText:</td><td><input type=text name="FreeText" s=40 maxlength=100></td></tr>
<tr><td></td><td><input type=submit value=add></td></tr>
</form>
</table>
<?php include ('links.x');?>
</body>
</html>

[email protected]:/var/www/example.com/public_html# vi add2tbl.php
<html>
<body>
<?php
$connect = mysql_connect("localhost","root","123456") or die ("Problem connecting to DataBase");
$query = "insert into tbl values ('{$_POST['idx']}','{$_POST['UserName']}','{$_POST['LastName']}','{$_POST['FreeText']}')";
$select = mysql_select_db('example', $connect);
$result = mysql_query($query, $connect);
$query = "SELECT * FROM tbl";
$result = mysql_query($query, $connect);
if ($result)
{
echo "Found these entries in the database:<br><p></p>";
echo "<table width=90% align=center border=1><tr>
<td align=center bgcolor=#00FFFF>idx</td>
<td align=center bgcolor=#00FFFF>User Name</td>
<td align=center bgcolor=#00FFFF>Last Name</td>
<td align=center bgcolor=#00FFFF>Free Text</td>
</tr>";
while ($r = mysql_fetch_array($result))
{
$idx = $r["idx"];
$user = $r["UserName"];
$last = $r["LastName"];
$text = $r["FreeText"];
echo "<tr>
<td>$idx</td>
<td>$user</td>
<td>$last</td>
<td>$text</td>
</tr>";
}
echo "</table>";
}
else
{
echo "No data.";
}
mysql_free_result($result);
include ('links.x');
?>
</body>
</html>

[email protected]:/var/www/example.com/public_html# vi edit.php
<html>
<head><title>Editing an entry from the database</title>
</head>
<body bgcolor=#ffffff>
<h1>Edit an entry</h1
<?php
$connect = mysql_connect("localhost","root","123456") or die ("Problem connecting to DataBase");
$select = mysql_select_db('example', $connect);
$sql="select * from tbl";
$result = mysql_query($sql, $connect);
if ($result)
{
echo "Found these entries in the database:<br>";
echo "<table width=90% align=center border=1><tr>
<td align=center bgcolor=#00ffff>idx</td>
<td align=center bgcolor=#00FFFF>User Name</td>
<td align=center bgcolor=#00FFFF>Last Name</td>
<td align=center bgcolor=#00FFFF>Free Text</td>
</tr>";
while ($r = mysql_fetch_array($result))
{
$idx = $r["idx"];
$user = $r["UserName"];
$last = $r["LastName"];
$text = $r["FreeText"];
echo "<tr>
<td align=center>
<a href=\"editing.php?idx=$idx&user=$user&last=$last&text=$text\">$idx</a></td>
<td>$user</td>
<td>$last</td>
<td>$text</td>
</tr>";
}
echo "</table>";
}
else
{
echo "No data.";
}
mysql_free_result($result);
include ('links.x');
?>
</body>
</html>

[email protected]:/var/www/example.com/public_html# vi editing.php
<html>
<head><title>Editing an entry</title>
</head>
<body bgcolor=#ffffff>
<h1>Editing an entry</h1>
<form method="post" action="editdb.php">
<table width=90% align=center>
<tr><td>idx:</td><td><?php echo $_GET['idx'];?></td></tr>
<tr><td>UserName:</td><td><input type=text name=UserName size=40 maxlength=100
value="<?php echo $_GET['user'];?>"></td></tr>
<tr><td>LastName:</td><td><input type=text name=LastName size=40 maxlength=100
value="<?php echo $_GET['last'];?>"></td></tr>
<tr><td>Free Text:</td><td><input type=text name=FreeText size=40 maxlength=100
value="<?php echo $_GET['text'];?>"></td></tr>
<tr><td></td><td><input type=submit value="Edit it!"></td></tr></table>
<input type=hidden name=idx value="<?php echo $_GET['idx'];?>">
</form>
<?php include ('links.x');?>
</body>
</html>

[email protected]:/var/www/example.com/public_html# vi editdb.php
<?php
$connect = mysql_connect("localhost","root","123456") or die ("Problem connecting to DataBase");
$query = "update tbl set
idx='{$_POST['idx']}',UserName='{$_POST['UserName']}',LastName='{$_POST['LastName']}',FreeText='{$_POST['FreeText']}' where
idx='{$_POST['idx']}'";
$select = mysql_select_db('example', $connect);
$result = mysql_query($query, $connect);
$query = "SELECT * FROM tbl";
$result = mysql_query($query, $connect);
if ($result)
{
echo "Found these entries in the database:<br><p></p>";
echo "<table width=90% align=center border=1><tr>
<td align=center bgcolor=#00FFFF>idx</td>
<td align=center bgcolor=#00FFFF>User Name</td>
<td align=center bgcolor=#00FFFF>Last Name</td>
<td align=center bgcolor=#00FFFF>Free Text</td>
</tr>";
while ($r = mysql_fetch_array($result))
{
$idx = $r["idx"];
$user = $r["UserName"];
$last = $r["LastName"];
$text = $r["FreeText"];
echo "<tr>
<td>$idx</td>
<td>$user</td>
<td>$last</td>
<td>$text</td>
</tr>";
}
echo "</table>";
}
else
{
echo "No data.";
}
mysql_free_result($result);
include ('links.x');
?>

[email protected]:/var/www/example.com/public_html# vi del.php
<html>
<head><title>Deleting an entry from the database</title>
</head>
<body bgcolor=#ffffff>
<h1>Del an entry</h1>
<?php
$connect = mysql_connect("localhost","root","123456") or die ("Problem connecting to DataBase");
$select = mysql_select_db('example', $connect);
$sql="select * from tbl";
$result = mysql_query($sql, $connect);
if ($result)
{
echo "Found these entries in the database:<br><p></p>";
echo "<table width=90% align=center border=1><tr>
<td align=center bgcolor=#00ffff>idx</td>
<td align=center bgcolor=#00FFFF>User Name</td>
<td align=center bgcolor=#00FFFF>Last Name</td>
<td align=center bgcolor=#00FFFF>Free Text</td>
</tr>";
while ($r = mysql_fetch_array($result))
{
$idx = $r["idx"];
$user = $r["UserName"];
$last = $r["LastName"];
$text = $r["FreeText"];
echo "<tr>
<td align=center>
<a href=\"dele.php?
idx=$idx&UserName=$user&LastName=$last&FreeText=$text\">$idx</a></td>
<td>$user</td>
<td>$last</td>
<td>$text</td>
</tr>";
}
echo "</table>";
}
else
{
echo "No data.";
}
mysql_free_result($result);
include ('links.x');
?>
</body>
</html>

[email protected]:/var/www/example.com/public_html# vi dele.php
<html>
<body>
<?php
$connect = mysql_connect("localhost","root","123456") or die ("Problem connecting to DataBase");
$query = "delete from tbl where idx='{$_GET['idx']}'";
$select = mysql_select_db('example', $connect);
$result = mysql_query($query, $connect);
$query = "SELECT * FROM tbl";
$result = mysql_query($query, $connect);
if ($result)
{
echo "Found these entries in the database:<br><p></p>";
echo "<table width=90% align=center border=1><tr>
<td align=center bgcolor=#00FFFF>idx</td>
<td align=center bgcolor=#00FFFF>User Name</td>
<td align=center bgcolor=#00FFFF>Last Name</td>
<td align=center bgcolor=#00FFFF>Free Text</td>
</tr>";
while ($r = mysql_fetch_array($result))
{
$idx = $r["idx"];
$user = $r["UserName"];
$last = $r["LastName"];
$text = $r["FreeText"];
echo "<tr>
<td>$idx</td>
<td>$user</td>
<td>$last</td>
<td>$text</td>
</tr>";
}
echo "</table>";
}
else
{
echo "No data.";
}
mysql_free_result($result);
include ('links.x');
?>
</body>
</html>

[email protected]:/var/www/example.com/public_html# ls -la
total 40
drwxr-xr-x. 2 root root 174 Dec 1 10:09 .
drwxr-xr-x. 5 root root 51 Dec 1 05:43 ..
-rw-r--r--. 1 root root 666 Dec 1 10:04 add.php
-rw-r--r--. 1 root root 1046 Dec 1 10:05 add2tbl.php
-rw-r--r--. 1 root root 1081 Dec 1 10:07 del.php
-rw-r--r--. 1 root root 977 Dec 1 10:07 dele.php
-rw-r--r--. 1 root root 1102 Dec 1 10:05 edit.php
-rw-r--r--. 1 root root 1064 Dec 1 10:06 editdb.php
-rw-r--r--. 1 root root 800 Dec 1 10:06 editing.php
-rw-r--r--. 1 root root 492 Feb 19 2015 index.html
-rw-r--r--. 1 root root 989 Dec 1 09:49 index.php
-rw-r--r--. 1 root root 211 Dec 1 10:01 links.x

以上資料存在於宿主主機上
[[email protected] _data]# ls -la /var/lib/docker/volumes/lamp_www/_data/example.com/public_html
total 40
drwxr-xr-x. 2 root root 174 Dec 1 18:09 .
drwxr-xr-x. 5 root root 51 Dec 1 13:43 ..
-rw-r--r--. 1 root root 1046 Dec 1 18:05 add2tbl.php
-rw-r--r--. 1 root root 666 Dec 1 18:04 add.php
-rw-r--r--. 1 root root 977 Dec 1 18:07 dele.php
-rw-r--r--. 1 root root 1081 Dec 1 18:07 del.php
-rw-r--r--. 1 root root 1064 Dec 1 18:06 editdb.php
-rw-r--r--. 1 root root 800 Dec 1 18:06 editing.php
-rw-r--r--. 1 root root 1102 Dec 1 18:05 edit.php
-rw-r--r--. 1 root root 492 Feb 20 2015 index.html
-rw-r--r--. 1 root root 989 Dec 1 17:49 index.php
-rw-r--r--. 1 root root 211 Dec 1 18:01 links.x

因此:
宿主機上mysql資料目錄
/var/lib/docker/volumes/lamp_mysql_data/_data
宿主機上mysql配置檔案目錄
/var/lib/docker/volumes/lamp_mysql_conf/_data
宿主機上網頁資料目錄
/var/lib/docker/volumes/lamp_www/_data/example.com/public_html
宿主機上apache配置檔案目錄
/var/lib/docker/volumes/lamp_apache_conf/_data