如何創建自己的docker image並上傳到DockerHub上


這里,記錄一下比較常用的docker操作細節,對於初次使用者,可能有很大的幫助。

 

docker作為雲計算Paas層面的東西,風靡全世界了,主要是因為它小巧,好用,功能強大。今天主要介紹一下如何依據自己的dockerfile創建image,並將自己的image共享到DockerHub上。方便團隊在需要的時候取用。

 

這里主要是demo,所以,Dockerfile也很簡單:

1 #this is my demo dockerfile
2 
3 FROM ubuntu:14.10
4 MAINTAINER xxxxx@yyyy.com
5 ADD script.sh /usr/script/
6 ENTRYPOINT ["/usr/script/script.sh"]
7 CMD ["This is a test dockfile out"]

這里的script.sh的內容如下:

1 #!/bin/bash
2 
3 echo "There are $# parameters provided!"
4 
5 for i in $@
6 do
7    echo $i
8 done

 

這里,需要注意一點的是,第一行的命令,必須是FROM,比如,將FROM命令放在第二行了,在執行docker build的時候,會報下面的錯誤:

[root@CloudGame myimage]# docker build -t shihuc/hello:v1 .
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : MAINTAINER xxxx@yyyy.com
Please provide a source image with `from` prior to commit

 

接着看正常的Dockerfile的build的過程:

 1 [root@CloudGame myimage]# docker build -t shihuc/demo:v1 .
 2 Sending build context to Docker daemon 3.072 kB
 3 Sending build context to Docker daemon 
 4 Step 0 : FROM ubuntu:14.10
 5 14.10: Pulling from ubuntu
 6 6d370c930acc: Already exists 
 7 9a63f1e91c4c: Already exists 
 8 74364530838d: Already exists 
 9 dce38fb57986: Already exists 
10 ubuntu:14.10: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
11 Digest: sha256:6341c688b4b0b82ec735389b3c97df8cf2831b8cb8bd1856779130a86574ac5c
12 Status: Downloaded newer image for ubuntu:14.10
13  ---> dce38fb57986
14 Step 1 : MAINTAINER xxxx@yyyy.com
15  ---> Using cache
16  ---> d77b1889ec2b
17 Step 2 : ADD script.sh /usr/script/
18  ---> Using cache
19  ---> 2d927db27a62
20 Step 3 : ENTRYPOINT /usr/script/script.sh
21  ---> Using cache
22  ---> 2d0fea5aca3c
23 Step 4 : CMD This is a test dockfile out
24  ---> Using cache
25  ---> 54b2b27ac4ef
26 Successfully built 54b2b27ac4ef

 

現在docker image demo:v1已經創建好了。這個時候就可以共享出去了,共享到DockerHub上去。首先需要有一個DockerHub的帳號,當然,這里,我申請了一個Public的repo,免費的,和GitHub類似,public的免費,private的要錢喲。網址為https://hub.docker.com/

申請好了帳號后,就可以登錄了:

1 [root@CloudGame myimage]# docker login
2 Username: shihuc
3 Password: 
4 Email: xxxx@yyyy.com
5 WARNING: login credentials saved in /root/.docker/config.json
6 Login Succeeded
7 [root@CloudGame myimage]# 

現在,我就將這個docker image demo:v1上傳到DockerHub上去:

 1 [root@CloudGame myimage]# docker push shihuc/demo:v1  2 The push refers to a repository [shihuc/demo] (len: 1)
 3 54b2b27ac4ef: Image already exists 
 4 2d0fea5aca3c: Image already exists 
 5 2d927db27a62: Image successfully pushed 
 6 d77b1889ec2b: Image already exists 
 7 dce38fb57986: Image already exists 
 8 74364530838d: Image successfully pushed 
 9 9a63f1e91c4c: Image successfully pushed  
10 Digest: sha256:593286981f39efb3e7caa52020645f3f5b2a38f45a8d3ffaa1b4079b5f508a2e

這里有兩點要注意喲

1. 必須是在命令行下登錄了DockerHub后才能作push操作。這個很容易理解,否則push不知道往那push,這個和git push有點不同,git push到GitHub時,通常是走SSH,這個時候要在github設置Public key,本地會默認用當前用戶.ssh下的私鑰。而DockerHub是通過用戶名密碼和郵箱地址來確認用戶身份的。

2. 上面push操作的指令中,紅色部分,shihuc表示DockerHub上的用戶名,demo是repo的名字,v1表示tag號。若在創建docker image的時候,-t選項不是shihuc/demo:v1,而是demo:v1,那么即使用shihuc用戶名登錄了DockerHub,最后也無法push的,會遇到下面的錯誤:

1 [root@CloudGame myimage]# docker push demo:v1
2 You cannot push a "root" repository. Please rename your repository to <user>/<repo> (ex: shihuc/demo)

而此時,你若根據提示,采用docker push shihuc/demo:v1提交,則會遇到下面的錯誤:

1 [root@CloudGame myimage]# docker push shihuc/demo:v1
2 The push refers to a repository [shihuc/demo] (len: 1)
3 Repository does not exist: shihuc/demo

 

好了,最后看看我們創建的image運行的如何吧,首先默認運行,不加任何參數(結合上面的腳本,分析一下,就可以知道答案是正確的,注意CMD指令后的參數是在一個引號內喲):

1 [root@CloudGame myimage]# docker run shihuc/demo:v1
2 There are 1 parameters provided!
3 This
4 is
5 a
6 test
7 dockfile
8 out

再來看看,添加參數的運行結果:

1 [root@CloudGame myimage]# docker run shihuc/demo:v1 hello docker
2 There are 2 parameters provided!
3 hello
4 docker

這個例子,說明自己創建的image運行一切正常。也可以看出CMD的參數可以被命令行替換,而ENTRYPOINT的參數是不能被替換的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM