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