计算机网络

计算机网络

半小时看懂<计算机网络>

TCP和UDP区别

特性 TCP UDP
包头 20+字节 8+字节
连接
可靠
超时重传
流量控制
滑动窗口
报文顺序
传输格式 字节流(会粘包) 整个报文
传输效率
适用 文件下载,浏览网站 实时通话

wireshark与charles

TCP三次握手的连接过程,为什么是三次

TCP的四次挥手

curl

route指令

iptables

ssh

shell笔记

shell小技巧

找到含有’aaa’的行,并把该行内’bbb’改为’ccc’、’ddd’改为’eee’

1
sed -i '/aaa/ { s/bbb/ccc/g;  s/ddd/eee/g; }'  filename

grep查找过滤目录或文件

1
2
3
grep "string" . -R --exclude-dir=./dir #目录
grep "http" . -R --exclude-dir={.git,res,bin} #目录
grep "http" . -R --exclude=*.{java,js} #文件

查看代码行数(去空行)

1
find . -name "*.[ch]" |xargs cat|grep -v ^$|wc -l

脚本显示所执行的每一条命令

1
2
3
#!/bin/bash
set -x
ls
1
2
3
#!/bin/bash
set -xv
ls
1
2
3

```bash
sh -x yourscript.sh

openshot新建视频尺寸

openshot新建视频尺寸

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
# li @ evpower in ~ [14:48:20]
$ find /usr/ -name hdv_720_24p
/usr/lib/python3/dist-packages/openshot_qt/profiles/hdv_720_24p

# li @ evpower in ~ [14:48:24]
$ cd /usr/lib/python3/dist-packages/openshot_qt/profiles

# li @ evpower in /usr/lib/python3/dist-packages/openshot_qt/profiles [14:48:54]
$ sudo cp hdv_720_24p hdv_480_24p

# li @ evpower in /usr/lib/python3/dist-packages/openshot_qt/profiles [14:48:57]
$ sudo vi hdv_480_24p

# li @ evpower in /usr/lib/python3/dist-packages/openshot_qt/profiles [14:49:05]
$ cat hdv_480_24p
description=HDV 480 24p
frame_rate_num=24
frame_rate_den=1
width=540
height=960
progressive=1
sample_aspect_num=1
sample_aspect_den=1
display_aspect_num=9
display_aspect_den=16

TODO_after_manjaro_installed

manjaro安装后需要做的事情

注意

安装系统时选:上海,系统、编码 两个都选 zh-CN.UTF-8 免得后面系统全是英文

快捷

1
2
3
4
mkdir -p ~/li && git clone https://gitee.com/humble-zh/zhbox-blog.git ~/li/.zbb;
bash -x ~/li/.zbb/source/_posts/TODO_after_manjaro_installed/manjaro_config.sh
bash -x ~/li/.zbb/source/_posts/TODO_after_manjaro_installed/manjaro_config.sh vim
bash -x ~/li/.zbb/source/_posts/TODO_after_manjaro_installed/manjaro_config.sh ohmyzsh

改为国内源

1
sudo pacman-mirrors -i -c China -m rank

更新

1
sudo pacman -Syyu

添加源

在 /etc/pacman.conf 追加

1
2
3
[archlinuxcn]
SigLevel = Optional TrustedOnly
Server = http://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
1
2
sudo pacman -Syyu
sudo pacman -S archlinuxcn-keyring

更换中文字体(simsun.ttc或MSYH.TTF)

1
2
3
4
5
6
7
sudo pacman -S wqy-microhei
cd $(当前仓库)
sudo cp -r ./source/_posts/TODO_after_manjaro_installed/fonts/zhfonts /usr/share/fonts
cd /usr/share/fonts/zhfonts
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv

修改i3配置

1
2
3
cd $(当前仓库)
mv ~/.i3/config ~/.i3/config.bak
ln -s $(pwd)/source/_posts/TODO_after_manjaro_installed/i3/config ~/.i3/config

Linux交换Esc和Caps

在文件 ~/.i3/config 加入

1
exec_always --no-startup-id setxkbmap -option caps:swapescape &

修改默认浏览器为firefox(也可选chromium)

  1. 安装firefox

    1
    sudo pacman -S firefox-i18n-zh-cn
  2. 修改~/.i3/config对应行

    1
    bindsym $mod+F2 exec firefox
  3. 修改系统默认打开方式文件:~/.config/mimeapps.list

    1
    2
    vim ~/.config/mimeapps.list
    :%s/userapp-Pale Moon/firefox/g
  4. 修改~/.profile

    1
    export BROWSER=/usr/bin/firefox
  5. 卸载palemoon

    1
    sudo pacman -Rns local/palemoon-bin
  6. 重新加载配置或重启

  7. 安装插件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Tampermonkey(有些脚本在Greasemonkey无法运行)
    AC-baidu:重定向优化百度搜狗谷歌必应搜索_favicon_双列
    【玩的嗨】VIP工具箱,全网VIP视频免费破解去广告,一站式音乐搜索下载,获取B站封面,下载B站视频,上学吧答案获取等众多功能聚合
    百度网盘直链满速下载助手
    网盘自动填写访问码【威力加强版】
    豆瓣资源下载大师:1秒搞定豆瓣电影|音乐|图书下载
    持续更新 CSDN广告完全过滤、人性化脚本优化:不用再登录了!让你体验令人惊喜的崭新CSDN
    购物党实时比价工具(浏览器57以上版本安装)
    Adblock Plus - 免费的广告拦截器
    Vedio Speed Controller
    Vimium C 全键盘操作浏览器
    划词翻译 有道
    京价保 - 京东价保助手
    Video Downloader Pro 免费视频下载器
    网页截图
    Gesturefy 鼠标手势操作
    markdown-clipper 网页保存为markdown

    关闭桌面左下脚提示

注释掉/usr/bin/start_conky_maia里的# conky -c /usr/share/conky/conky1.10_shortcuts_maia &&

安装中文输入法(sunpinyin或libpinyin)

  1. 安装输入法以及依赖
    1
    sudo pacman -S fcitx fcitx-im fcitx-configtool fcitx-ui-light ttf-dejavu adobe-source-han-sans-otc-fonts fcitx-libpinyin fcitx-sunpinyin fcitx-cloudpinyin
  2. 给文件 ~/.xprofile 追加
    1
    2
    3
    export GTK_IM_MODULE=fcitx
    export QT_IM_MODULE=fcitx
    export XMODIFIERS="@im=fcitx"
  3. 给文件 ~/.profile 追加
    1
    fcitx

    安装配置vim/neovim

在 ~/.profile 修改默认编辑器为vim

1
export EDITOR=/usr/bin/vim

如何解决 Windows 和 Manjaro 双系统时间不一致_差8小时的问题

1
2
3
sudo pacman -S ntp
#sudo timedatectl set-ntp true
sudo timedatectl set-local-rtc true

解决桌面右上角的日期显示方块乱码

1
2
3
sudo cp /usr/share/conky/conky_maia /usr/share/conky/conky_maia.bak
sudo vim /usr/share/conky/conky_maia
:%s/Bitstream Vera/anti/g

删除状态栏的”no battery”

1
2
cd $(当前仓库)
ln -s $(pwd)/source/_posts/TODO_after_manjaro_installed/i3status.conf ~/.i3status.conf

拷贝 /etc/i3status.conf 到 ~/.i3status.conf ,注释 ~/.i3status.conf 以下行

1
order += "battery all"

~/.i3status.conf 修改状态栏的时间日期格式

1
2
3
4
tztime local {
format = "%Y-%m-%d %H:%M:%S"
# format = " %d.%m. %H:%M "
}

安装常用软件

scrot: 截图软件

inkscape: 编辑图片画框画箭头等等

variety: 更换壁纸

the_silver_searcher: 快速的代码命令行搜索工具 ag

autojump: 快速跳转目录

fzf: 终端命令行模糊查询历史

cloc: 统计代码行数,可区分文件类型以及空行和注释

zeal: 离线文档浏览器

albert: 快捷搜索/执行

1
2
3
4
5
6
sudo pacman -S sshpass mosquitto scrot inkscape the_silver_searcher fzf base-devel cmake unrar unzip yay netcat cloc smplayer you-get albert

#echo '. /usr/share/autojump/autojump.bash' >> ~/.bashrc
#echo '. /usr/share/fzf/key-bindings.bash' >> ~/.bashrc
#echo '. /usr/share/fzf/completion.bash' >> ~/.bashrc
#source ~/.bashrc

删除不必要的软件

1
sudo pacman -Rns $(pacman -Qdtq)

安装ohmyzsh

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

1
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

1
2
curl -Lo install.sh https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
sh install.sh

如果出现 Failed to connect to raw.githubusercontent.com port 443: Connection refused ,就在/etc/hosts文件追加

1
199.232.28.133 raw.githubusercontent.com

修改ohmyzsh配置

1
2
3
cd $(当前仓库)
mv ~/.zshrc ~/.zshrc.bak
ln -s $(pwd)/source/_posts/TODO_after_manjaro_installed/zshrc ~/.zshrc

安装ohmyzsh两个插件zsh-syntax-highlightingzsh-autosuggestions

1
2
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

查看git命令缩写

1
cat ~/.oh-my-zsh/plugins/git/git.plugin.zsh

git status中文乱码

1
git config --global core.quotepath false

系统无声音

测试声音 speaker-test

小新pro14,因为是新电脑,声卡很新。使用aplay -l 命令 ,显示没有声卡就安装sudo pacman -S sof-firmware

Manjaro 没有声音(伪输出)怎么办

可能就是你关机的时候是强制关机的,导致管理声音的软件异常退出,下次开机的时候管理声音的软件没有打开造成的,下面有5个方法,每种电脑可能都不一样,我尝试了多种方法,今天就来记录一下。每种方法使用完必须要重启一下电脑才可以的
方法1

1
amixer -D pulse sset Master toggle

方法2

1
2
rm -R .config/pulse/
sudo pacman -S pulseaudio

方法3

1
2
sudo gpasswd -a $USER audio
sudo killall pulseaudio

方法4

1
2
3
pulseaudio --check
pulseaudio --kill
pulseaudio --start

方法5

1
2
systemctl --user restart pulseaudio.service
systemctl --user restart pulseaudio.socket

参考文献

https://askubuntu.com/questions/15223/how-can-i-restart-pulseaudio-without-having-to-logout
https://unix.stackexchange.com/questions/204522/how-does-pulseaudio-start
https://forum.manjaro.org/t/solved-manjaro-xfce-no-sound-dummy-output/26332

Manjaro设置声音

  1. 试试系统中有没有alsamixer命令,直接终端执行alsamixer(没有的话请安装alsa-utils)
  2. 在终端执行 aplay -l 查看声卡信息
  3. 执行: amixer scontrols
  4. 然后: amixer -c 1 scontrols
  5. 给(新建)文件 ~/.asoundrc 追加下面内容
    1
    2
    3
    defaults.pcm.card 1
    defaults.pcm.device 0
    defaults.ctl.card 1
  6. $mod+Shift+r

win10更新后无法引导manjaro

情况一

先入winPE,使用扇区小工具BOOTICEUEFI - 修改启动序列 - WindowsBootManager - 启动分区 改为linux的swap(8G)重启就可以进grub引导进linux,执行sudo update-grub

再进winPE,使用扇区小工具BOOTICEUEFI - 修改启动序列 - WindowsBootManager - 启动文件,见到从\EFI\Microsoft\Boot\bootmgfw.efi改为了\EFI\Manjaro\grubx64.efi就行(或者见到WindowsBootManager的是\EFI\Microsoft\Boot\bootmgfw.efiManjaro的是\EFI\Manjaro\grubx64.efi)

情况二

1
2
3
error: unknown filesystem.
Entering rescue mode...
grub rescue> _

Manjaro won’t boot after Windows Update

1
2
3
4
5
6
ls #输出(hd0) (hd0,gpt6) (hd0,gpt5) (hd0,gpt4) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1)
ls (hd0,6)/boot #输出了目录内容
set root=(hd0,6)
set prefix=(hd0,6)/boot/grub
insmod normal
normal #就可以进入系统然后按照下面的进行修复

GRUB/Restore the GRUB Bootloader

1
2
3
4
sudo pacman -Syu grub
sudo update-grub
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=manjaro --recheck
sudo grub-mkconfig -o /boot/grub/grub.cfg

选装

修改字体DPI

i3wm 调节分辨率,鼠标大小等等

1
2
3
4
5
6
cp ~/.Xresources ~/.Xresources.bak
# 修改 Xft.dpi: 96 为 Xft.dpi: 144
# sudo xrdb ~/.Xresources # 使配置文件生效
# 修改 URxvt.font: 9x15,xft:TerminessTTFNerdFontMono
# 成为 URxvt.font: xft:TerminessTTFNerdFontMono:size=15
reboot

修改触摸板上下滚动

1
sudo cp /etc/X11/xorg.conf.d/30-touchpad.conf /etc/X11/xorg.conf.d/30-touchpad.conf.bak
1
2
3
4
5
6
7
8
9
--- /etc/X11/xorg.conf.d/30-touchpad.conf.bak	2021-01-24 22:23:49.541749394 +0800
+++ /etc/X11/xorg.conf.d/30-touchpad.conf 2021-01-24 22:21:09.836616261 +0800
@@ -3,4 +3,6 @@
Driver "libinput"
MatchIsTouchpad "on"
Option "Tapping" "on"
+ Option "NaturalScrolling" "true"
+ Option "ClickMethod" "clickfinger" #(去掉,因为右键会失效)
EndSection

联想小新pro14触摸板和键盘失灵

不能进系统:进入grub界面,按e编辑,在linux行的quiet splash后面加入i8042.dumbkdb nomodeset,按F10进入系统

能进系统:给/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT行的quiet splash后面加i8042.dumbkdb nomodeset,然后sudo update-grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i8042.direct i8042.dumbkbd"

若esc和cpas没有切换,则在.i3/config新增3行

1
2
3
exec_always --no-startup-id xmodmap -e "clear lock"
exec_always --no-startup-id xmodmap -e "keycode 9 = Caps_Lock NoSymbol Caps_Lock"
exec_always --no-startup-id xmodmap -e "keycode 66 = Escape NoSymbol Escape"

开启ssh服务

1
2
3
sudo systemctl enable sshd.service #开机启动
sudo systemctl start sshd.service #立即启动
sudo systemctl restart sshd.service #立即重启

避免进不了桌面

1
sudo pacman -S xf86-video-amdgpu

安装录屏工具

1
sudo pacman -S obs-studio

安装VSCode

1
sudo pacman -S visual-studio-code-bin

VSCode安装vim插件后,esc和caps没切换,在设置里搜Keyboard:Dispatch改为keyCode重启软件即可

win的ntfs分区只读

在win打开Windows Powershell(管理员)用下面命令关闭快速启动

1
powercfg /h off

安装mqtt.fx

1
yay -S mqttfx-bin

配置mail

1
sudo pacman -S mailx

修改 /etc/mail.rc 权限并追加内容

1
2
3
set from=humble.li@evpowergroup.com smtp="smtp.mxhichina.com"
set smtp-auth-user="humble.li@evpowergroup.com" smtp-auth-password="123456"
set smtp-auth=login

WPS-Office

1
sudo pacman -S wps-office ttf-wps-fonts

typora-free-0.11.18-1

1
yay -S typora-free

openwrt编译依赖软件

1
2
3
4
sudo pacman -S --needed bash bc bin86 binutils bzip2 cdrkit core/which \
diffutils fastjar findutils flex gawk gcc gettext git intltool \
libusb libxslt make ncurses openssl patch perl-extutils-makemaker \
pkgconf python3 rsync sharutils time unzip util-linux wget zlib

ss-libev&v2ray-plugin

1
2
3
sudo pacman -S shadowsocks-libev shadowsocks-v2ray-plugin proxychains
v2ray-plugin --help
nohup ss-local -c ~/v2ray.conf &

/etc/proxychains.confsocks4*改为socks5 127.0.0.1 1080

浏览器:手动代理配置:127.0.0.1,端口:1080,使用SOCKSv5时代理DNS查询

yay无法proxychains

注释/etc/proxychains.confproxy_dns

安装todesk

1
2
3
4
5
6
yay -S todesk
sudo systemctl start todeskd.service
sudo systemctl is-enabled todeskd.service
sudo systemctl enabled todeskd.service
# 如果开机没有自启动就
# sudo chmod 744 ~/.config/autostart/todesk.desktop

安装向日葵

1
yay -S sunloginclient

每次开机都需要运行一次下面指令才能正常使用向日葵

1
systemctl start runsunloginclient.service

解决Manjaro i3社区版 compton默认配置不正确的问题

2020年1月10日 更新。默认配置可以使用透明,需要取消 compton.conf 中

1
2
3
#inactive-opacity = 0.93;
#active-opacity = 1;
#取消这两行的注释

此问题默认存在于manjaro-i3-18.1.5-191229-linux54之前的版本中。 i3 社区版中compton包名已经改名为picom。 终端中运行:

1
2
pkill comton #关闭compton
compton -b #运行compton

错误显示为:

1
2
3
4
5
6
[ 01/09/2020 18:38:49.762 parse_config_libconfig WARN ] Option `no-dock-shadow` is deprecated, and will be removed. Please use the wintype option `shadow` of `dock` instead.
[ 01/09/2020 18:38:49.762 parse_config_libconfig WARN ] Option `menu-opacity` is deprecated, and will be removed.Please use the wintype option `opacity` of `popup_menu` and `dropdown_menu` instead.
[ 01/09/2020 18:38:49.762 parse_config_libconfig WARN ] vsync option will take a boolean from now on. "none" is interpreted as "false" for compatibility, but this will stop working soon
[ 01/09/2020 18:38:49.763 parse_config_libconfig WARN ] glx-swap-method has been deprecated since v6, your setting "undefined" should be removed.
[ 01/09/2020 18:38:49.763 parse_config_libconfig WARN ] "clear-shadow" is removed as an option, and is always enabled now. Consider removing it from your config file
[ 01/09/2020 18:38:49.763 parse_config_libconfig WARN ] "paint-on-overlay" has been removed as an option, and is enabled whenever possible
1
2
3
4
5
6
cd $(当前仓库)
sed -i 's/compton/picom/g' ~/.i3/config #将.i3/config中的compton 替换为picom
mv ~/.config/compton.conf ~/.config/compton.conf.old #删除原有.config/compton.conf
vim ~/.config/picom.conf #新建picom.conf文件,输入内容
cp ${pwd}/source/_posts/TODO_after_manjaro_installed/picom.conf ~/.config/picom.conf
reboot #重启系统
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# ~/.config/picom.conf
# Shadow
shadow = true;
# no-dnd-shadow = true;
#no-dock-shadow = true;
#clear-shadow = true;
detect-rounded-corners = true;
shadow-radius = 5;
shadow-offset-x = 1;
shadow-offset-y = 1;
shadow-opacity = .3;
shadow-ignore-shaped = false;
shadow-exclude = [
"name = 'Notification'",
# workaround for conky until it provides window properties:
"override_redirect = 1 && !WM_CLASS@:s",
"class_g ?= 'Dmenu'",
# "class_g ?= 'Dunst'",
# disable shadows for hidden windows:
"_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'",
"_GTK_FRAME_EXTENTS@:c",
# disables shadows on sticky windows:
# "_NET_WM_STATE@:32a *= '_NET_WM_STATE_STICKY'",
# disables shadows on i3 frames
"class_g ?= 'i3-frame'"
];

# shadow-exclude-reg = "x10+0+0";
# xinerama-shadow-crop = true;

#menu-opacity = 0.95;
#inactive-opacity = 0.93;
#active-opacity = 1;
#alpha-step = 0.01;
#inactive-dim = 0.0;
#blur-background = false;
#blur-kern = "3x3box";

fading = false;
fade-delta = 1;
fade-in-step = 0.03;
fade-out-step = 0.03;
fade-exclude = [ ];

backend = "xrender";
mark-wmwin-focused = true;
mark-ovredir-focused = true;
detect-client-opacity = true;
unredir-if-possible = true;
refresh-rate = 0;
vsync = false;
dbe = false;
#paint-on-overlay = true;
focus-exclude = [ "class_g = 'Cairo-clock'" ];
detect-transient = true;
detect-client-leader = true;
invert-color-include = [ ];
glx-copy-from-front = false;
#glx-swap-method = "undefined";

#opacity-rule = [
#"99:name *?= 'Call'",
#"99:class_g = 'Chromium'",
#"99:name *?= 'Conky'",
#"99:class_g = 'Darktable'",
#"50:class_g = 'Dmenu'",
#"99:name *?= 'Event'",
#"99:class_g = 'Firefox'",
#"99:class_g = 'GIMP'",
#"99:name *?= 'Image'",
#"99:class_g = 'Lazpaint'",
#"99:class_g = 'Midori'",
#"99:name *?= 'Minitube'",
#"99:class_g = 'Mousepad'",
#"99:name *?= 'MuseScore'",
#"90:name *?= 'Page Info'",
#"99:name *?= 'Pale Moon'",
#"90:name *?= 'Panel'",
#"99:class_g = 'Pinta'",
#"90:name *?= 'Restart'",
#"99:name *?= 'sudo'",
#"99:name *?= 'Screenshot'",
#"99:class_g = 'Viewnior'",
#"99:class_g = 'VirtualBox'",
#"99:name *?= 'VLC'",
#"99:name *?= 'Write'",
#"93:class_g = 'URxvt' && !_NET_WM_STATE@:32a",
#"0:_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'",
#"96:_NET_WM_STATE@:32a *= '_NET_WM_STATE_STICKY'"
#];

wintypes :
{
tooltip :
{
fade = true;
shadow = false;
opacity = 0.85;
focus = true;
};
fullscreen :
{
fade = true;
shadow = false;
opacity = 1;
focus = true;
};
};

````

### [安装vnc](http://blog.lujun9972.win/blog/2018/09/20/%E5%9C%A8archlinux%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AEvnc-server/index.html)

```bash
sudo pacman -S tigervnc
vncpasswd
#Would you like to enter a view-only password (y/n)? n
sudo cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@\:1.service
sudo vim /etc/systemd/system/vncserver@:1.service
sudo systemctl daemon-reload
sudo systemctl start vncserver@:1.service
sudo systemctl enable vncserver@:1.service
ls ~/.vnc
vncserver :1
netstat -pantu|grep 5901
# 客户端开始连接 vncviewer 192.168.1.3:5901
1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/systemd/system/vncserver@:1.service
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=simple
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver_wrapper zh %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

deepin TIM/QQ

前提:添加 archlinuxcn 源。在 /etc/pacman.conf 里加入以下代码:

1
2
3
[archlinuxcn]
SigLevel = Never
Server = http://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
1
sudo pacman -Sy

安装 TIM

1
2
sudo pacman -S deepin.com.qq.office
nohup /opt/deepinwine/apps/Deepin-WeChat/run.sh > /dev/null 2>&1 &

无法启动

1
2
3
4
5
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 20 (X_GetProperty)
Resource id in failed request:
0x0 Serial number of failed request:
10 Current serial number in output stream: 10

解决方案

1
2
3
yaourt -S gnome-settings-daemon
nohup /usr/lib/gsd-xsettings > /dev/null 2>&1 &
nohup /opt/deepinwine/apps/Deepin-WeChat/run.sh > /dev/null 2>&1 &

开机启动 /usr/lib/gsd-xsettings ,往 ~/.i3/config 加入

1
exec_always --no-startup-id nohup /usr/lib/gsd-xsettings > /dev/null 2>&1 &

系统语言非中文时,中文全显示成方块,需要在 /opt/deepinwine/tools/run.sh 中将 WINE_CMD 那一行修改为

1
WINE_CMD="LC_ALL=zh_CN.UTF-8 deepin-wine"

WeChat

1
2
yay -S deepin-wine-wechat
/opt/deepinwine/apps/Deepin-WeChat/run.sh

python

when-changed: 监控文件变动并且执行命令

1
pip3 install when-changed
1
pip3 install ipdb

vim

vim小技巧

快速插入时间

把下面行追加到 ~/.vimrc ,在vim的插入模式输入 xtime 即可

1
iab xtime <c-r>=strftime("%Y-%m-%d %H:%M:%S")<cr>

复制/剪切/删除

print("Hi, this is a 'word'!")

  • 拷贝word:光标移到oyiw(举一反三:viw,diw,ciw)或者yi'
  • 拷贝'word':光标移到oya'(举一反三:va',da',ca')
  • 拷贝Hi, this is a 'word'!:光标移到oyi"(举一反三:vi",di",ci")
  • 拷贝"Hi, this is a 'word'!":光标移到oya"(举一反三:va",da",ca")

vim寄存器

查看vim常用寄存器的保存的内容:registers

a-z每个字母对应一个寄存器,查看寄存器a对应的值:reg a,查看寄存器b对应的值:reg a

normal模式下粘贴寄存器a的内容"ap,insert模式下粘贴寄存器a的内容Ctrl+r a

print("Hi, this is a 'word'!")

  • 拷贝word寄存器a:光标移到o,"a(选择寄存器a),yiw(拷贝单词)
  • 拷贝this寄存器b:光标移到h,"b(选择寄存器b),yiw(拷贝单词)
  • 查看寄存器a保存的内容::reg a
  • 查看寄存器b保存的内容::reg b
  • 粘贴word(即寄存器a的内容):光标移到粘贴位置,"a(选择寄存器a),p(粘贴)
  • 粘贴this(即寄存器b的内容):光标移到粘贴位置,"b(选择寄存器b),p(粘贴)

当我们不选择寄存器直接使用yd操作时,被操作的内容会被拷贝或者剪切到""(无名寄存器)中

"%:内容是当前文件名,一般写文件注释头会用到

".:上次插入的文本

"+:系统剪切板,查看vim是否支持使用系统剪切板:echo has('clipboard'),输出1表示支持

  • 在别的程序(如浏览器网页)用鼠标选择内容,Ctrl+c(拷贝内容到系统剪切板),回到vim用"+(选择系统剪切板),p(粘贴系统剪切板的内容)
  • "+(选择系统剪切板),yy(拷贝一行进入系统剪切板),可以在别的编辑器或者程序(如浏览器搜索框)里用Ctrl+v粘贴
  • vim拷贝默认放入""(无名寄存器),如果想用"+(系统剪切板)取代""(无名寄存器),需要:set clipboard^=unnamed,unnamedplus

粘贴网上拷贝的代码出现缩进对齐错乱

当vim :set autoindent 之后,在insert模式下用Ctrl+Shift+v粘贴网上拷贝的代码会出现缩进对齐错乱

  • 方法1. :set paste,i(进入插入模式),Ctrl+Shift+v(粘贴),:set nopaste
  • 方法2. "+(选择系统剪切板),p(粘贴)
  • 方法3. :set clipboard^=unnamed,unnamedplus(使用系统剪切板取代无名寄存器),p(粘贴)

linux使用mail命令发邮件

linux使用mail命令发邮件

安装

ubuntu

1
sudo apt-get install s-nail

manjaro

1
sudo pacman -S s-nail

配置

修改/etc/mail.rc或/etc/nail.rc或/etc/s-nail.rc(Ubuntu)、/etc/mail.rc(centOS)

1
2
3
set from=humble.li@evpowergroup.com smtp="smtp.mxhichina.com"
set smtp-auth-user="humble.li@evpowergroup.com" smtp-auth-password="123456"
set smtp-auth=login

使用

1.无邮件正文(如果需要结束交互可按ctrl+d)

1
mail -s "测试主题" humble.li@evpowergroup.com

2.有邮件正文

1
2
3
mail -s "测试主题" humble.li@evpowergroup.com < 正文文件.txt
echo "正文内容" | mail -s "测试主题" humble.li@evpowergroup.com
cat 正文文件.txt | mail -s "测试主题" humble.li@evpowergroup.com

3.带附件(doesn’t work)

1
uuencode a.txt a.txt | mail -s "测试主题" humble.li@evpowergroup.com < 正文文件.txt

Docker入门学习笔记

版权声明:本文为CSDN博主「渣渣的夏天」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_39564555/article/details/97620705

B站——【公开课】Docker入坑教程【33集】 庄七

Docker入门学习笔记

1. 什么是Docker?

  • 将应用程序自动部署到容器

2. Docke的目标

  • 提供简单轻量的建模方式
  • 职责的逻辑分离
  • 快速高效的开发周期
  • 鼓励面向服务的架构

3. Docker通常应用场景

  • 使用Docker容器开发、测试、部署服务
  • 创建隔离的运行环境
  • 搭建多用户的平台即服务(PaaS)基础设施
  • 提供软件即服务(SaaS)应用程序
  • 高性能、超大规模的宿主机部署

4. Docker的基本组成

  • Docker Client 客户端
  • Docker Daemon 守护进程
  • Docker Image 镜像
  • Docker Container 容器
  • Docker Registey 仓库

5. Docker基本操作

运行容器

1
2
docker run IMAGE [COMMAND] [ARG…]
run 在新容器中执行命令

启动交互式容器:

1
2
3
docker run -i -t IMAGE /bin/bash
-i --interactive=true|false 默认为false
-t --tty=true|false 默认为false

查看容器:

1
2
docker ps [-a] [-l]
# docker inspect 容器名/id

自定义容器名:

1
docker run --name=自定义名 -i -t /bin/bash

重新启动已经停止的容器:

1
docker start [-i] 容器名/id

删除停止的容器:

1
docker rm 容器名/id

6. 守护式容器

  • 能够长期运行
  • 没有交互式会话
  • 适合运行应用程序和服务

以守护形式运行容器

1
2
docker run -i -t IMAGE /bin/bash
Ctrl+P Ctrl+Q

附加到运行中的容器

1
docker attach 容器名/id

启动守护式容器

1
2
docker run -d 镜像名 [COMMAND] [ARG…]
-d 以后台运行方式启动

查看容器日志

1
2
3
4
5
6
7
docker logs [-f] [-t] [--tail] 容器名/id
-f --follows=true|false 默认为false
一直跟踪日志变化并返回结果,Ctrl+C停止
-t --timestamps=true|false 默认为false
附加时间戳
--tail ="all"
返回结尾处日志,未指定则返回所有日志

查看容器内进程

1
docker top 容器名/id

在运行中的容器内启动新进程

1
docker exec [-d][-i][-t] 容器名/id [COMMAND] [ARG…]

停止守护容器

1
2
docker stop 容器名/id     发送信号后等待服务器停止
# docker kill 容器名/id 直接终止

使用docker帮助文档

1
man docker-run

7. 在容器中部署静态网站

设置容器的端口映射

1
2
3
4
5
6
7
8
9
10
11
12
13
run [-P] [-p]
-P --publish-all=true | false 默认为false
# docker run -P -i -t ubuntu /bin/bash
映射所有端口
-p --publish=[] 指定映射端口
containerPort
# docker run -p 80 -i -t ubuntu /bin/bash
hostPort:containerPort
# docker run -p 8080:80 -i -t ubuntu /bin/bash
ip:containerPort
# docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
ip:hostPort:containerPort
# docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

Nginx部署静态网页流程

1
2
3
4
5
6
7
- 创建映射80端口的交互式容器
- 安装Nginx
- 安装文本编辑器vim
- 创建静态页面
- 修改Nginx配置文件
- 运行Nginx
- 验证网站访问
1
2
3
4
5
6
7
8
docker run -p 80 --name web -i -t ubuntu /bin/bash
apt-get update
apt-get install -y nginx
apt-get install -y vim

mkdir -p /var/www/html
cd /var/www/html
vim index.html
1
2
3
4
5
6
7
8
<html>
<head>
<title>Nginx in Docker</title>
</head>
<body>
<h1>hello, I'm website in docker!</h1>
</body>
</html>
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
whereis nginx
vim /etc/nginx/sites-enabled/default # 修改 root 的值为 /var/www/html

cd /
nginx
ps -ef
Ctrl+P Ctrl+Q 退出,后台运行

# docker ps 查看运行的容器
# docker port web 查看端口映射情况
# docker top web 查看容器进程情况

curl http://127.0.0.1:32768 以映射的端口为准

# docekr inspect web 查看容器对应的IPAddress
curl 172.17.0.2

# 关闭容器
# docker stop web
# docker start -i web
# ps -ef
# nignx并未启动

# docker exec web nginx
# 重新启动Nginx
# 映射的端口和IP地址均已改变

8. 镜像的相关操作

Docker镜像:

1
2
3
4
5
6
容器的基石
层叠的只读文件系统
联合加载(union mount)

# docker info
查看docker配置的相关信息

列出镜像

1
2
3
4
5
docker images [OPTIONS] [REPOSITORY]
-a --all=False 显示所有镜像
-f --filter=[] 显示时的过滤条件
--no-trunc=false 不使用截断的形式显示命令
-q --quiet=false 只显示镜像的v-id

查看镜像

1
docker inspect [OPTIONS] CONTAINER|IMAGE[CONTAINER|IMAGE……]

删除镜像

1
2
3
docker rmi [OPTIONS] IMAGE [IMAGE…]
-f --force=false 强制删除镜像
--no-prune=false 保留删除镜像中未打标签的父镜像

查找镜像

1
2
3
4
5
6
Docker Hub  https://hub.docker.com/
# docker search [OPTIONS] TERM
--automated=false 只显示自动化构建的选项
--no-trunc=false 以截断方式显示image id
-s --stars=0 设置显示结果的最低星级
一次最多返回25个结果

拉取镜像

1
2
3
4
5
6
7
8
docker pull [OPTIONS] NAME[:TAG]
-a --all-tags=false 下载仓库中所有标签镜像

提速
使用--registry-mirror选项
1.修改:vim /etc/default/docker
2.添加:DOCKER_OPTS = "--registry-mirror=http://MIRROR-ADDR"
https://www.daocloud.io

推送镜像

1
docker push NAME[:TAG]

构建镜像

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
保存对容器的修改,并再次使用
自定义镜像的能力
以软件的形式打包并分发服务及其运行环境

1.使用commit构建镜像
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a --author="" 指定镜像作者,一般:name@email
-m --message="" 提交信息
-p --pause=true 在commit过程中不暂停容器

********************demo***************
# docker run -it -p 80 --name commit_test ubuntu /bin/bash
# apt-get update
# apt-get install -y nginx
# exit
# docker ps -l
生成镜像
# docker commit -a "summer" -m "nginx" commit_test summer258/commit_test1
# docker images
# docker run -d --name nginx_web -p 80 summer258/commit_test1 nginx -g "daemon off;"
# docker ps
# curl http://127.0.0.1:32770
***************************************

2.使用dockerfile构建镜像

# docker build [OPTIONS] PATH | URL | -
--force-rm=false
--no-cache=false
--pull=false
-q --quiet=false
--rm=true
-t --tag=""

创建一个Dockerfile
# first dockerfile
FROM ubuntu:14.04
MAINTAINER name "name@email"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

********************demo***************
# mkdir -p dockerfile/df_test1
# cd dockerfile/df_test1
# vim Dockerfile
# first dockerfile
FROM ubuntu:14.04
MAINTAINER name "name@email"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
# docker build -t='summer258/df_test1' .
# docker run -d --name nginx_web2 -p 80 summer258/df_test1 nginx -g "daemon off;"
# docker ps
# curl http://127.0.0.1:32770
***************************************

9. Docker的C/S模式

Alt

Remote API

RESTful风格的API

STDIN、STDOUT、STDERR

Alt

连接方式

unix:///var/run/docker.sock

tcp://host:port

fd://socketfd

Alt

test

1
2
3
4
ps -ef | grep docker
# docker version
# nc -U /var/run/docker.sock
GET /info HTTP/1.1

10. Docker守护进程的配置和操作

查看守护进程

1
2
ps -ef | grep docker
# status docker

使用service命令管理

1
service docker start|stop|restart

Docker的启动选项

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
docker -d [OPTIONS]
-d 表示以守护进程形式运行

运行相关:
-D --debug=false
-e --exec-drive="native"
-g --graph="/var/lib/docker"
--icc=true
-l --log-level="info"
--label=[]
=p --pidfile="/var/run/docker.pid"

Docker服务器连接相关:
-G,--group="docker"
-H,--host=[]
--tls=false
--tlscacert="/home/sven/.docker/ca.pem"
--tlscert="/home/sven/.docker/cert.pem"
--tlskey="/home/sven/.docker/key.pem"
--tlsverify=false

RemoteAPI相关:
--api-enable-cors=false

存储相关:
-s,--storage-drive=""
--selinux-enabled=false
--storage-opt=[]

Registry相关:
--insecure-registry=[]
--registry-mirror=[]

网络设置相关:
-b,--bridge=""
--bip=""
--fixed-cidr=""
--fixed-cidr-v6=""
--dns=[]
--dns-search=[]
--ip=0.0.0.0
--ip-forward=true
--ip-masq=true
--iptables=true
--ipv6=false
--mtu=0

docker启动配置文件:/etc/default/docker

1
DOCKER_OPTS = "……"

11. Docker的远程访问

环境准备:

1
2
3
4
5
6
第二台安装Docker的服务器
修改Docker守护进程启动选项,区别服务器
保证Client API和Server API版本一致

# docker version
查看版本API是否一致

修改服务器端配置

1
2
3
4
5
6
7
8
9
10
11
12
修改Docker守护进程启动项
-H tcp://host:port
unix:///path/to/socket
fd://* or fd://socketfd
守护进程默认配置:
-H unix:///var/run/docker.sock

vim /etc/default/docker
DOCKER_OPTS = "-H tcp://0.0.0.0:2375"
# 一般选择2375端口
重启服务 # service docker restart
ifconfig 获取本机IP地址

远程访问

1
curl http://服务器IP:配置port/info

客户端远程访问:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
修改客户端配置
使用Docker客户端命令选项
-H tcp://host:port
unix:///path/to/socket
fd://* or fd://socketfd
客户端默认配置:
-H unix:///var/run/docker.sock

# docker -H tcp://ip:port info

使用环境变量简化操作DOCKER_HOST
export DOCKER_HOST="tcp://ip:port"

将环境变量置空则返回本机服务
export DOCKER_HOST=""

设置了远程访问模式后的服务端不再支持本机连接

1
2
3
4
1.将本机作为远程客户端,通过DOCKER_HOST连接
2.修改本机配置,添加默认配置
vim /etc/default/docker
DOCKER_OPTS = "-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

12. Dockerfile指令

创建一个Dockerfile

1
2
3
4
5
6
first dockerfile
FROM ubuntu:14.04
MAINTAINER name "name@email"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

指令格式

1
2
Comment
INSTRUCTION argument

FROM <image>[:<tag>]

1
2
3
已经存在的镜像
基础镜像
必须是第一条非注释指令

MAINTAINER <name>

1
指定镜像的作者信息,包含镜像的所有者和联系信息

RUN

1
2
3
4
5
6
7
指定当前镜像中运行的命令
shell模式
RUN <command>
默认shell /bin/sh -c command
exec模式
RUN [ "executable", "param1", "param2"]
可以指定其他shell RUN ["/bin/bash", "-c", "echo hello"]

EXPOSE <port> [<port>…]

1
2
指定运行该镜像的容器使用的端口
在使用时仍需指定 -p port

CMD

1
2
3
4
提供容器运行时的命令,作为默认设置,会被docker run中相同命令覆盖
CMD [ "executable", "param1", "param2"] (exec模式)
CMD command param1 param2 (shell模式)
CMD ["param1", "param2"] (作为ENTRYPOINT指令的默认参数)

ENTRYPOINT

1
2
3
4
ENTRYPOINT [ "executable", "param1", "param2"] (exec模式)
ENTRYPOINT command param1 param2 (shell模式)
默认不会被docker run中命令覆盖
可以使用 docker run entrypoint 覆盖

ADD、COPY

1
2
3
4
5
6
7
8
9
10
将文件/目录复制到Dockerfile构建的文件中,源地址,目标地址
ADD <src>…<dest>
ADD ["<src>""<dest>"] (使用于文件路径中有空格的情况)

COPY <src>…<dest>
COPY ["<src>""<dest>"] (使用于文件路径中有空格的情况)

ADD vs COPY
ADD包含类似tar的解压功能
如果单纯复制文件,Docker推荐使用COPY

VOLUME [“/data”]

1
用于向基于镜像创建的容器添加数据卷,共享数据/数据持久化

WORKDIR /path/to/workdir

1
在镜像创建新容器时,指定工作目录,一般使用绝对路径,相对路径会持续传递

ENV <key><value>

ENV <key>=<value>…

1
用户设置环境变量

USER daemon

1
指定镜像运行的用户,默认为root

ONBUILD [INSTRUCTION]

1
2
3
镜像触发器
当一个镜像被其他镜像作为基础镜像时执行
会在构建过程中插入指令

13. Dockerfile构建过程

  • 从基础镜像运行一个容器

  • 执行一条指令,对容器做出修改

  • 执行类似docker commit的操作,提交一个新的镜像层

  • 基于刚提交的镜像运行一个新容器

  • 执行Dockefile中的下一条指令,直至所有指令执行完毕

  • 中间层镜像不会被删除,中间层容器会被删除

  • 可以使用中间层镜像调试

    查找错误

  • 构建缓存

  • 不适用构建缓存

1
2
3
4
docker build --no-cache
或者
在Dockerfile中设置缓存刷新时间
ENV REFRESH_DATE 2019-8-2
  • 查看镜像构建的过程
1
docker history [image]

14. Docker容器的网络连接

  • Docker容器的网络基础

Alt

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
27
28
29
docker0——Linux虚拟网桥

Linux虚拟网桥:
可以设置IP地址
相当于拥有一个隐藏的虚拟网卡

docker0 地址划分
IP:172.17.42.1 子网掩码:255.255.0.0
MAC:02:42:ac:11:00:00到02:42:ac:11:ff:ff
总共提供了65534个地址

安装网桥管理程序
yum -y install bridge-utils
查看网桥设备
# brctl show

自定义Docker0

修改docker0地址
$ sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

自定义虚拟网桥

添加虚拟网桥
$ sudo brctl addbr br0
$ sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
更改docker守护进程的启动配置
/etc/default/docker 中添加DOCKER_OPTS值
-b=br0
  • Docker容器的互联

环境准备

1
2
3
4
5
6
7
8
9
10
11
12
用于测试的Docker镜像Dockerfile:
# ./cct/Dockerfile
# container connection test
FROM ubuntu:14.04
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE 80
CMD /bin/bash

# docker build -t summer258/cct .

允许所有容器间互联

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
27
28
29
30
31
32
33
34
35
36
37
38
默认设置
--icc=true 默认

启动第一个容器
# docker run -it --name cct1 summer258/cct
/# nginx
Ctrl+P Ctrl+Q

启动第二个容器
# docker run -it --name cct2 summer258/cct
/# ifconfig
Ctrl+P Ctrl+Q

inet addr:172.17.0.3

连接到第一个容器cct1
# docker attach cct1
/# ifconfig

inet addr:172.17.0.2

测试连接:ping 172.0.3

连接到第一个容器cct2
# docker attach cct2
测试连接:curl http://172.17.0.2

--link
# docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]

启动第三个容器
# docker run -it --name cct3 --link=cct1:webtest summer258/cct
/# ping webtest

重启docker服务
# systemctl restart docker
# docker restart cct1 cct2 cct3
/# ping webtest

拒绝所有容器间互联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Docker守护进程的启动选项
DOCKER_OPTS= " --icc=false"

# ubuntu
$ sudo vim /etc/default/docker
DOCKER_OPTS = "--icc=false"
# centos
$ sudo vim /etc/docker/daemon.json
{

“icc”:false,

}

$ sudo systemctl restart docker
$ ps -ef | grep docker
$ sudo docker restart cct1 cct2 cct3
$ sudo docker attach cct3
/# ping webtest

允许特定容器间的连接

1
2
3
4
5
6
Docker守护进程的启动选项
--icc=false --iptables=true
--link

$ sudo iptables -F
$ sudo iptables -L -n
  • Docker容器与外部网络的连接

ip-forward

1
2
3
4
--ip-forward=true
决定系统是否会转发流量

$ sudo sysctl net.ipv4.conf.all.forwarding

iptables

1
2
iptables是与Linux内核集成的包过滤防火墙系统,
几乎所有的Linux发行版本都会包含iptables的功能

Alt

1
2
3
4
5
6
filter表中包含的链:
INPUT
FORWARD
OUTPUT

$ sudo iptables -L -n

限制IP访问容器

1
$ sudo iptables -I DOCKER -s 10.211.55.3 -d 127.17.0.7 -p TCP --dport 80 j DROP

端口映射访问

15. Docker容器的数据管理

  • Docker容器的数据卷

    什么是数据卷?(Data Volume)

    • 数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问
    • 数据卷设计的目的,在于数据的永久化,它完全独立于容器的生存周期,因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理。

Alt

数据卷(Data Volume)的特点
  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。
  • 数据卷可以在容器之间共享和重用。
  • 可以对数据卷里的内容直接进行修改
  • 数据卷的变化不会影响镜像的更新
  • 卷会一直存在,及时挂载数据卷的容器已经被删除

为容器添加数据卷

1
2
3
4
5
$ sudo docker run -it -v ~/container_data:/data ubuntu /bin/bash
/# ls

$ sudo docker inspect 容器名/id
可以查看Volume目录信息

为数据卷添加访问权限

1
2
$ sudo docker run -it -v ~/datavolume:/data:ro ubuntu /bin/bash
ro:只读

使用Dockerfile构建包含数据卷的镜像

1
2
Dockerfile指令:VOLUME["/data"]
不能映射到已经存在的文件目录,系统默认创建
  • Docker的数据卷容器

    什么是数据卷容器:
    命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器。

Alt

挂载数据卷容器的方法

1
$ sudo docker run --volumes-from [CONTAINER NAME]
  • Docker数据卷的备份和还原

数据备份方法

1
$ sudo docker run --volumes-from [container name] -v $(pwd):/backup[:wr] ubuntu tar cvf /backup/backup.tar [container data volume]

Alt

数据还原方法

1
$ sudo docker run --volumes-from [container name] -v $(pwd):/backup[:wr] ubuntu tar xvf /backup/backup.tar [container data volume]

16. Docker容器的跨主机连接

  • 使用网桥实现跨主机连接

    原理:

    网络拓扑

    Alt

    环境准备:

1
2
3
4
5
6
Mac OS X + Parallels
两台Ubuntu 14.04 虚拟机
安装网桥管理工具:
apt-get install bridge-utils
IP地址:Host1:10.211.55.3
Host2:10.211.55.5

网络配置:

1
2
3
4
5
6
7
修改/etc/network/interfaces 文件
auto br0
iface br0 inet static
address 10.211.55.3
netmask 255.255.255.0
gateway 10.211.55.1
bridge_ports eth0

Docker设置:

1
2
3
4
5
6
7
8
9
修改/etc/default/docker文件
-b 指定使用自定义网桥
-b=br0
--fixed-cidr限制IP地址分配范围
IP地址划分:
Host1:10.211.55.64/26
地址范围:10.211.555.65~10.211.55.126
Host2:192.168.59.126/26
地址范围:10.211.55.129~10.211.55.190

优点:

1
配置简单,不依赖第三方软件

缺点:

1
2
3
4
与主机在同网段,需要小心划分IP地址
需要有网段控制权,在生产环境中不易实现
不容易管理
兼容性不佳
  • 使用Open vSwitch实现跨主机容器连接

    Open vSwitch是什么?

      Open vSwitch是一个高质量、多层虚拟交换机,使用开源Apache2.0许可协议,由Nicira Networks开发,主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如NetFlow,sFlow,SPAN,RSPAN,CLI,LACP,8022.lag)

    原理:

    Alt

    什么是GRE隧道?

      GRE:通用路由协议封装

      隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用随带传递的数据(或负载)可以使不同协议的数据帧或包。隧道协议将其它协议的数据帧或包重新封装然后通过隧道发送新的帧头提供路由信息,以便通过互联网传递被封装的负载数据。

    环境准备:

1
2
3
4
5
6
7
8
9
Mac OS X + Virtualbox
两台Ubuntu14.04虚拟机
双网卡,Host-Only&amp;NAT
安装Open vSwitch:
apt-get install openvswitch-switch
安装网桥管理工具:
apt-get install bridge-utils
IP地址:Host1:192.168.59.103
Host2:192.168.59.104

操作:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
建立ovs网桥
添加gre连接
配置docker容器虚拟网桥
为虚拟网桥添加ovs接口
添加不同Docker容器网段路由

主机:192.168.59.103
查看ovs状态
$ sudo ovs-vsctl show
建立ovs网桥
$ sudo ovs-vsctl add-br obr0
添加gre接口
$ sudo ovs-vsctl add-port obr0 gre0
$ sudo ovs-vsctl set interface gre0 type=gre options:remote_ip=192.168.59.104
$ sudo ovs-vsctl show

建立本机docker需要使用的网桥
$ sudo brctl addbr br0
$ sudo ifconfig br0 192.168.1.1 netmask 255.255.255.0
$ sudo brctl addif br0 obr0
$ sudo brctl show

配置docker,用新建的网桥代替docker0
$ sudo vim /etc/default/docker
DOCKER_OPTS="obr0"
$ sudo service docker restart

新建一个docker容器
$ sudo docker run -it ubuntu /bin/bash
/# ifconfig
inet addr:192.168.1.2
/# ping 192.168.59.104

切换主机:192.168.59.104
$ ifconfig
inet addr:192.168.2.1
启动一个docker容器
$ sudo docker run -it ubuntu /bin/bash
/# ifconfig
inet addr:192.168.2.4
/# ping 192.168.59.104

切回主机:192.168.59.103
/# ping 192.168.2.4
ping不通,因为不同网段需要查找路由表来确定不同网段的网络地址
$ route
$ sudo ip route add 192.168.2.0/24 via 192.168.59.104 dev eth0

$ sudo docker run -it ubuntu /bin/bash
/# ping 192.168.2.4
  • 使用weave实现跨主机容器连接

    weave是什么?

1
2
3
4
语义:编织
建立一个虚拟的网络,用于将运行在不同主机的Docker容器连接起来
https://www.weave.works/
https://github.com/weaveworks/weave#readme

Alt

环境准备:

1
2
3
4
5
Mac OS X + Virtualbox
两台Ubuntu14.04虚拟机
双网卡,Host-Only&amp;NAT
IP地址:Host1:192.168.59.103
Host2:192.168.59.104

操作:

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
27
28
29
30
31
32
安装weave
启动weave
$ weave launch
连接不同主机
通过weave启动容器

主机:192.168.59.103
$ sudo wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
$ sudo chmod a+x /usr/bin/weave
$ weave launch
$ sudo docker ps -l

切换主机:192.168.59.104
重复安装操作
$ sudo wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
$ sudo chmod a+x /usr/bin/weave
$ weave launch 192.168.59.103
启动容器,将ID赋值给c2
c2=$(weave run 192.168.1.2/24 -it ubuntu /bin/bash)
$ echo $c2
$ docker attach $ c2
/# ifconfig
多了一个网络设备ethwe,inet addr:192.168.1.2

切换Host1:192.168.59.103
$ weave run 192.168.1.10/24 -it --name wc1 ubuntu /bin/bash
相同网段的IP地址
$ sudo docker aatach wc1
/# ifconfig
增加wthwe,inet addr:192.168.1.10
/# ping 192.168.1.2
能够ping通

git笔记

git config

查看配置

1
git config --list

全局

1
2
3
cat ~/.gitconfig
git config --global user.name "username"
git config --global user.email "email"

github令牌

2021年8月13号之后,github已经不让直接使用账号名密码来登录了,必须使用personal access token(个人访问令牌)

  • 明文的密码很容易被泄露,如果换成有时限的token,即使泄露了影响也会非常有限。
  • 可以为同一个github账号根据不同的使用途径,生成不同的token,并且随时都可以控制token的有效状态和不同token代表的权限。最大限度的保证账号的安全性。
  • 生成的token可随时撤销,并且令牌的随机性更高,不容易被暴力破解。

我的账号->settings->Developer settings->Personal access tokens->Generate new token->(pc名字,粘贴key)->(Note:哪台电脑,有效期(Expiration)选90天,Select scopes选repo)

1
2
3
$ git clone https://github.com/username/repo.git
Username: your_username
Password: your_token

ssh访问github

1
2
3
4
#如果没有~/.ssh 目录就执行下面,一直回车到结束即可
ssh-keygen -t rsa -C "your email"
#查看ssh key并且拷贝
cat ~/.ssh/id_rsa.pub

我的账号->settings->SSH and GPG keys->New SSH key->(pc名字,粘贴key)

1
2
3
ssh -T git@github.com
#运行结果出现类似如下
Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.

局部(项目内的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd projectdir/
cat .git/config
git config user.name "username"
git config user.email "email"
cat .git/config

#设置记住密码(默认15分钟):
git config credential.helper cache
#设置记住密码1小时
git config credential.helper 'cache --timeout=3600'
#长期存储密码:记住密码,以明文存在~/.git-credentials电脑送人后记得删掉该文件
git config credential.helper store
#重新指定.git-credentials文件路径
git config credential.helper 'store --file /data/git/.git-credentials'
cat .git/config

记住或取消密码记录

1
2
3
(repository_home)/.git/config # for the subject repository.
~/.gitconfig # for this particular user.
/etc/gitconfig # for all users on this system.
1
2
3
4
5
6
7
8
9
#记住密码记录
git config --set credential.helper 'cache --timeout=600'
git config --global --set credential.helper 'cache --timeout=600'
git config --system --set credential.helper 'cache --timeout=600'

#取消密码记录
git config --unset-all credential.helper
git config --global --unset-all credential.helper
git config --system --unset-all credential.helper

本地origin分支与远程不同步

1
2
git remote show origin # 发现不是tracked的分支(远程已删,本地还有)
git remote prune origin # 删除远程没有本地还在的分支

windows删除git记录

  1. 进入控制面板
  2. 选择用户账户
  3. 选择管理你的凭据
  4. 选择Windows凭据
  5. 选择git保存的用户信息
  6. 选择编辑或者进行删除操作

git查看各分支之间关系

1
git log --graph --decorate --oneline --simplify-by-decoration --all

git status中文乱码

1
git config --global core.quotepath false

python_pandas

修改集合内匹配A列的行中其他列的值

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
27
28
29
>>> import pandas as pd
>>> df = pd.read_csv('class.csv', header=0)
>>> df
name age
0 小明 12
1 小红 11
2 小花 12
3 小龙 13
4 小白 11
>>> femalels={"小红","小花"}
>>> femalels
{'小花', '小红'}
>>> df['gender'] = 'male'
>>> df
name age gender
0 小明 12 male
1 小红 11 male
2 小花 12 male
3 小龙 13 male
4 小白 11 male
>>> df.loc[df.name.isin(femalels), 'gender'] = 'female'
>>> df
name age gender
0 小明 12 male
1 小红 11 female
2 小花 12 female
3 小龙 13 male
4 小白 11 male
>>> df.to_csv('class_tmp.csv', index=0) #df.to_excel

挑选A列匹配以’xiao‘开头或者中间’带”-“的所有行,把A按字符”-“拆分为两列

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
27
28
29
30
31
>>> import pandas as pd
>>> df = pd.read_csv('class.csv', header=0)
>>> df
name age nickname
0 小明 12 xiao-ming
1 小红 11 xiao-hong
2 小花 12 xiao-hua
3 小龙 13 xiao-long
4 小白 11 xiao-bai
>>> df[df.nickname.str.startswith('xiao')]
name age nickname
0 小明 12 xiao-ming
1 小红 11 xiao-hong
2 小花 12 xiao-hua
3 小龙 13 xiao-long
4 小白 11 xiao-bai
>>> df[(df.nickname.str.contains('-'))]
name age nickname
0 小明 12 xiao-ming
1 小红 11 xiao-hong
2 小花 12 xiao-hua
3 小龙 13 xiao-long
4 小白 11 xiao-bai
>>> df.nickname.str.split('-', expand=True)
0 1
0 xiao ming
1 xiao hong
2 xiao hua
3 xiao long
4 xiao bai
>>>

df.bs=df.bs.fillna(‘unknown’)

df.bs=df.bs.replace(‘CHN-UNICO’,’CHN-UNICOM’)

sshpass -p helloworld ssh -o stricthostkeychecking=no root@${line} ‘reboot -f’