1. 程式人生 > >Docker容器學習梳理--私有倉庫Registry使用

Docker容器學習梳理--私有倉庫Registry使用

但有時候使用Docker Hub這樣的公共倉庫可能不方便,這種情況下使用者可以使用registry建立一個本地倉庫供私人使用,這點跟Maven的管理類似。
使用私有倉庫有許多優點:

1

2

1)節省網路頻寬,針對於每個映象不用每個人都去中央倉庫上面去下載,只需要從私有倉庫中下載即可;

2)提供映象資源利用,針對於公司內部使用的映象,推送到本地的私有倉庫中,以供公司內部相關人員使用。

目前Docker Registry已經升級到了v2,最新版的Docker已不再支援v1。Registry v2使用Go語言編寫,在效能和安全性上做了很多優化,重新設計了映象的儲存格式。如果需要安裝registry v2,只需下載registry:2.2即可。Docker官方提供的工具docker-registry可以用於構建私有的映象倉庫。廢話不多說了,下面記錄下Docker私有倉庫構建的過程:

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

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

選擇一臺伺服器(內外網地址:192.168.1.23)作為註冊伺服器,用於搭建私有倉庫。(該機器要安裝了Docker環境)

1)從Docker官方倉庫裡下載registry映象

[[email protected] ~]# docker pull registry:2.2

----------------------------------------------------------------

或者:

[[email protected] ~]# docker pull registry

[[email protected] ~]# docker pull registry:2.1.1

----------------------------------------------------------------

下載完之後,可以通過該映象啟動一個容器

[[email protected] ~]# docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE

tomcat7              latest              97c6a43dd69c        12 minutes ago      562.3 MB

docker.io/registry   2.2                 ad379b517aa6        14 months ago       224.5 MB

預設情況下,會將私有倉庫存放於容器內的/tmp/registry目錄下,這樣如果容器被刪除,則存放於容器中的映象也會丟失。

所以一般情況下會指定本地一個目錄掛載到容器內的/tmp/registry下,如下:

[[email protected] ~]# docker run -d --name=my_registry -p 5000:5000 -v /opt/data/registry:/tmp/registry docker.io/registry:2.2

9fe45329bda17f61da04e6e8d2faf124fb22665a25270421bb8979a419809446

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS              PORTS                    NAMES

d8e98b1068cd        docker.io/registry:2.2   "/bin/registry /etc/d"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   my_registry

由上可以看到,已經啟動了一個容器,地址為:192.168.1.23:5000。

2)測試

接下來可以把一個本地映象push(如下面的tomcat7映象)到私有倉庫中。

[[email protected] ~]# docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE

tomcat7              latest              97c6a43dd69c        18 minutes ago      562.3 MB

docker.io/registry   2.2                 ad379b517aa6        14 months ago       224.5 MB

修改一下該映象的tag標識。

[[email protected] ~]# docker tag tomcat7 192.168.1.23:5000/tomcat7

[[email protected] ~]# docker tag tomcat7 192.168.1.23:5000/tomcat7       //修改了tag後的映象若要刪除,docker rmi後面不能用映象ID了,需要用docker rmi 192.168.1.23:5000/tomcat7:latest

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

192.168.1.23:5000/tomcat7   latest              97c6a43dd69c        18 minutes ago      562.3 MB

tomcat7                     latest              97c6a43dd69c        18 minutes ago      562.3 MB

docker.io/registry          2.2                 ad379b517aa6        14 months ago       224.5 MB

接下來把上面修改tag後的映象上傳到私有倉庫。

[[email protected] ~]# docker push 192.168.1.23:5000/tomcat7

The push refers to a repository [192.168.1.23:5000/tomcat7]

unable to ping registry endpoint https://192.168.1.23:5000/v0/

v2 ping attempt failed with error: Get https://192.168.1.23:5000/v2/: http: server gave HTTP response to HTTPS client

v1 ping attempt failed with error: Get https://192.168.1.23:5000/v1/_ping: http: server gave HTTP response to HTTPS client

出現上面錯誤的原因分析:

因為Docker從1.3.X之後,與docker registry互動預設使用的是https,然而此處搭建的私有倉庫只提供http服務,所以當與私有倉庫互動時就會報上面的錯誤。

為了解決這個問題需要在啟動docker server時增加啟動引數為預設使用http訪問。

需要在docker的配置檔案/etc/sysconfig/docker (ubuntu系統中的docker配置檔案時/etc/default/docker )新增引數“--insecure-registry=192.168.1.23:5000”。

-----------------------------------------------------------------------------------------------------------

溫馨提示:

這個是在客戶機的docker配置檔案裡新增的(即上傳映象到私有倉庫裡或從私有倉庫下載映象的客戶機)。

比如說在A機器上將它的映象上傳到192.168.1.23的私有倉庫上或從該私有倉庫下載映象,那麼就在A機器的本地docker配置檔案中新增。

我這裡測試用的是同一臺機器(centos7),即將註冊機192.168.1.23本機的映象上傳到它的倉庫內。     [如果是centos6系統,就在other_args選項後面新增。other_args="--graph=/docker --insecure-registry=192.168.1.234:5000"]

-----------------------------------------------------------------------------------------------------------

[[email protected] ~]# vim /etc/sysconfig/docker

.......

OPTIONS='--selinux-enabled --log-driver=journald'

改為

OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry=192.168.1.23:5000'

[[email protected] ~]# service docker restart

由於docker服務重啟後,所有容器都會被關閉。所以需要在docker重啟後再次啟動容器

[[email protected] ~]# docker start my_registry

my_registry

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS              PORTS                    NAMES

d8e98b1068cd        docker.io/registry:2.2   "/bin/registry /etc/d"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   my_registry

再次提交到私有倉庫

[[email protected] ~]# docker push 192.168.1.23:5000/tomcat7

The push refers to a repository [192.168.1.23:5000/tomcat7]

c6d7ce9e90d7: Pushed

34e7b85d83e4: Pushed

latest: digest: sha256:5fdcbaf254cb44dd26645f606cccea8de76118baff03485e40853c691a15956d size: 720

上面命令執行無誤後,就表示映象已經push到私有倉庫中去了。

檢視私有倉庫裡的映象(一定要保證下面能檢視到倉庫裡有映象!如果倉庫裡沒有映象,那麼客戶端機器就無法從該私有倉庫下載映象了)

[[email protected] ~]# curl -XGET http://192.168.1.23:5000/v2/_catalog    //即該私有倉庫裡有tomcat7映象 

{"repositories":["tomcat7"]}

[[email protected] ~]# curl -XGET http://192.168.1.23:5000/v2/tomcat7/tags/list

{"name":"tomcat7","tags":["latest"]}

或者瀏覽器裡訪問(103.110.186.23是註冊機的外網ip,iptables防火牆內開放5000埠訪問):

http://103.110.186.23:5000/v2/_catalog

http://103.110.186.23:5000/v2/tomcat7/tags/list

現在可以將本地的tomcat7和192.168.1.23:5000/tomcat7映象都刪除,然後從私有倉庫中下載

[[email protected] ~]# docker rmi tomcat7

[[email protected] ~]# docker rmi 192.168.1.23:5000/tomcat7

[[email protected] ~]# docker pull 192.168.1.23:5000/tomcat7

[[email protected] ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

192.168.1.23:5000/tomcat7   latest              5hc8a2ip413w        3 days ago          562.3 MB

-----------------------------------------------------------------------------

這樣,也就可以在同一區域網內的其他機器上,從該私有倉庫中pull下來該映象。

比如在192.168.1.17伺服器上拉取該私有倉庫的tomcat映象進行容器建立(注意,要在該機器的/etc/sysconfig/docker配置檔案裡新增--insecure-registry=192.168.1.23:5000引數)

[[email protected] ~]# docker pull 192.168.1.23:5000/tomcat7

[[email protected] ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

192.168.1.23:5000/tomcat7   latest              2ec9e2eb978a        3 days ago          562.3 MB

這樣就搭建了Docker私有倉庫,上面搭建的倉庫是不需要認證的,我們可以結合nginx和https實現認證和加密功能。

注意檢視映象方法(docker pull registry:2.1.1):

1

2

# curl -XGET http://registry_ip:5000/v2/_catalog

# curl -XGET http://registry_ip:5000/v2/image_name/tags/list

***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************