Docker 建立鏡像、修改、上傳鏡像

Docker 建立鏡像、修改、上傳鏡像java

 

–建立鏡像有不少方法,用戶能夠從 Docker Hub 獲取已有鏡像並更新,也能夠利用本地文件系統建立一個。python

1、建立鏡像linux

建立鏡像有不少方法,用戶能夠從 Docker Hub 獲取已有鏡像並更新,也能夠利用本地文件系統建立一個。git

2、修改已有鏡像web

一、先使用下載的鏡像啓動容器。docker

1apache

2django

$ docker run -t -i training/sinatra /bin/bashjson

root@0b2616b0e5a8:/#ubuntu

注意:記住容器的 ID,稍後還會用到。

二、在容器中添加 json 和 gem 兩個應用。

1

root@0b2616b0e5a8:/# gem install json

當結束後,咱們使用 exit 來退出,如今咱們的容器已經被咱們改變了,使用 docker commit 命令來提交更新後的副本。

1

2

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2

4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m 來指定提交的說明信息,跟咱們使用的版本控制工具同樣;-a 能夠指定更新的用戶信息;以後是用來建立鏡像的容器的 ID;最後指定目標鏡像的倉庫名和 tag 信息。建立成功後會返回這個鏡像的 ID 信息。

使用 docker images 來查看新建立的鏡像。

1

2

3

4

5

$ 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

以後,可使用新的鏡像來啓動容器

1

2

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash

root@78e82f680994:/#

3、利用 Dockerfile 來建立鏡像

使用 docker commit 來擴展一個鏡像比較簡單,可是不方便在一個團隊中分享。咱們可使用 docker build 來建立一個新的鏡像。爲此,首先須要建立一個 Dockerfile,包含一些如何建立鏡像的指令。
新建一個目錄和一個 Dockerfile

1

2

3

$ mkdir sinatra

$ cd sinatra

$ touch Dockerfile

Dockerfile 中每一條指令都建立鏡像的一層,例如:

1

2

3

4

5

6

# 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 來生成鏡像。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

$ 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 命令來描述容器啓動後運行的程序等。例如

1

2

3

4

5

6

# 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"]

如今能夠利用新建立的鏡像來啓動一個容器。

1

2

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash

root@8196968dac35:/#

還能夠用 docker tag 命令來修改鏡像的標籤。

1

2

3

4

5

6

$ 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

4、從本地文件系統導入

要從本地文件系統導入一個鏡像,可使用 openvz(容器虛擬化的先鋒技術)的模板來建立:openvz 的模板下載地址爲templates 。

好比,先下載了一個 ubuntu-14.04 的鏡像,以後使用如下命令導入:

1

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04

而後查看新導入的鏡像。

1

2

3

docker images

REPOSITORY     TAG         IMAGE ID      CREATED       VIRTUAL SIZE

ubuntu       14.04        05ac7c0b9383    17 seconds ago   215.5 MB

5、上傳鏡像

用戶能夠經過 docker push 命令,把本身建立的鏡像上傳到倉庫中來共享。例如,用戶在 Docker Hub 上完成註冊後,能夠推送本身的鏡像到倉庫中。

1

2

3

4

$ 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鏡像保存爲文件及從文件導入鏡像的方法

一、概述

咱們製做好鏡像後,有時須要將鏡像複製到另外一臺服務器使用。

能達到以上目的有兩種方式,一種是上傳鏡像到倉庫中(本地或公共倉庫),可是另外一臺服務器很肯能只是與當前服務器局域網想通而沒有公網的,因此若是使用倉庫的方式,只能本身搭建私有倉庫,這會在另外一篇文章中介紹。

若是咱們僅僅是要複製到另外少數的服務器,搭建私有倉庫顯然沒有這個必要,而將鏡像保存爲文件上傳到其餘服務器再從文件中載入鏡像也是一個不錯的選擇。

可使用Docker save和Docker load命令來存儲和載入鏡像。

二、保存鏡像爲文件

若是要講鏡像保存爲本地文件,可使用Docker save命令。

命令格式:

1

docker save -o 要保存的文件名  要保存的鏡像

首先查看當前的鏡像列表:

1

docker images

01

好比這裏,咱們將java8的鏡像保存爲文件:

1

docker save -o java8.tar lwieske/java-8

完成後經過 ls 命令便可看到文件。 

三、從文件載入鏡像

從文件載入鏡像可使用Docker load命令。

命令格式:

1

docker load --input 文件

或者

1

docker load < 文件名

此時會導入鏡像以及相關的元數據信息等。

首先使用SSH工具將文件上傳到另外一臺服務器。

而後經過命令載入鏡像:

1

docker load < java8.tar

導入後可使用docker images命令查看:

02

 

 

Docker鏡像製做詳解介紹

最近因爲工做緣由,須要對Docker鏡像進行製做,這裏記錄下,也許對你們也有必定幫助!    

寫在前面:本文docker鏡像製做方法更適用於基於已有docker鏡像一次性修改。

推薦用Docker File製做docker鏡像。

原理是同樣的,可是用docker file製做docker鏡像可以記錄下操做步驟,方便之後更改或者鏡像丟失後從新建立。
本文以Ubuntu爲基礎鏡像,預啓動一個django項目和ssh服務,製做一個新的鏡像。

一、基礎鏡像

我選用的是從Docker官網下載的ubuntu鏡像。

docker run ubuntu

或者

docker pull ubuntu

二、安裝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

三、製做新的鏡像

到此,咱們須要把這個帶有ssh服務的容器提交成一個鏡像,方便之後在這個基礎上各類改造:

docker commit <container id> <image name>

四、基於現有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

1

2

3

4

5

6

7

[supervisord]

nodaemon=true

[program:sshd]

command=/usr/sbin/sshd -D

 

[program:tomcat]

command=python ~/manager.py runserver 0.0.0.0:9999

而後保存退出便可。

用3小節方法從新制做新的鏡像,清除當前容器便可。

五、運行新鏡像

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的模板:

 

1

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倉庫,能夠存放符合本身需求的環境或系統鏡像,能夠實現快速部署。

 

docker 鏡像加速CentOS7詳細介紹

前言

在Docker Hub官網上註冊賬號,便可下載使用倉庫裏的所有的docker鏡像。而由於網絡緣由,國內的開發者沒辦法流暢的下載鏡像,常常會出現下載中斷的錯誤。解決方法就是使用國內的容器Hub加速服務,本質就是更改pull優先級較高的服務器爲國內的站點。

國內docker鏡像加速站

阿里雲
DaoCloud
靈雀雲

系統環境

操做系統: CentOS 7 
docker版本: 1.9.1

DaoCloud加速

DaoCloud如今是提供一個一鍵腳本配置registry-mirror,然而對於上述環境是不起做用的。

執行docker守護服務的help命令,發現沒有–registry-mirror這個選項,而是使用–add-registry選項。

具體命令以下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

$ sudo docker daemon -h

 

Usage: docker daemon [OPTIONS]

 

Enable daemon mode

 

 --add-registry=[]          Registry to query before a public one

 --api-cors-header=          Set CORS headers in the remote API

 -b, --bridge=            Attach containers to a network bridge

 --bip=                Specify network bridge IP

 --block-registry=[]         Don't contact given registry

 --cluster-advertise=         Address or interface name to advertise

 --cluster-store=           Set the cluster store

 --cluster-store-opt=map[]      Set cluster store options

 --confirm-def-push=true       Confirm a push to default registry

 -D, --debug=false          Enable debug mode

 --default-gateway=          Container default gateway IPv4 address

 --default-gateway-v6=        Container default gateway IPv6 address

 --default-ulimit=[]         Set default ulimits for containers

 --disable-legacy-registry=false   Do not contact legacy registries

 --dns=[]               DNS server to use

 --dns-opt=[]             DNS options to use

 --dns-search=[]           DNS search domains to use

 -e, --exec-driver=native       Exec driver to use

 --exec-opt=[]            Set exec driver options

 --exec-root=/var/run/docker     Root of the Docker execdriver

 --fixed-cidr=            IPv4 subnet for fixed IPs

 --fixed-cidr-v6=           IPv6 subnet for fixed IPs

 -G, --group=docker          Group for the unix socket

 -g, --graph=/var/lib/docker     Root of the Docker runtime

 -H, --host=[]            Daemon socket(s) to connect to

 --help=false             Print usage

 --icc=true              Enable inter-container communication

 --insecure-registry=[]        Enable insecure registry communication

 --ip=0.0.0.0             Default IP when binding container ports

 --ip-forward=true          Enable net.ipv4.ip_forward

 --ip-masq=true            Enable IP masquerading

 --iptables=true           Enable addition of iptables rules

 --ipv6=false             Enable IPv6 networking

 -l, --log-level=info         Set the logging level

 --label=[]              Set key=value labels to the daemon

 --log-driver=json-file        Default driver for container logs

 --log-opt=map[]           Set log driver options

 --mtu=0               Set the containers network MTU

 -p, --pidfile=/var/run/docker.pid  Path to use for daemon PID file

 --registry-mirror=[]         Preferred Docker registry mirror

 -s, --storage-driver=        Storage driver to use

 --selinux-enabled=false       Enable selinux support

 --storage-opt=[]           Set storage driver options

 --tls=false             Use TLS; implied by --tlsverify

 --tlscacert=~/.docker/ca.pem     Trust certs signed only by this CA

 --tlscert=~/.docker/cert.pem     Path to TLS certificate file

 --tlskey=~/.docker/key.pem      Path to TLS key file

 --tlsverify=false          Use TLS and verify the remote

 --userland-proxy=true        Use userland proxy for loopback traffic

在文件/etc/sysconfig/docker中增長如下代碼:

ADD_REGISTRY='--add-registry [你的加速站網址]'

而後,重啓Docker就能夠了。

1

2

3

sudo systemctl daemon-reload

 

sudo service docker restart

使用鏡像加速

1.拉取鏡像前請先登陸: docker login daocloud.io(請使用用戶名進行 login)

2.docker pull [你須要的鏡像]

後續

通過使用測試:下載docker鏡像時再也不出現下載失敗提示,粗略估計下載速度在200k/s左右,基本知足使用需求。

 

Docker鏡像保存爲文件及從文件導入鏡像的方法

一、概述

咱們製做好鏡像後,有時須要將鏡像複製到另外一臺服務器使用。

能達到以上目的有兩種方式,一種是上傳鏡像到倉庫中(本地或公共倉庫),可是另外一臺服務器很肯能只是與當前服務器局域網想通而沒有公網的,因此若是使用倉庫的方式,只能本身搭建私有倉庫,這會在另外一篇文章中介紹。

若是咱們僅僅是要複製到另外少數的服務器,搭建私有倉庫顯然沒有這個必要,而將鏡像保存爲文件上傳到其餘服務器再從文件中載入鏡像也是一個不錯的選擇。

可使用Docker save和Docker load命令來存儲和載入鏡像。

二、保存鏡像爲文件

若是要講鏡像保存爲本地文件,可使用Docker save命令。

命令格式:

1

docker save -o 要保存的文件名  要保存的鏡像

首先查看當前的鏡像列表:

1

docker images

01

好比這裏,咱們將java8的鏡像保存爲文件:

1

docker save -o java8.tar lwieske/java-8

完成後經過 ls 命令便可看到文件。 

三、從文件載入鏡像

從文件載入鏡像可使用Docker load命令。

命令格式:

1

docker load --input 文件

或者

1

docker load < 文件名

此時會導入鏡像以及相關的元數據信息等。

首先使用SSH工具將文件上傳到另外一臺服務器。

而後經過命令載入鏡像:

1

docker load < java8.tar

導入後可使用docker images命令查看:

相關文章
相關標籤/搜索