创建Docker镜像以及将其推送到DockerHub进行版本管理的步骤

你好。
我是Class Act基础设施事业部的大塚。

在这篇文章中,我打算写一些备忘录,比如如何自定义Docker镜像,以及将自定义的Docker镜像推送到DockerHub进行版本管理的方法。
※我想创建一个基于Django的Web应用程序,所以当我尝试从DockerHub获取Django镜像并使用时,意外地发现Django版本是1.●,所以我想”那我自己定制一下可能更快”,结果就变成了这样…汗。

在DockerHub上找到的Django镜像

之前,我在自己的环境中进行了Docker网络测试,并部署了一个简单的Django容器。当时使用的命令如下:

root@docker:~# docker run -itd --name django-con --net my-dk-br django:latest
Unable to find image 'django:latest' locally
latest: Pulling from library/django
75a822cd7888: Pull complete
e4665cede9d1: Pull complete
202a45aa091c: Pull complete
7799136eb561: Pull complete
7a7f9ca3fd40: Pull complete
412f2d081014: Pull complete
Digest: sha256:5bfd3f442952463f5bc97188b7f43cfcd6c2f631a017ee2a6fca3cb8992501e8
Status: Downloaded newer image for django:latest
4fd58c1ecdd0354b55c9a71e0f1d2face81843555f127f005a0b4fe07af979dc

当执行此命令时,如果本地有Django镜像,则使用本地镜像,否则自动从DockerHub下载镜像。
在我的情况中,由于本地没有,我正在从DockerHub拉取镜像,此时拉取的镜像可能如下所示。

 

经过仔细调查后发现,这个东西好像在6年前更新过,之后就没有再进行更新。
由于这个原因,Django的版本居然是1.●台。。。!
下面是进入部署的容器后通过pip list输出的安装库版本的结果。
除了Django之外,其他的东西也有点旧,所以我决定不使用这个镜像,而是从头开始自己制作。

root@890ed06d9e04:/# pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Django (1.10.4)
mysqlclient (1.3.9)
pip (9.0.1)
psycopg2 (2.6.2)
setuptools (20.10.1)
You are using pip version 9.0.1, however version 23.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

创建DockerImage

本来应该使用Dockerfile来将镜像代码化,但是我并不想学习那个,所以这次是手动进行。我会进入容器,并开始逐渐添加所需的内容,一旦达到一定程度,就会以容器形式进行镜像化处理。

image (20).png

 

首先,将这个镜像在本地拉取。

root@docker:~# docker pull ubuntu:22.04
22.04: Pulling from library/ubuntu
Digest: sha256:67211c14fa74f070d27cc59d69a7fa9aeff8e28ea118ef3babc295a0428a6d21
Status: Downloaded newer image for ubuntu:22.04
docker.io/library/ubuntu:22.04

root@docker:~# docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
portainer/portainer-ce   latest    f031e549070f   3 days ago      273MB
redis                    latest    eca1379fe8b5   4 days ago      117MB
nextcloud                latest    964325ce9b95   7 days ago      1e+03MB
nginx                    latest    6efc10a0510f   9 days ago      142MB
postgres                 latest    ceccf204404e   9 days ago      379MB
httpd                    latest    4b7fc736cb48   9 days ago      145MB
mysql                    latest    412b8cc72e4a   2 weeks ago     531MB
alpine                   latest    9ed4aefc74f6   3 weeks ago     7.05MB
ubuntu                   22.04     08d22c0ceb15   6 weeks ago     77.8MB
ubuntu                   latest    08d22c0ceb15   6 weeks ago     77.8MB
centos                   centos7   eeb6ee3f44bd   19 months ago   204MB
django                   latest    eb40dcf64078   6 years ago     436MB

根据pull的图像部署容器。进入已部署的容器并确认操作系统版本。以下是确认结果,似乎在ubuntu 22.04上没有问题。

root@docker:~# docker run -itd --name my-django ubuntu:22.04
882373b6681d3a406cb8d94d1c555e162fac8219c8fc542f33418d652c12d973
root@docker:~# docker exec -it my-django /bin/bash
root@882373b6681d:/# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
root@882373b6681d:/# python --version
bash: python: command not found

我会安装Python、pip和Django。
我参考了以下内容。

 

只记录了击中了什么。

root@882373b6681d:/# apt update
root@882373b6681d:/# apt upgrade
root@882373b6681d:/# apt install -y python3-pip
root@882373b6681d:/# pip --version
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
root@882373b6681d:/# apt install -y software-properties-common
root@882373b6681d:/# add-apt-repository ppa:deadsnakes/ppa
root@882373b6681d:/# apt update
root@882373b6681d:/# apt list python3.*
root@882373b6681d:/# apt install -y python3.12 python3.12-venv
root@882373b6681d:/# pip install django

我会检查Python版本以及各种库的版本。一旦发现缺少的内容,就会即时安装。虽然这样不太好…

root@882373b6681d:/# python3 --version
Python 3.10.6

root@882373b6681d:/# pip list
Package             Version
------------------- -------------
asgiref             3.6.0
blinker             1.4
cryptography        3.4.8
dbus-python         1.2.18
distro              1.7.0
distro-info         1.1build1
Django              4.2
httplib2            0.20.2
importlib-metadata  4.6.4
jeepney             0.7.1
keyring             23.5.0
launchpadlib        1.10.16
lazr.restfulclient  0.14.4
lazr.uri            1.0.6
more-itertools      8.10.0
oauthlib            3.2.0
pip                 22.0.2
PyGObject           3.42.1
PyJWT               2.3.0
pyparsing           2.4.7
python-apt          2.4.0+ubuntu1
SecretStorage       3.3.1
setuptools          59.6.0
six                 1.16.0
sqlparse            0.4.4
unattended-upgrades 0.1
wadllib             1.3.6
wheel               0.37.1
zipp                1.0.0

暂时将其转换为镜像状态。
似乎需要使用docker commit命令来将正在运行的容器转换为镜像。
这次我们创建了一个名为my-django-image的DockerImage。
通过使用docker image ls命令,确认镜像已成功创建。

root@docker:~# docker commit my-django my-django-image
sha256:55e95bb495d66998faf0e7f10ba54e7dc04a8dcb0e01d95fee5598c4e90c63ac

root@docker:~# docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
my-django-image          latest    55e95bb495d6   2 minutes ago   646MB
portainer/portainer-ce   latest    f031e549070f   3 days ago      273MB
redis                    latest    eca1379fe8b5   4 days ago      117MB
nextcloud                latest    964325ce9b95   7 days ago      1e+03MB
nginx                    latest    6efc10a0510f   9 days ago      142MB
postgres                 latest    ceccf204404e   9 days ago      379MB
httpd                    latest    4b7fc736cb48   9 days ago      145MB
mysql                    latest    412b8cc72e4a   2 weeks ago     531MB
alpine                   latest    9ed4aefc74f6   3 weeks ago     7.05MB
ubuntu                   22.04     08d22c0ceb15   6 weeks ago     77.8MB
ubuntu                   latest    08d22c0ceb15   6 weeks ago     77.8MB
centos                   centos7   eeb6ee3f44bd   19 months ago   204MB
django                   latest    eb40dcf64078   6 years ago     436MB

将内容推送到DockerHub。

我想将其推送到DockerHub上。
首先,在Web浏览器中访问DockerHub。如果没有账户,则进行注册。

 

image (21).png
image (22).png
image (23).png
image (24).png

要在服务器上登录到DockerHub,需要使用docker login命令进行登录。

root@docker:~# 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: shotaohtsuka
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

要将服务器镜像推送到DockerHub,主要需要按照以下步骤进行操作。

    1. 使用docker tag命令为镜像添加标签(例如,将”latest”添加到标签”django:latest”中)

 

    使用docker push命令将镜像推送到DockerHub。

我們將對已經創建的my-django-image進行標籤並進行推送。tag後面的字符串列表是my-django-image的IMAGE ID。

root@docker:~# docker tag 55e95bb495d6 shotaohtsuka/my-django-image:latest
root@docker:~# docker image ls
REPOSITORY                     TAG       IMAGE ID       CREATED         SIZE
my-django-image                latest    55e95bb495d6   4 hours ago     646MB
shotaohtsuka/my-django-image   latest    55e95bb495d6   4 hours ago     646MB
portainer/portainer-ce         latest    f031e549070f   4 days ago      273MB
redis                          latest    eca1379fe8b5   4 days ago      117MB
nextcloud                      latest    964325ce9b95   7 days ago      1e+03MB
nginx                          latest    6efc10a0510f   9 days ago      142MB
postgres                       latest    ceccf204404e   9 days ago      379MB
httpd                          latest    4b7fc736cb48   10 days ago     145MB
mysql                          latest    412b8cc72e4a   2 weeks ago     531MB
alpine                         latest    9ed4aefc74f6   3 weeks ago     7.05MB
ubuntu                         22.04     08d22c0ceb15   6 weeks ago     77.8MB
ubuntu                         latest    08d22c0ceb15   6 weeks ago     77.8MB
centos                         centos7   eeb6ee3f44bd   19 months ago   204MB
django                         latest    eb40dcf64078   6 years ago     436MB

root@docker:~# docker push shotaohtsuka/my-django-image
Using default tag: latest
The push refers to repository [docker.io/shotaohtsuka/my-django-image]
bf846b78d73a: Pushed
b93c1bd012ab: Pushed
latest: digest: sha256:c64b17376f63a2c936e422dc29c6fda9c01e2202f8cb62c6c011349d941adb6c size: 742
image (25).png

关于DockerImage/DockerHub的版本管理

在这里我会省略细节,但是我使用了我自己制作的名为my-django-image的镜像来部署容器,并且做了一些工作。
然后,我从工作完成的容器中重新创建了一个镜像。我想将它保存为最新版本(标签为:latest),并且将之前的一个镜像标记为1.0以便进行管理。

在这种情况下,以下可能是一个不错的选择。
※可能有更加有效的方法…

    1. 使用docker tag命令创建将标签更改为1.0的镜像文件。

 

    1. 使用docker push命令将1.0版本的内容推送到DockerHub。

 

    1. 使用docker commit命令将当前容器转换为镜像。

 

    1. 使用docker tag命令向转换为镜像的内容添加latest标签。

 

    使用docker push命令将最新版本的内容推送到DockerHub。

首先,提到1,2的部分。

root@docker:~# docker image ls
REPOSITORY                     TAG       IMAGE ID       CREATED         SIZE
my-django-image                latest    55e95bb495d6   4 hours ago     646MB
shotaohtsuka/my-django-image   latest    55e95bb495d6   4 hours ago     646MB
portainer/portainer-ce         latest    f031e549070f   4 days ago      273MB
redis                          latest    eca1379fe8b5   4 days ago      117MB
nextcloud                      latest    964325ce9b95   7 days ago      1e+03MB
nginx                          latest    6efc10a0510f   9 days ago      142MB
postgres                       latest    ceccf204404e   9 days ago      379MB
httpd                          latest    4b7fc736cb48   10 days ago     145MB
mysql                          latest    412b8cc72e4a   2 weeks ago     531MB
alpine                         latest    9ed4aefc74f6   3 weeks ago     7.05MB
ubuntu                         22.04     08d22c0ceb15   6 weeks ago     77.8MB
ubuntu                         latest    08d22c0ceb15   6 weeks ago     77.8MB
centos                         centos7   eeb6ee3f44bd   19 months ago   204MB
django                         latest    eb40dcf64078   6 years ago     436MB
root@docker:~# docker tag 55e95bb495d6 shotaohtsuka/my-django-image:1.0
root@docker:~# docker image ls
REPOSITORY                     TAG       IMAGE ID       CREATED         SIZE
my-django-image                latest    55e95bb495d6   6 hours ago     646MB
shotaohtsuka/my-django-image   1.0       55e95bb495d6   6 hours ago     646MB
shotaohtsuka/my-django-image   latest    55e95bb495d6   6 hours ago     646MB
portainer/portainer-ce         latest    f031e549070f   4 days ago      273MB
redis                          latest    eca1379fe8b5   4 days ago      117MB
nextcloud                      latest    964325ce9b95   7 days ago      1e+03MB
nginx                          latest    6efc10a0510f   9 days ago      142MB
postgres                       latest    ceccf204404e   10 days ago     379MB
httpd                          latest    4b7fc736cb48   10 days ago     145MB
mysql                          latest    412b8cc72e4a   2 weeks ago     531MB
alpine                         latest    9ed4aefc74f6   3 weeks ago     7.05MB
ubuntu                         22.04     08d22c0ceb15   6 weeks ago     77.8MB
ubuntu                         latest    08d22c0ceb15   6 weeks ago     77.8MB
centos                         centos7   eeb6ee3f44bd   19 months ago   204MB
django                         latest    eb40dcf64078   6 years ago     436MB
root@docker:~# docker push shotaohtsuka/my-django-image:1.0
The push refers to repository [docker.io/shotaohtsuka/my-django-image]
bf846b78d73a: Layer already exists
b93c1bd012ab: Layer already exists
1.0: digest: sha256:c64b17376f63a2c936e422dc29c6fda9c01e2202f8cb62c6c011349d941adb6c size: 742

下面是关于第3、4、5部分的内容

root@docker:~# docker commit django-con my-django-image
sha256:55e0f735a3ae3c0426f1ed9cb64cf135974489ea3c8635b8294cb0fe88f63522
root@docker:~# docker image ls
REPOSITORY                     TAG       IMAGE ID       CREATED              SIZE
my-django-image                latest    55e0f735a3ae   About a minute ago   685MB
shotaohtsuka/my-django-image   1.0       55e95bb495d6   6 hours ago          646MB
shotaohtsuka/my-django-image   latest    55e95bb495d6   6 hours ago          646MB
portainer/portainer-ce         latest    f031e549070f   4 days ago           273MB
redis                          latest    eca1379fe8b5   4 days ago           117MB
nextcloud                      latest    964325ce9b95   7 days ago           1e+03MB
nginx                          latest    6efc10a0510f   9 days ago           142MB
postgres                       latest    ceccf204404e   10 days ago          379MB
httpd                          latest    4b7fc736cb48   10 days ago          145MB
mysql                          latest    412b8cc72e4a   2 weeks ago          531MB
alpine                         latest    9ed4aefc74f6   3 weeks ago          7.05MB
ubuntu                         22.04     08d22c0ceb15   6 weeks ago          77.8MB
ubuntu                         latest    08d22c0ceb15   6 weeks ago          77.8MB
centos                         centos7   eeb6ee3f44bd   19 months ago        204MB
django                         latest    eb40dcf64078   6 years ago          436MB
root@docker:~# docker tag 55e0f735a3ae shotaohtsuka/my-django-image:latest
root@docker:~# docker image ls
REPOSITORY                     TAG       IMAGE ID       CREATED         SIZE
my-django-image                latest    55e0f735a3ae   2 minutes ago   685MB
shotaohtsuka/my-django-image   latest    55e0f735a3ae   2 minutes ago   685MB
shotaohtsuka/my-django-image   1.0       55e95bb495d6   6 hours ago     646MB
portainer/portainer-ce         latest    f031e549070f   4 days ago      273MB
redis                          latest    eca1379fe8b5   4 days ago      117MB
nextcloud                      latest    964325ce9b95   7 days ago      1e+03MB
nginx                          latest    6efc10a0510f   9 days ago      142MB
postgres                       latest    ceccf204404e   10 days ago     379MB
httpd                          latest    4b7fc736cb48   10 days ago     145MB
mysql                          latest    412b8cc72e4a   2 weeks ago     531MB
alpine                         latest    9ed4aefc74f6   3 weeks ago     7.05MB
ubuntu                         22.04     08d22c0ceb15   6 weeks ago     77.8MB
ubuntu                         latest    08d22c0ceb15   6 weeks ago     77.8MB
centos                         centos7   eeb6ee3f44bd   19 months ago   204MB
django                         latest    eb40dcf64078   6 years ago     436MB
root@docker:~# docker push shotaohtsuka/my-django-image:latest
The push refers to repository [docker.io/shotaohtsuka/my-django-image]
4c6106b49d52: Pushed
bf846b78d73a: Layer already exists
b93c1bd012ab: Layer already exists
latest: digest: sha256:63dc995b9a27594c4b72c32c16168e5b4f8de614bcc633ff06b2d6bc5401b867 size: 954
image (26).png
广告
将在 10 秒后关闭
bannerAds