原文地址:https://www.cnblogs.com/lsgxeva/p/8746644.html
原文作者: lsgxeva
–創建鏡像有很多方法,用戶可以從 Docker Hub 獲取已有鏡像並更新,也可以利用本地文件系統創建一個。
一、創建鏡像
創建鏡像有很多方法,用戶可以從 Docker Hub 獲取已有鏡像並更新,也可以利用本地文件系統創建一個。
二、修改已有鏡像
1、先使用下載的鏡像啟動容器。
$ docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
注意:記住容器的 ID,稍后還會用到。
2、在容器中添加 json 和 gem 兩個應用。
root@0b2616b0e5a8:/# gem install json
當結束后,我們使用 exit 來退出,現在我們的容器已經被我們改變了,使用 docker commit 命令來提交更新后的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
-m 來指定提交的說明信息,跟我們使用的版本控制工具一樣;
-a 可以指定更新的用戶信息;之后是用來創建鏡像的容器的 ID;最后指定目標鏡像的倉庫名和 tag 信息。
創建成功后會返回這個鏡像的 ID 信息。
使用 docker images 來查看新創建的鏡像。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB
之后,可以使用新的鏡像來啟動容器
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root@78e82f680994:/#
三、利用 Dockerfile 來創建鏡像
使用 docker commit 來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享。我們可以使用 docker build 來創建一個新的鏡像。為此,首先需要創建一個 Dockerfile,包含一些如何創建鏡像的指令。
新建一個目錄和一個 Dockerfile
$ mkdir sinatra $ cd sinatra $ touch Dockerfile
Dockerfile 中每一條指令都創建鏡像的一層,例如:
# This is a comment FROM ubuntu:14.04 MAINTAINER Docker Newbee <newbee@docker.com> RUN apt-get -qq update RUN apt-get -qqy install ruby ruby-dev RUN gem install sinatra
Dockerfile 基本的語法是
使用 # 來注釋
FROM 指令告訴 Docker 使用哪個鏡像作為基礎
接着是維護者的信息
RUN 開頭的指令會在創建中運行,比如安裝一個軟件包,在這里使用 apt-get 來安裝了一些軟件
編寫完成 Dockerfile 后可以使用 docker build 來生成鏡像。
$ sudo docker build -t="ouruser/sinatra:v2" . Uploading context 2.56 kB Uploading context Step 0 : FROM ubuntu:14.04 ---> 99ec81b80c55 Step 1 : MAINTAINER Newbee <newbee@docker.com> ---> Running in 7c5664a8a0c1 ---> 2fa8ca4e2a13 Removing intermediate container 7c5664a8a0c1 Step 2 : RUN apt-get -qq update ---> Running in b07cc3fb4256 ---> 50d21070ec0c Removing intermediate container b07cc3fb4256 Step 3 : RUN apt-get -qqy install ruby ruby-dev ---> Running in a5b038dd127e Selecting previously unselected package libasan0:amd64. (Reading database ... 11518 files and directories currently installed.) Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ... Setting up ruby (1:1.9.3.4) ... Setting up ruby1.9.1 (1.9.3.484-2ubuntu1) ... Processing triggers for libc-bin (2.19-0ubuntu6) ... ---> 2acb20f17878 Removing intermediate container a5b038dd127e Step 4 : RUN gem install sinatra ---> Running in 5e9d0065c1f7 . . . Successfully installed rack-protection-1.5.3 Successfully installed sinatra-1.4.5 4 gems installed ---> 324104cde6ad Removing intermediate container 5e9d0065c1f7 Successfully built 324104cde6ad
其中 -t 標記來添加 tag,指定新的鏡像的用戶信息。“.” 是 Dockerfile 所在的路徑(當前目錄),也可以替換為一個具體的 Dockerfile 的路徑。
可以看到 build 進程在執行操作。它要做的第一件事情就是上傳這個 Dockerfile 內容,因為所有的操作都要依據 Dockerfile 來進行。然后,Dockfile 中的指令被一條一條的執行。每一步都創建了一個新的容器,在容器中執行指令並提交修改(就跟之前介紹過的 docker commit 一樣)。當所有的指令都執行完畢之后,返回了最終的鏡像 id。所有的中間步驟所產生的容器都被刪除和清理了。
注意一個鏡像不能超過 127 層
此外,還可以利用 ADD 命令復制本地文件到鏡像;用 EXPOSE 命令來向外部開放端口;用 CMD 命令來描述容器啟動后運行的程序等。例如
# put my local web site in myApp folder to /var/www ADD myApp /var/www # expose httpd port EXPOSE 80 # the command to run CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
現在可以利用新創建的鏡像來啟動一個容器。
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root@8196968dac35:/#
還可以用 docker tag 命令來修改鏡像的標簽。
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel $ sudo docker images ouruser/sinatra REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 MB ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB
四、從本地文件系統導入
要從本地文件系統導入一個鏡像,可以使用 openvz(容器虛擬化的先鋒技術)的模板來創建:openvz 的模板下載地址為templates 。
比如,先下載了一個 ubuntu-14.04 的鏡像,之后使用以下命令導入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
然后查看新導入的鏡像。
docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
五、上傳鏡像
用戶可以通過 docker push 命令,把自己創建的鏡像上傳到倉庫中來共享。例如,用戶在 Docker Hub 上完成注冊后,可以推送自己的鏡像到倉庫中。
$ sudo docker push ouruser/sinatra The push refers to a repository [ouruser/sinatra] (len: 1) Sending image list Pushing repository ouruser/sinatra (3 tags)
Docker鏡像保存為文件及從文件導入鏡像的方法
1、概述
我們制作好鏡像后,有時需要將鏡像復制到另一台服務器使用。
能達到以上目的有兩種方式,一種是上傳鏡像到倉庫中(本地或公共倉庫),但是另一台服務器很肯能只是與當前服務器局域網想通而沒有公網的,所以如果使用倉庫的方式,只能自己搭建私有倉庫,這會在另一篇文章中介紹。
如果我們僅僅是要復制到另外少數的服務器,搭建私有倉庫顯然沒有這個必要,而將鏡像保存為文件上傳到其他服務器再從文件中載入鏡像也是一個不錯的選擇。
可以使用Docker save和Docker load命令來存儲和載入鏡像。
2、保存鏡像為文件
如果要講鏡像保存為本地文件,可以使用Docker save命令。
命令格式:
docker save -o 要保存的文件名 要保存的鏡像
首先查看當前的鏡像列表:
docker images
比如這里,我們將java8的鏡像保存為文件:
docker save -o java8.tar lwieske/java-8
完成后通過 ls 命令即可看到文件。
3、從文件載入鏡像
從文件載入鏡像可以使用Docker load命令。
命令格式:
docker load --input 文件
或者
docker load < 文件名
此時會導入鏡像以及相關的元數據信息等。
首先使用SSH工具將文件上傳到另一台服務器。
然后通過命令載入鏡像:
docker load < java8.tar
導入后可以使用docker images命令查看:
Docker鏡像制作詳解介紹
最近由於工作原因,需要對Docker鏡像進行制作,這里記錄下,也許對大家也有一定幫助!
寫在前面:本文docker鏡像制作方法更適用於基於已有docker鏡像一次性修改。
推薦用Docker File制作docker鏡像。
原理是一樣的,但是用docker file制作docker鏡像能夠記錄下操作步驟,方便以后更改或者鏡像丟失后重新創建。
本文以Ubuntu為基礎鏡像,預啟動一個django項目和ssh服務,制作一個新的鏡像。
1、基礎鏡像
我選用的是從Docker官網下載的ubuntu鏡像。
docker run ubuntu
或者
docker pull ubuntu
2、安裝ssh服務
docker run -i -t ubuntu /bin/bash #創建一個容器,-t是臨時終端。
進入ubuntu后,安裝openssh
apt-get install openssh-server #安裝ssh
#需要修改/etc/sshd/sshd_config文件中內容
PermitRootLogin yes
UsePAM no
修改ubuntu的root用戶密碼,以便以后ssh登陸:
sudo passwd root
3、制作新的鏡像
到此,我們需要把這個帶有ssh服務的容器提交成一個鏡像,方便以后在這個基礎上各種改造:
docker commit <container id> <image name>
4、基於現有ssh服務的Ubuntu鏡像,加入django項目,並設置隨容器自啟動
ok,經過以上步驟,doker images可以查看,新提交的doker鏡像已經在里面了,例如image name為ssh-ubuntu的新鏡像。
最基礎的Ubuntu容器已經沒有作用了
利用
doker stop <container id> doker rm <Container id>
清楚剛剛啟動的最基礎的Ubuntu容器
下面,要基於我們新的ssh-ubuntu進行個性化定制,首先,要將這個鏡像運行起來
docker run -d -p 5001:22 ssh-ubuntu /usr/sbin/sshd -D
(-p為端口映射 容器中22端口應射程主機5001端口 || /usr/sbin/sshd -D是指定容器啟動后要運行的command,本處是啟動ssh服務)
容器啟動后,我們可以通過ssh的方式,登陸到容器中
ssh root@doker0_ip -p 5001(22映射端口)
進入到容器后,就可以進行下一步個性化定制了。例如我要把我的django項目放到鏡像中,並隨着容器啟動而啟動。
(1)把django項目拷貝到容器中,用scp命令即可。
(2)比較通用的開機啟動進程方法:
安裝supervisor!
apt-get update && apt-get install supervisor
(如果apt-get install找不到包,先update一下)
然后編輯配置文件,vi /etc/supervisord.conf
[supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D [program:tomcat] command=python ~/manager.py runserver 0.0.0.0:9999
然后保存退出即可。
用3小節方法重新制作新的鏡像,清除當前容器即可。
5、運行新鏡像
docker run -d -p 5001:22 -p 5000:9999 <image-name> /etc/supervisord
此時,可以訪問主機5000端口,看看能不能訪問到容器里面的django項目。
鏡像制作大體過程至此完成。
*****************************************************************************************************************************************************
docker 本身是有push 來上傳的 index.docker.io 的,使用是用pull拉取。但是沒有條件搭建本地docker倉庫或者需要將應用導出到另外一個Docker環境中,我們可以將docker鏡像導出到一個文件,具體做法如下:
sudo docker export <容器id> > docker_app.tar
完成后我們剛才制作的容器就導出成了 docker_app.tar 文件, 以后在其他機器部署的時候執行導入
cat docker_app.tar | sudo docker import - docker_app
管道后面的 docker_app 為導入后image命名,自己指定。
Docker鏡像的創建、存出、載入
創建鏡像的方法有三種:基於已有鏡像的容器創建、基於本地模板導入、基於Dockerfile創建,本博文講解前兩種。
基於已有鏡像的容器創建
該方法是使用docker commit命令,其命令格式為:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要參數選項包括:
- -a ,–author=”” 作者信息
- -m,–message=”” 提交信息
- -p,–pause=true 提交是暫停容器運行
比如,先創建一個運行bash的ubuntu容器:
docker run –it ubuntu /bin/bash root@d8990fec2141:/# touch test root@d8990fec2141:/# exit
然后根據創建的這個容器來提交一個新的鏡像,提交時需要用到容器ID。
docker commit –m “test” –a “zmc” d8990fec2141 testimage
如果成功的話,就會返回新鏡像的長ID號,然后可以查看看在本地已有的鏡像:
docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE testimage latest baea98d5a437 About a minute ago 188.3 MB ……
第三行就是剛剛創建的鏡像。
PS:利用此容器創建的鏡像Id與此容器的鏡像id不同,可知它們不是同一鏡像。
基於本地模板導入
也可以從操作系統模板文件導入一個鏡像,比如使用OpenVZ提供的模板創建,OPENVZ下載模板在:http://openvz.org/Download/template/precreated。
我嘗試使用了Ubuntu14.04的模板:
wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
下載完之后就可以導入了:
sudo cat ubuntu–14.04–x86_64–minimal.tar.gz | docker import – ubuntu:14.04
其實只是兩個命令,不過很顯而易見,就不加解釋了。成功的話,就會返回根據模板建立的鏡像的長ID
sudo cat ubuntu–14.04–x86_64–minimal.tar.gz | docker import – ubuntu:14.04 ab80404d13d580965b9919b640169ccb585ea7884e6aa9de1ec043075c65fe35
然后就可以查看本地的鏡像:
docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 14.04 ab80404d13d5 56 seconds ago 215.4 MB testimage latest baea98d5a437 29 minutes ago 188.3 MB ….
其實可以看出,雖然模板才75M,但創建的鏡像並不小。
鏡像的存出和載入
可以利用docker save和docker命令來存出和載入鏡像。
存出鏡像
如果想要把鏡像存出到本地文件,可以使用docker save命令,例如,存出本地的剛才創建的testimage:lastest為鏡像文件testimage.tar文件:
docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE testimage latest baea98d5a437 25 minutes ago 188.3 MB ubuntu latest fa81ed084842 3 days ago 188.3 MB …. docker save –o /data/testimage.tar testimage:latest
上面的第6行就是存出代碼,這時在/data下就有一個testimage.tar文件,這時我們把本地鏡像rmi掉,然后嘗試載入。
載入鏡像
刪除鏡像之后的狀態:
ubuntu@VM–223–238–ubuntu:/data$ docker rmi baea98d5a437 Untagged: testimage:latest Deleted: baea98d5a4371a6abf9efc8c53a54a6fc5befd167bf91ce9fd4a28a6d1b7dc5b ubuntu@VM–223–238–ubuntu:/data$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 14.04 ab80404d13d5 5 minutes ago 215.4 MB
然后載入鏡像:
docker load —input testimage.tar docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 14.04 ab80404d13d5 6 minutes ago 215.4 MB testimage latest baea98d5a437 35 minutes ago 188.3 MB
第一行就是載入鏡像,還可以簡化寫成:
docker load < testimage.tar
載入操作將會導入鏡像以及相關的元數據信息(包括標簽等)。
鏡像的上傳
最后說點鏡像的上傳,鏡像的管理方式非常像git,可以使用docker push命令上傳自己本地鏡像到倉庫,默認上傳到DockerHub官方倉庫(需要登陸),命令格式:
docker push NAME[:TAG]
在上傳之前一般會先為自己的鏡像添加帶自己名字(作者信息)的標簽:
docker tag testimage:lastest zmc/testimage:lastest
docker pushzmc/testimage:lastest
有利於上傳之后的區分。
我覺得無論是運維團隊還是開發團隊還是一個實驗室,都有必要有一個自己的Docker倉庫,可以存放符合自己需求的環境或系統鏡像,可以實現快速部署。