时隔一年,我又捡起Docker,而又放弃

   起初认识 Docker 的方式,都是从阮一峰老师的个人博客了解到的。虽然看了好几次,仍是只知其然,而不知其所以然。 与之前不同,这次我坚持看到了书的最后一页。同时,在下班后,照着书里的指引,尝试编写 Dockerfile 并构建容器。温故而知新,二刷这本书,确实能带来新的认知。

  这本书,首先介绍了 Docker 的基础架构,相关名词的概念,不同环境的安装方法。接着, 由浅入深的讲解了,基于 Dockerfile 构建的相关知识。最后,还涵盖了 Docker Compose 以及服务发现等高级用法。即使全书不到300页,仍然是满满的干货。

  一开始计划学完后,重新构建一下本地的开发环境,换掉之前使用的 Vagrant 。主要原因是,我在启动 Vagrant 时,无法正常启动 Nginx 。因为,Nginx 的配置文件在我的 Windows 终端机上,而不在虚拟机里。虽然,网上看似有解决办法,但他并不适合我。因为我的 vbox 里装的是 CentOS ,而不是 Ubuntu 。并且 Vagrant 没办法区分“启动时执行的命令”和“构建时执行的命令”,这让我很困惑。

  最后,当我发现 wsl 时,仿佛看到了新大陆。虽然,wsl 不兼容 Docker ,wsl2 又与 vbox 里的虚拟机冲突。但他的体验,绝对要比任何虚拟机都要来的好。借用知乎里别人的一句话,win10 是最好的 Linux 发行版。后来,我仍然在 wsl2 里折腾过 Docker 。但始终觉得,要学以致用才能记得住。以我目前所在公司的工作流程,使用 Docker 不太现实,还不如 wsl 直接装环境来的方便。

  wsl 真香!!!

docker从入门到放弃

  看了一段时间的汇编,准备先放一放。正好手上有本《第一本Docker书》,打算,先去看看,时下比较火的docker。
  当我看到第80页的时候,基本对它失去了兴趣。后面几页,我都是跳着看的。就在今天晚上,我打消了继续研究的念头。主要是我觉得,这明明是运维的锅。虽然,我最近一直被当运维使唤,也学习了一些Linux的基础。但是,我的兴趣并不在这里,我还是想多学学编程。
  当然,也不是劝大家不去学习docker。毕竟是新技术,了解一下还是可以的,但还是要确定自己的方向。学习东西,还是得跟着自己的兴趣走,不能一脑子扎进去,白白浪费太多时间。我觉得人的精力,还有脑容量,都是有限的,不可能鱼和熊掌兼得。学的东西多了,总会忘掉一些,最近的记忆力也是越来越差了。

git笔记 – 修改误操作

  前二周,阅读了git官方文档,感觉还是受益良多。感叹,过去的git基础太差。还经常碰见,合并远程分支到本地分支的“诡异”情况。如,https://stackoverflow.com/questions/6406762/why-am-i-merging-remote-tracking-branch-origin-develop-into-develop

情况一: 把文件add到暂存区,并未提交时,需要取消暂存, 见图一

图一

英文好的,可以直接看到说明:“使用xxx取消暂存”
这里我们直接输入 ,效果见图二 [code lang=”php”]git reset HEAD test.php[/code]

图二

情况二:commit到本地仓库后,需要取消提交,见图三、图四

图三
图四

这里我们可以输入 ,效果见图五、图六 [code lang=”php”]git reset –soft HEAD~1[/code]tips:数字1可以省略

图五
图六

除了,可以回滚到“未提交”状态,还可以直接回滚到“未暂存”状态
[code lang=”php”]git reset –mixed HEAD~1[/code]
tips:参数”–mixed”可以省略。这里涉及到git手册中“重置揭密”的知识,个人建议:去看官方文档较好 ( https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86 )

情况三:提交代码后,发现有些文件不用提交,需要从提交记录中删除,但又不删除文件本身,如:ide生成的临时文件、测试代码等。

直接运行如下代码。如果提交代码时,需要忽略该文件,可以配置到 gitignore 中。
[code lang=”php”] git rm –cached test.php [/code]

权限、文件系统与安装软件

  当面试的时候,别人问我Linux的掌握情况,我诚实的说只会简单操作。别人又问我ls -l第一列的含义,我却答不上来。这时候,我就觉得我要好好看看Linux书了。虽然我只是看了第一部分,后面的内容,大概的预览了一遍,以后有机会再看看吧。
  这本《Linux命令行与shell脚本编程大全(第3版)》,整本书只有前三分之一在讲shell基础操作命令,后面大篇幅的都在讲如何编写脚本,内容还不错。在不同的发行版,涉及到类似的功能命令时,会区别开来,逐一讲解。一共有26章、附录A和附录B。其中,26章又分为4个部分。第一部分(1-10章)主要讲了shell的基础,涵盖了linux的桌面环境、文件/文件夹的处理、磁盘/分区的管理、环境变量、用户/权限的处理,最后还介绍了包管理和编辑器。后面3个部分,都是在讲如果编写shell脚本,从基础到高级,再从高级到实用的脚本,下面总结下我觉得有用的命令。
1、文件权限

命令 说明
cat /etc/passwd 保存了:用户名、密码、用户的uid、用户组的gid、用户HOME目录位置、用户的默认shell,等等
cat /etc/shadow 保存了:用户名、密码、上次修改密码后过去的天数、多久后才能改密码、多久后必须改密码、密码过期提前多久提醒、密码过期多久禁用用户,等等
cat /etc/group 保存了:组名、组密码、gid、属于该组的用户列表( 当用户在/etc/passwd文件中,指定了某个组为默认组时,用户不会再出现在这里)
useradd -D 查看新用户的默认值
useradd xxx -p xxx 添加新用户,并指定默认密码
userdel -r xxx 删除用户,并删除用户的HOME目录以及邮件目录
usermod 修改用户名、密码、锁定帐户、解除锁定
passwd/chpasswd 修改密码
passwd/chpasswd 修改密码
groupadd 创建新组
umask 权限掩码(这个要好好理解
chmod 修改文件权限,支持“8进制模式”或“符号模式”
chown 改变文件所属关系

2、管理文件系统

命令 说明
fdisk /dev/sdb 分区管理
sudo mkfs.ext4 /dev/sdb1 创建文件系统
fsck 检查/修复文件系统
sudo pvcreate /dev/sdb1 创建物理卷
sudo pvdisplay /dev/sdb1 显示已创建的物理卷
sudo vgcreate Vol1 /dev/sdb1 创建卷组
sudo vgdisplay Vol1 显示已创建的卷组
sudo lvcreate -l 100%FREE -n lvtest Vol1 创建逻辑卷
sudo lvdisplay Vol1 显示已创建的逻辑卷
sudo mkfs.ext4 /dev/Vol1/lvtest 创建文件系统 ( 逻辑卷 )

3、安装软件程序

命令 说明
yum list installed 列出已安装的包
yum list xxx 显示指定软件包的详细信息
yum provides xxx 查看该文件属于哪个软件包
yum install xxx 安装软件包
yum list updates 列出已安装包的可用更新
yum update xxx 更新指定的软件包
yum update 更新所有软件包
yum remove xxx 卸载软件包,保留配置文件和数据文件
yum erase xxx 卸载软件包,并删除它所有的文件
yum clean all 清理损坏的依赖关系
yum deplist xxx 列出包的库依赖
yum repolist 查看yum的软件仓库
./configure && make && make install 编译安装

环境变量

  这段时间,我在阅读Linux书箱。前几天刚好读到环境变量,还记得以前在学校学java的时,第一步,学的就是配置环境变量,今天就作个总结。也算是做个笔记吧,好记性不如烂笔头,虽然也不是笔。
  Linux的环境变量,跟windows的环境变量类似。因为Linux系统的shell存在父子关系,所以Linux的环境变量,也分全局环境变量和局部环境变量。全局和局部的作用域不同,操作的方式也不相同。下面是一些命令介绍:

命令 说明
printenv 显示全局环境变量(所有或单个)
env 显示全局环境变量(只显示所有)
set 显示全局环境变量、局部环境变量、用户定义变量(显示所有,并排序)
unset 删除环境变量
export 把局部环境变量,导出到全局环境变量

环境变量也有数组类型的,需要通过特殊的方式全部打印出来,如: ” echo ${BASH_VERSINFO[*]} ” ,variable代码你的变量名。shell有很多的默认环境变量,下面再列举一些:

变量名 说明
HOME 当前用户的主目录
PWD 当前工作目录
MAIL 当前用户收件箱的文件名
MAILPATH 冒号分隔的当前用户收件箱的文件名列表
BASH 当前shell实例的全路径名
BASH_VERSION 当前运行的bash shell版本号
BASHPID 当前bash进程的pid
PPID bash shell父进程的pid
COLUMNS 当前bash shell实例所用终端的宽度
LINES 定义了终端可见的行数
LINENO 当前执行的脚本的行号
HOSTNAME 当前主机的名称
HOSTTYPE 当前运行bash shell的机器
LANG shell的语言环境类别
OSTYPE 定义了shell所在的操作系统
RANDOM 返回一个0~32767的随机数( 对其的赋值可作为随机数生成器的种子 )
SECONDS 自从shell启动到现在的秒数( 对其赋值将会重置计数器 )
UID 当前用户的真实用户id( 数字形式 )
EUID 当前用户的有效用户id( 数字形式 )

杂项:延时执行、后台作业、协程、查找、历史记录、别名、查看手册

命令 说明
sleep 休眠若干秒,结果加连接符(&),可以置入后台执行
jobs 显示后台作业信息
coproc 协程,可将命令置入后台模式
find 在指定目录下,查找文件
which 在环境变量$PATH设置的目录下,查找文件
whereis 在特定目录下,查找文件 ( 该指令只能用于查找二进制文件、源代码文件和man手册页 )
type 了解某个命令是否内建的,还可以查看命令的不同实现,如: type -a echo
history 查看最近使用过的命令列表,
!! 执行,最近一次,执行过的命令
alias 定义别名,如: alias li=’ls -li’
unalias 删除别名
man 查看指定命令的手册

监测进程、监测磁盘、压解文件

命令 说明
ps 显示进程,推荐: ps -ef
top 实时显示进程
kill/killall 结束进程
mount 挂载磁盘
umount 卸载磁盘
df 磁盘使用情况,推荐: df -h
du 目录使用情况,推荐: du -sh *|sort -nr
sort 排序数据
grep/egrep/fgrep 搜索数据
gzip/gunzip 压缩/解压单个文件
tar 压缩/解压多个文件

linux文件目录操作cd,pwd,ls,ll,mkdir,rmdir,touch,cp,ln,mv,rm,file,cat,tac,more,less,head,tail,nl,od

命令 说明
cd 切换 “当前工作目录”
pwd 显示 “当前工作目录”
ls 列出 “当前工作目录” 下的文件和目录
ll 列出 “当前工作目录” 下的文件和目录 ( 等同于 ls -l )
mkdir 创建目录
rmdir 删除空目录
touch 创建文件
cp 复制文件
ln 创建文件的符号链接、硬链接
mv 移动文件/重命名文件
rm 删除文件/目录
file 查看文件类型 ( ASCII text / directory / … )
cat 从头到尾,显示全部内容( 适合小文件 )
tac 从尾到头,显示全部内容( 适合小文件 )
more 按页显示内容 ( 空格下一页,b上一页 )
less 与 more 类似,但它更好用
head 显示头10行
tail 显示尾10行 ( 非常适合实时监测日志 )
nl 显示带行号的全部内容 ( 等同于 cat -n )
od 以二进位的方式,显示全部内容

git放弃本地所有修改,强制更新

挺有用的一个命令,先说说我遇到的问题吧。
最近,git用的比较频繁。遇到一个奇葩问题,我在A分支下开发好的东西,合并到dev分支,进行测试,发现代码居然没有合并成功,具体什么原因造成的,还不得而知。
git fetch –all && git reset –hard origin/dev
git pull

centos 查看磁盘使用情况和文件夹占用大小

昨天,我又想登录博客写文章。突然发现,后台登录不上了。一时半会,还不知道是什么原因。后来用navicat登录数据库,查看表时,发现报了一个关于磁盘空间的错误。仔细一查,原来是磁盘满了。后来,查到php-fpm的日志居然占了几十G,果断删了再说。
使用的命令如下:
df -h 查看磁盘使用情况
du -sh * 查看当前目录下,所有文件夹占用大小