一 Docker 搭建 LAMP 环境
参考:
1、 Docker搭建LAMP环境
2、 Docker 基于centos7 的LAMP环境搭建
3、 玩转 docker 入门(10) 利用docker搭建LAMP(php5+mysql+apache2)集成环境
- 概述:
- 两种方法进行搭建,一种是直接使用别人搭好的(从 Docker Hub 上拉,见本章参考 1),本笔记是直接使用别人搭好的用;第二种是自己从零搭建(见本章参考 2)。
- 过程:Docker 中下载镜像 -> 设置数据卷(数据永久化)-> 映射运行一个容器 -> 其它操作(和使用虚拟机一样)
- 准备工作:
拉镜像,下载 LAMP 镜像,去 Docker Hub 查看镜像信息避免坑 mattrayner/lamp 镜像。
创建好 docker 数据卷(数据持久化),运行容器:
1
2
3
4
5
6
7
8
9
10
11
12
13命令创建:
docker volume create test_lamp_www # apache的web根目录 / 容器内:/var/www
docker volume create test_lamp_apache_conf # apache的配置目录 / 容器内:/etc/apache2
docker volume create test_lamp_mysql_conf # MySQL的配置目录 / 容器内:/etc/mysql
docker volume create test_lamp_mysql_data # MySQL的数据目录 / 容器内:/var/lib/mysql
映射命令(大概参考):
docker run -it -p 80:80 -p 3306:3306 -v test_lamp_www:/var/www -v test_lamp_apache_conf:/etc/apache2 -v test_lamp_mysql_conf:/etc/mysql -v test_lamp_mysql_data:/var/lib/mysql --name testproject mattrayner/lamp /bin/bash
# 解释:
# docker run:运行一个 container,如果后面要绑定宿主主机的 0-1024 端口需要使用 sudo
# -p port1:port2: 将宿主机的端口 port1 映射到容器中的 port2
# -v volume:path: 将宿主机的 docker 卷映射到容器中的指定的路径
# -t -i mattrayner/lamp /bin/bash:使用 mattrayner/lamp 生成容器,并打开 shellWindows 环境中 DockerToolBox 目录挂载问题:
DockerToolBox 的工作原理是,首先通过 VM 虚拟机创建一个 Linux 虚拟机,然后在虚拟机中安装 Docker。然后 VM 虚拟机通过共享文件夹的机制将宿主机文件挂载到虚拟机中,然后我们通过 -v 参数挂载时,:
前面的目录应该是 Linux 虚拟机中的共享文件夹的目录。补充,用图形工具查看容器相关信息:
图中的 IP 是虚拟机的 IP,详见 Windows 环境中 DockerToolBox 目录挂载问题。一般是 127.0.0.1,本地访问。虚拟机问题导致的使用虚拟机 IP 更像是从公网访问。补充:Windows 迁移本地 Docker 数据卷(Windows for Docker 软件安装的 Docker):
参见:参考 1、参考 2。
- 对容器中的 Apache、MySQL 等进行启动、配置:
每从镜像运行一个容器(添加完数据卷,数据卷数据会保留于宿主机)就相当于新建运行了一个虚拟机,并在上面运行了程序。
启动容器内的 Apache、MySQL 服务,如下图是初次运行。然后对其进行配置,如数据库管理员密码等。记得所有脚本加执行权限
chmod +x xxx.sh
后再运行脚本!然后配置 MySQL 初始密码,命令mysql -uroot
、ALTER USER 'root'@'localhost' IDENTIFIED BY '12345';
。宿主机浏览器访问
容器的公共 ip:port/phpmyadmin/
来访问容器内的 phpmyadmin,图形化工具来使用其中的 MySQL。具体怎么配置记得去 Docker Hub 查看镜像信息避免坑 mattrayner/lamp 镜像。补充:MySQL 密码的问题:Linux 解决下mysql 首次无法直接通过无密码登录问题。
二 从零开始制作 LAMP 镜像
参考:
1、 Docker与Dockerfile极简入门文档
2、 Docker 基于centos7 的LAMP环境搭建
3、 如何在PHP7中安装mysql的扩展
4、 年终福利,PHP7+Apache2.4+MySQL5.6 源码编译安装,环境配置,搭建你自己的LAMP环境
5、 过程小结:从零开始构建 Docker LAMP 镜像
1 手动制作过程
Ubuntu 18.04.2;Apache 2.4.29;MySQL 5.7.25;PHP 7.2.15
Docker Hub:marlous/lamp
- 制作过程:
从 Docker Hub 上拉一个 Ubuntu 镜像
docker pull ubuntu
。基于 Ubuntu 镜像,运行一个容器(最好指定好端口方便测试
docker run -it -p 80:80 -p 3306:3306 --name 准备的容器名 镜像名 /bin/bash
),进入。安装相关服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92/*
注意:安装的是最新版本的服务程序,PHP 7.2 和之前版本不太相同,所需要的插件模块也不太相同。
网上很多是以前老版本的教程。本过程是目前最新版的安装过程。
*/
/*
换源
cp /etc/apt/sources.list /etc/apt/sources_bak.list
vi /etc/apt/sources.list
把源拷贝进去
// 注意,换源可能会导致很多包找不到!
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
*/
// sudo apt-get -f install 修复包
apt-get update
apt-get install vim-gtk
apt-get install apache2
apt-get install php
apt-get install mysql-server
apt-get install phpmyadmin
不配置 phpmyadmin
/*
service mysql restart
service apache2 restart
*/
无法重启 apache 服务:在 apache2.conf 中添加一行 ServerName 127.0.0.1:80
// MySQL 服务启动报错的话(No directory, logging in with HOME=/)
usermod -d /var/lib/mysql/ mysql#第一步
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock#第二步
chown -R mysql:mysql /var/lib/mysql#第三步
chmod 777 /var/www
// 为查看 PHP 信息准备
cd /var/www/html
sudo vi info.php
内容为
<?php
phpinfo();
?>
// 之后运行镜像时,浏览器 127.0.0.1/info.php 查看环境是否搭建完成。
进入 /etc/php/7.2/apache2/php.ini 去掉分号并改为 ;extension=mbstring.os
service apache2 restart
a2enmod rewrite // 启用 mod_rewrite 模块。
apt-get install libapache2-mod-php // 没有的话注意 PHP 版本
apt-get install php7.2-mbstring
apt-get install php7.2-mysql
apt-get install php7.2-gd
// 在 /var/www 文件夹下建立链接。
ln -s /usr/share/phpmyadmin /var/www/
初始化 root 密码、创建一个用来访问数据库的用户。
/*
mysql -uroot、ALTER USER 'root'@'localhost' IDENTIFIED BY '12345';
CREATE USER 'admin'@'localhost' IDENTIFIED BY '12345';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit
*/
配置 phpmyadmin,配置 MySQL 帐号密码(admin,12345)。参考下面补充。// phpmyadmin/libraries/config.default.php
/* 可选择
apt install python-setuptools // 安装 supervisord 进程管理程序
easy_install supervisor
apt-get install supervisor
配置 supervisord,参见下面配置方法
supervisorctl reload
*/
// 可选择配置服务开机自启。参见下面配置方法。制作成镜像,
docker commit 容器名 起个镜像名
。从刚制作的镜像运行一个容器
docker run -it -p 80:80 -p 3306:3306 --name 容器名 镜像名 /bin/bash
。浏览器
127.0.0.1:80/phpmyadmin/
、127.0.0.1:80
、127.0.0.1:80/info.php
查看。(
如果是 Windows 上的 DockerToolbox 安装的 Docker,则改为虚拟机的 IP 访问。)完成镜像的测试。
可以上传镜像到 Docker Hub:
docker push <hub-user>/<repo-name>:<tag>
,参考博文。补充问题解决:ubuntu中supervisor的安装及配置、MySQL在Ubuntu系统的三种自启动方法、Ubuntu 16.04 安装 Apache, MySQL, PHP7 解决mbstring丢失、phpmyadmin 配置。
- 下次正式使用镜像:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16命令创建:
docker volume create test_lamp_www # apache的web根目录 / 容器内:/var/www
docker volume create test_lamp_apache_conf # apache的配置目录 / 容器内:/etc/apache2
docker volume create test_lamp_mysql_conf # MySQL的配置目录 / 容器内:/etc/mysql
docker volume create test_lamp_mysql_data # MySQL的数据目录 / 容器内:/var/lib/mysql
映射命令(大概参考):
docker run -it -p 80:80 -p 3306:3306 -v test_lamp_www:/var/www -v test_lamp_apache_conf:/etc/apache2 -v test_lamp_mysql_conf:/etc/mysql -v test_lamp_mysql_data:/var/lib/mysql --name 容器名 镜像名 /bin/bash
# 解释:
# docker run:运行一个 container,如果后面要绑定宿主主机的 0-1024 端口需要使用 sudo
# -p port1:port2: 将宿主机的端口 port1 映射到容器中的 port2
# -v volume:path: 将宿主机的 docker 卷映射到容器中的指定的路径
# -t -i [镜像名] /bin/bash:使用 [镜像名] 生成容器,并打开 shell
service apache2 start
service mysql start
2 使用 Dockerfile 制作镜像
1 | # LAMP docker image |
1 | /* |
1 | /* |
3 制作运行使用的 docker-compose
- 使用
docker-compose up -d
命令从制作好的镜像运行一个容器:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/*
docker-compose.yml
*/
lamp_auto:
image: 'lamp_auto'
restart: always
hostname: 'lamp_auto'
ports:
- '3306:3306'
- '80:80'
volumes:
- 'docker volume create test_lamp_www:/var/www'
- 'docker volume create test_lamp_apache_conf:/etc/apache2'
- 'docker volume create test_lamp_mysql_conf:/etc/mysql'
- 'docker volume create test_lamp_mysql_data:/var/lib/mysql'
二 制作 WordPress 镜像
在上面 marlous/lamp 镜像基础上制作。
参考我的博文 《使用 WordPress 在云服务器快速建站》
Ubuntu 18.04.2;Apache 2.4.29;MySQL 5.7.25;PHP 7.2.15;WordPress 5.11
Docker Hub:marlous/wordpress
- 制作过程:
基于 marlous/lamp 镜像运行容器,
docker run -it -p 80:80 -p 3306:3306 --name 准备的容器名 镜像名 /bin/bash
。开启 Apache2、MySQL 服务。
创建 WordPress 的数据库:
1
2
3
4
5
6
7
8mysql -u admin -p12345
CREATE DATABASE WordPress; // WordPress 作为数据库名字。
GRANT ALL PRIVILEGES ON WordPress.* TO "admin"@"localhost" IDENTIFIED BY "12345";
FLUSH PRIVILEGES;
EXIT下载 WordPress:
1
2
3
4
5
6
7
8
9
10apt-get install wget
cd /tmp
wget https://cn.wordpress.org/latest-zh_CN.tar.gz
tar -xvzf latest-zh_CN.tar.gz
mv html html_bak // www 目录下
cp -Rf /tmp/wordpress/* /var/www/html将复制过去的文件中的 wp-config-sample.php 重命名为 wp-config.php。
mv wp-config-sample.php wp-config.php
。配置 wp-config.php 文件,设置用户名密码:
1
2
3
4
5
6
7
8
9
10
11
12DB_NAME
在第二步中为WordPress创建的数据库名称
DB_USER
在第二步中创建的WordPress用户名
DB_PASSWORD
第二步中为WordPress用户名设定的密码
DB_HOST
第二步中设定的hostname(通常是localhost,但总有例外;参见编辑wp-config.php文件中的“可能的DB_HOST值)。
DB_CHARSET
数据库字符串,通常不可更改(参见zh-cn:编辑wp-config.php)。
DB_COLLATE
留为空白的数据库排序制作成镜像,
docker commit 容器名 起个镜像名
。从刚制作的镜像运行一个容器
docker run -it -p 80:80 -p 3306:3306 --name 容器名 镜像名 /bin/bash
。本地浏览器访问,通过安装脚本安装:
放在 www 根目录下的 html 里的,http://example.com/wp-admin/install.php (本地用 127.0.0.1/wp-admin/install.php)。/放在 www 根目录下的 html 里的子目录的,http://example.com/blog/wp-admin/install.php出现安装界面,完成镜像的测试。
可以上传镜像到 Docker Hub:
docker push <hub-user>/<repo-name>:<tag>
,参考博文。
- 下次正式使用镜像:
运行容器进入:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16命令创建:
docker volume create test_wordpress_wp_config # wordpress的配置目录 / 容器内:/var/www/html/
docker volume create test_wordpress_apache_conf # apache的配置目录 / 容器内:/etc/apache2
docker volume create test_wordpress_mysql_conf # MySQL的配置目录 / 容器内:/etc/mysql
docker volume create test_wordpress_mysql_data # MySQL的数据目录 / 容器内:/var/lib/mysql
映射命令(大概参考):
docker run -it -p 80:80 -p 3306:3306 -v test_wordpress_wp_config:/var/www/html/ -v test_wordpress_apache_conf:/etc/apache2 -v test_wordpress_mysql_conf:/etc/mysql -v test_wordpress_mysql_data:/var/lib/mysql --name 容器名 镜像名 /bin/bash
# 解释:
# docker run:运行一个 container,如果后面要绑定宿主主机的 0-1024 端口需要使用 sudo
# -p port1:port2: 将宿主机的端口 port1 映射到容器中的 port2
# -v volume:path: 将宿主机的 docker 卷映射到容器中的指定的路径
# -t -i [镜像名] /bin/bash:使用 [镜像名] 生成容器,并打开 shell
service apache2 start
service mysql start安装:
本地(部署的服务器,远程则服务器名:80/wp-admin/install.php)浏览器访问,通过安装脚本安装:
放在 www 根目录下的 html 里的,http://example.com/wp-admin/install.php (本地用 127.0.0.1/wp-admin/install.php)。/放在 www 根目录下的 html 里的子目录的,http://example.com/blog/wp-admin/install.php