Docker制作镜像并提交到Docker Hub

前面研究过Docker的基本命令和使用,但是一直没有介绍如何制作自己的一个镜像并将其提交到Docker Hub镜像中心,本文今天就介绍如何来制作一个关于IDEA授权服务器的Docker镜像并提交到Docker Hub。

登录Docker Hub

首先我们需要注册一个Docker Hub的用户名,以我的为例:qinjiangbo。登录Hub以后,需要创建一个repository,作为我们后面提交的仓库。如下图:

第一步,找到create菜单

第二步,填写相关信息

第三步,查看已创建仓库

终端登录Docker

我使用的是macOS版本,因此直接打开Docker应用就可以了。如果没有使用Docker应用的话,可以直接在终端输入docker login来登录的。

1
2
3
4
5
docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (qinjiangbo): qinjiangbo
Password:
Login Succeeded

下载授权服务器程序

我们制作的镜像是关于IDEA的授权服务器的,因此需要先下载这个授权服务器运行程序。下面给出磁力链接:

磁力链接: magnet:?xt=urn:btih:ED1FA379ECBD34D13CB7D14B0C2B024986A6FC79&dn=IntelliJIDEALicenseServer(v1.4).tar.tar)

粘贴到迅雷下载,完成以后解压可以看到一下文件列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cd IntelliJIDEALicenseServer
$ IntelliJIDEALicenseServer ls
IntelliJIDEALicenseServer.html IntelliJIDEALicenseServer_linux_mips64le
IntelliJIDEALicenseServer_darwin_386 IntelliJIDEALicenseServer_linux_mipsle
IntelliJIDEALicenseServer_darwin_amd64 IntelliJIDEALicenseServer_netbsd_386
IntelliJIDEALicenseServer_freebsd_386 IntelliJIDEALicenseServer_netbsd_amd64
IntelliJIDEALicenseServer_freebsd_amd64 IntelliJIDEALicenseServer_netbsd_arm
IntelliJIDEALicenseServer_freebsd_arm IntelliJIDEALicenseServer_openbsd_386
IntelliJIDEALicenseServer_linux_386 IntelliJIDEALicenseServer_openbsd_amd64
IntelliJIDEALicenseServer_linux_amd64 IntelliJIDEALicenseServer_windows_386.exe
IntelliJIDEALicenseServer_linux_arm IntelliJIDEALicenseServer_windows_amd64.exe
IntelliJIDEALicenseServer_linux_mips md5sum
IntelliJIDEALicenseServer_linux_mips64

我们后期是要放在Linux服务器上运行的,所以选择一个Linux版本,IntelliJIDEALicenseServer_linux_386IntelliJIDEALicenseServer_linux_amd64都可以的,只是对应的处理器类型不同,我们这里选择IntelliJIDEALicenseServer_linux_386

制作Docker镜像

我们最终是需要制作一个Dockerfile文件,在此之前,我们需要准备一些文件。给大家列举一下:

1
2
3
$ license-server ls
Dockerfile IntelliJIDEALicenseServer_linux_386
IntelliJIDEALicenseServer.html docker-entrypoint.sh

这里需要跟大家解释一下过程,首先我们需要创建一个文件夹用于存放这些文件,我们这里创建的文件夹名称是license-server,里面包含四个文件:

  • Dockerfile,这个不解释
  • IntelliJIDEALicenseServer_linux_386,这个是我们的授权服务器运行程序
  • IntelliJIDEALicenseServer.html,这个是提示页面,就是用户如果在浏览器直接访问授权服务器地址,展现给用户的提示页面,一般会告诉用户如何操作
  • docker-entrypoint.sh,这个主要是容器启动后用来执行运行程序的脚本

重点看两个文件:

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM ubuntu
MAINTAINER qinjiangbo<[email protected]>
RUN mkdir /idea
ADD IntelliJIDEALicenseServer_linux_386 /idea
ADD IntelliJIDEALicenseServer.html /idea
ADD docker-entrypoint.sh /
RUN chmod 755 idea -R
RUN chmod 755 docker-entrypoint.sh
EXPOSE 1017
WORKDIR /idea
CMD ["/docker-entrypoint.sh"]

这个内容就不解释了,不明白的可以看我前面的关于Docker的几篇文章。

docker-entrypoint.sh

1
2
#!/bin/bash
./IntelliJIDEALicenseServer_linux_386

打包制作镜像

制作镜像的命令比较简单:

1
$ docker build -t license-server:latest .

注意最后有一个.

查看镜像列表:

1
2
3
4
5
6
7
8
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
license-server latest 34fe7d26dd9e 4 hours ago 118MB
ubuntu latest 00fd29ccc6f1 3 weeks ago 111MB
sshd_centos latest f0560ea85754 2 months ago 221MB
nginx latest 1e5ab59102ce 2 months ago 108MB
gitlab/gitlab-ce latest 453d64ae84c7 3 months ago 1.28GB
centos latest 196e0ce0c9fb 3 months ago 197MB

已经存在这个镜像了,接下来需要给这个镜像打标,示例就是docker tag <existing-image> <hub-user>/<repo-name>[:<tag>],因此我们这样操作:

1
$ docker tag 34fe7d26dd9e qinjiangbo/idea-license-server

再次查看可以看到列表中多了一个:

1
2
3
4
5
6
7
8
9
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
license-server latest 34fe7d26dd9e About an hour ago 118MB
qinjiangbo/license-server latest 34fe7d26dd9e About an hour ago 118MB
ubuntu latest 00fd29ccc6f1 3 weeks ago 111MB
sshd_centos latest f0560ea85754 2 months ago 221MB
nginx latest 1e5ab59102ce 2 months ago 108MB
gitlab/gitlab-ce latest 453d64ae84c7 3 months ago 1.28GB
centos latest 196e0ce0c9fb 3 months ago 197MB

如果是针对容器做出修改又如何创建呢?docker commit <exiting-Container> <hub-user>/<repo-name>[:<tag>]这个命令可以解决。

提交到Docker Hub仓库中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ docker push qinjiangbo/idea-license-server
The push refers to a repository [docker.io/qinjiangbo/idea-license-server]
9ee0aba95d5f: Pushed
d18db1e351f0: Pushed
cdc1754f226e: Pushed
e65d9cc78d36: Pushed
c15ee4074338: Pushed
3da57500ceb4: Pushed
f17fc24fb8d0: Pushed
6458f770d435: Pushed
5a876f8f1a3d: Pushed
d2f8c05d353b: Pushed
48e0baf45d4d: Pushed
latest: digest: sha256:21c1dc48a12372fa4943e262f8dc57af9782664278e6f8bfaab68251de6fb8b7 size: 2607

中间可能会报以下错误:

1
2
3
$ docker push qinjiangbo/idea-license-server:latest
The push refers to a repository [docker.io/qinjiangbo/idea-license-server]
Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.65.1:53: read udp 192.168.65.2:56209->192.168.65.1:53: i/o timeout

没关系,重试几次就好了,最好加上VPN会比较稳定一点。

查看Docker Hub个人仓库

可以看到,我们的镜像已经制作并提交成功了。

总结

以上就是如何制作一个Docker镜像并提交到Docker Hub仓库的基本流程。需要注意自己是基于别人镜像的容器改进的还是自己从零开始制作的,因为方式是不一样的。上面也提到了两者的制作方式。大家有什么好的镜像都可以踊跃地向社区提交,优秀的东西应该和大家一起分享嘛!

分享到