docker 的安裝和鏡像

1、docker的 安裝 :

第一種:docker

yum -y install docker ubuntu

systemctl start docker.servicevim

systemctl status dockercentos

第二種:安裝包安裝緩存

[root@localhost ~]# lsbash

clip_image001

[root@localhost ~]# tar xzf docker.tar.gz 服務器

clip_image002

[root@localhost ~]# cd docker/網絡

clip_image003

[root@localhost docker]# sh docker.sh 學習

clip_image004

[root@localhost ~]# docker --versionui

clip_image005

ce表示免費版本

[root@localhost ~]# docker ps

clip_image006

安裝成功

2、docker鏡像

鏡像(docker image) --- Docker 運行容器以前須要本地存在鏡像,若本能地不存在,那麼 Docker 會找默認鏡像倉庫( Docker Hub 公共註冊服務器中的倉科)下載,用戶也能夠經過配置使用本身的鏡像庫

(1)下載鏡像

#docker pull NAME:TAG

下載某個被打上了某個標籤的叫 ×× 名字的鏡像

eg:

docker pull ubuntu:latest

若在下載時你未指定標籤,默認追加 latest標籤,表示庫中最新鏡像

鏡像在下載過程當中是分層的,而且在每層前會有各層的 ID號,層(Layer )是 AUFS (聯合文件系統)的重要概念,是實現增量保存與更新的基礎

實際上面的命令的原型是

#docker pull registry.hub.docker.com/centos:7

即從默認的註冊服務器下載指定的鏡像固然,以此你也能夠用這種格式到其餘倉庫下載你所須要的鏡像了!!!

(2)查看本地鏡像相關信息

[root@localhost ~]# docker images

clip_image007

顯示結果:

#docker tag docker.io/ubuntu:latest ubuntu:latest

a.源自哪一個倉庫

b.標籤信息 ---用於區分同一個倉庫的同名鏡像可用 docker tag倉庫名:

標籤名 新庫名:新標籤

c. 鏡像 ID

d. 建立時間

e. 鏡像大小

更名:給對應的鏡像新添加了一個名字,使用該名字調用的仍是原來的那個鏡像

clip_image008

[root@localhost ~]# docker tag ppc64le/busybox:latest aaabusybox:v1

clip_image009

刪除起的別名

[root@localhost ~]# docker rmi aaabusybox:v1

(3)搜索庫中知足需求的鏡像,以此下載符合需求的鏡像文件

#docker search 鏡像名

顯示結果:

a.哪一個庫

b.絕對路徑,庫中的帶有搜索關鍵字的鏡像

c.描述

d.官方

e.是否自動建立

(4)刪除本地鏡像

#docker rmi imageID號 # 要刪除的鏡像對應的imageID號

eg:

docker rmi ubuntu: latest

當有別名鏡像時,是同一個ID 號多個名字,刪除任一個對互相無傷害,直至刪除最後一個,鏡像被完全刪除用ID號刪除,默認會刪除同一個ID的多個鏡像,除非該鏡像建立的容器存在,那麼鏡像可以不被刪除,因此在刪除時正確順序是先刪除使用鏡像的容器,再刪除鏡像

3、docker鏡像分層 :

docker鏡像的分層結構:支持經過擴展示有鏡像,建立新的鏡像

clip_image010

能夠看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現有鏡像的基礎上增長一層。

分層結構的優點:

共享資源:

有多個鏡像都從相同的 base 鏡像構建而來,那麼 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內存中也只需加載一份 base 鏡像,就能夠爲全部容器服務了。並且鏡像的每一層均可以被共享,咱們將在後面更深刻地討論這個特性。

這時可能就有人會問了:若是多個容器共享一份基礎鏡像,當某個容器修改了基礎鏡像的內容,好比 /etc 下的文件,這時其餘容器的 /etc 是否也會被修改?

答案是不會!

修改會被限制在單個容器內。

這就是咱們接下來要學習的容器 Copy-on-Write 特性。

可寫的容器層:

clip_image011

當容器啓動時,一個新的可寫層被加載到鏡像的頂部。這一層一般被稱做「容器層」,「容器層」之下的都叫「鏡像層」。

全部對容器的改動 - 不管添加、刪除、仍是修改文件都只會發生在容器層中。

只有容器層是可寫的,容器層下面的全部鏡像層都是隻讀的。

鏡像層數量可能會不少,全部鏡像層會聯合在一塊兒組成一個統一的文件系統。若是不一樣層中有一個相同路徑的文件,好比 /a,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊加以後的文件系統。

添加文件

在容器中建立文件時,新文件被添加到容器層中。

讀取文件

在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,打開並讀入內存。

修改文件

在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,當即將其複製到容器層,而後修改之。

刪除文件

在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。找到後,會在容器層中記錄下此刪除操做。

只有當須要修改時才複製一份數據,這種特性被稱做 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像自己進行任何修改。

這樣就解釋了咱們前面提出的問題:容器層記錄對鏡像的修改,全部鏡像層都是隻讀的,不會被容器修改,因此鏡像能夠被多個容器共享。

4、docker鏡像建立

建立鏡像的三種方法

(1)基於修改後的容器建立:docker commit 命令

(2)基於本地模板導入

(3)基於 Dockerfile 文件建立

(1)基於修改後的容器建立

clip_image012

[root@localhost ~]# docker run -it mariadb:latest /bin/sh #/bin/sh是環境變量

clip_image013

此時容器較鏡像已經發生改變,咱們以今生成新鏡像

[root@localhost ~]# docker ps -a #查看當前環境已有的容器

clip_image014

[root@localhost ~]# docker commit 5ea060bff8c9 test:latest # CONTAINER ID 新鏡像名字

clip_image015

[root@localhost ~]# docker images

clip_image016

查看鏡像列表,本地多了一個建立的新鏡像

[root@localhost ~]# docker run -it --name jxtest test:latest /bin/sh #新建立的容器名爲jxtest

clip_image017

這個新容器有新建立的文件

[root@localhost ~]# docker ps -a

clip_image018

新容器建立成功

刪除容器

[root@localhost ~]# docker rm cc01fb82e45e # 要刪除容器的CONTAINER ID

將全部容器刪除

for id in `docker ps -a | grep Exited | awk '{print $1}'`;do docker rm $id;done

(2)基於模板導出和導入鏡像

導出:將鏡像保存爲本地文件,以cturra/ntp爲例

clip_image019

[root@localhost ~]# docker save -o ntp.tar.gz cturra/ntp:latest

clip_image020

[root@localhost ~]# docker rmi c35549b258c5 #刪除cturra/ntp

導入 :將壓縮包文件導入到本地鏡像列表

[root@localhost ~]# docker load -i ntp.tar.gz

clip_image021

鏡像導入成功。

(3)基於 Dockerfile 文件建立

dockerfile 是一個文本文件,用來配置 image,記錄了鏡像構建的全部步驟。Docker 根據 該文件生成二進制的 image 文件。如何能夠生成 image 文件?若是你要推廣本身的軟件,勢必要本身製做 image 文件。

[root@localhost ~]# mkdir test

[root@localhost ~]# cd test/

[root@localhost test]# vim dockerfile

FROM test:latest

RUN yum install lrzsz -y

[root@localhost test]# docker build -t test:latest .

build:建立鏡像

-t:爲鏡像指定名字

.:指明 build context 爲當前目錄,咱們也能夠經過 -f 參數指定 Dockerfile 的位置

clip_image022

從這步開始就是鏡像真正的構建過程。 首先 Docker 將 build context 中的全部文件發送給 Docker daemon。build context 爲鏡像構建提供所須要的文件或目錄。Dockerfile 中的 ADD、COPY 等命令能夠將 build context 中的文件添加到鏡像。此例中,build context 爲當前目錄 /root/docker,該目錄下的全部文件和子目錄都會被髮送給 Docker daemon。

因此,使用 build context 就得當心了,不要將多餘文件放到 build context,特別不要把 /、/usr 做爲 build context,不然構建過程會至關緩慢甚至失敗。

[root@localhost ~]# docker history IMAGE ID #鏡像的ID

clip_image023

Docker 會緩存已有鏡像的鏡像層,構建新鏡像時,若是某鏡像層已經存在,就直接使用,無需從新建立。在前面的 Dockerfile 中添加一點新內容,往鏡像中複製一個文件:

5、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:設置環境變量,環境變量可被後面的指令使用。例如:ENV MY_VERSION 1.3

RUN apt-get install -y mypackage=$MY_VERSION

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。

6、docker經常使用命令

(1)建立容器,create命令是建立並不啓動容器

#docker creat -it centos:7

(2)查看全部狀態的容器

#docker ps -a 查看全部容器

#docker ps 查看全部已經開啓的容器

(3)啓動中止的容器

#docker start ID

(4)運行一個容器

#docker run -it docker.io/centos:7 /bin/bash

建立並運行一個容器 ,此時你會直接被切換到容器中

#ctrl+d//exit退出,而且容器也退出

#ctrl+p+q退出容器,而且保持容器up的狀態

-t 分配一個僞終端

-i 讓容器的標準輸入持續打開

用/bin/bash環境顯示

(5)之後臺守護進程(Daemonized)形態運行 用-d參數實現

#docker run -dti docker.io/centos:7

#docker ps -a

(6)終止容器

#docker stop NAME/ID #docker kill NAME/ID

#docker ps -a

(7)重啓容器

#docker restart NAME/ID

#docker ps -a

須要注意,非持久後臺守護狀態的虛擬機,在重啓後當你查看時仍是關閉狀態

(8)刪除容器

語法: docker rm 參數 NAME NAME …

#docker -rm -f NAME/ID

-f 強制刪除處於運行中的容器

-l 刪除連接,保留容器

-v 刪除掛載的數據卷

(9)進入容器

docker attach 和 docker exec 兩種方式:

docker attach直接進入容器 啓動命令的終端,不會啓動新的進程

#docker run -d centos /bin/bash -c while true; do sleep 1;echo I_am_docker;done」

#docker attach NAME/ID

docker exec則是在容器中打開新的終端,而且能夠啓動新的進程

#docker exec -it NAME/ID /bin/bash

(10)導入和導出容器

a. 導出容器:導出一個已經建立的容器到文件,無論容器是否運行

#docker ps -a

假設當前系統中有兩個處於運行和中止狀態的容器

#docker export ID > *.tar

#ls

b.將容器導入系統成爲鏡像

#cat *.tar | docker import - 鏡像名

(11)查看容器日誌

顯示容器啓動進程的控制檯輸出

#docker logs -f 容器的CONTAINER ID

(12)暫停容器

#docker pause NAME/ID

(13)取消暫停繼續運行容器

#docker unpause NAME/ID

下面是容器的經常使用操做命令:

clip_image024

相關文章
相關標籤/搜索