docker 的安裝和鏡像


一、docker的 安裝 :

第一種:

yum -y install docker

systemctl start docker.service

systemctl status docker

第二種:安裝包安裝

[root@localhost ~]# ls

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 --version

clip_image005

ce表示免費版本

[root@localhost ~]# docker ps

clip_image006

安裝成功

二、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的多個鏡像,除非該鏡像創建的容器存在,那么鏡像能夠不被刪除,所以在刪除時正確順序是先刪除使用鏡像的容器,再刪除鏡像

三、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。可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進行任何修改。

這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是只讀的,不會被容器修改,所以鏡像可以被多個容器共享。

四、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 中添加一點新內容,往鏡像中復制一個文件:

五、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。

六、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM