一、Docker簡介
官網 www.docker.com
github https://github.com/docker/docker.github.io
開源的容器引擎,可以讓開發者打包應用以及依賴的庫,然後發佈到任何流行的linux發行版上,移植很方便。
由go語言編寫,基於apache2.0協議發佈。
基於linux kernel,要想在win下運行需要藉助一個vm(虛擬機)來實現。
自2013年開始,近些年發展迅猛。
docker從1.13x開始,版本分爲社區版ce和企業版ee,並且基於年月的時間線形式,比如18.03就是2018年3月,當前最新穩定版爲18.09參考。
Docker版本變化說明:http://blog.csdn.net/chenhaifeng2016/article/details/68062414
Docker和傳統的虛擬化比較:
Docker也叫容器虛擬化,因爲少了一層操作系統,所以也是輕量虛擬化。
最下面一層是服務器,硬件,往上一層是host OS,Linux操作系統,再往上,傳統的有一個Hypervisor,就比如KVM,需要安裝一個KVM的服務來驅動虛擬化,docker需要安裝一個docker的服務,第三層是類似的,再往上就不一樣了,docker不需要安裝客戶虛擬機,而傳統的安裝完KVM以後還需要新建虛擬機,在這個虛擬機上再去安裝一個操作系統。
Docker的優勢
啓動非常快,秒級實現。
資源利用率高,一臺高配置服務器可以跑上千個docker容器。
更快的交付和部署,一次創建和配置後,可以在任意地方運行。
內核級別的虛擬化,不需要額外的hypevisor支持,會有更高的性能和效率。不需要虛擬化CPU、內存等等的服務。
易遷移,平臺依賴性不強。可以在Linux下搞一個鏡像,把這個鏡像放到Windows下去運行。
下圖是docker和虛擬機的特性對比:
Docker的核心理念
鏡像,是一個只讀的模板,類似於安裝系統用到的那個iso文件,我們通過鏡像來完成各種應用的部署。
容器,鏡像類似於操作系統,而容器類似於虛擬機本身。它可以被啓動、開始、停止、刪除等操作,每個容器都是相互隔離的。
倉庫,存放鏡像的一個場所,倉庫分爲公開倉庫和私有倉庫。 最大的公開倉庫是Docker hub(hub.docker.com),國內公開倉庫(dockerpool.com)
二、安裝Docker
先下載一個官方提供的yum源
# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo # yum list |grep docker-ce 可以看到最新版是19.03 docker-ce.x86_64 3:19.03.5-3.el7 docker-ce-stable # yum install -y docker-ce
速度比較慢,也可以直接下載rpm包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下載完,上傳到linux下
也需要用yum安裝,可以自動解決依賴關係
# yum install -y docker-ce-xxxx.rpm # systemctl start docker 啓動docker
啓動以後,它會幫你自動生成一些iptables規則,但是這個規則不會自動保存,要想保存它,執行service iptables save。一般作爲docker的服務器,iptables規則儘量不要去動它。
# iptables -t nat -F # iptables -t nat -nvL # systemctl restart docker # iptables -t nat -nvL 清空規則再重啓docker後,規則會回來,但是得要先保存。
三、鏡像管理
類似於系統的iso鏡像文件。
# docker pull centos //可以下載centos鏡像,速度很慢。直接到官網拉取一個鏡像。
docker pull類似於git pull。
配置docker加速器(參考 http://blog.csdn.net/xlemonok/article/details/71403534)
# vi /etc/docker/daemon.json//加入如下內容 { "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"] }
說明:這個url爲加速器地址,需要自行到阿里雲申請。
配置完加速器,重啓docker服務,再次docker pull centos會快很多。
docker images 查看本地的鏡像 [root@fuxi01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0f3e07c0138f 3 months ago 220MB
TAG:標籤,每個鏡像可以有很多個標籤。latest這個是版本標籤。
IMAGE ID:用來區分系統裏每個鏡像的ID,區分鏡像的唯一標識。
# docker search xxx //官方有哪些鏡像,用search搜索鏡像,其中xxx是關鍵詞,比如jumpserver,就會把jumpserver相關的docker # docker tag centos yw_centos //給鏡像打標籤 # docker tag centos centos:111 # docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 549b9b86cb8d 13 days ago 64.2MB yw_centos latest 0f3e07c0138f 3 months ago 220MB centos 111 0f3e07c0138f 3 months ago 220MB centos latest 0f3e07c0138f 3 months ago 220MB
不加冒號,則打的標籤在第一列,加了冒號,後面打的標識在TAG那,第二列。
# docker run -itd centos 43aae89a76aef04cab62efcf6c4ec2f24a29f69db192125b0d72b2e111af69ba
//docker run把鏡像啓動爲容器,-i表示讓容器的標準輸入打開,-t表示分配一個僞終端,-d表示後臺啓動,要把-i -t -d 放到鏡像名字前面。
# docker ps //查看運行的容器,加上-a選項後可以查看所有容器,包括未運行的,docker ps -a。 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 43aae89a76ae centos "/bin/bash" About a minute ago Up 24 seconds serene_kare
# docker rmi centos # docker rmi centos:111 Untagged: centos:111
//用來刪除指定鏡像, rm就是刪除,i就是images,其中後面的參數可以是tag,如果是tag時,實際上是刪除該tag。當後面的參數爲鏡像ID時,則會徹底刪除整個鏡像,所有標籤也會一同刪除。當有同名鏡像,而tag不同時,需要把tag加上才能刪除。
四、Docker通過容器創建鏡像
docker run啓動爲容器後,可以通過下面命令進入容器
# docker exec -it 43aae89 bash # docker exec -it infallible_lalande bash
//其中43aae89爲容器id,這個id可以用docker ps查看,也可以不寫容器ID,寫它的names,在docker ps中可以查看到,最後面的bash爲進入容器後要執行的命令,這樣就可以打開一個終端。
進入到該容器中,做一些變更,比如安裝一些東西,然後針對這個容器進行創建新的鏡像。
在容器中執行 yum install -y net-tools,然後ctrl d退出容器,ifconfig可以看到有docker0的網卡。
# docker commit -m "change somth" -a "somebody info" container_id new_image_name
//container_id通過docker ps -a獲取,後面的new_image_name爲新鏡像名字
例如:
# docker commit -m "install net-tools" -a "aminglinux" 43aae89 centos_with_net
這個命令有點像svn的提交,-m 加一些改動信息,-a 指定作者相關信息,43aae89這一串爲容器id,再後面爲新鏡像的名字。
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos_with_net latest 2803335f23a6 33 seconds ago 261MB ubuntu latest 549b9b86cb8d 3 weeks ago 64.2MB centos latest 0f3e07c0138f 3 months ago 220MB yw_centos latest 0f3e07c0138f 3 months ago 220MB
執行docker images就可以看到新的鏡像了。