Docker(五)--Dockerfile制作镜像

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(对于本次实验)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值