第一天兼职上课,反馈出自身很多问题,争取在下次的课程中调整好自己讲课的节奏和难易程度给同学们一个良好的教学环境
在本次教授课程中,从同学们实操的步骤中,发现了很多问题,所以大致整理了一下
本章所涉及知识点:DockerWordPressMysqlbusybox

1.防火墙的关闭及禁止开机启动

通常来讲,都需要关闭防火墙并设置为禁止开机启动,避免服务出现通信异常
systemctl disable的原理是,将/etc/systemd/system/下的服务文件指向/dev/null,从而使得服务在启动时不会被启动

1
2
3
4
#停止防火墙应用程序
[root@docker ~]# systemctl stop firewalld
#禁止防火墙开机启动
[root@docker ~]# systemctl disable firewalld

2.Selinux状态查询及永久关闭

seLinux是一个强制访问控制系统,带来高安全性的同时,也会可能会限制某些进程的权限,在学习linux的去期间,如无必要,一般是会对其进行永久性的关闭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 获取selinux的状态
[root@docker ~]# getenforce
Enforcing # 取值为Enforcing(启用)、Permissive(临时关闭)、Disabled(永久关闭)
# 修改selinux的状态为临时关闭
[root@docker ~]# setenforce 0
[root@docker ~]# getenforce
Permissive
# 修改Selinux的状态为永久关闭,需要重启
# 可在/etc/selinux.conf中将enforcing手动修改为disabled
[root@docker ~]# sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
[root@docker ~]# reboot
# 重启后查看selinux以永久关闭
[root@docker ~]# getenforce
Disabled

3.网卡配置

有部分同学基础较为薄弱,以下为网卡配置及重要参数解释

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
# 修改网卡配置文件
[root@docker ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
#指定协议类型为静态地址
BOOTPROTO="static"
DEFROUTE="yes"
NAME="ens33"
DEVICE="ens33"
#是否激活网卡
ONBOOT="yes"
#ip地址,请不要输入网段(192.168.200.150)
IPADDR=192.168.200.150
#子网掩码,在虚拟机网络编辑器中查看
NETMASK=255.255.255.0
#网关,在虚拟机网络编辑器中查看
GATEWAY=192.168.200.2
#DNS地址
DNS1=8.8.8.8
DNS2=114.114.114.114
[root@docker ~]# systemctl restart network
#测试网络连通性,是否可以访问外网
[root@docker ~]# ping www.baidu.com -c 1
PING www.a.shifen.com (182.61.200.6) 56(84) bytes of data.
64 bytes from 182.61.200.6 (182.61.200.6): icmp_seq=1 ttl=128 time=36.2 ms

virtualNetworkEdit1
virtualNetworkEdit2

4.grep

grep是一个强大的文本搜索工具,全称为"Globally search a Regular Expression and Print",它能够使用正则表达式搜索文本,并把匹配的行打印出来。grep的家族包括grep、egrep和fgrep,其中egrep是grep的扩展版本,支持使用扩展的正则表达式,而fgrep则是不使用正则表达式的版本。
grep的基本功能是搜索文本中的模式,并将匹配的行打印到屏幕上。它支持使用正则表达式来定义搜索模式,这使得grep非常灵活和强大。在Linux系统中,grep是许多系统管理员和程序员日常工作中不可或缺的工具之一

1
2
3
4
5
6
7
8
9
10
# 新建一个txt示例文件,内容如下
[root@docker ~]# vi test.txt
test1
abcd
!@#!@
test3
# 在test.txt中匹配包含test的行
[root@docker ~]# grep "test" test.txt
test1
test3

5." | " 管道

在Linux中,管道(Pipeline)是一种将多个命令连接起来的技术,使得一个命令的输出可以直接作为另一个命令的输入。这种机制通过管道符号 | 来实现,它极大地提高了命令行操作的效率和灵活性。
管道的概念源自于UNIX系统,它允许用户将简单的命令组合成强大的、复杂的命令序列。每个命令执行一个小的任务,并通过管道将结果传递给下一个命令,这样,多个命令就可以协同工作,完成更复杂的处理任务。
当使用管道连接两个命令时,第一个命令的输出会被自动传递给第二个命令作为输入,无需手动保存到文件或通过其他方式传递。这种机制类似于现实生活中的管道系统,水流(类比数据)通过管道(类比命令序列)从一个位置(类比源命令)流向另一个位置(类比目标命令)。

1
2
3
4
# 假设你有一个包含多行文本的文件test.txt,你想找出其中包含特定单词的所有行
[root@docker ~]# cat test.txt |grep test
test1
test3

6.查看VMvare虚拟机CPU是否支持虚拟化

在linux中/proc/cpuinfo存放着cpu的信息,可以cat /proc/cpuinfo查看cpu的信息
cpuinfo
通过过滤cpu信息中vmx或svm来判断是否支持虚拟化

1
2
3
4
# 此处egrep功能等价于grep -E,表明支持正则表达式
[root@docker ~]# egrep -c '(vmx|svm)' /proc/cpuinfo
2
# 值大于0 表明支持虚拟化,小于或等于0需要修改虚拟机cpu配置

打开VMvare虚拟机CPU的方式:
vmConfig
vmConfigCPU

7.修改/etc/docker/daemon.json后,重启docker报错

1
2
3
[root@docker ~]# vi /etc/docker/daemon.json
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker

有部分同学在daemin.json中添加镜像加速后,重启docker出现了以下报错
daemonError
如果执行了以上操作,出现该错误首先检查的事daemon.json的文件内容

1
2
[root@docker ~]# cat /etc/docker/daemon.json 
"registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"]

此时的daemon.json并不是一个完整的json文件。一个json文件,内容需要放在“ { } ”中,键值用” : ”分隔,所以需要修改为如下

1
2
3
4
5
6
7
8
[root@docker ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"]
}
# 检查服务配置文件变化,更新并重载systemd管理的服务单元
[root@docker ~]# systemctl daemon-reload
# 重启Docker服务
[root@docker ~]# systemctl restart docker

8.ocker run 报错“name is alreadyin use”

dockerRunNameError
从错误返回中可以看到是有同名container容器正在运行,按返回信息执行删除或rename即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 #查看容器列表,是否有上述命令冲突的容器名demo
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b1ad2b7aead nginx "/docker…" 2 minutes ago Up 2 minutes 80/tcp demo
# 删除掉冲突容器
[root@docker ~]# docker rm -f demo
demo
# 重新查看容器列表是否已删除冲突容器
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 重新运行并查看
[root@docker ~]# docker run -itd --name demo busybox
d40c8406a64f9e0d99f4aa4c89b7a9e64e3adeebb9d009017d6e67cadad9a392
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d40c8406a64f busybox "sh" 4 seconds ago Up 4 seconds demo

9.docker run 报错” port is already allocated”

dockerRunPortError
从错误返回中可以知道驱动程序在端点demo1上编程外部连接失败,失败的原因是这个端口已经被分配. 可以推测出“端口被其他容器占用了”,此时有两种解决方式

1
2
3
4
5
6
7
8
9
10
11
# 删除冲突容器,重新运行新容器
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
861f1072911f busybox "sh" 4 minutes ago Up 4 minutes 0.0.0.0:8081->80/tcp, :::8081->80/tcp demo
[root@docker ~]# docker rm -f demo
demo
[root@docker ~]# docker run -itd --name demo1 -p8081:80 busybox
e60a2952791654a35594f11c1518c28e05057193ca66f741a9fb00908381d27c
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e60a29527916 busybox "sh" 29 seconds ago Up 28 seconds 0.0.0.0:8081->80/tcp, :::8081->80/tcp demo1
1
2
3
4
5
6
7
8
9
10
11
# 修改待运行的容器,分配其他端口做映射
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c9d644bf0da busybox "sh" 1 second ago Up 1 second 0.0.0.0:8081->80/tcp, :::8081->80/tcp demo
# 修改预启动容器映射端口为8082,避免与已启动容器的银蛇端口8081冲突
[root@docker ~]# docker run -itd --name demo1 -p8082:80 busybox
d899e505be962256b3594a450bb803845fedb750d097668206fb2f35d11bdbec
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d899e505be96 busybox "sh" 3 seconds ago Up 2 seconds 0.0.0.0:8082->80/tcp, :::8082->80/tcp demo1
3c9d644bf0da busybox "sh" 10 seconds ago Up 10 seconds 0.0.0.0:8081->80/tcp, :::8081->80/tcp demo

10.交互方式进入容器后,如何退出

有部分同学,可能上课没有认真听哈 ╮(╯▽╰)╭

1
2
3
4
5
6
7
# 进入容器后,使用exit即可退出
[root@docker ~]# docker run -d --name nginx nginx
bdf91be9c84754b8f0631ac5cce01cbc15f3208eef934bf82f323b9022e226fb
[root@docker ~]# docker exec -it nginx bash
root@bdf91be9c847:/# exit
exit
[root@docker ~]#

11.创建docker自定义网络后,ssh的终端链接直接中断了

创建自定义网络后,发现终端中的ssh连接出现终端,但在自定义网络之前却正常
connectTimeOut

1
2
[root@docker ~]# docker network create demo --driver bridge --subnet 192.168.200.0/24 --gateway 192.168.200.2
< Connection close>

当出现这种情况,第一时间返回VMvare检查防火墙和selinux的状态

1
2
3
4
5
6
7
[root@docker ~]# systemctl status firewalld 
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@docker ~]# getenforce
Disabled

从上面返回信息,可以排除firewalld和selinux的问题,查看以下docker网络列表,inspect查看自定义网络demo的子网网段。然后再用该网段去过滤宿主机网卡情况,最终我们可以看到 宿主机的物理网卡使用的ip地址网段与docker虚拟网桥地址网段是一样的,造成了端口冲突,进而使得链接超时
connectTimeOutOrigin
如何解决呢?我们可以在vmvare中,删除与宿主机IP冲突的自定义网络,重启网络
deleteNetwork
再次尝试连接,连接成功
reConnect

10.部署wordpress过程中,wp的配置页面出现“与数据库建立连接失败”的错误

大致有3种类型的案例,如下

查看容器列表,发现mysql没有运行

1
2
3
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13c3df0e3938 mysql "docker-entrypoint.s…" 2 seconds ago Exited (1) 1 second ago mysql

查看mysql容器日志,提示缺少密码变量

1
2
3
4
5
6
7
[root@docker ~]# docker logs mysql|tail -n 1
2024-05-18 14:36:21+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of the following:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
2024-05-18 14:36:21+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.

查看历史命令,使用grep过滤mysql关键字,发现在docker run的过程中,环境变量缺失或环境变量值不正确

1
2
3
[root@docker ~]# history |grep mysql
132 docker run -d --name mysql -e MYSQL_PASSWOD="000000" -e MYSQL_DATABASE='wordpress' mysql
156 docker run -d --name mysql -e MYSQL_ROOT_PASSWOLD="000000" -e MYSQL_DATABASE='wordpress' mysql

解决方式:使用正确设置ROOT 密码的环境变量MYSQL_ROOT_PASSWORD

1
2
[root@docker ~]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD="000000" -e MYSQL_DATABASE="wordpress" mysql
869aa9bcd396185297bd689ddaaa2f54f7d0897a251c3b0dede7a8af5fba8337

查看容器列表,发现mysql正常运行,可以排除环境变量的“键”没有问题

1
2
3
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c98e30d29e76 mysql "docker-entrypoint.s…" 3 seconds ago Up 1 second 3306/tcp, 33060/tcp mysql

以交互方式进入mysql容器内部,尝试登录到mysql数据库中

1
2
3
4
5
6
[root@docker ~]# docker exec -it mysql bash 
root@97c41310e9de:/# mysql -uroot -p000000
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@97c41310e9de:/# exit
exit

从上面的返回中,我们可以看到当尝试登录到mysql时,访问被拒绝.考虑是用户名或密码的错误
查看历史命令,使用grep过滤mysql关键字,发现在docker run的过程中,环境变量``的值为7个0,而非尝试登录的6个0

1
2
[root@docker ~]# history |grep mysql
156 docker run -d --name mysql -e MYSQL_ROOT_PASSWOLD="0000000" -e MYSQL_DATABASE='wodpress' mysql

解决方式:修改正确的密码,或在wordpress的数据库配置界面使用7个0做为root密码进行数据库连接

1
2
[root@docker ~]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD="000000" -e MYSQL_DATABASE="wordpress" mysql
869aa9bcd396185297bd689ddaaa2f54f7d0897a251c3b0dede7a8af5fba8337

查看容器列表,发现mysql正常运行,可以排除环境变量的“键”没有问题

1
2
3
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c98e30d29e76 mysql "docker-entrypoint.s…" 3 seconds ago Up 1 second 3306/tcp, 33060/tcp mysql

以交互方式进入mysql容器内部,尝试登录到mysql数据库中

1
2
3
4
5
6
7
8
9
10
11
12
[root@docker ~]# docker exec -it mysql bash
root@fa39abadac00:/# mysql -uroot -p000000
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.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, 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>

从上面的返回中,我们可以看到登录到mysql数据库,此时我们可以确定root密码设置正确(确保wp数据库配置页面的数据库密码与此时输入的密码一致)
列出当前mysql中的所有数据库.发现数据库名为wodpress,并不是在wp数据库配置页面所设置的库名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show  databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wodpress |
+--------------------+
5 rows in set (0.03 sec)
mysql> exit
Bye
root@fa39abadac00:/# exit
exit
[root@docker ~]#

解决方式:修改数据库名为wordpress,或在wp数据库配置页面的库名中填入目前mysql错误的库名’wodpress’

1
2
[root@docker ~]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD="000000" -e MYSQL_DATABASE="wordpress" mysql
869aa9bcd396185297bd689ddaaa2f54f7d0897a251c3b0dede7a8af5fba8337