Devs.tw 是讓工程師寫筆記、網誌的平台。歡迎您隨手紀錄、寫作,方便日後搜尋!
linux 本身有一種容器技術叫做 LXC. 有提供一套 manager 叫做 LXD.
docker 一開始就是一套幫助操作 LXC 的工具
https://unix.stackexchange.com/questions/254956/what-is-the-difference-between-docker-lxd-and-lxc
2014年以前是用 LXC driver. 2014 年之後自行用 Go 開發了 libcontainer
所以現在 docker 有兩種 driver.
https://www.docker.com/blog/docker-0-9-introducing-execution-drivers-and-libcontainer/
https://github.com/opencontainers/runc/tree/master/libcontainer
容器社群發展至今,可以留意
好文參閱
ls /usr/share/lxc/templates/
cat /usr/share/lxc/templates/lxc-ubuntu
Current default time zone: 'Etc/UTC'
Local time is now: Thu May 13 02:49:25 UTC 2021.
Universal Time is now: Thu May 13 02:49:25 UTC 2021.
##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##
Name: lxc-test
State: RUNNING
PID: 14100
IP: 10.0.3.220
CPU use: 0.61 seconds
BlkIO use: 4.67 MiB
Memory use: 29.45 MiB
KMem use: 10.23 MiB
Link: vethX6K21K
TX bytes: 1.89 KiB
RX bytes: 10.33 KiB
Total bytes: 12.22 KiB
Connected to tty 1
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself
Ubuntu 18.04.5 LTS lxc-test pts/0
lxc-test login: ubuntu
Password:
Last login: Thu May 13 03:11:58 UTC 2021 on pts/0
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.19.10-041910-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
sudo lxc-
+ press tablxc-attach lxc-copy lxc-ls lxc-unshare
lxc-autostart lxc-create lxc-monitor lxc-update-config
lxc-cgroup lxc-destroy lxc-snapshot lxc-usernsexec
lxc-checkconfig lxc-device lxc-start lxc-wait
lxc-checkpoint lxc-execute lxc-stop
lxc-config lxc-freeze lxc-top
lxc-console lxc-info lxc-unfreeze
可以發現 lxc 指令命名設計哲學就是 linux 指令 or 功能動詞,前面 prefix lxc-
https://www.digitalocean.com/community/tutorials/getting-started-with-lxc-on-an-ubuntu-13-04-vps
如果要方便的 manager app 那就是去學 lxd.
然後這應該就是 docker 一開始版本的實作內容. docker 只是一層方便的 wrapper.
所以是有一群工程師覺得 lxd 太難用,所以自己寫了一個 docker 來操作 lxc?
過幾年,這群人覺得連 lxc 都太難用,所以自己寫了一個 libcontainer?
題外話,lxc 本身的指令是 lxc-
prefix 開頭系列,lxd 本身的指令則是 lxc
這個命名設計真糟糕!
目前的LXC使用下列核心功能來控制行程:
核心命名空間(行程間通訊、uts、mount、pid、network和user)
AppArmor和SELinux組態
Seccomp策略
chroot(使用pivot_root)
Kernel Capibilities
控制組(cgroups)
因此,LXC通常被認為介於「加強版」的chroot和完全成熟的虛擬機器之間的技術。LXC的目標是建立一個儘可能與標準安裝的Linux相同但又不需要分離核心的環境。
我花了相當多的時間談論Linux容器,但是Docker呢?它是生產中部署最多的容器解決方案。自首次推出以來,Docker已經風靡Linux計算世界。 Docker是一種Apache許可的開源容器化技術,旨在自動化在容器內建立和部署微服務這類重複性任務。 Docker將容器視為非常輕量級和模組化的虛擬機器。最初,Docker是在LXC之上構建的,但它已經遠離了這種依賴,從而帶來了更好的開發人員和使用者體驗。與LXC非常相似,Docker繼續使用核心 cgroup 子系統。該技術不僅僅是執行容器,還簡化了建立容器,構建映像,共享構建的映像以及對其進行版本控制的過程。
LXC關鍵技術點:
chroot,根切換,從容器內的角度來看,彷彿真的有自己的根樹
namespaces:名稱空間,負責將資源隔離,比如pid,網路,mnt,user,uts等
CGroups:控制組,負責控制資源的分配
# download a mini ubuntu into a cache
debootstrap
debootstrap is a tool which will install a Debian base system into a subdirectory of another, already installed system. It doesn't require an installation CD, just access to a Debian repository.
原理?就是整串 shell script 囉 https://salsa.debian.org/installer-team/debootstrap/-/blob/master/debootstrap
since it's just shell script, google: debootstrap alternative
-> https://pknopf.com/post/2019-11-26-announcing-apt-tool-an-alternative-to-debootstrap-and-multistrap-for-deterministic-and-predictable-root-filesystems/
Mac 跟 Windows 要選擇切割多少資源給 docker. Linux 不用切割
http://www.floydhilton.com/docker/2017/03/31/Docker-ContainerHost-vs-ContainerOS-Linux-Windows.html
xenial 就是其中一個 ubuntu 版本的代號而已,基本上這些代號都可以用 http://archive.ubuntu.com/ubuntu/dists/
howtomakeaturn@howtomakeaturn-UX533FD:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
root@howtomakeaturn-UX533FD:/home# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04 LTS
Release: 16.04
Codename: xenial
2006年,Linux核心中開發出cgroups。2007年,被加到Linux 2.6.24版核心中。2008年,基於cgroups,開發出LXC,以及Docker。2013年被加入Linux 3.8版中。
這就是現代 DevOps 的由來與原理吧!
都能夠以 root 身份在裡面操作了,所謂「ssh 到容器裡面」,就是以此為基礎,加上一些網路設定的原理,所做出的效果吧!