关于Linux和docker的常用命令
Linux
内存
#检查内存
free -mh
total used free shared buff/cache available
Mem: 15G 13G 213M 127M 1.5G 1.1G
Swap: 7.9G 2.6G 5.3G
#total 系统总的可用物理内存大小
#used 已被使用的物理内存大小
#free 还有多少物理内存可用
#shared 被共享使用的物理内存大小
#buff/cache 被 buffer 和 cache 使用的物理内存大小
#available 还可以被 应用程序 使用的物理内存大小
#通常swap缓冲区在装配系统时挂载在逻辑卷,若未分配缓冲区可手动创建
#调整swap缓冲区(root用户下操作)
#创建一个swap存储目录
mkdir /swap
cd /swap
#设定要创建的交换分区大小(这里是8G=8*1024*1024=8388608)
dd if=/dev/zero of=swapfile bs=1024 count=8388608
#设置为0600 权限
chmod 0600 swapfile
#创建分区
mkswap swapfile
#挂载分区并设置到开机启动(swapon /swap/swapfile)
swapon swapfile
#如要卸载则 swapoff swapfile
#Linux中交换分区的大小分配推荐法则
#内存小于4GB,推荐不少于2GB的swap空间
#内存4GB-16GB,推荐不少于4GB的swap空间
#内存16GB-64GB,推荐不少于8GB的swap空间
#内存64GB-256GB,推荐不少于16GB的swap空间
硬盘
#查看硬盘空间
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl_bigdata--201-root 50G 5.4G 45G 11% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 769M 7.1G 10% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/sda1 1014M 139M 876M 14% /boot
/dev/mapper/cl_bigdata--201-home 142G 68G 74G 48% /home
shm 64M 0 64M 0% /var/lib/docker/containers/******
tmpfs 1.6G 0 1.6G 0% /run/user/0
#查看PV物理磁盘
fdisk -l
Disk /dev/sda: 214.7 GB, 214748364800 bytes, 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009cae3
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 419430399 208665600 8e Linux LVM
Disk /dev/mapper/cl_bigdata--201-root: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/cl_bigdata--201-swap: 8455 MB, 8455716864 bytes, 16515072 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/cl_bigdata--201-home: 151.5 GB, 151523426304 bytes, 295944192 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
#查看卷管理,若没有卷管理硬盘可能是标准模式需重装系统采用LVM模式
pvdisplay
#若有未挂载的硬盘需挂载,步骤如下
#1.格式化硬盘
fdisk /dev/sda n p 3 t -> 8e w
fdisk -l # 能看到增加了一个 /dev/sda3
#2.创建pv
pvcreate /dev/sda3
#3.vg扩展,将新增的pv加到vg中去
vgextend centos /dev/sdb3
vgdisplay #可看到有**G未分配空间
#4.使扩容生效
xfs_growfs /dev/centos/root
CPU
#查看CPU详细信息
cat /proc/cpuinfo
#查看物理CPU的个数
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
#查看物理CPU内核的个数
cat /proc/cpuinfo | grep "cpu cores" | uniq
#查看所有逻辑CPU的个数
cat /proc/cpuinfo | grep "processor" | wc -l
防火墙和SELinux 安全模块
#查看防火墙状态
systemctl status firewalld.service
#停止
systemctl stop firewalld.service
#在开机时禁用服务
systemctl disable firewalld.service
#再次检查防火墙状态
systemctl status firewalld.service
# 关闭 SELinux 安全模块getenforce/usr/sbin/sestatus -vsestatus
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#临时关闭
setenforce 0
#补充说明,centos7中,使用iptables(iptables -I INPUT 1 -p tcp --dport 21 -j ACCEPT)无效的情况下,采用firewall开放端口
#作用域 --zone
#添加端口,格式为:端口/通讯协议 --add-port=21/tcp
#永久生效 --permanent
firewall-cmd --zone=public --add-port=21/tcp --permanent
#移除21端口号
firewall-cmd --permanent --zone=public --remove-port=21/tcp
#查看防火墙开放的端口
firewall-cmd --zone=public --list-ports
#重新载入
firewall-cmd --reload
网络
网卡配置
#目录,PS:不同系统版本目录不一致
cd /etc/sysconfig/network-scripts/
#找到需要设置的网卡,通常为ifcfg-eno1、ifcfg-eno2类推
#罗列以下涉及到修改的项
#通常内网环境使用static模式
BOOTPROTO=static
#通常为文件名ifcfg-后缀部分,不去动它
NAME=eno1
#UUID不要修改
UUID=46af8308-03a2-4116-ac34-50c1c0c89c34
#对应网卡名称
DEVICE=eno1
#开机启动
ONBOOT=yes
#IP地址
IPADDR=33.66.0.132
#网关
GATEWAY=33.66.0.129
#掩码
NETMASK=255.255.255.192
#若通外网增加设置DNS,仅对该网卡生效
DNS1=8.8.8.8
DNS配置
vi /etc/resolv.conf
#如公司内网服务器DNS默认为网关地址
nameserver 192.168.1.1
多网卡路由设置
#启动脚本赋权
chmod +x /etc/rc.d/rc.local
#vi /etc/rc.d/rc.local 设置路由开机启动生效(插拔网线不生效)
#部分情况需删除默认路由,具体以当前网络环境和服务器为准
#查看当前网络路由
route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 ens192
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-95f182ae3136
172.20.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-ae8dcad332b5
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens192
#删除eno1网卡默认路由
route del default dev eno1
#删除eno2网卡默认路由
route del default dev eno2
#访问33.66网段走1号网卡
route add -net 33.66.0.0 netmask 255.255.0.0 gw 33.66.0.129 dev eno1
#除33.66外,默认走2号网卡,如需要通外网的场景等
route add -net default netmask 0.0.0.0 gw 192.169.8.1 dev eno2
#以上具体网关地址以1号2号网卡所在网络为准
服务器多网卡做路由器
#过于复杂,意义不大,不赘述
端口转发ncat
#监听本机 9876 端口,将数据转发到 192.168.172.131的 80 端口
yum install nmap-ncat -y
ncat --sh-exec “ncat 192.168.172.131 80” -l 9876 --keep-open
时钟服务
PS:如果是虚拟机,例如vmware,需要关闭虚拟机的时间设置,去掉勾选同步客户机时间与主机时间
安装ntpdate
yum install ntpdate -y
yum install ntp -y
初始手动同步一次时间
ntpdate 0.asia.pool.ntp.org
#若上述不可用可更换以下时间服务地址,可百度阿里云时钟服务地址
ntpdate ntp.aliyun.com
ntpdate time.nist.gov
ntpdate time.nuri.net
ntpdate 1.asia.pool.ntp.org
ntpdate 2.asia.pool.ntp.org
ntpdate 3.asia.pool.ntp.org
系统时间同步到硬件,防止系统重启后时间被还原
#未实际操作过
hwclock --systohc
时钟服务配置
#编辑配置文件
vi /etc/ntp.conf
#原有配置允许本地操作,不动
restrict 127.0.0.1
restrict ::1
#增加设置允许同步的IP段
#nomodify:不能使用 ntpc 与 ntpq 这两支程序来修改本服务器的时间参数, 但客户端仍可透过这部主机来进行网络校时的
#notrap:不提供 trap 这个远程事件登录 (remote event logging) 的功能
restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap
# iburst当一个运程NTP服务器不可用时,向它发送一系列的并发包进行检测
# prefer表示为优先,表示本机优先同步该服务器时间
#这里分两种情况
#A:可连接外网,从公网时钟服务同步本机时间(以下4个为国内地址)
server ntp.aliyun.com iburst prefer
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server 0.cn.pool.ntp.org iburst
#B:无法连接外网,本机作为虚拟时钟服务,自己向自己同步,本机会有偏移
server 127.127.1.0
Fudge 127.127.1.0 stratum 10
#重启NTP服务(设置开机启动)。使用命令:systemctl restart|enable|stop|start|status ntpd
systemctl status ntpd
客户机定期从指定时钟服务同步时间
方案1:crontab
#编写定时任务
crontab -e
37 */1 * * * ntpdate 192.168.1.1(时钟服务IP)
方案2(建议):ntp服务自动管理,需设置服务开机自启
#编辑配置文件
vi /etc/ntp.conf
server 192.168.1.1(时钟服务IP)
检查时钟服务
#查看状态
ntpstat
#查看ntp操作
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
+ntp6.flashdance 192.36.143.234 2 u 1154 1024 366 313.215 13.969 13.501
+119.28.206.193 100.122.36.196 2 u 1277 1024 326 48.498 -3.780 4.190
*tick.ntp.infoma .GPS. 1 u 618 1024 377 243.975 -4.049 12.538
-electrode.felix 85.10.240.253 4 u 662 1024 373 249.038 -5.779 8.135
•remote:响应这个请求的NTP服务器的名称。*表示当前选择的主服务器,+表示辅助服务器,-表示不合格的服务器,x表示服务器不可用。
•refid:NTP服务器使用的上一级ntp服务器。
•st :remote远程服务器的stratum级别。由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端,所以服务器从高到低级别可以设定为1-16。为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的。
•when:上一次成功请求之后到现在的秒数。
•poll:轮询周期。本地机和远程服务器多少时间进行一次同步(单位为s),决定了时钟同步频率。在一开始运行NTP的时候这个poll值会比较小,时钟同步频率高,系统可以尽快调整到与server一致的时间范围,之后poll值会逐渐增大,时钟同步频率降低,默认最大可达1024,受maxpool配置。
•reach:这是一个八进制值,用来测试能否和服务器连接。每成功连接一次它的值就会增加
•delay:从本地机发送同步要求到ntp服务器的round-trip time(RTT,往返时延,单位为ms)
•offset:时间偏移量。主机通过NTP时钟同步与所同步时间源的时间偏移量(单位为ms)。本地主机时间+offset=NTP服务器时间。offset越接近于0,主机和ntp服务器的时间越接近。
•jitter:抖动值。这是一个用来做统计的值。它统计了在特定个连续的连接数里offset的分布情况。简单地说这个数值的绝对值越小,主机的时间就越精确
开机启动项
#启动脚本赋权
chmod +x /etc/rc.d/rc.local
#vi编辑需要启动执行的命令即可
常用命令
JAVA项目常用
#打印配置信息,包括命令行参数、系统变量等
jinfo pid
#找到PID后通过查看句柄信息和统计句柄数量
lsof -p PID
lsof -p PID|wc -l
#查进程
ps -ef|grep Java
#查看进程下多线程占用子进程情况
ps -T -p PID
top -H -p PID
#查询某进程打开线程数,需安装yum install psmisc
pstree -p PID | wc -l
#将PID为916的堆栈信息打印到jstack.log中,命令:
jstack -l pid > jstack-1.log
#端口占用和进程查不到java项目,bin目录下查找java进程
jps -l
#查看jar包内容
jar -xvf fileJar.jar
其他类
#修改hostname
hostnamectl set-hostname test
vim /etc/hosts
#服务器开机后运行时长
cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'
#TCP 连接数和状态
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
#当前目录文件数量
ls -l |grep "^-"|wc -l
#服务器间传输文件scp local_file remote_username@remote_ip:remote_file
scp /tmp/a.jar root@192.168.1.2:/tmp/b.jar
#-r 递归整个目录
scp -r /home/space/music/ root@www.runoob.com:/home/root/others/
#1c:第一行写入 内容【文本内容】 至 tmpaa文件中
sed -i '1c '"文本内容"'' tmpaa
#部分前端项目通过sed命令动态调整不同环境下nginx配置和参数,行号如果发生变化会导致nginx配置文件错误
#场景:硬盘空间不足,查找大文件目录
#按G显示大文件夹
du -sh * | grep G
#tar命令
#仅打包,不压缩!
tar -cvf /tmp/etc.tar /etc
#压缩
tar -zczf device-rest.txt.tar.gz device-rest.txt
#解压压缩包
tar -zxv -f apache-tomcat-7.0.29.tar.gz
用户等
# 创建用户
adduser admin
# 设置密码
passwd admin
#分配root权限
vim /etc/passwd
#admin:x:1000:1000::/home/admin:/bin/bash
#改为
#admin:x:0:0::/home/admin:/bin/bash
Docker
安装环境
#在新主机上首次安装 Docker Engine-Community 之前,需要设置Docker仓库,之后可以从仓库安装和更新 Docker。
#安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#使用阿里云源地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,建议执行这个命令可以提升yum安装的速度
yum makecache fast
#安装docker服务
yum -y install docker-ce
yum -y install docker-compose
#如果没找到则先安装 yum -y install epel-release
# 以下为更新docker镜像源为阿里云
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://f85gs03l.mirror.aliyuncs.com"]
}
EOF
systemctl enable docker
systemctl daemon-reload
systemctl restart docker
#根据硬盘切换运行目录
# 先运行一次, 让它初始化 Root Dir
systemctl start docker
systemctl stop docker
#迁移docker目录
mv /var/lib/docker /home/docker
#建立软链接
ln -s /home/docker /var/lib/docker
#再次启动docker
systemctl start docker
#查看 Root Dir是否正确
docker info
常用命令
RUN命令解析
#-e Set environment variables设置环境变量,通常如Mysql容器需指定时区
-e TZ="Asia/Shanghai"
#后台运行容器,并返回容器ID
-d
#指定端口映射,格式为:主机(宿主)端口:容器端口
-p: 3307:3306
#为容器指定一个名称
--name="nginx-lb"
#Username or UID指定root用户运行
--user root
#Restart policy to apply when a container exits(重启策略default no,通常设置always失败自动重启)
--restart=always
#目录挂载,格式为:宿主机目录:容器目录
-v /home/iotlinks/data/redis:/data
#java项目通常会在run命令中调整java程序的环境变量,如下
--spring.profiles.active=docker-test
--spring.redis.password=password
其他
#查看容器信息
docker inspect containername
#监控容器资源消耗
docker stats
#format按需打印docker容器信息
docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.ID}}\t{{.Ports}}\t{{.Status}}"
# 慎重-清除所有没有容器引用的镜像,通常开发环境镜像堆积导致硬盘爆满时使用
docker image prune -a
#删除none的镜像,可能被引用删除失败.
docker rmi $(docker images | grep "none" | awk '{print $3}')
#调试使用,entrypoint入口为空,--rm退出后删除,进入后自行执行java -jar 或pyhton命令运行程序
docker run --rm --entrypoint="" -it 镜像ID /bin/bash
#日志查看
docker logs -t -f --tail=1000 iotlinks-ext-ping
#按名称进入指定docker
docker exec -it 镜像名称 /bin/bash
#docker查看容器完整command的命令
docker ps -a --no-trunc
#查看docker 容器输出日志大小
ls -lh $(find /var/lib/docker/containers/ -name *-json.log)
#清空输出日志,不建议直接删除
echo "" > /var/lib/docker/containers/xxxx
#清空所有输出docker 日志
ls $(find /var/lib/docker/containers/ -name *-json.log) |xargs truncate -s 0
#查看docker 容器占用的空间情况
docker system df -v
#修改容器restart配置
docker update --restart=always iotlinks-ui(容器名)
#docker拷贝文件拷贝至镜像中
docker cp mysqld.cnf mysql57:/etc/mysql/mysql.conf.d/mysqld.cnf
#拷贝至当前路径,点是当前目录
docker cp mysql57:/etc/mysql/mysql.conf.d/mysqld.cnf .
#导出镜像,包含名称和标签(压缩模式)
docker save imagename:tag > AAAAA
tar -zczf AAAAA.tar.gz AAAAA
#使用时需先解压后
tar -zxv -f AAAAA.tar.gz
#导入使用 docker save 命令导出的镜像
docker load < AAAAA
#通过docker的overlay2目录反向查找对应容器
docker ps -a -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "overlay2目录"
Dockerfile
#根据Dockerfile构建镜像
docker build -f Dockerfile -t imagename:tagname .
#前端Dockerfile示例
# nginx基础镜像
FROM registry.cn-hangzhou.aliyuncs.com/tythin-projects/nginx
# 拷贝nginx配置
ADD ./nginx.conf /etc/nginx/conf.d/default.conf
# 拷贝前端打包文件
COPY ./dist/ /usr/share/nginx/html/
常用容器
#redis 密码参数--requirepass 123456 \
docker run -d --restart=always --name order-redis -p 6379:6379 \
--user root -v /home/order/data/redis:/data \
-e TZ=Asia/Shanghai redis:7.0.2 --requirepass 123456 --appendonly yes
#验证,进容器后
docker exec -it iotlinks-redis /bin/bash
#无密码访问
redis-cli
#有密码访问
redis-cli -a 密码
#选择数据槽
select 0
#set,get
set test thisistest
get test
del test
#mysql
docker run --restart=always -p 3306:3306 --name iotlinks-mysql \
--user root -v /home/iotlinks/data/mysql/data:/var/lib/mysql \
-v /home/iotlinks/data/mysql/logs:/var/log/mysql -e MYSQL_ROOT_PASSWORD=demo1111111 \
-e TZ=Asia/Shanghai -d mysql:5.7.38
#验证,进容器后
docker exec -it iotlinks-mysql /bin/bash
mysql -h localhost -P 3306 -u root --password=demo1111111
show databases;
#Elasticsearch6.8.8
docker run -d --restart=always -p 9200:9200 -p 9300:9300 \
--user root --name elasticsearch \
-v /home/zhoupeng/elasticsearch/data:/usr/share/elasticsearch/data \
-e TZ=Asia/Shanghai \
--ulimit memlock=-1:-1 -e ES_JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Xms5g -Xmx5g" \
-e transport.host=0.0.0.0 -e discovery.type=single-node \
-e bootstrap.memory_lock="true" -e discovery.zen.minimum_master_nodes=1 \
-e discovery.zen.ping.unicast.hosts=elasticsearch elasticsearch:6.8.8
#邮件服务
docker run -d -h mail.iot.com --restart=always \
-p 25:25 \
-p 109:109 \
-p 110:110 \
-p 143:143 \
-p 465:465 \
-p 587:587 \
-p 993:993 \
-p 995:995 \
-p 5080:80 \
-p 5081:8080 \
-v `pwd`/mysql/:/ewomail/mysql/data/ \
-v `pwd`/vmail/:/ewomail/mail/ \
-v `pwd`/ssl/certs/:/etc/ssl/certs/ \
-v `pwd`/ssl/private/:/etc/ssl/private/ \
-v `pwd`/rainloop:/ewomail/www/rainloop/data \
-v `pwd`/ssl/dkim/:/ewomail/dkim/ \
--name ewomail bestwu/ewomailserver
#NODE-RED规则引擎
docker run -p 1880:1880 --name=nodered-demo --restart=always -v /home/nodered/data:/data -e TZ=Asia/Shanghai nodered/node-red