docker容器初探—基本概念和基礎命令用法

                    docker容器初探—基本概念和基礎命令用法

-------------------------------------------------------------------------------------------------------------------------------------------

一、基本概念

1、LXC:Linux Container,針對於Linux內核容器功能的用戶空間接口,docker剛問世時基於LXC之上,後期發展摒棄了LXC,lxc -> libcontainer -> runC

2、docker:也是基於c/s架構

容器基於鏡像啓動,如果本地沒有,docker會去ftp倉庫拉取鏡像到本地

基於自己開發的libcontainer

3、Cgroups和namespace是docker的核心技術

(1)docker的kernel namespace(內核名稱空間)六個重要元素:ipc uts mount pid network user

image.png

(2)Cgroups:control groups

blkio:塊設備IO

cpu CPU

cpuacct CPU資源使用報告

cpuset 多處理器平臺上的CPU集合

devices 設備訪問

freezer 掛起或恢復任務

memory 內存用量及報告

perf_event 對cgroup中的任務進行統一性能測試

net_cls cgroup中的任務創建的數據報文的類別標識符

OCI:Open Container Initiative,旨在圍繞容器格式和運行時制定一個開放的工業化標準

4、鏡像是分層構建的

docker image的使用

image.png 

聯合掛載:上3層都可以看到底層的/var/log,假設當第二層執行rm /tmp/a.txt後,上3層看不到/tmp/a.txt,但底層的/tmp/a.txt依然在。最上一層爲可寫層(其它層只讀),平時修改操作都在可寫層進行,所以修改完成後底層鏡像沒有變動,變動的只是可寫層

5、docker怎樣運行的

image.png

aufs:advanced multi-layered unification filesystem:高級多層統一文件系統,用於爲Linux文件系統實現聯合掛載

overlayfs:aufs的競爭產品,自從3.18版本被合併到Linux內核,也就是說CentOS7內核版本3.10未打補丁是不支持的,用的還是devicemapper,雖說redhat給內核打了補丁,不過支持度肯定還是遠不如Ubuntu默認的aufs

6、特點:

(1)基於一個鏡像,可以啓動多個容器,供多個容器之間共享使用

(2)正常情況下一個docker容器只允許運行一個進程和其子進程,否則容器還需要一個進程管理器

7、docker的對象

image、contain、networksvolumes、plugins、other object

8、docker的registry倉庫可分爲:其中的鏡像名的引用類似於httpd:v2.4.32,引用2.4.32版本的httpd

Docker Hub

gcr.io

quay.io

dev.aliyun.com

個人建立高可用倉庫

image.png

registry分類

    sponsor registry

    mirror registry

    vendor registry

    private registry


二、docker的安裝

1、docker的社區版:moby,也稱作docker-ce

阿里雲鏡像站的docker-ce下,建議使用較新版本,k8s只支持到docker的17.03版

image.png

下載docker-ce.repo文件到yum源文件,yum -y install docker-ce

 image.png

將此文件移動到/etc/yum.repos.d/目錄下

yum -y install docker-ce

注意:安裝過程中出現以下界面,請填寫一個epel源,之後重裝container-selinux

image.png

複製以下代碼到/etc/yum.repos.d/目錄下新建的repo文件

[base]

name=CentOS-$releasever - Base - mirrors.aliyun.com

failovermethod=priority

baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/

        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/

        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/

gpgcheck=1

gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

 

[updates]

name=CentOS-$releasever - Updates - mirrors.aliyun.com

failovermethod=priority

baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/

        http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/

        http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/

gpgcheck=1

gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

 

[extras]

name=CentOS-$releasever - Extras - mirrors.aliyun.com

failovermethod=priority

baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/

        http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/

        http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/

gpgcheck=1

gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

 

[centosplus]

name=CentOS-$releasever - Plus - mirrors.aliyun.com

failovermethod=priority

baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/

        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/

        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/

gpgcheck=1

enabled=0

gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

 

[contrib]

name=CentOS-$releasever - Contrib - mirrors.aliyun.com

failovermethod=priority

baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/

        http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/

        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/

gpgcheck=1

enabled=0

gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

2、安裝成功後,需要修改幾個地方

(1)編輯/usr/lib/systemd/system/docker.service

image.png

(2)設置加速連接

登錄阿里雲賬號,之後轉入cr.console.aliyun.com,開通,界面如下

image.png

寫入

image.png

(3)開啓docker需要/proc/sysnet/brige/bridge-nf-call-iptables和/proc/sysnet/brige/bridge-nf-call-ip6tables爲1,常保存需要vim /etc/sysctl.d/docker.conf,寫入net.bridge.bridge-nf-call-iptables = 1和

net.bridge.bridge-nf-call-ip6tables = 1

image.png

完成後systemctl daemon-reload;systemctl restart docker


三、docker官方鏡像網站

https://hub.docker.com

image.png


四、docker基礎命令

1、docker search :搜索鏡像

image.png

2、docker image pull alpine:從倉庫向本地拖鏡像,不用標籤默認用最新版alpine

alpine有版本:

image.png

安裝效果

image.png

3、docker image ls:查看鏡像信息

docker imager ls -a

image.png

4、docker image inspect alpine:顯示鏡像詳細信息

image.png

5、docker image rm alpine:3.8,刪除alpine3.8鏡像

image.png

6、docker image tag httpd:2.4.37-alpine httpd:2.4,給標籤爲2.4.37-alpine的httpd鏡像增加標籤httpd:2.4

docker image tag httpd:2.4.37-alpine chenux/httpd:2.4

docker image tag httpd:2.4.37-alpine reg.chenux.com:8443/chenux/httpd:2.4,只有這麼打上主機標籤纔會認爲是自己的docker庫,否則系統會認爲是官方的docker庫

有原鏡像

image.png

添加鏡像tag,docker image tag httpd:2.4.37-alpine httpd:2.4,docker image tag busybox:1.29 chenux/busybox:2.4

image.png

docker image tag httpd:2.4.37-alpine reg.chenux.com:8443/chenux/httpd:2.4

image.png

注:一個鏡像可以有多個tag標籤,但一個tag標籤只能有一個鏡像

7、docker container run --name alpine1 -it alpine:3.8

新建一個容器,名字叫alpine1,並啓動打開其交互界面

image.png

docker container run --name alpine1 alpine:3.8 -d

啓動一個容器,名字叫alpine1,以守護進程方式後臺運行

image.png

另起一個終端

image.png

注:這裏httpd可以後臺運行是因爲鏡像裏CMD中有個httpd-foreground前臺運行,所以此時-d剝離後依然存在,而alpine鏡像由於沒有前臺運行的指令,所以此法創建出後是退出狀態

image.png

docker container run --name alpine1 -it alpine:3.8 --rm alpine

啓動一個容器,名字叫alpine1,打開其交互界面,停止後刪除該容器

啓動狀態時存在httpd2

image.png

停止後

image.png

8、docker container ls,查看docker容器狀態信息

docker container ls -a

image.png

9、docker container start httpd1,啓動一個關閉的容器

顯示前有container狀態

image.png

啓動docker container start httpd1

image.png

docker container start -i doc7

啓動doc7容器並進入交互界面

image.png

10、docker container attach doc7,其他終端使用該命令關聯一個容器的終端,前臺運行光標閃爍

image.png

ctrl+p後ctrl+q,剝離容器的終端

image.png

11、docker ps:doc列出後臺運行的容器

docker ps -a

image.png

12、docker logs:用來獲取和顯示docker控制檯的日誌

image.png

13、docker container exec,非交互式突破容器外殼進入容器內部執行命令

docker exec alpine1 ifconfig

image.png

docker exec web1 -it /bin/bash, 交互式突破容器外殼進入容器內部執行命令

14、docker top web1,對web1的容器查看內部運行狀態

image.png

15、docker container stats,獲取當前所有容器cpu、內存、網絡io、磁盤io的消耗

image.png

16、docker container pause,暫停容器

docker container unpause ,繼續運行暫停的容器

image.png

docker rm web1,刪除web1容器

image.png


四、docker狀態轉換結構圖

image.png

docker kill類似於virsh中的destroy,一般情況不建議使用,除非docker在使用中遇到了錯誤

OOM:out of memory,非計劃內終止,容器所在的宿主機內存資源耗盡,此時系統會自動殺死佔用內存最大的由docker內的服務進程,此時需要定製策略,看此服務進程是重啓還是進入stopped狀態


五、製作docker鏡像

因爲docker的鏡像採用是聯合掛載,因此對鏡像的修改製作,實質上是對鏡像最上層可寫層進行寫操作保存,對底層鏡像並沒有修改

1、下載原鏡像

docker image pull busybox

docker container run --name b1 -it busybox

image.png

2、進行修改,比如安裝包之類

image.png

docker commit,用於該容器可寫層寫的數據保存爲一個鏡像層

docker commit doc7,保doc7這個容器可寫層

image.png

3、新的鏡像沒有名字和標籤,所以需要添加

docker image tag IMAGEID mycentos:7

image.png

4、如果有需求,還可以繼續使用docker commit -c 命令修改需要鏡像的指令的內部

docker commit -a "chenux" -c 'CMD ["/usr/sbin/httpd","-DFOREGROUND"]' -p centos-base1 centos-httpd:v0.2-2.4

-a,添加作者

-c,修改CMD中指令

-p,修改過程中容器暫停

修改centos-base1鏡像,添加作者信息chenux,由CMD中的/bin/bash命令改爲了/usr/sbin/httpd,-DFOREGROUND,創建過程中暫停容器,新鏡像名字叫centos-httpd:v0.2-2.4

鏡像信息中containerconfig中的CMD

示例

image.png

修改結果

image.png


六、使用registry推送鏡像

1、阿里雲創建鏡像倉庫

 image.png

2、建立倉庫信息

image.png

3、選擇本地倉庫

image.png

4、創建好後點擊管理

image.png

5、推送時鏡像標籤需要和服務器保持一致,阿里雲提示的操作指南會有

image.png

(1)登錄倉庫

image.png

(2)添加標籤

image.png

(3)推送

image.png

完成後

image.png

倉庫也有了

image.png

推送完成後,docker logout

 

七、分發鏡像

docker image save IMAGE-ID -o /DIR/*.tar

image.png

scp

docker image load -i /DIR/*.tar

image.png

測試結果

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章