爲了能很好的瞭解k8s,這裏小編寫大體的將docker的基礎作一些介紹,這裏小編將會以2篇博文的形式,詳細的介紹一下docker的基礎部分,這一篇是docker的概念以及docker的基本使用,後續會在發佈一篇關於docker的官網上的quick-start的實戰案例,讓你們能更好的瞭解docker。html
Docker是一個開源的引擎,能夠輕鬆的爲任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試經過的容器能夠批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集羣和其餘的基礎應用平臺。mysql
Docker經過容器來打包應用,意味着遷移只須要在新的服務器上啓動須要的容器就能夠,下降部署過程出現的問題的風險。
更高的資源利用,docker容器的運行不須要額外的虛擬化管理程序支持,它是內核級的虛擬化,能夠實現更高的性能。
更輕鬆的更新管理。使用dockerfile只須要小小的配置,就能夠代替以往大量的更新工做。
nginx
工做流程:服務器A運行docker engine 服務,在docker engine 上啓動不少容器container,從外網Docker Hub把image操做系統鏡像pull下來,放到container容器運行。最後經過docker client對docker容器虛擬化平臺進行控制。
Image 和 Container 的關係:image 能夠理解爲一個系統鏡像,Container 是 Image 在運行時的 一個狀態。
dockerhub:dockerhub 是 docker 官方的鏡像存儲站點,其中提供了不少經常使用的鏡像供用戶下載, 如 ubuntu, centos 等系統鏡像。(這裏還有私有鏡像庫harbor,小編在以前的博文中也介紹過:http://www.javashuo.com/article/p-haetltkg-cw.html)
Docker的核心技術:web
Docker依賴於Linux內核的特性:namespace和cgroups(控制組)。
Namespace實現資源隔離,其中docker有五種命名空間:
- PID:進程隔離
- NET:管理網絡接口
- IPC:管理誇進程通訊的訪問
- MNT:管理掛載點
- UTS:隔離內核已經版本標識
Cgroups實現這個五種命名空間的管理:
- 資源限制:內存、網絡、磁盤、CPU
- 優先級設定:設定哪些進程組使用更大的資源。
- 資源計量:計算資源組使用了多少資源。
- 資源的控制:將進程組執行和掛起。
Docker容器的能力:
- 文件系統的隔離:每一個容器有本身的root文件系統
- 進程隔離:每一個容器都運行在本身的進程環境中
- 網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的
- 資源隔離和分組:使用cogroup將CPU和內存之類的資源獨立分配給每個Docker容器sql
因爲docker的安裝比較容易這裏小編就不在給出,可是這裏須要注意:docker對centos7的支持比較好,centos6可能有有些小問題(升級kernel...):
http://www.javashuo.com/article/p-xlupdqno-gc.htmldocker
咱們在安裝好Docker CE後,使用docker pull官方鏡像的時候速度很是慢,因此須要使用加速器進行加速,配置好加速器後能夠很是快速的pull(拉取)Docker官方的鏡像。
第一步:註冊阿里雲帳號:
阿里雲帳號註冊網址:
https://account.aliyun.com/register/register.htm?spm=5176.166170.765261.21.7150217fkh2EMl&oauth_callback=https%3A%2F%2Fwww.aliyun.com%2Fproduct%2Facr%3Fspm%3D5176.54417.765261.263.db5924592lOt4j
第二步:進入容器鏡像服務的管理控制檯:
第三步:配置鏡像加速器:
例如我如今的操做系統是ubuntu16.04,我須要在/etc/docker文件夾下新建一個名爲daemon.json的文件,並將配置信息寫進去
當前Docker CE的版本是18.03:
建立daemon.json,並編輯它
將你的專屬加速器網址寫進去,保存退出:
而後重啓docker服務
好了,如今你就能夠經過加速器愉快的下載Docker官方鏡像了。數據庫
有時候使用 Docker Hub 這樣的公共倉庫可能丌方便(有時候沒法訪問),用戶能夠建立一個本地倉庫供私人使用,這裏使用官方提供的工具 docker-registry 來配置私有庫。
docker-registry 是官方提供的工具,能夠用於構建私有的鏡像倉庫。
實戰搭建json
#下載registry鏡像 [root@xuegod63 ~]# docker pull registry [root@xuegod63 ~]# docker pull busybox #啓動registry容器 docker run -d -p 5000:5000 -v /docker/images_repo:/var/lib/registry --name private_registry registry #修改配置 echo '{ "insecure-registries":["192.168.130.101:5000"] }' > /etc/docker/daemon.json #重啓docker systemctl restart docker #給busyboxdabianqian打標籤 docker tag busybox:latest 192.168.130.101:5000/busybox:latest #將busybox鏡像推送到遠端 docker push 192.168.130.101:5000/busybox #刪除本地全部的busybox鏡像 docker rmi 192.168.130.101:5000/busybox docker rmi busybox #從私有倉庫中下載busybox鏡像 docker pull 192.168.130.101:5000/busybox
若是搭建成功,以上操做都會執行成功。
觀察私有庫的結構:ubuntu
[root@zy system]# tree /opt/registry/docker/registry/v2/
補充:這裏介紹一下,若是是想配置私有庫,而且也想配置外部的公共倉庫:
編輯/etc/docker/daemon.json:centos
{ "registry-mirrors": [ "https://2lqq34jg.mirror.aliyuncs.com", "https://pee6w651.mirror.aliyuncs.com", "https://registry.docker-cn.com", "http://hub-mirror.c.163.com" ], "dns": ["8.8.8.8","8.8.4.4"], "insecure-registries":["192.168.172.128:5000"] }
根據以上的模板進行修改,小編嘗試過編輯/etc/deaful/docker:
DOCKER_OPTS="--insecure-registries 192.168.130.130:5000"
可是好像不起做用!
#鏡像操做
在docker Hub 官方倉庫中搜索鏡像
[root@test ~]# docker search image_name(mysql)
注意:
獲取鏡像
[root@test ~]# docker pull busybox
獲取特定版本的鏡像
[root@test ~]# docker pull ubuntu:14.04
查看本地鏡像信息
[root@test ~]# docker images
給已有鏡像打標籤
[root@test ~]# docker tag busybox busybox:latests
刪除鏡像
[root@test ~]# docker rmi image/tag
注意:若是有鏡像是經過此鏡像打標籤的,則只是刪除了這個標籤而已,不影響鏡像自己。固然,若是本地這個鏡像只有一個標籤的話,執行刪除操做,將會刪除此鏡像文件。
若是這裏有鏡像已經在運行容器,強制刪除
[root@test ~]# docker rim -f image_name
建立鏡像之基於已有的鏡像容器建立(接下來是一組操做)
[root@test ~]# docker run -ti test /bin/sh #運行並進入容器 sh-4.2$ touch test.txt #在容器中進行修改操 sh-4.2$ exit #退出容器 [root@test ~]# docker ps -a #查看全部容器
記住此容器的ID
[root@test ~]# docker commit -m "add a new file " -a "zy" 容器ID 鏡像名 #提交鏡像
建立鏡像之導入本地模板
[root@test ~]# cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
存出和載入鏡像
[root@test ~]# docker save -o test.tar image_name #將鏡像存出到本地 [root@test ~]# docker load --input test.tar #將存出的鏡像導入docker倉庫
上傳鏡像(將鏡像上傳到遠端倉庫)
[root@test ~]# docker push image_name #注意這裏須要實現登陸鏡像倉庫,若是有本身的私有倉庫,可使用 [root@test ~]#docker push ip:port/倉庫路徑/image:tag
建立容器
[root@test ~]# docker create -it 鏡像名
查看容器
[root@test ~]#docker ps -a
新建並啓動容器
[root@test ~]# docker run 鏡像名 /bin/echo ‘hello world’ 上一句命令會執行的操做: 檢查本地是否存在指定的鏡像,不存在就從共享倉庫下載 利用鏡像建立並啓動一個容器 分配一個文件系統,並在只讀的鏡像層外掛載一層可讀可寫層 從宿主機配置的網橋接口中橋接一個虛擬接口到容器 從地址池配置一個IP給容器 執行用戶指定的程序 執行完畢後容器被終止
啓動一個容器並執行終端
[root@test ~]# docker run -it centos /bin/bash -t 選項是讓docker分配一個僞終端並綁定到容器,-i 則是讓容器的標準輸入保持打開。
守護態運行
[root@test ~]# docker run -d -h hostname centos /bin/bash -c "exec command"
查看容器日誌
[root@test ~]# docker log 容器ID #獲取容器的輸出信息
終止容器
[root@test ~]# docker stop -t 100 容器ID # -t 是多久後終止容器
啓動容器
[root@test ~]# docker start 容器ID
啓動並進入一個容器
[root@test data]# docker start -it 容器ID
進入容器
[root@test ~]# docker run -t -i -h hostname 鏡像名 /bin/bash #方法一(建立並進入容器) [root@test ~]#docker attach 容器名 #方法二 (attach,進入已啓動的容器) [root@test ~]# docker exec -ti 容器ID/容器名 /bin/bash #方法三 (exec進入已啓動的容器)
刪除容器
[root@test ~]# docker rm [option] container [root@test ~]#docker rm 容器ID #刪除一個終止的容器 [root@test ~]#docker rm -f 容器ID #刪除一個正在運行的容器
注意:
導出容器
[root@test ~]# docker export 容器ID > centos_for_run.tar
導入容器
[root@test ~]# cat centos_for_run.tar |docker import - centos:v1.0
docker容器的生命週期:
從官方倉庫中查找鏡像
[root@test ~]# docker search centos
從官方倉庫中下載鏡像當本地倉庫
[root@test ~]# docker pull centos
建立和使用私有倉庫
安裝docker後,能夠經過官方提供的registry鏡像來簡單搭建一套本地私有倉庫環境 [root@test ~]# docker pull registry [root@test ~]#docker run -d -p 5000:5000 registry 注意:上述命令,會後臺啓動一個registry容器,建立本地的私有倉庫服務。 默認狀況下,倉庫將會放入/tmp/registry目錄下,這樣容器容易被刪除。因此經過-v參數,指定鏡像存放的目錄。 [root@test ~]#docker run -d -p 5000:5000 -v /docker/images_repo registry #此時在本地將啓動一個私有倉庫服務,監聽端口爲5000 [root@test ~]#curl 127.0.0.1:5000/v1/search #訪問私有倉庫
小編這裏只是簡單的將registry私有倉庫搭建完成,並無測試,若是你們有疑問能夠查看https://blog.csdn.net/tellmewhyto/article/details/80822188 這個大神寫的博客。固然若是以爲registry簡單的私人倉庫知足不了需求,可使用harbor企業級的私人倉庫,這裏小編也有介紹:http://www.javashuo.com/article/p-haetltkg-cw.html
固然最後介紹一下搭建私人倉庫的好處:
- 節約帶寬
- 能夠本身定製系統
- 對於微服務的發佈和使用,也就是對運維部署,提供了便捷。
用戶在使用docker的過程當中,每每須要能查看容器內應用產生的數據,或者須要把容器內的數據進行備份,甚至多個容器之間進行數據的共享,這必然涉及容器的數據管理操做:數據卷、數據卷容器。
數據卷的使用,相似於Linux下對目錄或者文件進行mount操做。數據卷是一個可供容器使用的特殊目錄,他繞過文件系統,能夠提供不少的有用特性:
- 數據卷能夠在容器之間共享數據和重用
- 對數據卷的修改會馬上生效
- 對數據卷的更新,不會影響鏡像
- 數據卷會一直存在,直到沒有容器爲止
對數據卷的操做
[root@test ~]#docker run -d --name web -v /data centos #在容器中建立一個數據卷 [root@test ~]# docker run -d --name web1 -v /docker/data:/webapp centos #掛載一個主機目錄做爲數據卷 注意: - 本地目錄的路徑必須是絕對路徑,若是目錄不存在docker會自動建立。 - ‘-v’後面的參數爲:宿主機文件/目錄:容器裏對應的文件/目錄 [root@test ~]# docker run -d --name web1 -v /docker/data:/webapp:or centos 上面的/docker/data:/webapp:'or' 默認狀況下是rw,加了ro以後容器內掛載的數據卷的數據就沒法修改了。
若是用戶須要在容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器。數據卷容器其實就是一個普通的容器,專門用他提供數據卷供其餘容器掛載使用。
容器卷容器的操做(實現多個容器之間的數據共享)
#首先,建立一個數據卷容器dbdata ,並在其中建立一個數據卷掛載到/dbdata: [root@test data]# docker run -it -v /dbdata --name dbdata centos #此時在這個容器中就會出現一個/dbdata目錄。 #在其餘容器中使用--volumes-from 來掛載dbdata容器中的數據卷: [root@test data]# docker run -it --volumes-from dbdata --name db1 centos [root@test data]# docker run -it --volumes-from dbdata --name db2 centos #此時容器db1和db2都掛載同一個數據捲到相同的/dbdata目錄下,三個容器任何一個該目錄下的寫入,其餘的容器均可以看到。 '注意': - 使用--volumes-from參數,所掛載數據卷的容器自身'不須要保持運行狀態' - 若是刪除了掛載的容器(包括dbdata、db一、db二、)數據卷不會自動刪除,若是想刪除數據卷,必須在刪除最後一個掛載他的容器時,-v指定同時刪除關聯的容器
能夠用數據卷容器對其中的數據捲進行備份,恢復,以實現數據的遷移。
數據備份
[root@test data]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos tar cvf /backup/backup.tar /dbdata 解釋:首先利用centos鏡像建立一個容器worker,使用--volumes-from dbdata 參數來讓worker容器掛載dbdata容器中的數據卷; 使用-v $(pwd):/backup 參數來掛載本地的當前目錄到worker容器中的/backup目錄; 最後worker啓動後,使用tar cvf /backup/backup.tar /dbdata將其內容備份到/backup下,既宿主機的當前目錄下。
數據恢復
#先建立一個帶有數據卷的容器dbdata2 [root@test data]# docker run -v /dbdata --name dbdata2 centos #而後建立另外一個新的容器,掛載dbdata2的容器,並使用tar命令解壓備份文件到所掛載的容器目錄中: [root@test data]# docker run --volumes-from dbdata2 -v $(pwd):/backup centos tar xvf /backup/backup.tar -C /dbdata
大量的互聯網應用服務包括多個服務組件,這每每須要多個容器之間經過網絡通訊。Docker目前提供了映射容器端口到宿主機和容器互聯機制來將容器內引用服務提供外部網絡,以及經過容器互聯繫統讓多個容器之間進行快捷的網絡通訊。
在啓動容器的時候,若是不指定對應的參數,在容器外部是沒法經過網絡來訪問容器內的服務的。當容器中運行一些服務時,要讓外部訪問這些應用時,經過-p或者-P 參數指定端口映射,-P參數docker會隨機映射一個49000~49900的端口至容器內部開發的網絡端口。
以registry 服務爲例:
#爲服務指定端口
[root@test data]# docker run -d -P registry
#指定具體的端口映射
[root@test data]# docker run -d -p 5000:5000 registry #其中的兩個5000,表示:hostPort:containerPort
[root@test data]# docker run -d -p 127.0.0.1:5000:5000 registry #映射到指定地址的指定端口
[root@test data]# docker run -d -p 127.0.0.1:5000:5000/(tcp|udp) registry #指定具體的協議
#查看端口映射 [root@test data]# docker ps [root@test data]# docker logs -f 容器名稱 [root@test data]#docker port 容器名
容器將的相互通訊,它會在源和接受容器之間建立一個隧道,接受容器能夠看到源容器指定的信息。在鏈接系統時依據容器的名稱來執行,因此在建立容器的時候,使用--name 指定好容器的名稱。
實現容器互聯
#先建立一個新的數據庫容器:
[root@test data]# docker run -d --name db training/postgres
#而後建立一個web容器,並將它鏈接到db容器:
[root@test data]# docker run -d -P --name web --link db:db trainng/webapp
注意:'--link db:db' :表示'鏈接容器的名字:此鏈接的別名'
[root@test data]# docker ps
這樣docker就在兩個容器之間建立了一個安全隧道,並且不用映射他們的端口到宿主機上。
環境變量
[root@test data]# docker run --rm --name web 2 -link db:db training/webapp env
其中以DB_開頭的環境變量hi提供web容器鏈接掉db容器使用。
更新/etc/hosts
[root@test data]# docker run -t -i --rm --link db:db training/webapp /bin/bash
其中有兩個hosts信息,第一個是web,它用本身的容器ID做爲主機名
第二個就是db容器的IP和主機名。
DockerFile是由一行行命令語句組成,並支持#開頭的註釋行。通常而言,DockerFile分爲四個部分:基礎鏡像信息,維護者信息,鏡像操做指令,和容器執行指令。
#一個簡單的dockerfile #This is DockerFile users the centos image #Version 2 -EDITION 1 #Author zy #Command format: Instruction [argunents/command].. #第一行必須指定基礎的鏡像信息 FROM centos #維護者信息 MAINTANER docker_user zy@email.com #鏡像的操做指令 RUN echo "deb http://archive.centos.com/centos raring main universe ">> /etc /apt/sources.list RUN install -y nginx RUN echo "\n daemon off;">>/etc/nginx/nginx.conf #容器啓動的執行指令 CMD /usr/sbin/nginx
#注意:RUN 命令是在image構建時運行的,而CMD是在容器運行時運行的命令 #若是在運行容器是指定了運行的命令 CMD命令則會被覆蓋 FROM ubuntu:14.04 MAINTAINER zy 'm18726234267@163.com' RUN echo "Hell World!" RUN apt-get update RUN apt-get install -y nginx #ENTRYPOINT指令 和CMD的不一樣就是,若是docker run 不指定 --entrypoint 及時後面有命令,也不會覆蓋 ENTRYPOINT [ "/usr/sbin/nginx" ] #ADD src dest 將文件和目錄複製到docker鏡像中 ,ADD提供瞭解壓縮功能,能夠直接解壓 .tar 的壓縮包 #COPY src dest 單純的複製文件使用 COPY #VOLUME 爲容器添加捲 #WORKDIR 在建立容器時爲容器添加工做目錄 #ENV key=value 用於設置環境變量 #USER 容器基於什麼用戶身份運行(默認是root用戶) USER nginx #USER uid #USER user:group #USER uid:gid #USER user:gid #EXPOSE 容器的暴露的端口 EXPOSE 80 #ONBUILD 容器觸發器,當一個鏡像被其餘的鏡像做爲基礎鏡像建立時執行,會在構建過程當中插入指令 #ONBUILD 的命令,不會再基礎鏡像中運行,哪個以他做爲基礎鏡像,就在哪個鏡像被構建時執行
當編譯好dockerfile時,咱們使用dockerfile去構建鏡像
[root@test data]# docker build -t build_repo/first_image /tmp/docker_builder 注意:-t是指定鏡像的標籤,後面是DockerFile所在的路徑
具體步驟:
- 從基礎鏡像運行一個容器
- 執行一條指令(RUN),對容器作出修改
- 執行相似docker commit的操做,提交一個新的鏡像層
- 在基於剛剛提交的鏡像運行一個新容器
- 在執行dockerfile的下一條指令
- 重複以上的步驟,直至全部指令執行完畢
- 在最後的結尾處,返回最後一個鏡像的ID
注意:在使用dockerfile構建鏡像時,只會刪除中間的構建時運行的容器,不會刪除中間層鏡像,咱們能夠經過中間層鏡像的ID,查看每個步驟具體構建的內容。這裏每個步驟都使用一箇中間鏡像的好處時,此時會給這個中間鏡像添加緩存,咱們在下次重複構建時,速度很是快。固然咱們也能夠不使用之間緩存:docker build --no-cache。或者在dockerfile中設置環境變量:
ENV REFRESH_DATE 2019-4-13,設置緩存的刷新時間。
#查看構建過程:
docker history image。
Docker 經過 cgroup 來控制容器使用的資源配額,包括 CPU、內存、磁盤三大方面,基本覆蓋了常 見的資源配額和使用量控制。
cgroup 是 Control Groups 的縮寫,是 Linux 內核提供的一種能夠限制、記錄、隔離過程組所使用 的物理資源(如 cpu、memory、磁盤 IO 等等) 的機制,被 LXC、docker 等不少項目用於實現過程資源 控制。cgroup 將任意過程過行分組化管理的 Linux 內核功能。cgroup 自己是提供將過程過行分組化管 理的功能和接口的基礎結構,I/O 或內存的分配控制等具體的資源管理功能是經過這個功能來實現的。
[root@test data]# docker run --help |grep cpu-shares
-c, --cpu-shares int CPU shares (relative weight) 在建立容器時指定容器所使用的 CPU 份額 值。cpu-shares 的值不能保證能夠得到 1 個 vcpu 或者多少 GHz 的 CPU 資源,僅僅只是一個彈性的加權值。
默認狀況下,每一個docker容器的CPU份額都是1024.單獨一個容器的份額是沒有意義的,只有在同時運行多個容器時,容器的 cpu 加權的效果才能體現出來。
舉例:
兩個容器 A、B 的 cpu 份額分別爲 1000 和 500。
狀況一:A 和 B 正常運行,在 cpu 過行時間片分配的時候,容器 A 比容器 B 多一倍的機會得到 CPU 的時間片。
狀況二:分配的結果取決於當時主機和其餘容器的運行狀態,實際上也沒法保證容器 A必定能得到 CPU 時間片。好比容器 A 的過程一直是空閒的,那麼容器 B 是能夠得到比容器 A 更多的 CPU 時間片的。
總結:cgroups 只在容器分配的資源緊缺時,也就是說在須要對容器使用的資源過行限制時,纔會生效。所以,沒法單純根據某個容器的 cpu 份額來肯定有多少 cpu 資源分配給它,資源分配結果取決於同時運行的其餘容器的 cpu 分配和容器中過程運行狀況。
#分配命令 [root@test data]# docker run -it --cpu-shares 512 centos /bin/bash
CPU的週期控制
docker 提供了--cpu-period(週期)、--cpu-quota 兩個參數控制容器能夠分配到的 CPU 時鐘週期。
--cpu-period:是用來指定容器對 CPU 的使用要在多長時間內作一次從新分配。(指定週期)
--cpu-quota:是用來指定在這個週期內,最多能夠有多少時間片段用來跑這個容器。 (指定在這個週期中使用多少時間片)
注意:--cpu-period:默認是0.1s,最大是1s。--cpu-quota:默認是-1,不作控制。
#命令容器過程須要每 1 秒使用單個 CPU 的 0.2 秒時間
[root@test data]#docker run -it --cpu-period 1000000 --cpu-quota 200000 centos /bin/bash
Docker 提供參數-m, --memory=""限制容器的內存使用量。
[root@xuegod63 ~]# docker run -it -m 128m centos
#容器對硬盤的最高寫入速度設定爲 1MB/s [root@test data]#docker run -it -v /var/www/html/:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:1mb centos /bin/bash