docker 镜像的制作,可以基于容器创建镜像,也可基于 dockerfile 构建镜像。但需要注意的是,我们并不是真正"创建"新镜像,而是基于一个已有的基础镜像,如 centos 或 ubuntu 等,构建新镜像而已。
1.基于容器制作
联合文件系统(UnionFS)挂载提供了容器的文件系统,任何对容器内文件系统的改动都会被写入到新的文件层中,这个文件层归创建它的容器所有。而我们就对做出改动的容器进行镜像构建。我这儿使用 busybox 作为 base image,我们可以认为 busybox 为一个精简的 linux 系统。在 busybox 上运行一个 httpd 程序,并将其制作为镜像文件。
1.拉取镜像
~]# docker image pull busybox:latest #默认会从dockerhub上拉取
...
~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 59788edf1f3e 2 months ago 1.15MB
2.运行镜像
~]# docker container run --name bbox -it busybox:latest #启动镜像,并交互式登录
3.运行httpd
busybox 自带有 httpd 程序
/ # httpd -h
Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM] [-h HOME]
httpd -d/-e/-m STRING
-i Inetd mode
-f Don't daemonize
-v[v] Verbose
-p [IP:]PORT Bind to IP:PORT (default *:80)
-u USER[:GRP] Set uid/gid after binding to port
-r REALM Authentication Realm for Basic Authentication
-h HOME Home directory (default .)
-c FILE Configuration file (default {/etc,HOME}/httpd.conf)
-m STRING MD5 crypt STRING
-e STRING HTML encode STRING
-d STRING URL decode STRING
/ # mkdir /data/html #家目录
/ # echo "httpd server" >> /data/html/index.html #测试页
/ # httpd -h /data/html #指定家目录,启动服务
4.镜像制作
新打开一个控制台
~]# docker container commit --help
Usage: docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
~]# docker container commit -p bbox test/mybbox:v0.1 #-p制作镜像时,容器暂停运行,防止在制作镜像时有数据写入
~]# docker image ls
test/mybbox v0.1 e07687dd8546 1 minutes ago 1.15MB
注:若是想对版本号或者镜像名称进行修改,可使用docker tag命令,但是修改后不会覆盖原镜像,会新生成一个镜像,类似于硬链接。
5.更改启动命令
当我们运行mybbox时,会发现虽然文件都有,但是并没有运行httpd服务,这是因为每个镜像都有一个运行时启动的初始命令,我们若想镜像启动时就运行某个命令,需要我们在制作镜像时就指定。
~]# docker image inspect -f {
{.Config.Cmd}} test/mybbox:v0.1
[sh] #可见 mybbox 镜像还是使用 busybox 的初始命令。
~]# docker container commit -a "test <test@docker.com>" -c 'CMD ["/bin/httpd,"-h /data/html"]' -p bbox test/mybbox:v0.2
~]# docker image inspect -f {
{.Config.Cmd}} test/mybbox:v0.2
[/bin/sh -c ["/bin/httpd,"-h /data/html"]]
6.推送至仓库
镜像制作完成,就可以推送至仓库,默认是推送到dockerhub,我们可以自己在 dockerhub 创建账号并创建仓库,然后本地 docker login 登录,就可以将本地镜像 push 上去。需要注意的是在 dockerhub 上创建仓库时,命名空间要为test,仓库名为 mybbox(对于本次实验)