白话容器之简单制作镜像与hub使用(7)

2023年 7月 16日 105.2k 0

通常,编辑一个dockerfile进行build,或者将运行中的容器containers,使用commit将容器最上一层可写层单独创建一个镜像。或者如上github antomated builds,这种方式还是需要基于dockerfile。大致形式如下: docker-22.png

制作镜像

  • 基于容器制作镜像

我们run起一个容器,而后在容器内添加一些文件。随后将这个容器commit成一个镜像,在将此镜像run起来。如上图containers部分。

我使用busybox,使用httpd测试,首先创建一个index.html文件,添加一段helo www.linuxea.com

[root@linuxea-Node_10_10_240_145 ~]$ docker run --name 5idocker -it busybox 
/ # mkdir /data/5idocker -p
/ # cat /data/5idocker/index.html 
helo www.linuxea.com
/ # httpd -d -h /data/5idocker/

现在这个容器的是运行的

[root@linuxea-Node_10_10_240_145 ~]$ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
8b8016950ac7        busybox                      "sh"                     10 minutes ago      Up 10 minutes                           5idocker

而后将这个容器commit -m版本是v1,id是8b8016950ac7,保存名称为linuxea/httpd:v1,这两段的意思是linuxea为名称,httpd是仓库名称也是镜像名称,v1是tag,这里的tag可以进行多次打标。

  • 需要注意的是,这里的用户如果是本地使用可随便写,如果是仓库,用户需要实现存在。
  • 这个标签的删除也是引用,最初的镜像才是真正的镜像
  • -a 指定作者,示例: -a "linuxea <linuxea@linuxea.com>"
  • -c 使用cmd,示例: -c "CMD ["bin/httpd","-f","-h","/data/5idocker"]"

但是我这里不使用,而后直接用命令启动的时候输入命令即可

[root@linuxea-Node_10_10_240_145 ~]$ docker commit -m "v1"  8b8016950ac7 linuxea/httpd:v1
sha256:2f502ef7d89a3f28b10d1c30c49e066634b4cfdab96b24bbb0e9e97b1f7a4291

而后如下

[root@linuxea-Node_10_10_240_145 ~]$ docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
linuxea/httpd                      v1                  2f502ef7d89a        4 seconds ago       1.15MB

现在有了刚刚commit的镜像,现在run起这个镜像,并且传入参数 httpd -f -h /data/5idocker,这样容器就运行在前台了。

  • 就算之前加了CMD,httpd -f -h /data/5idocker这段命令也会替换到之前的cmd
[root@linuxea-Node_10_10_240_145 ~]$ docker run -d -p 80:80 linuxea/httpd:v1 httpd -f -h /data/5idocker
9257381bd8abcbf25601aca4e94a05f115d75cc9981839ce5fc7b68a7ec4b49f

运行状态如下:

[root@linuxea-Node_10_10_240_145 ~]$ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                       PORTS                NAMES
9257381bd8ab        linuxea/httpd:v1             "httpd -f -h /data/5…"   5 seconds ago       Up 4 seconds                 0.0.0.0:80->80/tcp   nostalgic_bhaskara

我们获取到ip,然后curl下

[root@linuxea-Node_10_10_240_145 ~]$ docker inspect 9257381bd8ab|tail -20
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "aeb93fd1bb6abcc31fb3f34c055d8a24eb8e9b30ede398623848f514f8299d04",
                    "EndpointID": "677570f365c32a805400a69d779712d55aa6769dc83d4b8dd8c29248b771273c",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.4",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:04",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@linuxea-Node_10_10_240_145 ~]$ curl 172.17.0.4
helo www.linuxea.com

这样以来镜像就已经打包好了。

dockerhub使用

我们现在push到dockerhub上,我此前在dockerhub创建的一个5idocker。那么就需要将将名称打标签成5idocker。这里的用户名称(也就是linuxea这段)必须要dockerhub上的用户一样。因此我有5idocker用户,就需要打标成5idocker。

[root@linuxea-Node_10_10_240_145 ~]$ docker tag linuxea/httpd:v1 5idocker/httpd:v1
[root@linuxea-Node_10_10_240_145 ~]$ docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
5idocker/httpd                     v1                  2f502ef7d89a        34 minutes ago      1.15MB

登陆

[root@linuxea-Node_10_10_240_145 ~]$ docker login -u 5idocker
[root@linuxea-Node_10_10_240_145 ~]$ docker login -u 5idocker
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

docker push,这里可以不需要事先创建好httpd,也可以事先创建好这个项目

[root@linuxea-Node_10_10_240_145 ~]$ docker push 5idocker/httpd:v1 
The push refers to repository [docker.io/5idocker/httpd]
de9d93fb552a: Pushed 
8a788232037e: Mounted from library/busybox 
v1: digest: sha256:07b0a8045f5df6ba1cd170f61ea66be1e44cbd6dcc2121d304c37cbd6c6e8a26 size: 734

而后dockerhub上就有了这个镜像docker-23.png

并且可以被其他人所使用,因为是公开的。使用docker pull 5idocker/httpd即可docker-24.png

dev.aliyum使用

假如我要推送到dev.aliyun.com的话就需要在json文件中在添加一行

像这样:

[root@linuxea-Node_10_10_240_145 ~]$ cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://9ykgc5q2.mirror.aliyuncs.com","https://registry.docker-cn.com"]
}

那么阿里云的创建参考和登陆密码设置就不演示,我们直接push

先退出之前的登陆

[root@linuxea-Node_10_10_240_145 ~]$ docker logout
Removing login credentials for https://index.docker.io/v1/

登陆阿里云

[root@linuxea-Node_10_10_240_145 ~]$  docker login --username=usertzc@163.com registry.cn-hangzhou.aliyuncs.com
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

而后修改下标签

[root@linuxea-Node_10_10_240_145 ~]$ docker tag linuxea/httpd:v1 registry.cn-hangzhou.aliyuncs.com/linuxea/httpd:v1

push到阿里云

[root@linuxea-Node_10_10_240_145 ~]$  docker push registry.cn-hangzhou.aliyuncs.com/linuxea/httpd:v1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/linuxea/httpd]
de9d93fb552a: Pushed 
8a788232037e: Pushed 
v1: digest: sha256:07b0a8045f5df6ba1cd170f61ea66be1e44cbd6dcc2121d304c37cbd6c6e8a26 size: 734

而后就可以在阿里云看到镜像被上传,大致如下图:docker-25.png

本地save镜像

当不想上传到hub上,或者没有网且没有仓库的情况下, 我们可以进行打包,甚至于打好几个镜像包,如下:

[root@linuxea-Node_10_10_240_145 ~]$ docker save -o linuxea.gz linuxea/httpd:v1 nginx:1.14-alpine 
[root@linuxea-Node_10_10_240_145 ~]$ ll linuxea.gz 
-rw------- 1 root root 20333568 11月 26 21:41 linuxea.gz

我们scp到其他机器解压使用即可

[root@linuxea-Node_10_10_240_145 ~]$ scp linuxea.gz root@10.10.240.142:~/
The authenticity of host '10.10.240.142 (10.10.240.142)' can't be established.
ECDSA key fingerprint is SHA256:CuxYCbuJuzJBjj2Ps7anOR7BKYx4w1Md80APwSJ5Ei8.
ECDSA key fingerprint is MD5:0b:26:0a:e4:1f:04:b5:71:64:a3:0f:e6:e7:11:ee:b0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.240.142' (ECDSA) to the list of known hosts.
root@10.10.240.142's password: 
linuxea.gz    

而后load即可

[root@linuxea-Node142 ~]# docker load -i linuxea.gz 
de9d93fb552a: Loading layer [==================================================>]   5.12kB/5.12kB
Loaded image: linuxea/httpd:v1
df64d3292fd6: Loading layer [==================================================>]  4.672MB/4.672MB
9d687ea74fd6: Loading layer [==================================================>]  14.24MB/14.24MB
07616dc06659: Loading layer [==================================================>]  3.584kB/3.584kB
4468d9e70dc1: Loading layer [==================================================>]  4.608kB/4.608kB
Loaded image: nginx:1.14-alpine

相关文章

LeaferJS 1.0 重磅发布:强悍的前端 Canvas 渲染引擎
10分钟搞定支持通配符的永久有效免费HTTPS证书
300 多个 Microsoft Excel 快捷方式
一步步配置基于kubeadmin的kubevip高可用
istio全链路传递cookie和header灰度
REST Web 服务版本控制

发布评论