Docker 建立鏡像、修改、上傳鏡像java
–建立鏡像有不少方法,用戶能夠從 Docker Hub 獲取已有鏡像並更新,也能夠利用本地文件系統建立一個。python
1、建立鏡像linux
建立鏡像有不少方法,用戶能夠從 Docker Hub 獲取已有鏡像並更新,也能夠利用本地文件系統建立一個。git
2、修改已有鏡像web
一、先使用下載的鏡像啓動容器。docker
1apache 2django |
|
注意:記住容器的 ID,稍後還會用到。
二、在容器中添加 json 和 gem 兩個應用。
1 |
|
當結束後,咱們使用 exit 來退出,如今咱們的容器已經被咱們改變了,使用 docker commit 命令來提交更新後的副本。
1 2 |
|
其中,-m 來指定提交的說明信息,跟咱們使用的版本控制工具同樣;-a 能夠指定更新的用戶信息;以後是用來建立鏡像的容器的 ID;最後指定目標鏡像的倉庫名和 tag 信息。建立成功後會返回這個鏡像的 ID 信息。
使用 docker images 來查看新建立的鏡像。
1 2 3 4 5 |
|
以後,可使用新的鏡像來啓動容器
1 2 |
|
3、利用 Dockerfile 來建立鏡像
使用 docker commit 來擴展一個鏡像比較簡單,可是不方便在一個團隊中分享。咱們可使用 docker build 來建立一個新的鏡像。爲此,首先須要建立一個 Dockerfile,包含一些如何建立鏡像的指令。
新建一個目錄和一個 Dockerfile
1 2 3 |
|
Dockerfile 中每一條指令都建立鏡像的一層,例如:
1 2 3 4 5 6 |
|
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 |
|
其中 -t 標記來添加 tag,指定新的鏡像的用戶信息。「.」 是 Dockerfile 所在的路徑(當前目錄),也能夠替換爲一個具體的 Dockerfile 的路徑。
能夠看到 build 進程在執行操做。它要作的第一件事情就是上傳這個 Dockerfile 內容,由於全部的操做都要依據 Dockerfile 來進行。而後,Dockfile 中的指令被一條一條的執行。每一步都建立了一個新的容器,在容器中執行指令並提交修改(就跟以前介紹過的 docker commit 同樣)。當全部的指令都執行完畢以後,返回了最終的鏡像 id。全部的中間步驟所產生的容器都被刪除和清理了。
注意一個鏡像不能超過 127 層
此外,還能夠利用 ADD 命令複製本地文件到鏡像;用 EXPOSE 命令來向外部開放端口;用 CMD 命令來描述容器啓動後運行的程序等。例如
1 2 3 4 5 6 |
|
如今能夠利用新建立的鏡像來啓動一個容器。
1 2 |
|
還能夠用 docker tag 命令來修改鏡像的標籤。
1 2 3 4 5 6 |
|
4、從本地文件系統導入
要從本地文件系統導入一個鏡像,可使用 openvz(容器虛擬化的先鋒技術)的模板來建立:openvz 的模板下載地址爲templates 。
好比,先下載了一個 ubuntu-14.04 的鏡像,以後使用如下命令導入:
1 |
|
而後查看新導入的鏡像。
1 2 3 |
|
5、上傳鏡像
用戶能夠經過 docker push 命令,把本身建立的鏡像上傳到倉庫中來共享。例如,用戶在 Docker Hub 上完成註冊後,能夠推送本身的鏡像到倉庫中。
1 2 3 4 |
|
一、概述
咱們製做好鏡像後,有時須要將鏡像複製到另外一臺服務器使用。
能達到以上目的有兩種方式,一種是上傳鏡像到倉庫中(本地或公共倉庫),可是另外一臺服務器很肯能只是與當前服務器局域網想通而沒有公網的,因此若是使用倉庫的方式,只能本身搭建私有倉庫,這會在另外一篇文章中介紹。
若是咱們僅僅是要複製到另外少數的服務器,搭建私有倉庫顯然沒有這個必要,而將鏡像保存爲文件上傳到其餘服務器再從文件中載入鏡像也是一個不錯的選擇。
可使用Docker save和Docker load命令來存儲和載入鏡像。
二、保存鏡像爲文件
若是要講鏡像保存爲本地文件,可使用Docker save命令。
命令格式:
1 |
|
首先查看當前的鏡像列表:
1 |
|
好比這裏,咱們將java8的鏡像保存爲文件:
1 |
|
完成後經過 ls 命令便可看到文件。
三、從文件載入鏡像
從文件載入鏡像可使用Docker load命令。
命令格式:
1 |
|
或者
1 |
|
此時會導入鏡像以及相關的元數據信息等。
首先使用SSH工具將文件上傳到另外一臺服務器。
而後經過命令載入鏡像:
1 |
|
導入後可使用docker images命令查看:
最近因爲工做緣由,須要對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 |
|
而後保存退出便可。
用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命名,本身指定。
建立鏡像的方法有三種:基於已有鏡像的容器建立、基於本地模板導入、基於Dockerfile建立,本博文講解前兩種。
該方法是使用docker commit命令,其命令格式爲:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要參數選項包括:
好比,先建立一個運行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 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 |
|
在文件/etc/sysconfig/docker中增長如下代碼:
ADD_REGISTRY='--add-registry [你的加速站網址]'
而後,重啓Docker就能夠了。
1 2 3 |
|
使用鏡像加速
1.拉取鏡像前請先登陸: docker login daocloud.io(請使用用戶名進行 login)
2.docker pull [你須要的鏡像]
後續
通過使用測試:下載docker鏡像時再也不出現下載失敗提示,粗略估計下載速度在200k/s左右,基本知足使用需求。
一、概述
咱們製做好鏡像後,有時須要將鏡像複製到另外一臺服務器使用。
能達到以上目的有兩種方式,一種是上傳鏡像到倉庫中(本地或公共倉庫),可是另外一臺服務器很肯能只是與當前服務器局域網想通而沒有公網的,因此若是使用倉庫的方式,只能本身搭建私有倉庫,這會在另外一篇文章中介紹。
若是咱們僅僅是要複製到另外少數的服務器,搭建私有倉庫顯然沒有這個必要,而將鏡像保存爲文件上傳到其餘服務器再從文件中載入鏡像也是一個不錯的選擇。
可使用Docker save和Docker load命令來存儲和載入鏡像。
二、保存鏡像爲文件
若是要講鏡像保存爲本地文件,可使用Docker save命令。
命令格式:
1 |
|
首先查看當前的鏡像列表:
1 |
|
好比這裏,咱們將java8的鏡像保存爲文件:
1 |
|
完成後經過 ls 命令便可看到文件。
三、從文件載入鏡像
從文件載入鏡像可使用Docker load命令。
命令格式:
1 |
|
或者
1 |
|
此時會導入鏡像以及相關的元數據信息等。
首先使用SSH工具將文件上傳到另外一臺服務器。
而後經過命令載入鏡像:
1 |
|
導入後可使用docker images命令查看: