笺注: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/
在客户端访问容器“Apache_1”的Apache的默认站点里的PHP测试页:
http://192.168.168.154/test.php
PHP的版本:
Apache的版本:
注释:此时,外面的客户端访问宿主机的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
错误:
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
相关文章:
CentOS8_在Docker中安装MySQL
CentOS8_在Docker中安装MariaDB
CentOS8_在Docker中安装LAMP(使用参数--link)
CentOS8安装LAMP+phpMyAdmin
Windows2008R2_IIS+PHP Manger+Zend Guard Loader/OPcache |