Docker 平臺
Docker 平臺基本上由三部分組成:
客戶端:使用者使用 Docker 提供的工具(CLI 以及 API 等)來構建,上傳映象併發布命令來建立和啟動容器
Docker 主機:從 Docker registry 上下載映象並啟動容器
Docker registry:Docker 映象倉庫,用於儲存映象,並提供映象上傳和下載
與Mavan的管理一樣,Docker不僅提供了一箇中央倉庫,同時也允許我們使用registry搭建本地私有映象倉庫。
中央倉庫
官方的hub.docker
國內廠商,阿里雲,daocloud提供的免費中央倉庫
也可以使用官方hub安裝自建私有倉庫
準備工作
首先你得準備一個hub 的帳號, 去
註冊吧!
檢視本地已有映象
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 9f38484d220f 2 months ago 202 MB1234
建立dockerfile
mkdir docker_file
cd docker_file/
vi Dockerfile
123
內容如下
FROM centos
MAINTAINER sandywei <zjcjava@163.com>
# move all configuration files into container
RUN yum install -y httpd
EXPOSE 80
CMD ["sh","-c","service httpd start;bash"]1234567
docker build -t cenots/httpd:1.0 .
...
Removing intermediate container bd9551733fae
Successfully built 88bb00e21fc6123456
檢視當前已經有兩個映象了
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cenots/httpd 1.0 88bb00e21fc6 3 minutes ago 329 MB
docker.io/centos latest 9f38484d220f 2 months ago 202 MB12345
cenots的拼寫我這裡寫錯了
建立容器
docker run -d 88bb00e21fc6 bash -c "while true; do echo hello world; sleep 1; done"
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2907ad80faca 88bb00e21fc6 "bash -c 'while tr..." 13 seconds ago Up 13 seconds 80/tcp wonderful_spence12345
釋出docker
接下來就是登入一個hub帳號了 命令: docker login 如果成功則顯示下圖
docker login12
輸入使用者名稱,密碼登陸成功即可
這個過程和github的使用非常相似
1.commit一個容器 命令: docker commit CONTAINER_ID 倉庫路徑
docker commit 2907ad80faca zhangbamboo/test1
2.將剛才的映象push 到你的hub 那裡去 命令: docker push 倉庫路徑:版本號 這個latest其實就是一個tag name 會在hub的Tags那裡顯示
docker push zhangbamboo/test:latest
The push refers to a repository [docker.io/zhangbamboo/test]
d8153f44fb20: Pushing [==================================================>] 128.3 MB
d69483a6face: Pushing [==================================================>] 209.5 MB
success1234567
現在驗證一下 命令: docker inspect zhangbamboo/test
docker inspect zhangbamboo/test
[
{
"Id": "sha256:188f3ed072afad90f22cf0c7024029fc2437365744e432b8566f36c9b8349044",
"RepoTags": [
"zhangbamboo/test:latest"
],
"RepoDigests": [
"zhangbamboo/test@sha256:702a594f74413ba060664e587fb8535d7fcbf5a50b5a628d21c90ebb70b555aa"
],
"Parent": "sha256:88bb00e21fc683553117487f57ba637054f84220eb6c4fe445b31c2cdc1fbd2d",
"Comment": "",
"Created": "2019-06-05T10:03:03.807710776Z",
"Container": "2907ad80faca19257db56491da14c24627ddfc708604c5455cbeabbefae1c767",
"ContainerConfig": {
"Hostname": "2907ad80faca",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"bash",
"-c",
"while true; do echo hello world; sleep 1; done"
],
"Image": "88bb00e21fc6",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20190305",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"DockerVersion": "1.13.1",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"bash",
"-c",
"while true; do echo hello world; sleep 1; done"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20190305",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 329320764,
"VirtualSize": 329320764,
"GraphDriver": {
"Name": "overlay2",
"Data": {
"LowerDir": "/var/lib/docker/overlay2/8115006f63caf4a90d60d3eee5643d0068c5a853f07e3b559d21d6f0c7ba07a0/diff",
"MergedDir": "/var/lib/docker/overlay2/8aa447669d56da1205fa222c144ea3449d860c3b2905c1e5e48026624a9e0589/merged",
"UpperDir": "/var/lib/docker/overlay2/8aa447669d56da1205fa222c144ea3449d860c3b2905c1e5e48026624a9e0589/diff",
"WorkDir": "/var/lib/docker/overlay2/8aa447669d56da1205fa222c144ea3449d860c3b2905c1e5e48026624a9e0589/work"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:d69483a6face4499acb974449d1303591fcbb5cdce5420f36f8a6607bda11854",
"sha256:d8153f44fb200d131212f3db77bcdd32e352d717d590b1ad344006a7c9aef63d"
]
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
上傳Docker映象到阿里雲
配置阿里雲的映象加速器:
參考
配置docker加速器中的內容
https://blog.csdn.net/zjcjava/article/details/91380509
- 登入阿里雲Docker Registry
$ sudo docker login --username=zjcjava@163.com registry.cn-hangzhou.aliyuncs.com1
用於登入的使用者名稱為阿里雲賬號全名,密碼為開通服務時設定的密碼。
您可以在產品控制檯首頁修改登入密碼。
- 從Registry中拉取映象
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/dreamer/dokcer_test:[映象版本號]1
- 將映象推送到Registry
這裡我們以我係統裡面已經pull的nginx為例
$ sudo docker login --username=zjcjava@163.com registry.cn-hangzhou.aliyuncs.com #如果已經登陸過這裡可以跳過
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 719cd2e3ed04 33 hours ago 109 MB
# $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/dreamer/dokcer_test:[映象版本號] #命名規則按照阿里的命名規則設定
sudo docker tag 719cd2e3ed04 registry.cn-hangzhou.aliyuncs.com/dreamer/dokcer_test:v1.0
#可以看到719cd2e3ed04有兩個tag不同的名稱
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 719cd2e3ed04 33 hours ago 109 MB
registry.cn-hangzhou.aliyuncs.com/dreamer/dokcer_test v1.0 719cd2e3ed04 33 hours ago 109 MB
#$ sudo docker push registry.cn-hangzhou.aliyuncs.com/dreamer/dokcer_test:[映象版本號] 釋出版本到倉庫
sudo docker push registry.cn-hangzhou.aliyuncs.com/dreamer/dokcer_test:v1.012345678910111213141516
請根據實際映象資訊替換示例中的[ImageId]和[映象版本號]引數。
- 選擇合適的映象倉庫地址
從ECS推送映象時,可以選擇使用映象倉庫內網地址。推送速度將得到提升並且將不會損耗您的公網流量。
如果您使用的機器位於VPC網路,請使用
registry-vpc.cn-hangzhou.aliyuncs.com 作為Registry的域名登入,並作為映象名稱空間字首。
- 示例
使用"docker tag"命令重新命名映象,並將它透過專有網路地址推送至Registry。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb68161234
使用"docker images"命令找到映象,將該映象名稱中的域名部分變更為Registry專有網路地址。
$ sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb68161
從registry中拉取映象:
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/qz/nginx-vim:[映象版本號]1
登入阿里雲檢視已上傳的映象列表:
https://cr.console.aliyun.com/#/imageList
自建私有倉庫
使用官方hub安裝自建私有倉庫有許多優點:
1.節省網路頻寬,針對於每個映象不用每個人都去中央倉庫上面去下載,只需要從私有倉庫中下載即可;
2.提供映象資源利用,針對於公司內部使用的映象,推送到本地的私有倉庫中,以供公司內部相關人員使用。
缺點:
只有即便的倉庫功能,沒有和賬號資訊關聯(這部分需要自研,大廠都有提供),共有和私有倉庫的許可權(需要自研)
使用官方提供的hub自己安裝
搭建私有倉庫:
# 下載registry映象
$ sudo docker pull registry
# 透過該映象啟動一個容器
$ sudo docker run -d -p 8082:8082 registry
# 對映映象路徑至宿機器、放置容器刪除、映象丟失:
$ sudo docker run -d -p 8082:8082 -v /opt/data/registry:/tmp/registry registry
修改配置並重啟Docker
vi /etc/docker/daemon.json
{
"registry-mirrors": ["172.17.120.102:8082"],
"insecure-registries":["172.17.120.102:8082"]
}
# 重啟 docker 服務
systemctl restart docker
測試倉庫Push/Pull:
# 首先pull一個比較小的映象(busybox)來測試
docker pull busybox
# 修改一下該映象的tag
$ docker tag busybox 172.17.120.102:8080/busybox
# 上傳映象到私有倉庫。
$ docker push 172.17.120.102:8082/busybox123456789101112131415161718192021222324
到此就搭建好了Docker私有倉庫,但是如上搭建的倉庫是不需要加密認證的,當然你可以透過證照或者Nginx實現認證訪問。下面介紹一下基於Nexus 3搭建的Docker私有倉庫。
基於Nexus 3搭建的Docker私有倉庫
Nexus簡介
Nexus是一個多功能的倉庫管理系統,是企業常用的私有倉庫伺服器軟體。目前常被用來作為Maven私服、Docker私服。
如果用java的maven元件那麼這個大公司基本都會有自己的私服nexus倉庫。
優點
安裝簡單,並且有官方Docker映象
使用者介面,並提供REST API
支援瀏覽、檢索以及檢查機制
支援npm與bower以及Raw repositories、NuGet repositories
總之Nexus物美價廉,又提供功能全面的oss版,加之支援種類眾多的依賴管理,又可以統一管理docker映象。
安裝
參考之前寫的一篇部落格:
本地私服倉庫nexus3.3.1使用手冊 。當然,這裡我們有更簡潔的安裝方式,由於nexus3+依賴於JDK1.8,可能有不少企業系統上安裝的還是1.7甚至是1.6版本,這裡建議主機安裝安裝,不適用Dokerfile。
參考資料
本地私服倉庫nexus3.3.1使用手冊
https://blog.52itstyle.vip/archives/1025/