通常,编辑一个dockerfile进行build,或者将运行中的容器containers,使用commit将容器最上一层可写层单独创建一个镜像。或者如上github antomated builds,这种方式还是需要基于dockerfile。大致形式如下:
制作镜像
- 基于容器制作镜像
我们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 pull 5idocker/httpd
即可
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
而后就可以在阿里云看到镜像被上传,大致如下图:
本地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