1. 程式人生 > >docker概述和基本命令

docker概述和基本命令

centos 搜索 文章 des 一個 case tfs 時間 測試

容器技術已經成為應用程序封裝和交付的核心技術

  ? 容器技術的核心有以下幾個內核技術組成:

    – CGroups(Control Groups)-資源管理

    – NameSpace-進程隔離

    – SELinux安全

  ? 由於是在物理機上實施隔離,啟動一個容器,可以像啟動一個進程一樣快速

Docker是完整的一套容器管理系統

  ? Docker提供了一組命令,讓用戶更加方便直接地使用容器技術,而不需要過多關心底層內核技術

Docker特性

Docker優點:

  削減高峰,填堵低峰

  相比於傳統的虛擬化技術,容器更加簡潔高效

  傳統虛擬機需要給每個VM安裝操作系統

   容器使用的共享公共庫和程序

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

Docker的缺點

  容器的隔離性沒有虛擬化強

  共用Linux內核,安全性有先天缺陷

  SELinux難以駕馭

  監控容器和容器排錯是挑戰

docker應用場景

  Web 應用的自動化打包和發布。 

  自動化測試和持續集成、發布。

  在服務型環境中部署和調整數據庫或其他的後臺應用。

  從頭編譯或者擴展現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境。

八個Docker的真實應用場景

技術分享圖片 Docker提供了輕量級的虛擬化,它幾乎沒有任何額外開銷,這個特性非常酷。
首先你在享有Docker帶來的虛擬化能力的時候無需擔心它帶來的額外開銷。其次,相比於虛擬機,你可以在同一臺機器上創建更多數量的容器。
Docker的另外一個優點是容器的啟動與停止都能在幾秒中內完成。

1. 簡化配置

  這是Docker公司宣傳的Docker的主要使用場景。虛擬機的最大好處是能在你的硬件設施上運行各種配置不一樣的平臺(軟件、系統),Docker在降低額外開銷的情況下提供了同樣的功能。它能讓你將運行環境和配置放在代碼中然後部署,同一個Docker的配置可以在不同的環境中使用,這樣就降低了硬件要求和應用環境之間耦合度。

2. 代碼流水線(Code Pipeline)管理

  前一個場景對於管理代碼的流水線起到了很大的幫助。代碼從開發者的機器到最終在生產環境上的部署,需要經過很多的中間環境。而每一個中間環境都有自己微小的差別,Docker給應用提供了一個從開發到上線均一致的環境,讓代碼的流水線變得簡單不少。

3. 提高開發效率

  這就帶來了一些額外的好處:Docker能提升開發者的開發效率。如果你想看一個詳細一點的例子,可以參考Aater在DevOpsDays Austin 2014 大會或者是DockerCon上的演講。

  不同的開發環境中,我們都想把兩件事做好。一是我們想讓開發環境盡量貼近生產環境,二是我們想快速搭建開發環境。

  理想狀態中,要達到第一個目標,我們需要將每一個服務都跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,我們卻不想每次都需要網絡連接,每次重新編譯的時候遠程連接上去特別麻煩。這就是Docker做的特別好的地方,開發環境的機器通常內存比較小,之前使用虛擬的時候,我們經常需要為開發環境的機器加內存,而現在Docker可以輕易的讓幾十個服務在Docker中跑起來。

4. 隔離應用

  有很多種原因會讓你選擇在一個機器上運行不同的應用,比如之前提到的提高開發效率的場景等。

  我們經常需要考慮兩點,一是因為要降低成本而進行服務器整合,二是將一個整體式的應用拆分成松耦合的單個服務(譯者註:微服務架構)。如果你想了解為什麽松耦合的應用這麽重要,請參考Steve Yege的這篇論文,文中將Google和亞馬遜做了比較。

5. 整合服務器

  正如通過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker可以整合多個服務器以降低成本。由於沒有多個操作系統的內存占用,以及能在多個實例之間共享沒有使用的內存,Docker可以比虛擬機提供更好的服務器整合解決方案。

6. 調試能力

  Docker提供了很多的工具,這些工具不一定只是針對容器,但是卻適用於容器。它們提供了很多的功能,包括可以為容器設置檢查點、設置版本和查看兩個容器之間的差別,這些特性可以幫助調試Bug。你可以在《Docker拯救世界》的文章中找到這一點的例證。

7. 多租戶環境

  另外一個Docker有意思的使用場景是在多租戶的應用中,它可以避免關鍵應用的重寫。我們一個特別的關於這個場景的例子是為IoT(譯者註:物聯網)的應用開發一個快速、易用的多租戶環境。這種多租戶的基本代碼非常復雜,很難處理,重新規劃這樣一個應用不但消耗時間,也浪費金錢。

  使用Docker,可以為每一個租戶的應用層的多個實例創建隔離的環境,這不僅簡單而且成本低廉,當然這一切得益於Docker環境的啟動速度和其高效的diff命令。

8. 快速部署

  在虛擬機之前,引入新的硬件資源需要消耗幾天的時間。虛擬化技術(Virtualization)將這個時間縮短到了分鐘級別。而Docker通過為進程僅僅創建一個容器而無需啟動一個操作系統,再次將這個過程縮短到了秒級。這正是Google和Facebook都看重的特性。

  你可以在數據中心創建銷毀資源而無需擔心重新啟動帶來的開銷。通常數據中心的資源利用率只有30%,通過使用Docker並進行有效的資源分配可以提高資源的利用率。

docker:微服務,基於linux內核

Docker 架構

  Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。

  Docker 容器通過 Docker 鏡像來創建。

  容器與鏡像的關系類似於面向對象編程中的對象與類。

Docker面向對象
容器 對象
鏡像

技術分享圖片

Docker 鏡像(Images)

Docker 鏡像是用於創建 Docker 容器的模板。

Docker 容器(Container)

容器是獨立運行的一個或一組應用。

Docker 客戶端(Client)

Docker 客戶端通過命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 與 Docker 的守護進程通信。

Docker 主機(Host)

一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。

Docker 倉庫(Registry)

Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。

Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。

Docker Machine

Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

鏡像

在Docker中容器是基於鏡像啟動的

  鏡像是啟動容器的核心

  鏡像采用分層設計

  使用快照的COW技術,確保底層數據不丟失

Docker hub鏡像倉庫

  https://hub.docker.com

  Docker官方提供公共鏡像的倉庫(Registry)

1、鏡像是只讀的

2、鏡像應該從官方下載,不要試圖自己手工制作

3、鏡像采用聯合文件系統,分層設計

4、查看當前系統有哪些鏡像

docker鏡像管理

技術分享圖片

二、部署docker

1、關閉防火墻和selinux

2、安裝

[root@vh01 docker]# systemctl stop firewalld.service

[root@vh01 docker]# setenforce 0

[root@vh01 docker]# vim /etc/selinux/config

[root@vh01 docker]# yum install -y docker-io

3、起動

[root@vh01 docker]# systemctl start docker

[root@vh01 docker]# systemctl enable docker.service

[root@vh01 docker]# systemctl status docker

5、docker國內鏡像倉庫 daocloud 阿裏https://dashboard.daocloud.io

可以先在daocloud或阿裏註冊用戶,獲得阿裏或daocloud的開發者網址,然後執行以下操作

[root@room9pc16 docker]# vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --registry-mirror=http://aad0405c.m.daocloud.io

[root@room9pc16 docker]# systemctl daemon-reload

[root@room9pc16 docker]# systemctl restart docker

[root@room9pc16 docker]# docker search ubuntu

6、在倉庫中搜索鏡像

[root@vh01 docker]# docker search centos

7、導入鏡像

[root@vh01 docker_images]# docker load < centos.tar

[root@vh01 docker]# cd /root/docker/docker_images/

[root@s62 docker_images]# for i in * ; do docker load < ${i} ;done

[root@vh01 docker_images]# docker images

8、導出鏡像

[root@vh01 docker_images]# docker save nginx > /tmp/nginx.tar

9、如果運行容器時,本地沒有鏡像,docker將自動在倉庫中下載

[root@room9pc16 docker]# dokcer run busybox echo hello

[root@room9pc16 docker]# docker run busybox tac /etc/passwd

10、下載名為buxybox的鏡像

[root@room9pc16 docker]# docker pull busybox( 系統命令的集成)

鏡像常用命令

命令列表

– docker images //查看鏡像列表

– docker history //查看鏡像制作歷史

– docker inspect //查看鏡像底層信息

– docker pull //下載鏡像

– docker push //上傳鏡像

– docker rmi //刪除本地鏡像

– docker save //鏡像另存為tar包

– docker load //使用tar包導入鏡像

– docker search //搜索鏡像

– docker tag //修改鏡像名稱和標簽(相當於軟連接)

docker images

? 查看鏡像列表

– 鏡像倉庫名稱  – 鏡像標簽  – 鏡像ID  – 創建時間  – 大小

容器常用命令

? 命令列表

– docker run //運行容器

– docker ps //查看容器列表,正在運行中的鏡像,-a所有

– docker stop //關閉容器

– docker start //啟動容器

– docker restart //重啟容器

– docker attach|exec //進入容器

– docker inspect //查看容器底層信息

– docker top //查看容器進程列表

– docker rm //刪除容器

? 列出容器列表 docker ps

– docker ps 查看正在運行的容器

– docker ps -a 查看所有容器列表

– docker ps -aq 僅顯示容器id

? 管理容器docker stop|start|restart

– docker stop 關閉容器

– docker start 開啟容器

– docker restart 重啟容器

進入容器 docker attach|exec

– docker attach 進入容器,exit會導致容器關閉(進入當前解釋器)

– docker exec 進入容器,退出時不會關閉容器(新建一個解釋器)

顯示容器詳細信息

docker inspect 容器id

crtl+pq //把容器放在後臺運行

容器

1、容器基於鏡像啟動

2、容器需要有程序在前臺執行,一旦程序執行結束,容器也就停止

3、想要容器一直運行,需要一個交互式的終端或駐留在系統的進程

[root@vh01 docker_images]# docker run centos echo hello

4、查看容器信息

[root@vh01 docker_images]# docker ps

[root@vh01 docker_images]# docker ps -a

5、開啟一個交互式的容器

[root@vh01 docker_images]# docker run -it centos bash

6、退出容器,但是不想結束容器,按組合鍵ctrl+p+q

7、在已啟動的容器中運行新進程

[root@vh01 docker_images]# docker ps 查看容器的ID

[root@vh01 docker_images]# docker exec -it 0905ef31ad02 bash

[root@0905ef31ad02 /]#

[root@vh01 docker_images]# docker top 0905ef31ad02 查看容器中的進程

8、重新連接容器

[root@vh01 docker_images]# docker attach 0905ef31ad02

常用的與鏡像相關的命令

1、了解鏡像的制作過程

[root@vh01 ~]# docker history centos

2、了解鏡底層信息

[root@vh01 ~]# docker inspect centos

查看某一具體項信息

[root@vh01 ~]# docker inspect -f {{.RootFS}} centos

3、刪除本地鏡像

[root@vh01 ~]# docker rmi nginx

如果有容器在使用該鏡像則無法刪除

4、為鏡像新建tag

[root@vh01 ~]# docker tag centos:latest centos:basic 或

[root@vh01 ~]# docker tag centos centos:basic

如果源鏡像沒有指定tag,那麽系統默認使用latest,如果源鏡像沒有latest,那麽將會報錯

常用容器相關命令

1、在容器中運行命令

[root@vh01 ~]# docker run centos ls / 命令在新建的容器中運行,執行結束後,容器也就相應的停止

2、查看run的幫助

[root@vh01 ~]# docker help run

3、在後臺運行容器

[root@vh01 ~]# docker run -itd centos bash

4、連接容器

[root@vh01 ~]# docker attach 55ff014ffa6d

5、在容器中配置yum,並安裝net-tools

6、查看正在運行的容器

[root@vh01 ~]# docker ps

7、查看所有容器列表

[root@vh01 ~]# docker ps -a

8、僅顯示容器ID

9、容器狀態管理

[root@vh01 ~]# docker start | stop | restart 容器

10、使用nginx鏡像

[root@vh01 ~]# docker load < nginx.tar

[root@vh01 ~]# docker run -d nginx

[root@vh01 ~]# docker ps

[root@vh01 ~]# docker stop 容器ID

[root@vh01 ~]# docker exec -it 容器ID

11、查看容器信息

[root@vh01 ~]# docker inspect 2f3e82361b46

[root@vh01 ~]# docker inspect -f {{.NetworkSettings}} 2f3e82361b46

12、查看容器中運行的進程

[root@vh01 ~]# docker top 2f3e82361b46

13、刪除容器

[root@vh01 ~]# docker ps -aq

[root@vh01 ~]# docker rm ef2ff7026212

[root@vh01 ~]# docker rm $(docker ps -aq) 刪除所有的容器

14、操作容器時,每個容器還有一個名字,可以通過名字進行容器管理,容器的名字通過docker ps查看,最後一個字段即為名字

15、啟動容器時,為其指定名字

[root@vh01 ~]# docker run -itd --name rhel7.2 centos bash

16、啟動容器,前臺運行apache

[root@room9pc16 docker_images]# docker run --name centos_web1 -it centos bash

[root@56258210ba50 /]# cd /etc/yum.repos.d/

[root@56258210ba50 yum.repos.d]# mkdir backup

[root@56258210ba50 yum.repos.d]# mv *repo backup

[root@56258210ba50 yum.repos.d]# yum-config-manager --add ftp://172.17.0.1/rhel7.2 配置好yum

[root@56258210ba50 yum.repos.d]# yum install -y httpd

[root@56258210ba50 ~]# httpd -DFOREGROUND

[root@s62 ~]# docker tag busybox:latest busybox:v1

[root@s62 ~]# docker images

[root@s62 ~]# docker stop $(docker ps -aq)

[root@s62 ~]# docker rm $(docker ps -aq)

[root@s62 ~]# docker ps -aq | while read l; do echo docker rm ${l}; done

docker概述和基本命令