Linux简单介绍
- Linux 是一套开源操作系统,它有稳定、消耗资源小、功能很强、安全性高等特点,让它在 服务器领域有庞大的用户群体
- 目前市面上较知名的发行版有:RedHat、Ubuntu、CentOS、Debian、Fedora、SuSE、OpenSUSE、 Arch Linux、SolusOS 等
- 常见的服务器操作系统主要有
CentOS、Ubuntu、Debian,CentOS现在市场占有率第一
Linux常用命令
init 0关机init 6重启ls、ls -l、ll列出出当前目录下的文件cd切换目录pwd查看当前路径ctrl+c中断当前程序ctrl+l / (clear)清屏ifconfig/ipconfig查看网卡信息ping 127.0.0.1看网络是否通畅- Linux 创建用户修改密码
- 添加用户
useradd zhangsan - 设置密码
passwd zhangsan - 删除用户
userdel -rf zhangsan-r:递归的删除目录下面文件以及子目录下文件。
- 添加用户
- 文件管理
- 创建文件
touch file - 删除文件
rm -rf file-r:递归的删除目录下面文件以及子目录下文件。-f:强制删除,忽略不存在的文件,从不给出提示
- 修改文件名
mv file1 file11 - 查看文件内容
cat file1 - 复制文件
cp file2 file22 - 移动文件
mv file1 file11 - 编辑文件
vi file1 - 批量创建文件
touch file{1..10}rm -rf file{1..10} - 查看文件前3行
cat file1 | head -3 - 查看文件后3行
cat file1 | tail -3 - liunx服务器上面查找文件
find查找文件find / -name httpd.conf查找当前目录下的文件名为httpd.conf的文件find目录-name文件名
- 查找文件里面内容找到
httpd.conf里面有listencat httpd.conf | grep listencat httpd.conf | grep -ignore listen / cat httpd.conf | grep -i listen忽略大小写
- 查找文件里面内容 vi搜索
vi httpd.conf- 输入
/Listen搜索ListenN下一个
- 创建文件
- Linux 目录管理
- 创建目录
mkdir dir1 dir2 dir3 - 删除目录
rm -rf dir1 dir2-r:递归的删除目录下面文件以及子目录下文件。-f:强制删除,忽略不存在的文件,从不给出提示rm -rf dir*以dir开头的所有文件删除
- 重命名目录或移动目录
mv dir1 dir11 - 查看目录
ls / ll - 递归创建目录
mkdir -p a/b/c/d/e/f/g创建多层级目录 - 递归查看目录
tree atree命令不存在的话需要安装yum install tree -y - 复制目录
cp -rf wwwroot/ mywwwroot/
- 创建目录
- Linux 打包压缩别名管理
- zip压缩包
- 安装zip减压软件
yum install -y unzip zip - zip压缩包
zip -r public.zip public-r递归 表示将指定的目录下的所有子目录以及文件一起处理 - 解压
unzip public.zipunzip public.zip -d dir - 查看
unzip -l public.zip
- 安装zip减压软件
- gz压缩包: (源代码压缩)
- Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法
- 制作gz包
tar czvf public.tar.gz public - 解压gz包
tar xzvf public.tar.gz - 查看gz包
tar tf public.tar.gz
- tar包
tar cvf wwwroot.tar wwwroot仅打包,不压缩!- 解压tar包
tar xvf wwwroot.tar
- xz压缩包
- 对于xz这个压缩相信很多人陌生,但xz是绝大数linux默认就带的一个压缩工具,xz格式比7z还要小。
- 制作
-tar cvf xxx.tar xxx这样创建xxx.tar文件先,
-xz xxx.tar将 xxx.tar压缩成为 xxx.tar.xz 删除原来的tar包
-xz -k xxx.tar将 xxx.tar压缩成为 xxx.tar.xz 保留原来的tar包 - 解压
-xz -d ***.tar.xz先解压xz 删除原来的xz包
-xz -dk ***.tar.xz先解压xz 保留原来的xz包
-tar -xvf ***.tar再解压tar- 查看
xz -l ***.tar.xz先解压xz
- 查看
- 别名管理
- 添加别名
-alias chttp='cat /etc/httpd/conf/httpd.conf'
-chttp - 删除别名
unalias chttp - 查看别名
alias
- 添加别名
- zip压缩包
- 用户管理、用户权限管理
- 用户管理
- 添加用户
useradd lisi - 设置密码
passwd lisi - 删除用户
userdel -r lisi-r:递归的删除目录下面文件以及子目录下文件。
- 备注:删除用户的时候用户组被删除
- 查看用户
id user - 把用户加入组
gpasswd -a testuser root- 把用户
testuser加入到root组,加入组后testuser获取到user组及root组所有权限
- 把用户移出租
gpasswd -d testuser root
- 添加用户
- 用户权限管理
- drwxr-xr-x. 2 root root 6 4月 11 2022 mnt
rwx当前用户对mnt有读写执行权限ur-x当前用户的组对mnt文件有读和执行gr-x其他用户对mnt也具有读和执行o
- 权限:
r读w写x执行 - 用户:
- 所有者
user u - 所属组
group g - 其他用户
other o - 所有用户
all au+g+o=a(表示所有人)
- 所有者
- 目录的rwx
r查看目录里面的文件(4)w在目录里创建或删除文件(2)x切换进目录(1)
- 文件的rwx
r查看文件内容w在文件里写内容x执行该文件(文件不是普通文件,是程序或脚本)
- chmod权限分配
+增加权限 -删除权限chmod u+x my.sh给当前用户分配执行my.sh的权限chmod o+r,o+w file.txt给其他用户分配对file.txt的读写权限chmod o+r,o+w,o+x mnt/给所有其他用户分配对mnt目录的进入、读取、写入权限chmod -R o+r,o+w,o+x mnt/修改目录下的所有文件的权限为可读、可修改、可执行chmod 755 filechmod -R 777 wwwroot/修改目录下的所有文件的权限为可读、可修改、可执行
- drwxr-xr-x. 2 root root 6 4月 11 2022 mnt
- 用户管理
- rpm软件安装卸载
- rpm命令安装卸载查找rpm包
- 挂载光盘
mount dev/cdrom /media挂载df查看光盘是否挂载
- 卸载umount /media
- rpm安装
-rpm -ivhrpm软件包rpm卸载软件rpm -e net-toolsnet-tools表示要卸载的软件包- 查看
rpm软件包的安装位置 / 软件包是否安装rpm -ql net-tools
- 查看
- 挂载光盘
- Yum安装rpm 卸载rpm 查看rpm包
- yum安装rpm包
-yum install -y net-tools包括netstatifconfig等命令
-yum install -y unzip zipzip压缩减压
-yum install -y mlocateupdatedb
-yum install -y wget下载文件包
-yum -y install psmiscpstree | grep httpd查看进程pstree -p显示进程以及子进程yum卸载rpm包yum -y remove wget
yum搜索npm包yum search名称
yum查看rpm包yum listyum list | grep httpdyum list updates列出所有可更新的软件包yum list installed列出所有已安装的软件包
- yum显示rpm包信息
yum info package1yum info httpdyum info zipyum info unzip
- yum 安装Apache
-yum -y install httpdservice httpd start安装启动apache
- 启动apache
- 关闭防火墙systemctl stop firewalldyum的主配置文件etc/yum.confyum的仓库配置文件/etc/yum.repo.d/*.repo
- Yum 安装Nginx:
- 安装nginx源
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- 查看Nginx源是否配置成功
- 通过
yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。 - 或者
npm info nginx也可以看看nginx源是否添加成功
- 通过
- 安装Nginx
sudo yum install -y nginx - 启动Nginx并设置开机自动运行
sudo systemctl start nginx.servicesudo systemctl enable nginx.service
- 安装nginx源
- yum安装rpm包
- rpm命令安装卸载查找rpm包
- 源代码包的安装
- 先安装源代码编译的软件
gcc,make,openssl如下: yum install -y gcc make gcc-c++ openssl-devel- 检查系统中是否已经安装 gcc:
rpm -qa | grep gcc / rpm -ql gcc - 编译安装源代码包
- 生成编译配置文件(Makefile)
- 开始编译(make)
- 开始安装(make install)- 安装
httpd-2.2.9.tar.gz源代码:- 减压并cd到对应目录
./configure --prefix=/usr/local/nodejs安装路径设置为/usr/local/apachemake / make -j4make install
- 安装
- 删除源代码包
- 结束当前源代码进程
- 删除源代码
- 如:结束进程
-pstree|grep httpd
-pkill httpd
- 删除源代码
-cd /usr/local/
- 直接删除源代码rm -rf apache/- linux下源代码安装nodejs:
- 下载nodejs源码包
- 减压到
usr/local/nodejs目录 ./configuremake / make -j4make install
- linux下源代码安装nodejs:
- 先安装源代码编译的软件
- Linux 内存、cpu、进程、端口、硬盘管理
- top命令 查看内存 cpu 进程 以及服务器负载
- top命令的第一行:
-top- 15:31:47 up 9:30, 3 users, load average: 0.00, 0.02, 0.05
- 依次对应:系统当前时间 up 系统到目前为止i运行的时间, 当前登陆系统的用户数量, load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况。- top命令的第二行:
- Tasks: 133 total, 1 running, 132 sleeping, 0 stopped, 0 zombie
- 依次对应:tasks表示任务(进程),133 total则表示现在有133 个进程,其中处于运行中的有1个,132 个在休眠(挂起),stopped状态即停止的进程数为0,zombie状态即僵尸的进程数为0个。
- top命令的第三行,cpu状态:
- %Cpu(s): 0.2 us, 0.4 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
- 只看空闲就可以了:cpu空闲率为99.3%
- top命令的第四行,内存状态:
- KiB Mem : 2897496 total, 1995628 free, 191852 used, 710016 buff/cache
- 总内存:2.76g 空闲:1995628/1024/1024=1.9g 已经使用0.18g 缓存区内存0.67g
- 缓冲区是从主内存中特地预留出的内存,用来存放特定的一些信息,例如从磁盘中取得的文件表,程序正在读取的内容等等
- top命令的第二行:
- 看当前登录的账户who、查看最新操作电脑的用户last
who命令: 显示当前正在系统中的所有用户名字,使用终端设备号,注册时间。whoami: 显示出当前终端上使用的用户。last:last作用是显示近期用户或终端的登录情况
- 查看进程关闭进程
- 查看进程
-pstree查看进程树
-pstree -ap显示所有信息
-pstree | grep httpd
-pstree -ap | grep httpd
-ps -au
-ps -au |grep httpd
-ps -aux
-ps中aux的含义:
- 显示现行终端机下的所有程序,包括其他用户的程序(a)
- 以用户为主的格式来显示程序状况。 (x)
- 显示所有程序,不以终端机来区分(u)- 关闭进程
pkill httpdpkill进程的名字kill 2245kill进程号kill -9 1234kill -9进程号 强制杀死kill:执行kill`命令,系统会发送一个SIGTERM信号给对应的程序。当程序接收到该signal信号后,将会发生以下事情:
程序立刻停止- 当程序释放相应资源后再停止
- 程序可能仍然继续运行
- 大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止。但是也有程序可能接收信号后,做一些其他的事情(如果程序正在等待IO,可能就不会立马做出响应,我在使用wkhtmltopdf转pdf的项目中遇到这现象),也就是说,SIGTERM多半是会被阻塞的。
kill -9:kill -9命令,系统给对应程序发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。
- 查看端口
netstat -tunpl |grep httpd
- 关闭进程
- top命令的第一行:
- 查看硬盘信息:
-df命令作用是列出文件系统的整体磁盘空间使用情况。可以用来查看磁盘已被使用多少空间和还剩余多少空间。
-df -h以人们易读的方式显示,总共多少g用了多少g
-df /home查看该文件夹所在磁盘的使用情况
- top命令 查看内存 cpu 进程 以及服务器负载
- Linux
systemctl管理服务yum安装httpdyum install -y httpdsystemctl start httpd
systemctl管理服务- 启动服务:
systemctl start httpd - 关闭服务:
systemctl stop httpd - 重启服务:
systemctl restart httpd - 查看一个服务的状态:
systemctl status httpd - 查看一个服务是否在运行:
systemctl is-active httpd - 查看当前已经运行的服务:
systemctl list-units -t service - 列出所有服务:
systemctl list-units -at service注意顺序 - 设置开机自启动:
systemctl enable httpd - 停止开机自启动:
systemctl disable httpd - 列出所有自启动服务:
- `systemctl list-unit-files|grep enabled``
- `systemctl list-unit-files|grep disabled``
- `systemctl list-unit-files|grep disabled | grep httpd``
- 使指定服务从新加载配置:
systemctl reload httpd
- 启动服务:
- Firewalld防火墙和SELinux防火墙的设置
firewalld的基本使用:- 启动:
systemctl start firewalld - 关闭:
systemctl stop firewalld - 查看状态:
systemctl status firewalld - 开机禁用 :
systemctl disable firewalld - 开机启用 :
systemctl enable firewalld
- 启动:
firewall-cmd的基本使用:- 那怎么开启一个端口呢:
firewall-cmd --zone=public --add-port=80/tcp --permanent(–permanent永久生效,没有此参数重启后失效) - 重新载入:
firewall-cmd --reload修改firewall-cmd配置后必须重启 - 查看:
firewall-cmd --zone= public --query-port=80/tcp - 删除:
firewall-cmd --zone= public --remove-port=80/tcp --permanent - 查看所有打开的端口:
firewall-cmd --zone=public --list-ports
- 那怎么开启一个端口呢:
- SELinux防火墙的设置
- 修改/etc/selinux/config文件
- 将SELINUX=enforcing改为SELINUX=disabled
配置服务器的免密码快捷登录
登录服务器: ssh
ssh,
secure shell protocol,以更加安全的方式连接远程服务器
# root: 用户名 |
配置别名快速登录:ssh-config
在本地电脑上配置
ssh-config,对自己管理的服务器起别名,可以更方便地登录多台云服务器
ssh-config 的配置文件
/etc/ssh/ssh_config |
示例
# 修改~/.ssh/config配置 |
配置成功之后直接
ssh就可以直接登录
# 登录服务器1 |
免密登录:public-key 与 ssh-copy-id
把自己的公钥放在远程服务器的 authorized_keys 中
把本地文件
~/.ssh/id_rsa.pub中内容复制粘贴到远程服务器~/.ssh/authorized_keys
简单来说,就是 Ctrl-C 与 Ctrl-V 操作,不过还有一个更加有效率的工具: ssh-copy-id。
# 在本地环境进行操作 |
# 登录成功服务器,可以看到authorized_keys中的公钥信息 |
保持连接,防止断掉
我们可以通过 man ssh-config,找到每一项的详细释义。
# 编辑 ~/.ssh/config |
Linux环境变量
通过 printenv 可获得系统的所有环境变量
$ printenv |
我们也可以通过
printenv,来获得某个环境变量的值
$ printenv NVM_BIN |
通过
$var或者${var}可以取得环境变量,并通过 `echo`` 进行打印
$ echo $path |
$HOME当前用户目录,也就是~目录$USER当前用户名$PATH环境变量,指向环境变量的路径$SHELL当前用户的 shell,比如bash、zsh、fish等export可以用来设置环境变量,比如
$ export PATH=/usr/local/bin:$PATH |
在执行命令之前置入环境变量,可以用以指定仅在该命令中有效的环境变量。
# 该环境变量仅在当前命令中有效 |
使用 rsync进行文件拷贝
快速高效,支持断点续传、按需复制的文件拷贝工具,并支持远程服务器拷贝,建议在本地也使用
rsync替换cp进行文件拷贝
# 将本地的test目录拷贝到服务器的/home目录 |
拷贝目录,则需要看原目录是否以
/结尾
- 不以
/结尾,代表将该目录连同目录名一起进行拷贝 - 以
/结尾,代表将该目录下所有内容进行拷贝
服务安装
mongodb4.x的安装配置
官方文档:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
Mongodb的安装
配置yum源
- 在路径
/etc/yum.repos.d/下创建文件mongodb-org-4.0.repo
cd /etc/yum.repos.d/ |
- 在文件
mongodb-org-4.0.repo中写入如下内容(下面内容可以直接复制,也可以复制官方文档)
[mongodb-org-4.0] |
- 安装mongodb
yum install -y mongodb-org |
- 开启mongodb服务
systemctl start mongod |

- 设置开机启动mongodb
systemctl enable mongod |
远程连接mongodb
- 修改mongo.conf文件
- 命令:
sudo vi /etc/mongod.conf - 将原来bindIp:
127.0.0.1修改为0.0.0.0
- 命令:
- 重启动mongo服务:
service mongod restart - 永久开放
27017端口:firewall-cmd --zone=public --add-port=27017/tcp --permanent;(--permanent永久生效,没有此参数重启后失效)firewall-cmd --reload
Mongodb4.x卸载
- 停止服务
service mongod stop - 删除安装的包
rpm -qa | grep mongodb-org列出所有的包yum remove -y $(rpm -qa | grep mongodb-org)- 也可以尝试下面命令卸载
yum remove -y mongodb-org*
- 删除数据及日志
rm -r /var/log/mongodbrm -r /var/lib/mongo
mysql安装配置
找到mysql的yum源rpm包 https://dev.mysql.com/downloads/repo/yum
mysql安装源地址:http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
查看机器上面是否安装过mysql
rpm -qa | grep mysql* |
mysql的安装:
- 安装配置yum源
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm - 安装
yum -y install mysql-server - 启动
mysqlsystemctl start mysqld - mysql开机启动
systemctl enable mysqld - 修改 mysql 密码
- 查看mysql默认安装以后的密码
- mysql 安装完成之后,在
/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到 root 默认密码,然后登录 mysql 进行修改
mysql -u root -p输入密码ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';- 默认情况mysql对密码要求非常严格
- 修改密码策略 在
/etc/my.cnf文件添加validate_password_policy配置,指定密码策略 - 选择
0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件validate_password_policy=0- 如果不需要密码策略,添加 my.cnf 文件中添加如下配置禁用即可:
validate_password = off - 重新启动 mysql 服务使配置生效:
systemctl restart mysqld
- 如果不需要密码策略,添加 my.cnf 文件中添加如下配置禁用即可:
- 修改密码策略 在
- 远程管理mysql 添加
mysql远程登录用户- 把
host改为%mysql -u root -p
mysql> use mysql;
mysql> update user set host = '%' where user = 'root';
mysql> select host, user from user;
mysql> select host, user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+---------------+
3 rows in set (0.00 sec)
mysql> update user set host = '%' where user = 'root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select host, user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| % | root |
| localhost | mysql.session |
| localhost | mysql.sys |
+-----------+---------------+
3 rows in set (0.00 sec)
退出mysql
exit;- 配置防火墙
firewall-cmd --zone=public --add-port=3306/tcp --permanentfirewall-cmd --reload- 最后注意:重启
mysql
- 最后注意:重启
- 把
安装redis
- 检查是否有
redisyum 源
yum search redis |
- 安装 epel 仓库
EPEL (Extra Packages for Enterprise Linux)是基于 Fedora 的一个项目,为“红帽系”的操作系 统提供额外的软件包,适用于 RHEL、CentOS 和 Scientific Linux.
yum install epel-release -y |
- 安装 redis 数据库
yum info redis |
- 安装完毕后,使用下面的命令启动 redis 服务
systemctl start redis |
linux 上面进入 Redis 客户端
redis-cli |
nginx+nodejs 一台服务器站架多个网站

搭建 Nodejs 生产环境
- 下载 nodejs 二进制代码包,然后减压到
/usr/local/nodejs - 配置环境变量
vi /etc/profile- 最后面添加:
export NODE_HOME=/usr/local/nodejs/binexport PATH=$NODE_HOME:$PATH
:wq保存,然后运行source /etc/profile
nodejs 进程管理器 pm2 的使用
PM2 是一款非常优秀的 Node 进程管理工具,它有着丰富的特性:能够充分利用多核 CPU 且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model)和超出最大内存限制 等情况下实现自动重启。 PM2 是开源的基于 Nodejs 的进程管理器,包括守护进程,监控,日志的一整套完整的功能。
PM2 的主要特性:
- 内建负载均衡(使用 Node cluster 集群模块)
- 后台运行
- 0 秒停机重载,我理解大概意思是维护升级的时候不需要停机.
- 具有 Ubuntu 和 CentOS 的启动脚本
- 停止不稳定的进程(避免无限循环)
- 控制台检测
PM2 的常见命令
npm install pm2 -g |
运行
pm2的程序并指定name
pm2 start app.js --name appName |
- 显示所有进程状态
pm2 list - 显示所有进程状态
pm2 logs - 显示一个进程的日志
pm2 logs appName - 关闭重启所有进程
pm2 stop all# 停止所有进程pm2 restart all# 重启所有进程pm2 reload all# 0 秒停机重载进程 (用于 NETWORKED 进程)
- 关闭重启指定进程
pm2 stop 0# 停止指定的进程pm2 restart 0# 重启指定的进程pm2 stop appNamepm2 restart appName
- 杀死进程
pm2 delete 0# 杀死指定的进程pm2 delete all# 杀死全部进程pm2 delete appName# 杀死指定名字的进程
- 显示相应进程/应用的总体信息
pm2 show appName
Nginx 的安装
- 安装 nginx 源
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm |
- 查看 Nginx 源是否配置成功
- 通过
yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装 Nginx。 - 或者
npm info nginx也可以看看 nginx 源是否添加成功
- 安装 Nginx
sudo yum install -y nginx |
- 启动 Nginx 并设置开机自动运行
sudo systemctl start nginx |
Nginx 反向代理配置
- 关闭 Selinux
# 修改 SELINUX=enforcing 为 SELINUX=disabled |
- 配置
firewalld开启80端口
firewall-cmd --zone=public --list-ports |
- 配置反向代理
找到 /etc/nginx/conf.d 然后在里面新建对应网站的配置文件

server { |
重启 nginx
systemctl restart nginx |
nginx -t看配置是否正确systemctl stop nginx停止nginxsystemctl start nginx启动nginx
域名测试
找到 C:\Windows\System32\drivers\etc\hosts
192.168.1.128 |
浏览器输入
www.aaa.comnginx 转发到了127.0.0.1:3001
相关防火墙配置
# 添加 |
nginx+nodejs多台服务器负载均衡

负载均衡的种类
- 一种是通过硬件来进行解决,常见的硬件有 NetScaler、F5、Radware 和 Array 等商用的 负载均衡器,但是它们是比较昂贵的
- 一种是通过软件来进行解决的,常见的软件有 LVS、Nginx、apache 等,它们是基于 Linux 系统并且开源的负载均衡策略.
Nginx 的特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服 务器中表现最好,中国大陆使用 nginx 网站用户有:新浪、网易、 腾讯等
nginx 的 upstream 目前支持 3 种方式的分配
- 轮询(默认)
- 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉, 能自动剔除。
weight 权重——you can you up- 指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况
ip_haship 哈希算法- 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器, 可以解决 session 的问题。
- 配置负载均衡
- 找到
/etc/nginx/conf.d然后在里面新建对应网站的配置文件
- 找到

重启 nginx:
systemctl restart nginx
www_aaa_com.conf
upstream bakeaaa { |
www_bbb.com.conf
|
www_ccc_com.conf
upstream bakeccc { |
负载均衡操作演示
我们使用docker跑三个nodejs应用程序作为演示

- 使用koa搭建三个服务3001,3002,3003
- 3001服务
const Koa = require('koa'); |
- 3002服务
const Koa = require('koa'); |
- 3003服务
const Koa = require('koa'); |
在本地启动以上三个服务
- docker运行Nginx
# nginx/Dockerfile |
本机
conf.d/default.conf文件
upstream bakeaaa { |
- 构建nginx镜像
docker build -t nginx-demo . - 运行nginx镜像
ddocker run --name nginx -d -p 8666:80(本机端口:容器端口) -v /Users/poetry/Download/docker/nginx/conf.d:/etc/nginx/conf.d(本机配置文件目录:容器配置文件目录) e00b36d6975b(nginx镜像ID) - 运行
docker ps查看启动的服务 - 修改配置
nginx/conf.d需要重启容器才生效docker restart nginx(容器名称)
修改
upstream bakeaaa中的权重等,可以看到不断刷新页面,可以看到不同的服务器负载均衡的效果

云服务器部署node项目
- 安装 nginx
安装nginx源
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm |
查看 Nginx 源是否配置成功
- 通过
yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装 Nginx。 - 或者
npm info nginx也可以看看 nginx 源是否添加成功
安装nginx源
sudo yum install -y nginx |
启动 Nginx 并设置开机自动运行
sudo systemctl start nginx sudo systemctl enable nginx |
- 安装 nodejs
下载 nodejs 二进制代码包,然后减压到 /usr/local/nodejs
配置环境变量
vi /etc/profile
最后面添加
export NODE_HOME=/usr/local/nodejs/bin |
:wq 保存,然后运行 source /etc/profile
- 配置 nginx
server { |
nginx配置https
为什么要使用 https
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。
HTTPS 是在 HTTP 的基础上添加了安全层,从原来的明文传输变成密文传输,当然加密与解 密是需要一些时间代价与开销的,不完全统计有 10 倍的差异。在当下的网络环境下可以忽 略不计,已经成为一种必然趋势。
目前微信小程序请求 Api 必须用 https、Ios 请求 api 接口必须用 https
配置 https
证书类型
- 域名型 https 证书(DVSSL):信任等级一般,只需验证网站的真实性便可颁发证书保护网站
- 企业型 https 证书(OVSSL):信任等级强,须要验证企业的身份,审核严格,安全性更高
- 增强型 https 证书(EVSSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高, 同时可以激活绿色网址栏
server { |
docker系统管理
docker简介与安装
Docker 是一个跨平台的开源的应用容器引擎,诞生于 2013 年初,基于 Go 语言 并遵从 Apache2.0 协议开源
刚开始学 Docker 你可以把它理解成我们以前学过的虚拟机,但是 Docke 和传统虚拟化方式 的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系 统上再运行所需应用进程;Docker 相比传统的虚拟化技术要更轻量级,Docker 容器内的应 用程序是直接运行在宿主内核中的,容器内没有自己的内核,也没有进行硬件虚拟


因此 Docker 容器要比传统虚拟机占用资源更小、系统支持量更大、启动速度更快、更容易 维护和扩展。 目前 Docker 是全栈开发者必备的技能之一。 官网:https://hub.docker.com
为什么要使用 Docker
- 开发人员利用 Docker 快速部署 调试我们的应用
- 开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作,其他机器不能正 常工作”的问题。Docker 可以提供一致的运行环境,开发过程中一个常见的问题是环境一致 性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被 发现。
- 运维人员利用 Docker 可以在隔离容器中并行运行和管理应用
- Serverless 也是基于 docker 容器技术
mac docker安装
本地docker环境搭建
mac下安装docker: brew install docker,或者下载安装 https://docs.docker.com/docker-for-mac/install
https://hub.docker.com 拉取镜像速度比较慢,我们推荐使用国内的镜像源访问速度较快 https://hub.daocloud.io
设置国内镜像源

{ |
进入该网站 https://hub.daocloud.io 获取镜像的下载地址
docker命令基础
docker images查看镜像docker ps查看启动的容器 (-a查看全部)docker rmi 镜像ID删除镜像docker rm 容器ID删除容器docker exec -it 1a8eca716169(容器ID:docker ps获取) sh进入容器内部docker inspect bf70019da487(容器ID)查看容器内的信息
删除none的镜像,要先删除镜像中的容器。要删除镜像中的容器,必须先停止容器。
$ docker rmi $(docker images | grep "none" | awk '{print $3}') |
$ docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') //停止容器 |
docker info 命令可以查看 Docker 容器的配置信息,包括镜像源、网络、磁盘、内存、系统等。
$ docker info |
Linux 中安装 docker
安装工具包
yum install yum-utils device-mapper-persistent-data lvm2 -y |

设置阿里镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |

安装docker
yum install docker-ce docker-ce-cli containerd.io -y |
启动docker
systemctl start docker |
设置docker镜像源
vi /etc/docker/daemon.json |
{ |
后续拉取镜像直接从 https://hub.docker.com 网站拉取速度更快
重启docker
systemctl restart docker |
安装指定版本的 docker
- 要安装特定版本的 Docker Engine,请在 repo 中列出可用版本,然后选择并安装: 一种。
- 列出并排序您的存储库中可用的版本。此示例按版本号对结果进行排序,从高到低, 并被截断:
yum list docker-ce --showduplicates | sort -r |

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.i o |
卸载 docker
- 卸载 Docker Engine、CLI 和 Containerd 包:
$ sudo yum remove docker-ce docker-ce-cli containerd.io - 主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷
$ sudo rm -rf /var/lib/docker$ sudo rm -rf /var/lib/containerd- 您必须手动删除任何已编辑的配置文件
阿里云 Docker 镜像加速器
访问 https://www.aliyun.com/ 搜索 “容器镜像服务”

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker |
docker镜像容器仓库


镜像
Docker 镜像就是一个 Linux 的文件系统(Root FileSystem),这个文件系统里面包含可以运 行在 Linux 内核的程序以及相应的数据
- 镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中 间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。
- 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说 的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或 删除文件,从而形成新的镜像,因为容器是可以动态改变的

容器
类似 linux 系统环境,运行和隔离应用。容器从镜像启动的时候,docker 会在镜像的最上一 层创建一个可写层,镜像本身是只读的,保持不变。容器与镜像的关系,就如同面向编程中 对象与类之间的关系。
- 因为容器是通过镜像来创建的,所以必须先有镜像才能创建容器,而生成的容器是一个独立 于宿主机的隔离进程,并且有属于容器自己的网络和命名空间
- 镜像由多个中间层(layer)组成,生成的镜像是只读的,但容器却是可读 可写的,这是因为容器是在镜像上面添一层读写层(writer/read layer)来实现的,如下图所 示:

仓库
仓库(Repository)是集中存储镜像的地方,这里有个概念要区分一下,那就是仓库与仓库 服务器(Registry)是两回事,像我们上面说的 Docker Hub,就是 Docker 官方提供的一个仓库 服务器,不过其实有时候我们不太需要太过区分这两个概念。
公共仓库
- 公共仓库一般是指 Docker Hub,除了 获取镜像外,我们也可以将自己构建的镜像存放到 Docker Hub,这样,别人也可以使用我们 构建的镜像。
- 不过要将镜像上传到 Docker Hub,必须先在 Docker 的官方网站上注册一个账号
私有仓库
有时候自己部门内部有一些镜像要共享时,如果直接导出镜像拿给别人又比较麻烦,使用像 Docker Hub 这样的公共仓库又不是很方便,这时候我们可以自己搭建属于自己的私有仓库服 务,用于存储和分布我们的镜像。
Docker 镜像以及仓库
Docker 镜像就是一个 Linux 的文件系统(Root FileSystem),这个文件系统里面包含可以运 行在 Linux 内核的程序以及相应的数据
镜像结构: registryname/repositoryname/imagename:tagname 例如:docker.io/library/centos:8.3.2011
docker search搜索镜像docker search centosdocker pull下载镜像docker pull centos- 下载指定的 tag
docker pull centos:8.3.2011
- 下载指定的 tag
docker images查看本地镜像docker tag给镜像打标签- 给镜像打标签可以创建自己的镜像
- 镜像结构:
registryname/repositoryname/imagename:tagname - 例如:
docker.io/library/centos:8.3.2011
docker rmi 镜像ID -f(强制删除)删除镜像- 这样删除只会删除对应的标签
docker images | grep centos
- 这样删除只会删除对应的标签
- 把本地镜像推送到
dockerHub仓库- 需要在 dockerHub 上面注册一个账户:
https://hub.docker.com/ - 使用
docker login本地登录dockerHub docker login- 查看保存的账户信息
cat .docker/config.json
- 需要在 dockerHub 上面注册一个账户:
docker push镜像名称 把本地镜像推送到远程
Docker 容器
类似 linux 系统环境,运行和隔离应用。容器从镜像启动的时候,docker 会在镜像的最上一 层创建一个可写层,镜像本身是只读的,保持不变。容器与镜像的关系,就如同面向编程中 对象与类之间的关系。
因为容器是通过镜像来创建的,所以必须先有镜像才能创建容器,而生成的容器是一个独立 于宿主机的隔离进程,并且有属于容器自己的网络和命名空间
- 查看所的容器
docker psdocker ps -a查看所有容器
docker run参数docker run:创建一个新的容器并运行一个命令docker run是日常用的最频繁用的命令之一,同样也是较为复杂的命令之一 命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]- 参数
- OPTIONS :选项
-i:表示启动一个可交互的容器,并持续打开标准输入-t: 表示使用终端关联到容器的标准输入输出上-d:表示容器放置后台运行--rm:退出后即删除容器--name:表示定义容器唯一名称-p映射端口-v指定路径挂载数据卷-e运行容器传递环境变量
IMAGE:表示要运行的镜像COMMAND:表示启动容器时要运行的命令
- OPTIONS :选项
- 参数
-it启动一个交互式容器docker run启动一个交互式容器在容器内执行/bin/bash命令docker run -it nginx(镜像ID或名称) /bin/bash
- 删除容器
docker rm 容器ID -f - 停止容器
docker stop 容器ID - 启动容器
docker start 容器ID - 重启容器
docker restart 容器ID - 进入容器内部
- 进入容器内部
docker exec -it 容器ID /bin/bash docker exec:进入容器开启一个新的终端(常用) 执行exit退出的时候不会停止容器docker attach:进入容器正在执行的终端exit退出会停止容器
- 进入容器内部
- 查看容器日志
docker logs 容器ID- 语法
docker logs [OPTIONS] CONTAINER -f: 跟踪日志输出--since:显示某个开始时间的所有日志-t: 显示时间戳--tail:仅列出最新N条容器日志
- 语法
docker commit容器转换为镜像- 镜像是没有写入权限的,但是我们可以修改容器把容器制作为镜像
- 启动一个容器 给容器写入内容
docker exec -it 容器ID /bin/bash进入容器内部,写入内容echo test > 1.txtdocker commit 容器ID 自定义镜像名称将容器转换为镜像
docker应用
安装node
进入https://hub.daocloud.io 搜索node,切换到版本获取下载地址
docker pull daocloud.io/library/node:12.18docker tag 28faf336034d node重命名镜像
重命名镜像后IMAGE ID都是一样的

也可以导出镜像到本地备份 docker save -o node.image(导出镜像要起的名称) 28faf336034d(要导出的镜像的ID)

我们先删除之前的镜像 docker rmi 28faf336034d -f 强制删除

再次导入本地镜像
docker load -i node.image(导入的镜像名称)

然后再次重命名镜像即可
docker tag 28faf336034d node:v1.0(版本v1.0)

安装Nginx

docker pull daocloud.io/library/nginx:1.13.0-alpine |

启动Nginx镜像
服务器上启动
docker run --name nginx(起一个容器名称) -d(后台运行) -p 80:80(本机:容器) -v(映射Nginx容器的运行目录本机) /root/nginx/log:/var/log/nginx(本机目录:容器目录) -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf(本机目录:容器内nginx配置所在目录) -v /root/nginx/conf.d:/etc/nginx/conf.d -v /root/nginx/html:/usr/share/nginx/html f00ab1b3ac6d(nginx镜像ID) |
本地电脑启动
docker run --name nginx -d -p 8666:80 -v /Users/poetry/Downloads/docker/nginx/log:/var/log/nginx -v /Users/poetry/Downloads/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /Users/poetry/Downloads/docker/nginx/conf.d:/etc/nginx/conf.d -v /Users/poetry/Downloads/docker/nginx/html:/usr/share/nginx/html f00ab1b3ac6d |
把docker容器中的Nginx服务配置映射本地方便管理

访问docker暴露的8666端口即可

当我们修改了html中的文件,无需重启容器即可看到效果


安装mysql
进入https://hub.daocloud.io 搜索mysql,切换到版本获取下载地址

docker pull daocloud.io/library/mysql:8.0.20

启动MySQL镜像
docker run -d(后台运行) -p 3307:3306(本机端口:MySQL运行端口) --name mysql(容器名称) -e MYSQL_ROOT_PASSWORD=123456(设置mysql密码) be0dbf01a0f3(mysql镜像ID) |
查看当前正在运行的镜像
docker ps -a(正在运行和停止的镜像-a都可见) |

删除容器
删除之前需要stop:docker stop bac2692e2b9a(容器ID)
docker rm bac2692e2b9a(容器ID:docker ps获取) |
进入容器内部
docker exec -it bac2692e2b9a(容器ID) sh(指定进入方式) |

我们使用Navicat新建一个连接测试一下

说明我们使用docker安装MySQL的方式是没问题的
查看MySQL容器日志
docker logs -f(查看最后几条) bac2692e2b9a(容器ID) |

重启容器
如果修改了容器配置,我们需要重新启动容器
docker restart bac2692e2b9a(容器ID) |
设置MySQL权限
mysql8.0后,需要设置,否则node连接不上
docker exec -it bac2692e2b9a sh |
# 远程连接权限 |

挂载配置文件目录
默认数据库的数据是放在容器里面的,这样的话当容器删除会导致数据丢失。我们想的是删 除容器的时候不删除容器里面的 mysql 数据,这个时候启动容器的时候就可以把 mysql 数据 挂载到外部。
docker run -d(后台运行) -p 3307:3306(本机端口:MySQL运行端口) -v v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/data:/var/lib/mysql --name mysql(容器名称) -e MYSQL_ROOT_PASSWORD=123456(设置mysql密码) be0dbf01a0f3(mysql镜像ID) |
docker inspect bac2692e2b9a(容器ID)
docker inspect bac2692e2b9a | grep mysql |
安装redis

docker pull daocloud.io/library/redis:6.0.3-alpine3.11 |
启动Redis镜像
docker run -d -p 6380:6379 --name redis 29c713657d31(镜像ID) --requirepass 123456(redis登录密码) |

或进入redis镜像后在输入密码

交互式进入redis容器
docker exec -it 9751cbc96861(容器ID) sh |

安装MongoDB
docker pull mongo |

启动容器 映射端口 挂载目录
docker run --name mongoTest -p 27018:27017 -v ~/Downloads/docker/mongo:/data/db -d mongo(镜像ID或名称) |

可以看到通过 -v挂载到本地的数据

进入容器内部 docker exec -it mongoTest(镜像ID或名称) sh

输入mongo,可以看到mongo已经安装成功了,我们从容器外连接容器的mongo

连接需要密码
docker run -d --name authMongo -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=123456 -p 27019:27017 -v ~/Downloads/docker/authMongo:/data/db mongo(镜像名称或者ID) --auth |
进入容器内部

远程连接

Dockerfile
Dockerfile 构建一个 nginx 镜像
Dockerfile 构建一个 nginx 镜像,构建好的镜像内会有一个
/usr/share/nginx/html/index.html文件
新建一个名为 Dockerfile 文件,并在文件内添加以下内容
FROM nginx |
- 构建镜像
docker build -t nginx:v1 . - 进入容器
docker run -it -d -p 8900:80 容器ID - [root@localhost ~]#
curl 127.0.0.1你好 docker
Dockerfile 详解
Dockerfile文件的文件名建议使用Dockerfile,如果是其他文件构建的时候需要指定文件 名- Dockerfile 构建镜像的执行顺序是从上往下
- 每一个指令都会创建一个新的镜像层,并提交
FROM # 基础境像,一切从这里开始构建 |
FROM指定哪种镜像作为新镜像的基础镜像,如:FROM ubuntu:14.04MAINTAINER指明该镜像的作者和其电子邮件,如:MAINTAINER "xxxxxxx@qq.com"LABEL给镜像添加信息。使用docker inspect可查看镜像的相关信息,如:LABEL maintainer="xx@qq.com"LABEL version="1.0"LABEL description="This is description"
RUN在新镜像内部执行的命令- 比如安装一些软件、配置一些基础环境,可使用
\来换行,如:RUN apt-get update && apt-get install -y vim - 也可以使用
exec格式RUN ["executable", "param1", "param2"]的命令,如RUN ["apt-get","install","-y","nginx"]RUN ["yum","install","-y","nginx"]
- 比如安装一些软件、配置一些基础环境,可使用
COPY- 将主机的文件复制到镜像内,如果目的位置不存在,Docker 会自动创建所有需要的目录结 构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:
COPY ./src/ /usr/share/nginx/html/
ADD- 将主机的文件复制到镜像内,如果目的位置不存在,Docker 会自动创建所有需要的目录结 构,并且会解压文件。如:
ADD ./src.tar.gz /usr/share/nginx/html/
WORKDIR- 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会 创建目录
WORKDIR /usr/share/nginx/html
CMD- 在构建镜像时,指定容器启动的命令,如果不存在,则会使用镜像的默认启动命令
CMD ["/bin/bash"]
ENTRYPOINT- 在构建镜像时,指定容器启动的命令,如果不存在,则会使用镜像的默认启动命令
ENTRYPOINT ["/bin/bash"]CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点CMD的命令会被docker run的命令覆盖而ENTRYPOINT不会- 如使用
CMD ["/bin/bash"]或ENTRYPOINT ["/bin/bash"]后,再使用docker run -it image启动容 器,它会自动进入容器内部的交互终端,如同使用docker run -it image /bin/bash - 但是如果启动镜像的命令为
docker run -it image /bin/ps,使用CMD后面的命令就会被覆盖 转而执行bin/ps命令,而ENTRYPOINT的则不会,而是会把docker run后面的命令当做ENTRYPOINT执行命令的参数
EXPOSE 暴露端口- 在构建镜像时,指定暴露的端口,如果不存在,则会使用镜像的默认端口
EXPOSE 8080- 仅仅是声明了一个暴露的端口
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射端口
- 在运行时使用随机端口映射时,也就是
docker run -P时,会自动随机映射EXPOSE的端口。
VOLUME- 在构建镜像时,指定挂载的卷,如果不存在,则会使用镜像的默认卷
VOLUME /usr/share/nginx/html- 帮助镜像使用者理解这个镜像服务的守护卷,以方便配置映射卷
- 在运行时使用随机卷映射时,也就是
docker run -v时,会自动随机映射VOLUME的卷。 - 我们通过
docker inspect查看通过该dockerfile创建的镜像生成的容器
ENV- 在构建镜像时,指定环境变量,如果不存在,则会使用镜像的默认环境变量
ENV PATH=/usr/bin- 帮助镜像使用者理解这个镜像服务的守护环境变量,以方便配置映射环境变量
- 在运行时使用随机环境变量映射时,也就是
docker run -e时,会自动随机映射ENV的环境变量。
Dockerfile 构建 Centos 并安装 net-tools yum 软件
# Dockerfile_centos |
编译 编译的时候注意最后面的.
docker build -f Dockerfile_centos -t centos:v1.0 .
查看执行的历史 docker history 镜像名称或者id
Dockerfile 自动部署 Nodejs 程序
项目目录中新建 Dockerfile COPY . /root/wwwroot/表示把项目目录中的代码复制到容器里面的/root/wwwroot 目录
FROM node |
构建 docker build -t nodeimg:v1.0.1 .
运行镜像并且进入容器 docker run -tid --name nodeDemo -p 3000:3000 nodeimg:v1.0.1
配置docker网络
多个容器之间如何通信,是否可以直接连接

首先看看网卡信息

:默认情况同一台主机上面的容器是可以互相通信的,默认情况同一台主机上面的容器 和主机之间是可以互相通信的
通信原理
我们每启动一个Docker容器,Docker就会给Docker容器分配一个ip,我们只要安装了Docker, 就会有一个网卡
Docker0,Docker0使用的是桥接模式,使用的技术是 evth-pair 技术
Docker Network 详解
- 关于 docker network 命令
docker network --help docker network ls查看网络docker network inspect 网络ID(docker network ls获取)查看网络详情
Docker 网络的四种模式
| Docker 网络模式 | 配置 | 说明 |
|---|---|---|
host 模式 |
--net=host |
容器和宿主机共享 Network namespace |
container 模式 |
--net=container:NAMEorID |
容器和另外一个容器共享 Network namespace。 kubernetes 中的 pod 就是多个容器共享一个 Network namespace。 |
none 模式 |
--net=none |
容器有独立的 Network namespace,但并没有对其 进行任何网络设置,如分配 veth pair 和网桥连 接,配置 IP 等。 |
bridge 模式 |
--net=bridge |
(默认为该模式) |
host 模式
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡, 配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进 程列表等还是和宿主机隔离的
使用 host 模式的容器可以直接使用宿主机的 IP 地址与外界通信,容器内部的服务端口也可 以使用宿主机的端口,不需要进行 NAT,host 最大的优势就是网络性能比较好,但是 docker host 上已经使用的端口就不能再用了,网络的隔离性不好

container 模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和 宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器 共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还 是隔离的。两个容器的进程可以通过 lo 网卡设备通信

none 模式
使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进 行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己 为 Docker 容器添加网卡、配置 IP 等。
这种网络模式下容器只有 lo 回环网络,没有其他网卡。none 模式可以在容器创建时通过 --network=none 来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安 全性

bridge 模式
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有 容器就通过交换机连在了一个二层网络中

docker network create 创建网络以及启动容器指定网络
docker network create --help |
容器直接网络连接演示
docker pull centos |
创建一个 mysqlNet网络
--driver bridge配置网络类型bridge桥接--subnet 192.168.1.0/24配置子网 建议每个网络的范围尽量小--gateway 192.168.1.1配置网关
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 mysql Net |
启动容器指定网络
我们启动容器的时候可以加上 --net 参数可以指定启动容器的时候使用的网络,如果不加表 示默认使用 docker0 网络
--net bridge表示使用docker0网络
docker run -tid --name centos01 centos /bin/bash |
--net mysqlNet表示使用我们自定义网络
docker run -tid --name centos04 --net mysqlNet centos /bin/bash |
使用主机名称可以 ping 通
# 进入centos05 |
结果
$ docker exec -it centos05 /bin/bash |
不同网络的容器默认没法通信
我们在centos05容器内ping centos01容器,结果是不成功的
# 进入centos05 |
这样我们就把 centos04 和 centos05 加入了我们自定义的 mysqlNet 网络,这样的话 centos04 和 centos05 是互通的,但是 mysqlNet 网络和 docker0 网络默认是不互通的

docker network connect 实现不同网络之间的连通
如上图,我们想的是 centos01 可以 访问 mysqlNet 里面的 centos04 和 centos05,这个时候 我们就需要使用 docker network connect 实现网络连通
docker network connect mysqlNet centos01 |
# 查看本地网络 |
查看网络详情
$ docker network inspect mysqlNet |
可以看到是ping成功的
$ docker exec centos01 ping centos05 |