很多情况下我们是需要自己的镜像,满足自己业务需要的镜像,这就需要我们能够定制自己需要的镜像,构建 Docker 镜像有以下两种方法。
- 使用 docker commit 命令。
- 使用 docker build 命令和 Dockerfile 构建文件。
1.1使用 docker commit 命令。
docker commit 命令是创建新镜像最直观的方法,其过程包含三个步骤:
- 运行容器;
- 修改容器;
- 将容器保存为新的镜像。
先从创建一个新容器开始,这个容器我们就使用很常见的 ubuntu 镜像,操作步骤如下
运行一个要进行修改的容器
1 2 | root@ubuntu:~# docker run -ti ubuntu /bin/bashroot@733a4b080491:/# |
安装 Apache 软件包
1 2 3 4 | root@733a4b080491:/# apt-get update... ...root@733a4b080491:/# apt-get install -y apache2... ... |
我们启动了一个容器,并在里面安装了 Apache 。我们将会拿这个容器作为一个 Web 服务器来运行,我们需要把它保存下来,这样就不用每次都运行这个步骤了。
1.3 提交定制容器
1 2 3 | root@ubuntu:~# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES733a4b080491 ubuntu "/bin/bash" 11 minutes ago Exited (0) 5 seconds ago suspicious_mestorf |
1 2 | root@ubuntu:~# docker commit 733a4b080491 wzlinux/ubuntu_with_apachesha256:902ac2c87147fefc5b70c741ce9550dcda426cea9f824f442d5cc2744bdc90ae |
1 2 3 4 | root@ubuntu:~# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEwzlinux/ubuntu_with_apache latest 902ac2c87147 33 seconds ago 261MBubuntu latest 20c44cd7596f 10 days ago 123MB |
可以看到,我们使用 docker commit 提交了修改过的容器,从 size 上可以看到镜像因为安装软件由123MB->261MB,docker commit 提交的只是创建容器的镜像与容器的当前状态之间有差异的部分,这使得该更新非常轻量。
这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 apache,还得重复前面的所有步骤。使用 Dockerfile 方法来代替 docker commit,因为通过前者构建镜像更具备可重复性、透明性以及幂等性。即便是用 Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。学习 docker commit 能够帮助我们更加深入地理解构建过程和镜像的分层结构。