返回列表 发帖

CentOS8_在Docker中安装LAMP

笺注:Docker的安装可参考 CentOS8_在Docker中使用Nginx的反向代理


查看Docker的版本信息:
[root@centos8 ~]# docker -v
Docker version 20.10.21, build baeda1f
[root@centos8 ~]#

已经设置开机自动启动Docker:
[root@centos8 ~]# systemctl is-enabled docker
enabled
[root@centos8 ~]#



[root@centos8 ~]# yum -y install net-tools

[root@centos8 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:99ff:fea5:bcb6  prefixlen 64  scopeid 0x20<link>
        ether 02:42:99:a5:bc:b6  txqueuelen 0  (Ethernet)
        RX packets 445  bytes 97545 (95.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 459  bytes 63899 (62.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.168.154  netmask 255.255.255.0  broadcast 192.168.168.255
        inet6 fe80::92ab:5fb4:5373:ad53  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:0e:fa:49  txqueuelen 1000  (Ethernet)
        RX packets 197116  bytes 285229969 (272.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 59085  bytes 3932166 (3.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth17d4fc8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::74a0:dfff:fee0:bdf6  prefixlen 64  scopeid 0x20<link>
        ether 76:a0:df:e0:bd:f6  txqueuelen 0  (Ethernet)
        RX packets 15  bytes 1972 (1.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31  bytes 2876 (2.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@centos8 ~]#



给Docker创建自定义虚拟网卡,并且指定网段:
[root@centos8 ~]# docker network create --subnet=172.19.0.0/16 zhuohua-docker
cd1995d89cccb6a5211c907c6391b5b3ffb2c6172d7a724cf2333c63de917567
[root@centos8 ~]#

备注:给Docker创建自定义虚拟网卡后,容器才能使用固定IP地址;



查看Docker所有的虚拟网卡:
[root@centos8 ~]# docker network ls
NETWORK ID     NAME             DRIVER    SCOPE
87097a7d771c   bridge           bridge    local
ecf4d5fc9a71   host             host      local
f3a83278f2d8   none             null      local
cd1995d89ccc   zhuohua-docker   bridge    local
[root@centos8 ~]#

备注:
网卡ID“cd1995d89ccc”是自动生成的;
网卡名“zhuohua-docker”是自定义的;



[root@centos8 ~]# ifconfig
br-cd1995d89ccc: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.19.0.1  netmask 255.255.0.0  broadcast 172.19.255.255
        ether 02:42:80:1e:9f:82  txqueuelen 0  (Ethernet)
        RX packets 197198  bytes 285236155 (272.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 59116  bytes 3937298 (3.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:99ff:fea5:bcb6  prefixlen 64  scopeid 0x20<link>
        ether 02:42:99:a5:bc:b6  txqueuelen 0  (Ethernet)
        RX packets 445  bytes 97545 (95.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 459  bytes 63899 (62.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.168.154  netmask 255.255.255.0  broadcast 192.168.168.255
        inet6 fe80::92ab:5fb4:5373:ad53  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:0e:fa:49  txqueuelen 1000  (Ethernet)
        RX packets 197198  bytes 285236155 (272.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 59116  bytes 3937298 (3.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth17d4fc8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::74a0:dfff:fee0:bdf6  prefixlen 64  scopeid 0x20<link>
        ether 76:a0:df:e0:bd:f6  txqueuelen 0  (Ethernet)
        RX packets 15  bytes 1972 (1.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31  bytes 2876 (2.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@centos8 ~]#





######

搭建Apache+PHP容器:

从公网下载镜像:( 以下是下载Apache2.4+PHP5.6的镜像 )
[root@centos8 ~]# docker pull php:5.6-apache
5.6-apache: Pulling from library/php
5e6ec7f28fb7: Already exists
cf165947b5b7: Already exists
7bd37682846d: Already exists
99daf8e838e1: Already exists
ae320713efba: Pull complete
ebcb99c48d8c: Pull complete
9867e71b4ab6: Pull complete
936eb418164a: Pull complete
bc298e7adaf7: Pull complete
ccd61b587bcd: Pull complete
b2d4b347f67c: Pull complete
56e9dde34152: Pull complete
9ad99b17eb78: Pull complete
Digest: sha256:0a40fd273961b99d8afe69a61a68c73c04bc0caa9de384d3b2dd9e7986eec86d
Status: Downloaded newer image for php:5.6-apache
docker.io/library/php:5.6-apache
[root@centos8 ~]#


查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY   TAG          IMAGE ID       CREATED       SIZE
php          5.6-apache   24c791995c1e   4 years ago   355MB
[root@centos8 ~]#



使用镜像“php:5.6-apache”创建并启动容器“Apache_1”:
[root@centos8 ~]# docker run -itd --name Apache_1 -p 80:80 -v /opt/Apache_1:/var/www/html --net zhuohua-docker --ip 172.19.0.2 php:5.6-apache
34c8454daca4a345c66482d64c41d7efb4b2203d7be408c5da2e23f7bc690e34
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 第一个80是宿主机的端口,暴露给外部直接访问;第二个80是容器的端口。
-v 挂载目录 : 这里是把宿主机的目录/opt/Apache_1挂载到容器的目录/var/www/html;假如目录不存在,就会自动创建。
--net zhuohua-docker --ip : 指定容器的固定IP地址(使用虚拟网卡“zhuohua-docker”)。
php:5.6-apache : 镜像名称:版本号



在宿主机查看正在运行的容器:
[root@centos8 ~]# docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED              STATUS              PORTS                               NAMES
34c8454daca4   php:5.6-apache   "docker-php-entrypoi…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   Apache_1
[root@centos8 ~]#

注释:宿主机的TCP 80端口,映射到容器“Apache_1”的TCP 80端口。



###

进入容器“Apache_1”:
[root@centos8 ~]# docker exec -it Apache_1 /bin/bash
root@34c8454daca4:/var/www/html#

root@34c8454daca4:/var/www/html# pwd
/var/www/html
root@34c8454daca4:/var/www/html# ls
root@34c8454daca4:/var/www/html#



查看容器“Apache_1”的系统版本信息:
root@34c8454daca4:~# cat /etc/issue
Debian GNU/Linux 9 \n \l

root@34c8454daca4:~# more /etc/debian_version
9.6
root@34c8454daca4:~# uname -r
4.18.0-193.el8.x86_64
root@34c8454daca4:~#



查看容器“Apache_1”的IP地址:
root@34c8454daca4:~# ifconfig
bash: ifconfig: command not found
root@34c8454daca4:~#

root@34c8454daca4:~# apt-get update
root@34c8454daca4:~# apt-get -y install net-tools

root@34c8454daca4:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.2  netmask 255.255.0.0  broadcast 172.19.255.255
        ether 02:42:ac:13:00:02  txqueuelen 0  (Ethernet)
        RX packets 2279  bytes 8511723 (8.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2096  bytes 114568 (111.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 6  bytes 526 (526.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 526 (526.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@34c8454daca4:~#

备注:
宿主机或容器重启后,IP地址都是不变的;



Apache的默认站点的默认首页文件:
root@34c8454daca4:~# cat /etc/apache2/conf-enabled/docker-php.conf |grep "index"
DirectoryIndex index.php index.html
root@34c8454daca4:~#



###

在宿主机上创建容器“Apache_1”的Apache的默认站点的默认首页文件:
[root@centos8 Apache_1]# pwd
/opt/Apache_1
[root@centos8 Apache_1]# echo 'Welcome to zhuohua.' > index.html
[root@centos8 Apache_1]#

创建PHP测试页:
[root@centos8 Apache_1]# cat /opt/Apache_1/test.php
<?php
phpinfo();
?>

[root@centos8 Apache_1]#


###

在容器“Apache_1”上查看Apache的默认站点里的文件:
root@34c8454daca4:~# cd /var/www/html/
root@34c8454daca4:/var/www/html# ls
index.html  test.php
root@34c8454daca4:/var/www/html#

注释:因为在创建容器“Apache_1”的时候,把宿主机的目录/opt/Apache_1挂载到容器的目录/var/www/html,所以这两个目录里的数据是双向同步的。



###

在宿主机的防火墙firewalld打开TCP 80端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

查看防火墙所有打开的端口:
[root@centos8 ~]# firewall-cmd --zone=public --list-ports
80/tcp
[root@centos8 ~]#



###

在客户端访问容器“Apache_1”的Apache的默认站点的默认首页文件:
http://192.168.168.154/
图片1.png
2023-1-30 21:45




在客户端访问容器“Apache_1”的Apache的默认站点里的PHP测试页:
http://192.168.168.154/test.php

PHP的版本:
图片2.png
2023-1-30 21:46


Apache的版本:
图片3.png
2023-1-30 21:46


注释:此时,外面的客户端访问宿主机的TCP 80端口时,等于访问容器“Apache_1”的TCP 80端口。





######

搭建MySQL容器:

从公网下载镜像:( 以下是下载MySQL5.7的镜像 )
[root@centos8 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
d26998a7c52d: Pull complete
4a9d8a3567e3: Pull complete
bfee1f0f349e: Pull complete
71ff8dfb9b12: Pull complete
bf56cbebc916: Pull complete
9a7bdfff0f5b: Pull complete
b7677d20b791: Pull complete
b4bcfc1167c2: Pull complete
03f1c0b71b70: Pull complete
61aa2e026ac3: Pull complete
3b784fa66c50: Pull complete
Digest: sha256:f04fc2e2f01e65d6e2828b4cce2c4761d9258aee71d989e273b2ae309f44a945
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
[root@centos8 ~]#


查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY   TAG          IMAGE ID       CREATED       SIZE
mysql        5.7          e982339a20a5   12 days ago   452MB
php          5.6-apache   24c791995c1e   4 years ago   355MB
[root@centos8 ~]#



使用镜像“mysql:5.7”创建并启动容器“MySQL_1”:
[root@centos8 ~]# docker run -itd --name MySQL_1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=888 --restart=always -v /opt/MySQL_1:/home/MySQL_1 --net zhuohua-docker --ip 172.19.0.3 mysql:5.7
3d05e80cf82a2cbac2c02649343fb4a2036be14e2891a2cac115cf8c31d55471
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 第一个3306是宿主机的端口,暴露给外部直接访问;第二个3306是容器的端口。
-e 环境配置 : 指定数据库管理员root@localhost的密码为888
--restart=always : 让容器随宿主机的启动而启动;还会自动启动MySQL数据库
-v 挂载目录 : 这里是把宿主机的目录/opt/MySQL_1挂载到容器的目录/home/MySQL_1;假如目录不存在,就会自动创建。
--net zhuohua-docker --ip : 指定容器的固定IP地址(使用虚拟网卡“zhuohua-docker”)。
mysql:5.7 : 镜像名称:版本号



在宿主机查看所有的容器:(无论是否正在运行)
[root@centos8 ~]# docker ps -a
CONTAINER ID   IMAGE            COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
3d05e80cf82a   mysql:5.7        "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   MySQL_1
34c8454daca4   php:5.6-apache   "docker-php-entrypoi…"   About an hour ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp                      Apache_1
[root@centos8 ~]#

注释:宿主机的TCP 3306端口,映射到容器“MySQL_1”的TCP 3306端口。



###

进入容器“MySQL_1”:
[root@centos8 ~]# docker exec -it MySQL_1 /bin/bash
bash-4.2#


查看容器“MySQL_1”的系统版本信息:
bash-4.2# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
bash-4.2# uname -r
4.18.0-193.el8.x86_64
bash-4.2#



查看容器“MySQL_1”的IP地址:
bash-4.2# ifconfig
bash: ifconfig: command not found
bash-4.2#

可以直接使用公网Yum源:
bash-4.2# yum -y install net-tools

bash-4.2# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.3  netmask 255.255.0.0  broadcast 172.19.255.255
        ether 02:42:ac:13:00:03  txqueuelen 0  (Ethernet)
        RX packets 20336  bytes 91088646 (86.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16887  bytes 923362 (901.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 47  bytes 5974 (5.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 47  bytes 5974 (5.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

bash-4.2#



查看MySQL的版本信息:
bash-4.2# mysql -V
mysql  Ver 14.14 Distrib 5.7.41, for Linux (x86_64) using  EditLine wrapper
bash-4.2#



MySQL的主配置文件:(以下是初始状态)
bash-4.2# cat /etc/my.cnf |grep -v "^#" |grep -v "^$"
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
symbolic-links=0
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
bash-4.2#



本地登录MySQL数据库:(使用的是数据库管理员root@localhost,密码888)
bash-4.2# mysql -uroot -p"888"
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.41 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


查看数据库里有哪些库:(以下4个库是默认就有的)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql>


查看所有数据库用户及其主机信息:(以下是初始状态)
mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

mysql>



删除数据库用户root@'%':
mysql> drop user root@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)

mysql>



创建一个数据库用户并授权:
MySQL服务器授权数据库用户Python@'172.19.0.2'(密码P@ssw0rd),仅仅在使用IP地址172.19.0.2时可以进行访问,对所有的库有完全控制的权限:
mysql> grant all on *.* to Python@'172.19.0.2' identified by 'P@ssw0rd';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>
mysql> select user,host from mysql.user;
+---------------+------------+
| user          | host       |
+---------------+------------+
| Python        | 172.19.0.2 |
| mysql.session | localhost  |
| mysql.sys     | localhost  |
| root          | localhost  |
+---------------+------------+
4 rows in set (0.00 sec)

mysql>


查看数据库用户Python@'172.19.0.2'的权限:
mysql> show grants for Python@'172.19.0.2';
+------------------------------------------------------+
| Grants for Python@172.19.0.2                         |
+------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'Python'@'172.19.0.2' |
+------------------------------------------------------+
1 row in set (0.00 sec)

mysql>



###

在宿主机上创建容器“Apache_1”的PHP与MySQL的连接测试页:
[root@centos8 ~]# cat /opt/Apache_1/mysql.php
<?php
header("Content-Type:text/html;charset=utf-8");
$link=mysql_connect('172.19.0.3','Python','P@ssw0rd');
if(!$link) echo "远程MySQL5.7连接失败。";
else echo "远程MySQL5.7连接正常。";
mysql_close();
?>
[root@centos8 ~]#


###

在容器“Apache_1”上查看Apache的默认站点里的文件:
root@34c8454daca4:~# ls /var/www/html/
index.html  mysql.php  test.php
root@34c8454daca4:~#

注释:因为在创建容器“Apache_1”的时候,把宿主机的目录/opt/Apache_1挂载到容器的目录/var/www/html,所以这两个目录里的数据是双向同步的。



###

在客户端访问容器“Apache_1”的Apache的默认站点里的MySQL测试页:
http://192.168.168.154/mysql.php
图片4.png
2023-1-30 21:52


错误:
Fatal error: Call to undefined function mysql_connect() in /var/www/html/mysql.php on line 3

这是因为容器“Apache_1”的PHP没有安装相关的MySQL扩展。


进入容器“Apache_1”安装相关的MySQL扩展:
root@34c8454daca4:~# docker-php-ext-install pdo_mysql

root@34c8454daca4:~# docker-php-ext-install mysql

root@34c8454daca4:~# docker-php-ext-install mysqli

root@34c8454daca4:~# docker-php-ext-install pdo


在宿主机重启容器“Apache_1”:
[root@centos8 ~]# docker restart Apache_1
Apache_1
[root@centos8 ~]#



再次,在客户端访问容器“Apache_1”的Apache的默认站点里的MySQL测试页:
http://192.168.168.154/mysql.php
图片5.png
2023-1-30 21:53






相关文章:
CentOS8_在Docker中安装MySQL
CentOS8_在Docker中安装MariaDB
CentOS8_在Docker中安装LAMP(使用参数--link)

CentOS8安装LAMP+phpMyAdmin
Windows2008R2_IIS+PHP Manger+Zend Guard Loader/OPcache

返回列表