推送镜像到 DockerHub

注册账号

DockerHub 官网注册账号,该账号是免费注册的。

创建个人仓库

登录 DockerHub 的官网,创建新的镜像仓库。

手动推送镜像

构建镜像

在本地使用 Dockerfile 的方式构建镜像。通过 docker build 命令构建新的镜像,-t 参数可以指定新镜像的名称,. 表示在当前目录下。

  • 构建本地镜像
1
docker build -t clay/dingtalk-webhook .
  • 查看本地镜像
1
docker images
  • 给镜像打标签,更改标签的语法: docker tag IMAGEID REPOSITORY:TAG
1
2
3
4
5
# 指定版本号
docker tag 2657f9dbbd15 clay/dingtalk-webhook:1.0.3

# 不指定版本号(默认为 latest)
docker tag 2657f9dbbd15 clay/dingtalk-webhook

特别注意

每次都要 Push 不带版本号的镜像,否则镜像将没有 latest 版本,导致其他人拉取镜像的时候必须要指定 tag,这样会非常不方便。

推送镜像

1
2
3
4
5
6
7
8
# 登录 DockerHub
docker login

# 推送指定版本号的镜像
docker push clay/dingtalk-webhook:1.0.3

# 推送不带版本号的镜像(默认为 latest)
docker push clay/dingtalk-webhook

搜索镜像

镜像推送成功后,可以在 DockerHub 仓库中观察是否可以搜索到,若能搜索到则说明镜像推送成功。

1
docker search dingtalk-webhook

推送加速

推送镜像到 DockerHub 时,往往会因网络延迟而超时。这种情况下,可以配置 Docker Push 使用代理,加快镜像推送的速度。

提示

由于不可描述的原因,Docker 的 Pull 或 Push 都很慢。Docker Pull 镜像时,可以更改 /etc/docker/daemon.json 配置文件,加入国内镜像源的方式来加速。但 Docker Push 不支持这种方式,传统的 export http_proxy=xxxx 设置 HTTP 代理变量的方式对 Docker 也无效,因此需要采用下面的方式设置 HTTP 代理来解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建配置目录
mkdir -p /etc/systemd/system/docker.service.d

# 创建配置文件
vim /etc/systemd/system/docker.service.d/http-proxy.conf

# 写入配置文件(指定代理服务的地址)
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:1080/"

# 刷新更改
systemctl daemon-reload && systemctl restart docker

# 验证是否生效
systemctl show --property=Environment docker

# 重新Push镜像
docker push clay/dingtalk-webhook

自动推送镜像

这里将介绍如何利用 GitHub Actions 自动构建并推送 Docker 镜像到 DockerHub。

创建 GitHub 仓库

登录 GitHub 官网,首先手动创建代码仓库,然后将本地的代码 Push 到代码仓库。

配置 DockerHub 账号

由于希望通过 GitHub Actions 自动推送镜像到 DockerHub,因此必须要有 DockerHub 的认证配置,即需要在 GitHub 仓库中添加 DockerHub 登录的用户名和密码(AcessToken)。

选择 Action 工作流模板

选择 GitHub Actions 的工作流模板,这里可以任意选择一个,后续可以手动更改模板文件的内容。值得一提的是,模板文件创建成功后,默认会保存在 GitHub 仓库的 .github/workflows/ 目录下。

更改 Workflow 配置文件

编辑 GitHub 仓库 .github/workflows/ 目录下的 Workflow 配置文件,覆盖并添加下述内容。

提示

    1. GitHub Actions 的中文文档
    1. GitHub 从 Git 引用和 GitHub 事件中提取元数据(tags、labels)的配置方法,详细教程可以参考 这里
    1. Action 本质就是由一系列的 step 组成,GitHub Actions 官方所有可用的 Action 可以从 这里 查找到。
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
# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path

name: DockerHub Image Publish

on:
push:
branches:
- 'main'
tags:
- '*'
pull_request:
branches:
- 'main'

env:
IMAGE_NAME: clay/dingtalk-webhook

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout the repo
uses: actions/checkout@v3

- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
cache: maven

- name: Build with Maven
run: mvn -B package --file pom.xml

- name: Build the Docker image
run: docker build . --file Dockerfile --tag ${{ env.IMAGE_NAME }}

- name: Login to DockerHub
if: github.event_name != 'pull_request'
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@v3
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
步骤的名称步骤的描述
Checkout the repo 检出仓库代码
Set up JDK 11 安装 JDK 11
Build with MavenMaven 编译代码
Build the Docker image 构建 Docker 镜像
Login to DockerHub 登录 DockerHub
Extract Docker metadata 提取 Docker 的元数据
Build and push Docker image 推送 Docker 镜像

自动推送镜像到 DockerHub

Workflow 文件配置完成之后,将所有内容更改推送至 Github 仓库。按照本例中的配置,只要 main 分支有新的 Push 事件或者 tag 有更新,就会触发 Github Actions 自动构建镜像并推送至 DockerHub。上述配置的 Extract Docker metadata 步骤,目的是更改镜像的名称,镜像的 tag 会自动抽取(规则如下表所示)。默认情况下,如果是分支的 Push 事件,那么镜像的 tag 则为分支的名称,如果是 tag 的 Push 事件,则会推送 taglatest 这两个版本的镜像到 DockerHub,具体配置规则参见 这里

EentRefDocker Tags
pull_requestrefs/pull/2/mergepr-2
pushrefs/heads/mainmain
pushrefs/heads/releases/1releases-1
push tagrefs/tags/1.2.31.2.3, latest
push tagrefs/tags/2.0.8-beta.672.0.8-beta.67, latest
workflow_dispatchrefs/heads/mainmain
  • Git 创建并推送 tag 的命令
1
2
3
4
5
6
7
8
# 创建标签
git tag 1.0.2

# 推送标签
git push origin 1.0.2

# 查看所有标签列表
git tag --list
  • 当 Push 新的 tag 到 GitHub 仓库后,等待 GitHub Actions 的自动构建操作完成,最后登录 DockerHub 的官网,可以看到已经有相应的 Docker 镜像被创建。

查看自动构建的结果

参考资料