文章目录
Docker 平台
Docker 平台基本上由三部分组成:
客户端:用户使用 Docker 提供的工具(CLI 以及 API 等)来构建,上传镜像并发布命令来创建和启动容器
Docker 主机:从 Docker registry 上下载镜像并启动容器
Docker registry:Docker 镜像仓库,用于保存镜像,并提供镜像上传和下载
与Mavan的管理一样,Docker不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有镜像仓库。
1.公有云中央仓库
官方的hub.docker
国内厂商,阿里云,daocloud提供的免费中央仓库
2.也可以使用官方hub安装自建私有仓库
目前最为广泛使用的Harbor
如果只关注Harbor可以直接跳过前面,彼此之间并没有直接关联性,只是作为横向对比
公有云仓库
这里以阿里云仓库为例
准备工作
首先你得准备一个hub 的帐号, 去 https://hub.docker.com 注册吧!
查看本地已有镜像
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 9f38484d220f 2 months ago 202 MB
创建dockerfile
mkdir docker_file
cd docker_file/
vi Dockerfile
内容如下
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"]
docker build -t cenots/httpd:1.0 .
...
Removing intermediate container bd9551733fae
Successfully built 88bb00e21fc6
查看当前已经有两个镜像了
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 MB
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_spence
发布docker镜像
接下来就是登录一个hub帐号了 命令: docker login 如果成功则显示下图
docker login
输入用户名,密码登陆成功即可
这个过程和github的使用非常相似
1.commit一个容器 命令: docker commit CONTAINER_ID 仓库路径
docker commit 2907ad80faca zhangbamboo/test
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
success
现在验证一下 命令: 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"
]
}
上传Docker镜像到阿里云
配置阿里云的镜像加速器:https://cr.console.aliyun.com/#/accelerator
参考 配置docker加速器中的内容
https://blog.csdn.net/zjcjava/article/details/91380509
- 登录阿里云Docker Registry
$ sudo docker login --username=zjcjava@163.com registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在产品控制台首页修改登录密码。
- 从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/dreamer/dokcer_test:[镜像版本号]
- 将镜像推送到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.0
请根据实际镜像信息替换示例中的[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-dfb6816
使用"docker images"命令找到镜像,将该镜像名称中的域名部分变更为Registry专有网络地址。
$ sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
从registry中拉取镜像:
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/qz/nginx-vim:[镜像版本号]
登录阿里云查看已上传的镜像列表:https://cr.console.aliyun.com/#/imageList
自建私有仓库
目前绝大数公司都是使用自己的私有仓库存放公司的项目镜像,比较公有云环境对于有些商业项目来说存在安全问题,因此这里主要以harbor为例如何构建私有仓库
安装私有仓库Harbor
目前使用最多的仓库类型,提供账号和密码功能,有自己的web管理面板
1 .HARBOR新版本安装
https://segmentfault.com/a/1190000022812745
2.解压并修改配置信息
tar -xvf harbor-offline-installer-v2.5.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
vim harbor.yml:
hostname: 172.16.12.200 #如果要用https需要添加证书,这里直接使用IP
http:
port: 80 #curl测试用
#https:
# port: 443 #自动监听443端口,不通过Nginx
# certificate: /opt/certs/client.pem
# private_key: /opt/certs/client-key.pem
database:
password: root123 #默认
harbor_admin_password: Harbor12345 #默认
log:
location: /data/harbor/logs
data_volume: /data/harbor/
3.安装并登录管理页面,创建一个新项目
./prepare
./install.sh
http://172.16.12.200/默认用户名和密码如下: user:admin password:Harbor12345
4.修该docker配置信息,并重启服务
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://ehbu9xsm.mirror.aliyuncs.com"],
"insecure-registries":["192.168.88.61"]
}
systemctl daemon-reload
systemctl restart docker
5.构建自己的docke镜像并提交到私有仓库中
FROM openjdk:8-jdk-alpine
MAINTAINER bamoo
ADD springboot-demo.jar springboot-demo.jar
RUN echo "Asia/Shanghai" >/etc/timezone
RUN sh -c 'touch /springboot-demo.jar'
ENV JAVA_OPTS=""
CMD exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /springboot-demo.jar
EXPOSE 8000
#创建镜像
docker build . -t springboot-demo:v1 -f Dockerfile
运行镜像容器
docker run -d -p 8000:8000 --name demo-test springboot-demo:v1
docker rm 9bbc8f9a7e4b
curl localhost:8000
docker commit -a "bamboo" d7366f3cf72d springboot-demo:v1
修改镜像tag前
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot-demo v1 3ed4b8bc215f 26 minutes ago 140MB
修改镜像tag
docker tag springboot-demo:v1 172.16.12.200/demo/springboot-demo:v1
修改镜像tag后
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
172.16.12.200/demo/springboot-demo v1 3ed4b8bc215f 28 minutes ago 140MB
docker push 172.16.12.200/demo/springboot-demo:v1
The push refers to repository [172.16.12.200/demo/springboot-demo]
bee8556929fc: Pushed
83d6eb80e314: Pushed
1ad5d9220ec2: Pushed
32229f31d413: Pushed
ceaf9e1ebef5: Pushed
9b9b7f3d56a0: Pushed
f1b5933fe4b5: Pushed
v1: digest: sha256:567b056ce9d54521c50ff888adcabaa8180ce50ccad01c5db0214bfa5ecbb30f size: 1786
基于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/
自建私有仓库habor
https://blog.csdn.net/weixin_43546282/article/details/107696564