Docker鏡像製作及鏡像導入導出命令

1.鏡像製作

使用Dockerfile製作一個docker鏡像

1.1 編輯Dockerfile文件

下面是一個製作openssh的Dockerfile文件:

[root@docker]# vim Dockerfile

FROM centos:7
LABEL  demo [email protected]

RUN yum -y install openssh-server \
  && useradd natash \
  && echo "redhat"|passwd --stdin natash \
  && echo "redhat"|passwd --stdin root   \
  && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''\
  && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' \
  && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

ADD ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
ADD ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
ADD ssh_host_rsa_key     /tmp/ssh_host_rsa_key

CMD  ["/usr/sbin/sshd", "-D"]

說明:

FROM表示下載基本鏡像

LABEL作者信息

RUN 表示要執行的動作,相當於執行腳本,執行的是/bin/sh -c ***的動作

ADD表示複製文件

CMD表示執行一個命令

1.2 FROM 和 RUN 指令的作用

FROM:定製的鏡像都是基於 FROM 的鏡像,這裏的 centos就是定製需要的基礎鏡像。後續的操作都是基於 centos。

RUN:用於執行後面跟着的命令行命令。有以下倆種格式:

shell 格式:

RUN <命令行命令>
# <命令行命令> 等同於,在終端操作的 shell 命令。

exec 格式:

RUN ["可執行文件", "參數1", "參數2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等價於 RUN ./test.php dev offline

注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上執行會創建 3 層鏡像。可簡化爲以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

如上,以 && 符號連接命令,這樣執行後,只會創建 1 層鏡像。

1.3 鏡像構建

在 Dockerfile 文件的存放目錄下,執行構建動作。

以下示例,通過目錄下的 Dockerfile 構建一個 openssl:demo(鏡像名稱:鏡像標籤)。

$ docker build -t openssl:demo .

:最後的 . 代表本次執行的上下文路徑。

上下文路徑,是指 docker 在構建鏡像,有時候想要使用到本機的文件(比如複製),docker build 命令得知這個路徑後,會將路徑下的所有內容打包。

2. 導入導出命令介紹

涉及的命令有export、import、save、load

2.1 save

  • 命令
    docker save [options] images [images...]
  • 示例
    docker save -o nginx.tar nginx:latest

    docker save > nginx.tar nginx:latest
    其中-o和>表示輸出到文件,nginx.tar爲目標文件,nginx:latest是源鏡像名(name:tag)

2.2 load

  • 命令
    docker load [options]
  • 示例
    docker load -i nginx.tar

    docker load < nginx.tar
    其中-i和<表示從文件輸入。會成功導入鏡像及相關元數據,包括tag信息

2.3 export

  • 命令
    docker export [options] container
  • 示例
    docker export -o nginx-test.tar nginx-test
    其中-o表示輸出到文件,nginx-test.tar爲目標文件,nginx-test是源容器名(name)

2.4 import

  • 命令
    docker import [options] file|URL|- [REPOSITORY[:TAG]]
  • 示例
    docker import nginx-test.tar nginx:imp

    cat nginx-test.tar | docker import - nginx:imp

2.5 區別

  • export命令導出的tar文件略小於save命令導出的
  • export命令是從容器(container)中導出tar文件,而save命令則是從鏡像(images)中導出
    基於第二點,export導出的文件再import回去時,無法保留鏡像所有歷史(即每一層layer信息,不熟悉的可以去看Dockerfile),不能進行回滾操作;而save是依據鏡像來的,所以導入時可以完整保留下每一層layer信息。如下圖所示,nginx:latest是save導出load導入的,nginx:imp是export導出import導入的。

2.6 建議

  • 可以依據具體使用場景來選擇命令

  • 若是隻想備份images,使用save、load即可
  • 若是在啓動容器後,容器內容有變化,需要備份,則使用export、import
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章