容器( container-based )虛擬化方案,充分利用了操做系統自己已有的機 制和特性,以實現輕量級的虛擬化(每一個虛擬機安裝的不是完整的虛擬機), 甚至有人把他稱爲新一代的虛擬化技術, Docker 無疑就是其中的佼佼者 在一臺服務器上同時運行上百個虛擬機,確定會被認爲是癡人說夢,而在一臺機器上同時運 行一千個 Docker 容器,這已成爲現實 Docker 的目標 Build,Ship and Run Any App,Anywhere— 即經過對 應用組件的封裝 (Packaging), 發佈(Distribution), 運行 (runing) 等生命週期的管理 , 達到應用組件級別的」一 次封裝 , 處處運行」 mysql
1、 啓動快,資源佔用小 , 資源利用高,快速構建標準化運行環境 linux
2、建立分佈式應用程序時快速交付和部署,更輕鬆的遷移和擴展,更簡單的更新管理 侷限:ios
1、 Docker 是基於 Linux 64bit 的,沒法在 windows/unix 或 32bit 的 linux環境下使用 nginx
2、 LXC 是基於 cgroup 等 linux kernel 功能的,所以 container 的 guest 系統只能是 linux sql
3、 隔離性相比 KVM 之類的虛擬化方案仍是有些欠缺,全部 container 公用一部分的運行庫 docker
4、 管理相對簡單,主要是基於 namespace 隔離 json
5、cgroup 的 cpu 和 cpuset 提供的 cpu 功能相比 KVM 的等虛擬化方案相比難以度量 ( 因此 dotcloud 主要是按內存收費 ) ubuntu
6、docker 對 disk 的管理比較有限 vim
7、container 隨着用戶進程的中止而銷燬,container 中的 log 等用戶數據不便收集windows
docker的特色啓動快比虛擬機 , 能夠秒級啓動 對資源佔用小 , 宿主機上可運行千臺容器 方便用戶獲取 , 分佈 , 和更新應用鏡像 , 指令簡單 , 學習費用低 經過 Dockerfile 配置文件來靈活的自動建立和部署鏡像 & 容器 , 提升工做效 率 Docker 除了運行其中應用外 , 基本不消耗其餘系統資源 , 保證應用性能同時 , 儘可能減少系統開銷
https://hub.docker.com/
https://docs.docker.com/
http://docs.docker-cn.com/ docker
1、 yum install docker -y
2、 二進制安裝
鏡像(docker image) --- Docker 運行容器以前須要本地存在鏡像,若本 能地不存在,那麼 Docker 會找默認鏡像倉庫( Docker Hub 公共註冊服務 器中的倉科)下載。
下載鏡像: #docker pull NAME:TAG 下載某個被打上了某個標籤的叫 ×× 名字 的鏡像
eg:
docker pull ubuntu:latest 若在下載時你未指定標籤,默認追加 latest標籤,表示庫中最新鏡像
例
1、進入docker 官方鏡像倉庫
也能夠直接進入(網址:https://hub.docker.com/ )
2、選擇一個鏡像
3、選擇一個鏡像 下載
docker pull nginx
(2) 查看本地鏡像
docker images
(3)搜索一個鏡像
docker search mysql
(4) 刪除本地鏡像
docker rmi nginx : latest
docker鏡像的分層結構:支持經過擴展示有鏡像,建立新的鏡像
新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現有鏡像的基礎上增長一層。
分層結構的優點:
&1、共享資源:
有多個鏡像都從相同的 base 鏡像構建而來,那麼 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內存中也只需加載一份 base 鏡像,就能夠爲全部容器服務了。並且鏡像的每一層均可以被共享。
&2、可寫的容器層:
當容器啓動時,一個新的可寫層被 加載到鏡像的頂部。這一層一般被 稱做「容器層」 , 「容器層」之下 的都叫「鏡像層」 。 全部對容器的改動。
- 不管添加、刪除、仍是修改文件都只會發生在容器層中。 只有容器層是可寫的,容器層下面的全部鏡像層都是隻讀的。
這個特性。
鏡像層數量可能會不少,全部鏡像層會聯合在一塊兒組成一個統一的文件系統。 若是不一樣層中有一個相同路徑的文件,好比 /a,上層的 /a 會覆蓋下層的 /a, 也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊 加以後的文件系統。
一、添加文件
在容器中建立文件時,新文件被添加到容器層中。
二、讀取文件
在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文 件。一旦找到,打開並讀入內存。
三、修改文件
在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,當即將其複製到容器層,而後修改之。
四、刪除文件
在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。 找到後,會在容器層中記錄下此刪除操做。
只有當須要修改時才複製一份數據,這種特性被稱做 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像自己進行任何修改。
建立鏡像的三種方法
(1)基於修改後的容器建立:docker commit 命令
(2)基於本地模板導入
(3)基於 Dockerfile 文件建立
1、下載一個centos 鏡像
docker pull centos
2、建立並啓動一個鏡像爲 centos 的容器
docker run -it centos:latest /bin/bash ( /bin/bash 環境變量)
3、退出容器
exit
4、查看全部的 容器
docker ps -a ( 查看正在運行的容器,docker -ps )
5、從新喚醒 剛纔啓動的容器
docker start CONTAINER ID
6、進入容器 並建立一個文件
# 進入容器
docker exec -it CONTAINERID /bin/bash
# 建立一個文件
7、退出容器到命令行界面
此時容器較鏡像已經發生改變,咱們以今生成新鏡像
8、生成新的鏡像
docker commit f0decea12ae centos7.1:latest
9、查看本地鏡像
docker images
生成了一個新的鏡像!
1、導出:將鏡像保存爲本地文件
docker save -o centos.tar centos7.1:latest ( 也能夠 centios.tar.gz )
2、刪除 centos7.1 鏡像
docker rmi centos7.1: latest
3、導入:將壓縮包文件導入到本地鏡像列表
docker load -i centos7.1.tar
Dockerfile 是一個文本文件,用來配置 image,記錄了鏡像構建的全部步驟。
Docker 根據 該文件生成二進制的 image 文件
1、建立目錄dockerfile 並切換至此目錄
mkdir dockerfile
cd dockerfile
2、建立並編輯文件 dockerfile
# 建立
vim dockerfile
# 編輯內容以下
FROM centos:7 RUN yum install -y vim
3、建立鏡像
docker build -t centostest .
build:建立鏡像
-t:爲鏡像指定名字
注:
下面列出了 Dockerfile 中最經常使用的指令
FROM:指定 base 鏡像。
MAINTAINER:設置鏡像的做者,能夠是任意字符串。
COPY:將文件從 build context 複製到鏡像。
COPY 支持兩種形式:
COPY src dest
COPY ["src", "dest"]
注意:src 只能指定 build context 中的文件或目錄。
ADD:與 COPY 相似,從 build context 複製文件到鏡像。不一樣的是,若是 src 是歸檔文件(tar, zip, tgz, xz 等),文件會
被自動解壓到 dest。
ENV:設置環境變量,環境變量可被後面的指令使用。
EXPOSE:指定容器中的進程會監聽某個端口,Docker 能夠將該端口暴露出來。咱們會在容器網絡部分詳細討論。
VOLUME:將文件或目錄聲明爲 volume。
WORKDIR:爲後面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令設置鏡像中的當前工做目錄。
RUN:在容器中運行指定的命令,RUN 指令一般用於安裝應用和軟件包。
CMD:容器啓動時運行指定的命令。 Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效。CMD 能夠被 docker run 以後的參數替換。
ENTRYPOINT:設置容器啓動時運行的命令,可以讓容器以應用程序或者服務的形式運行。 Dockerfile 中能夠有多個 ENTRYPOINT 指令,但只有最後一個生效。CMD 或 docker run 以後的參數會被當作參數傳遞給 ENTRYPOINT。
1、建立容器,create命令是建立並不啓動容器 (不經常使用)
docker create -it centos7.1:latest
2、中止一個容器
docker stop CONTAINER ID (kill)
3、啓動中止的容器
docker start CONTAINER ID (重啓 restart)
注:非持久後臺守護狀態的虛擬機,在重啓後當你查看時仍是關閉狀態
4、運行一個容器
# docker run -ti centos:latest /bin/bash
建立並運行一個容器 ,此時你會直接被切換到容器中
#ctrl+d//exit退出,而且容器也退出
#ctrl+p+q退出容器,而且保持容器up的狀態
-t 分配一個僞終端
-i 讓容器的標準輸入持續打開
用/bin/bash環境顯示
5、之後臺守護進程(Daemonized)形態運行
6、刪除一個容器
docker rm CONTAINER ID
-f 強制刪除處於運行中的容器
-l 刪除連接,保留容器
-v 刪除掛載的數據卷
7、進入容器
# 1
docker attach直接進入容器 啓動命令的終端,不會啓動新的進程.
docker attach CONTAINER ID
&
docker run -d centos /bin/bash -c "while true;do sleep 1;echo I_am_docker;done"
&
#2 docker exec則是在容器中打開新的終端,而且能夠啓動新的進程
docker exec -it CONTAINER ID /bin/bash
8、導出容器:導出一個已經建立的容器到文件,無論容器是否運行
docker export CONTAINER ID > centos7.1.tar
9、將容器導入系統成爲鏡像
cat centos7.1.tar | docker import - test
10、查看容器日誌 (顯示容器啓動進程的控制檯輸出)
docker logs -f CONTAINER ID
11、暫停容器
docker pause CONTAINER ID
12、取消暫停 繼續運行容器
docker unpause CONTAINER ID
倉庫分爲公共倉庫和私有倉庫
DockerHub的官方倉庫 https://hub.docker.com
DockerPool社區倉庫 https://dl.dockerpool.com
Dockern Pool (http://dockerpool.com)是國內專業的Docker社區,目前 也提供了官方鏡像的下載管理服務
1、下載 registry 鏡像
2、利用容器啓用私有倉庫
docker run -d -p 5000:5000 -v /var/lib/registry:/var/lib/registry --restart=always --name registry registry:2
3、客戶端修改配置文件 /etc/docker/daemon.json
# vim /etc/docker/daemon.json
# 添加如下內容
"insecure-registries": ["192.168.226.147:5000"],
4、客戶端: 重啓 docker
systemctl restart docker
5、客戶端:對鏡像進行更名
# docker tag nginx:latest 192.168.226.147:5000/nginx:latest
6、客戶端:上傳鏡像
docker push 192.168.226.147:5000/nginx:latest
7、客戶端:刪除已有鏡像
docker rmi 192.168.226.147:5000/nginx:latest docker rmi nginx
8、客戶端:下載鏡像
docker pull 192.168.226.147:5000/nginx:latest
下載成功,證實私有倉庫可用!