docker基礎學習總結
抽時間從網上找資料學習了docker基本知識,做了這個總結,總結有點亂,僅作爲啥時忘了什麼操作看看這篇文章溫習一下之目的。
一:容器基本知識
1 容器隔離:UTS隔離,mount隔離,IPC隔離,PID隔離,使用者使用者組隔離,網路隔離。容器裏邊的進程PID彼此也是隔離的。容器IPC在內核裏實現,容器裏邊的進程可以彼此通訊,容器與容器之前的進程不能同喜。這些隔離通過namespace實現,setns()這個系統呼叫,把內核的執行緒放到容器裡
2 LXC:linux container,容器引擎,把完整的容器技術用一組簡易工具和模板,極大簡化了容器使用的一個方案,否則得手動執行serns()進行UTS隔離,mount隔離,IPC隔離,PID隔離,使用者使用者組隔離,網路隔離,LXC把這些全做了
3 LXC 有個缺點,把容器遷移到其他宿主機上很難,批次部署容器也很難。早期docker的出現爲了彌補這個缺點,是LXC的二次封裝(1-52),把一個容器需要檔案系統打包成映象,直接使用,基於映象啓動容器,docker極大簡化了容器的使用難度。大部分用到的容器映象在docker倉庫都有,直接下載,run就能用。一個容器只執行一個業務進程,LXC把一個容器當成一個獨立的使用者空間
4 容器就是啓動一個進程,容器停止了,進程就沒了,容器不需要持久
5 新版的容器引擎是libcontainer,即runC ,遵循容器執行時的標準,OCI
二:容器安裝
下載 docker ce開源版
yum repolist 看到的extras 這個倉庫中有docker
vim /etc/yum.repos.ddocker-ce.repo
%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@
dokcer預設下載源替換爲清華大學yum源,加快下載速度
修改完後 yum repolist可以看到
docker-ce-stable/x86_64 Docker CE Stable - x86_64 79
之後執行yum install docker-ce一次性自動安裝完成了
docker-ce.x86_64 3:19.03.12-3.el7
container-selinux.noarch 2:2.119.2-1.911c772.el7_8
containerd.io.x86_64 0:1.2.13-3.2.el7
docker-ce-cli.x86_64 1:19.03.12-3.el7
下載完成後,執行systemctl start docker.service 啓動docker服務
手動下載安裝的話,登錄,非常麻煩,破事特別多
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-17.12.1.ce-1.el7.centos.x86_64.rpm
爲了提高從docker hub來去映象的速度,要用映象加速器 docker cn
/etc/docker/ daemon.json 檔案"registry-mirrors":必須是空格,否則導致systemctl start docker失敗
{
「registry-mirrors」: [「https://registry.docker-cn.com」,「http://hub-mirror.c.163.com」]
}
設定 https://registry.docker-cn.com 這樣從docker官網拉映象網速很快
codker hub上docker tag有alpine,說明這是精簡的docker映象
三:docker基本操作命令
docker search busybox 搜尋docker官網的busybox容器
docker image pull busybox 拉最新映象
docker image pull busybox:1.14 指定版本
docker image ls 顯示當前已有的映象
docker image rm busybox
docker image ls --no-trunc 顯示docker映象的完整sha值
docker container 建立/刪除/啓動/停止/執行/檢視/暫停 容器
docker run –-name busybox_hu -it -rm busybox 啓動busybox容器,it互動模式
docker ps 檢視執行的容器
docker inspect busybox_hu 檢視容器更詳細的資訊
exit 停止容器
docker ps –a 檢視停止的busybox容器
docker start -i –a busybox_hu 啓動停止的容器
docker kill busybox_hu 強制容器停止,沙雕,stop退出容器
docker rm busybox_hu 徹底刪除容器
docker image pull redis:5.0.9-alpine
docker run --name redis_hu -d redis:5.0.9-alpine 後臺執行redis容器裡的redis_server,這種容器沒有shell吧,所以不能直接-it指定互動???,reids容器只是一個簡單的進程,沒有shell,需要指定shell才能 纔能互動。
docker inspect busybox 後可以看到容器的啓動命令
「Cmd」:
[
「sh」
],
docker inspect redis
「Cmd」:
[
「/bin/sh」,
「-c」,
「$STI_SCRIPTS_PATH/usage」
],
docker exec -it redis_hu /bin/sh 與正在執行的redis容器開始互動,互動shell是/bin/sh
docker rm redis_hu //刪除容器後才能 纔能重新run
docker run --name redis_hu -d redis:5.0.9-alpine
docker logs redis_hu 檢視容器執行日誌
四:容器檔案系統
容器最底層的檔案系統稱爲bootfs,lxc、aufs、averlayfs,devicemapper,bootfs引導完容器會被解除安裝移除系統
在bootfs之上,是rootfs,這個就是容器的根檔案系統。容器的根檔案系統始終只讀,可以通過聯合掛載額外掛載一個讀寫層。好像Centos啓動時,先是把rootfs掛載成只讀,自檢後重新掛載成讀寫吧。
容器裡檔案系統分了多層,最上一層的可寫層,才允許寫。爲了支援多層檔案系統,必須用分層檔案系統,多用overlay2fs,這是一個抽象檔案系統,需要建立在ext4之上。
除了docker hub,還有其他的站點下載docker映象,比如quay,此時需要特別指明站點,因爲預設站點是docker hub
Docker pull quay.io/coreos/flannel:v0.10.0-armd64
quay.io: redistry站點
coreos:名稱空間
flannel:倉庫
五:製作容器映象
啓動進去busybox那個docker,然後mkdir /data/hu –p和touch /data/hu/test,
busybox_hu 要保持執行,不能停止
Docker commit -p busybox_hu製作新映象
docker image ls
Docker tag 51c3a825e088 busybox/tag:0.1.1 打標籤
Docker tag busybox/tag:0.1.1 busybox/tag:latest 再打標籤
如果標籤錯了,還可以docker image rm busybox/tag:latest 然後再重新製作
docker run --name busybox_b2 -it busybox/tag:latest 執行自己製作的映象,即可看到自己建立的目錄,注意
docker comit –c ‘CMD [「/bin/http」,」-f」,」/data/test」]’ –p busybox_hu
這樣製作的容器,預設的啓動命令CMD不再是shell
Docker container ls 可以檢視每個容器的CMD,即預設啓動命令
映象製作後,可以傳到網上
在docker hub建立於新的容器一致的標籤,標籤要一致
Docker login -u mag…
Docker push busybox:… 把映象推播到了倉庫
還可以映象的匯入和導出
docker save -o image.gz busybox/tag:v1.1.0 busybox:latest
把過個容器打包壓縮,拷貝到另外的機器上
docker load –i image.gz
docker image ls 就可以看到匯入的兩個映象
六:容器儲存卷
docker run --name busybox_hu --rm -it -v /data busybox
-v指定docker執行時的一個目錄,–rm指定docker執行停止後就刪除,一定要這樣操作
並且busybox 一定要放到最後邊,否則會報錯docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused 「exec: 「-v」: executable file not found in $PATH」: unknown. 也是服了
docker image rm -f busybox_hu 容器有關聯關係時,強制刪除
之後容器與物理機共用目錄,是docker自動在物理機上建立的,如這個宿主機目錄
/var/lib/docker/volumes/d81d8bdb34dd24ebc3331c46053b147c24b465d8d9bbf92ef86c480897da9bef/_data/
docker inspect busybox_hu 「Mounts」 能看到容器和物理目錄對映的詳細資訊
這是特別指定物理機和容器的系結目錄
docker run --name busybox_hu --rm -it -v /home/docker_test/:/data busybox
這是新建立一個容器,但是儲存卷複製了busybox_hu的
docker run --name busybox_hu2 -it --rm --volumes-from busybox_hu busybox
這是新建立一個容器,但是網路和儲存卷都複製了busybox_hu的
docker run --name busybox_hu3 -it --rm --network container:busybox_hu --volumes-from busybox_hu busybox
docker ps –a 退出的容器也能看到
docker inspect 只檢視一項資訊
[root@localhost _data]# docker inspect -f {{.Mounts}} busybox_hu
[{bind /home/docker_test /data true rprivate}]
ocalhost _data]# docker inspect -f {{.NetworkSettings.IPAddress}} busybox_hu
172.17.0.2