返回列表 发帖

CentOS8_在Docker中安装LAMP(使用参数--link)

笺注: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 ~]#



######

搭建MySQL容器:

从公网下载镜像:( 以下是下载MySQL8.0的镜像 )
[root@centos8 ~]# docker pull mysql:8.0


查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY   TAG          IMAGE ID       CREATED        SIZE
mysql        8.0          05b458cc32b9   30 hours ago   517MB
[root@centos8 ~]#


使用镜像“mysql:8.0”创建并启动容器“MySQL_1”:
[root@centos8 ~]# docker run -itd --name MySQL_1 -e MYSQL_ROOT_PASSWORD=888 --restart=always -v /opt/MySQL_1:/home/MySQL_1 mysql:8.0
0e82cf518b86cdc842c7067e8f9df2ec9378a8f37a011e4b153862cfcbe714a0
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-e 环境配置 : 指定数据库管理员root@localhost的密码为888
--restart=always : 让容器随宿主机的启动而启动;还会自动启动MySQL数据库
-v 挂载目录 : 这里是把宿主机的目录/opt/MySQL_1挂载到容器的目录/home/MySQL_1;假如目录不存在,就会自动创建。
mysql:8.0 : 镜像名称:版本号


在宿主机查看正在运行的容器:
[root@centos8 ~]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                 NAMES
0e82cf518b86   mysql:8.0   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   3306/tcp, 33060/tcp   MySQL_1
[root@centos8 ~]#

注释:容器“MySQL_1”打开了TCP 3306端口。



###

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


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


查看MySQL的版本信息:
bash-4.4# mysql -V
mysql  Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)
bash-4.4#


MySQL的主配置文件:(以下是初始状态)
bash-4.4# 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
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
bash-4.4#



本地登录MySQL数据库:(使用的是数据库管理员root@localhost,密码888)
bash-4.4# 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 8
Server version: 8.0.32 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.01 sec)

mysql>


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

mysql>





######

搭建Apache+PHP容器:

从公网下载镜像:( 以下是下载Apache2.4+PHP7.0的镜像 )
[root@centos8 ~]# docker pull php:7.0-apache


再次,查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY   TAG          IMAGE ID       CREATED        SIZE
mysql        8.0          05b458cc32b9   31 hours ago   517MB
php          7.0-apache   aa67a9c9814f   4 years ago    368MB
[root@centos8 ~]#


使用镜像“php:7.0-apache”创建并启动容器“Apache_1”:
[root@centos8 ~]# docker run -itd --name Apache_1 -p 80:80 --restart=always --link MySQL_1 -v /opt/Apache_1:/var/www/html php:7.0-apache
d08b050906af3dac8f66e2b444aa9cf95eed2cbdcdd9d836d52f3b78587b0e25
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 第一个80是宿主机的端口,暴露给外部直接访问;第二个80是容器的端口。
--link MySQL_1 : 实现容器互联,让容器“Apache_1”可以通过容器名或容器id对容器“MySQL_1”进行网络访问。
--restart=always : 让容器随宿主机的启动而启动;还会自动启动Apache服务。因为使用了参数“--link”互联到容器“MySQL_1”,所以假如容器“MySQL_1”不设置为随宿主机的启动而启动,那么容器“Apache_1”也不会随宿主机的启动而启动。
-v 挂载目录 : 这里是把宿主机的目录/opt/Apache_1挂载到容器的目录/var/www/html;假如目录不存在,就会自动创建。
php:7.0-apache : 镜像名称:版本号


在宿主机查看正在运行的容器:
[root@centos8 ~]# docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                               NAMES
d08b050906af   php:7.0-apache   "docker-php-entrypoi…"   44 seconds ago   Up 42 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   Apache_1
0e82cf518b86   mysql:8.0        "docker-entrypoint.s…"   17 minutes ago   Up 17 minutes   3306/tcp, 33060/tcp                 MySQL_1
[root@centos8 ~]#

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



###

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

root@d08b050906af:/var/www/html# pwd
/var/www/html
root@d08b050906af:/var/www/html# ls
root@d08b050906af:/var/www/html#


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

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



容器“Apache_1”可以通过容器名或容器id对容器“MySQL_1”进行网络访问:
root@d08b050906af:~# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      MySQL_1 0e82cf518b86
172.17.0.3      d08b050906af
root@d08b050906af:~#

显示容器“Apache_1”对容器“MySQL_1”的环境变量:
root@d08b050906af:~# env | grep -i MySQL_1  
MYSQL_1_PORT_33060_TCP=tcp://172.17.0.2:33060
MYSQL_1_ENV_MYSQL_SHELL_VERSION=8.0.32-1.el8
MYSQL_1_PORT_33060_TCP_PORT=33060
MYSQL_1_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL_1_ENV_MYSQL_ROOT_PASSWORD=888
MYSQL_1_PORT_3306_TCP_PORT=3306
MYSQL_1_ENV_MYSQL_MAJOR=8.0
MYSQL_1_ENV_GOSU_VERSION=1.16
MYSQL_1_PORT_3306_TCP_PROTO=tcp
MYSQL_1_PORT_33060_TCP_ADDR=172.17.0.2
MYSQL_1_ENV_MYSQL_VERSION=8.0.32-1.el8
MYSQL_1_PORT_33060_TCP_PROTO=tcp
MYSQL_1_NAME=/Apache_1/MySQL_1
MYSQL_1_PORT_3306_TCP=tcp://172.17.0.2:3306
MYSQL_1_PORT=tcp://172.17.0.2:3306
root@d08b050906af:~#

注释:在创建容器“Apache_1”时,使用了参数 --link



Apache的默认站点的默认首页文件:
root@d08b050906af:~# cd /etc/apache2
root@d08b050906af:/etc/apache2# ls
apache2.conf    conf-enabled  magic           mods-enabled  sites-available
conf-available  envvars       mods-available  ports.conf    sites-enabled
root@d08b050906af:/etc/apache2#

root@d08b050906af:/etc/apache2# cd conf-enabled/
root@d08b050906af:/etc/apache2/conf-enabled# ls
charset.conf  docker-php.conf  localized-error-pages.conf  other-vhosts-access-log.conf  security.conf  serve-cgi-bin.conf
root@d08b050906af:/etc/apache2/conf-enabled#

root@d08b050906af:~# cat /etc/apache2/conf-enabled/docker-php.conf |grep 'index'
DirectoryIndex index.php index.html
root@d08b050906af:~#



###

在宿主机上创建容器“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 test.php
<?php
phpinfo();
?>
[root@centos8 Apache_1]#



###

在容器“Apache_1”上查看Apache的默认站点里的文件:
root@d08b050906af:~# cd /var/www/html/
root@d08b050906af:/var/www/html# ls
index.html  test.php
root@d08b050906af:/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-2-4 12:07



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

PHP的版本:
图片2.png
2023-2-4 12:08


Apache的版本:
图片3.png
2023-2-4 12:08


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





#####

在容器“MySQL_1”上创建一个数据库用户并授权:

授权数据库用户zhuohua@'%'(密码886),可以从任意IP进行访问,对所有的库有完全控制的权限:
mysql> Create user zhuohua@'%' identified with mysql_native_password by '886';
Query OK, 0 rows affected (0.00 sec)

mysql> Grant all on *.* to zhuohua@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> Flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> Select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| zhuohua          | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)

mysql>



###

在宿主机上创建容器“Apache_1”的PHP与MySQL的连接测试页:(PHP7.x的语法)
[root@centos8 ~]# cat /opt/Apache_1/mysql.php
<?php
header("Content-Type:text/html;charset=utf-8");
$con=mysqli_connect('MySQL_1','zhuohua','886')
OR die('远程MySQL8.0连接失败。');
echo '远程MySQL8.0连接正常。';
?>
[root@centos8 ~]#

注释:因为在创建容器“Apache_1”时,使用了参数“--link”互联到容器“MySQL_1”,所以在这里可以直接使用容器“MySQL_1”的容器名或容器id。


###

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

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



###

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


错误:
Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /var/www/html/mysql.php:3 Stack trace: #0 {main} thrown in /var/www/html/mysql.php on line 3

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


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

root@d08b050906af:~# docker-php-ext-install mysql

root@d08b050906af:~# docker-php-ext-install mysqli

root@d08b050906af:~# docker-php-ext-install pdo


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


再次,在客户端访问容器“Apache_1”的Apache的默认站点里的MySQL测试页:
图片5.png
2023-2-4 12:11


错误:
Warning: mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in /var/www/html/mysql.php on line 3

Warning: mysqli_connect(): (HY000/2054): The server requested authentication method unknown to the client in /var/www/html/mysql.php on line 3
远程MySQL8.0连接失败。


解决方法:(在宿主机上修改容器“MySQL_1”的MySQL的主配置文件)
[root@centos8 ~]# docker cp MySQL_1:/etc/my.cnf ./
[root@centos8 ~]# vi my.cnf
[mysqld]下添加以下一行代码:
default_authentication_plugin=mysql_native_password

[root@centos8 ~]# docker cp my.cnf MySQL_1:/etc/my.cnf
[root@centos8 ~]#


进入容器“MySQL_1”后,再次查看MySQL的主配置文件:
bash-4.4# cat /etc/my.cnf |grep -v '^#' |grep -v '^$'
[mysqld]
default_authentication_plugin=mysql_native_password
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
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
bash-4.4#


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



再次,在客户端访问容器“Apache_1”的Apache的默认站点里的MySQL测试页:
图片6.png
2023-2-4 12:12






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

CentOS8_Yum安装MySQL8.0

返回列表