Dockerfile
文章目录
在本章中,主要学习如何构建Docker镜像,其实在Docker公共仓库中已经有大量的镜像,但是并不一定满足我们对镜像的需求,所以我们需要学习如何的构建自己所需要的镜像。
Docker镜像构建
Docker镜像可以通过Docker hub或者阿里云等仓库中获取,这些镜像是由官方或者社区人员提供的,对于Docker用户来说并不能满足我们的需求,但是从无开始构建镜像成本大。常用的数据库、中间件、应用软件等都有现成的Docker官方镜像或社区创建的镜像,我们只需要稍作配置就可以直接使用。
使用现成镜像的好处除了省去自己做镜像的工作量外,更重要的是可以利用前人的经验。特别是使用那些官方镜像,因为Docker的工程师知道如何更好的在容器中运行软件。
当然,某些情况下我们也不得不自己构建镜像,比如找不到现成的镜像,比如自己开发的应用程序,需要在镜像中加入特定的功能。
Docker提供了三种构建镜像的方法:
- docker commit命令
- 基于本地模板导入
- Dockerfile构建文件
Docker commmit
docker commit命令可以基于容器创建镜像,创建过程大致分为三步,先创建容器,在容器中安装我们所需要的内容,再使用docker commit将容器打包为镜像即可。
下面展示一个示例:在centos的base镜像中安装vim-common并保存为新镜像。
1、先基于centos7运行容器,容器名为axi,并使用-it生成终端进入容器。
[root@localhost ~]# docker run -it --name axi centos:7
2、在容器中安装vim-common。
[root@194e67bda157 /]# dnf -y install vim-common
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirrors.bupt.edu.cn
* extras: mirrors.cqu.edu.cn
* updates: mirrors.cqu.edu.cn
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/4): base/7/x86_64/group_gz | 153 kB 00:00:00
(2/4): extras/7/x86_64/primary_db | 247 kB 00:00:00
(3/4): base/7/x86_64/primary_db | 6.1 MB 00:00:13
(4/4): updates/7/x86_64/primary_db | 16 MB 00:00:22
Resolving Dependencies
--> Running transaction check
---> Package vim-common.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-filesystem for package: 2:vim-common-7.4.629-8.el7_9.x86_64
--> Running transaction check
---> Package vim-filesystem.x86_64 2:7.4.629-8.el7_9 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
========================================================================================================
Package Arch Version Repository Size
========================================================================================================
Installing:
vim-common x86_64 2:7.4.629-8.el7_9 updates 5.9 M
Installing for dependencies:
vim-filesystem x86_64 2:7.4.629-8.el7_9 updates 11 k
Transaction Summary
========================================================================================================
Install 1 Package (+1 Dependent package)
Total download size: 5.9 M
Installed size: 21 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/updates/packages/vim-filesystem-7.4.629-8.el7_9.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for vim-filesystem-7.4.629-8.el7_9.x86_64.rpm is not installed
(1/2): vim-filesystem-7.4.629-8.el7_9.x86_64.rpm | 11 kB 00:00:00
(2/2): vim-common-7.4.629-8.el7_9.x86_64.rpm | 5.9 MB 00:00:27
--------------------------------------------------------------------------------------------------------
Total 221 kB/s | 5.9 MB 00:00:27
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-9.2009.0.el7.centos.x86_64 (@CentOS)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 2:vim-filesystem-7.4.629-8.el7_9.x86_64 1/2
Installing : 2:vim-common-7.4.629-8.el7_9.x86_64 2/2
Verifying : 2:vim-common-7.4.629-8.el7_9.x86_64 1/2
Verifying : 2:vim-filesystem-7.4.629-8.el7_9.x86_64 2/2
Installed:
vim-common.x86_64 2:7.4.629-8.el7_9
Dependency Installed:
vim-filesystem.x86_64 2:7.4.629-8.el7_9
Complete!
[root@194e67bda157 /]#
3、退出容器后,使用docker commit将axi容器打包为镜像,新镜像名为centosac:7
[root@docker ~]# docker commit axi centosac:7
sha256:282e38de865e6063499df3829e1a6b3854a178b03976472ef3e2b8ffd40a0008
[root@docker ~]# docker images | grep centos
centosac 7 282e38de865e 24 seconds ago 391MB
centos axi 5279aaca23bc 25 minutes ago 204MB
centos 7 6ac490b1c4a0 9 months ago 204MB
[root@docker ~]# docker run --name ac -it centosac:7
[root@30f05c39a0c7 /]# rpm -q vim-common
vim-common-7.4.629-8.el7_9.x86_64
[root@30f05c39a0c7 /]#
这样一个新的镜像就构建完成了,centosac:7镜像是在centos:7镜像基础之上创建的,通过查看镜像属性,发现centoscy:7要比centos:7镜像大一些。
然而,Docker并不建议用户通过这种方式构建镜像。这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。更重要的,使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患.
基于本地模板导入
用户可以直接从一个操作系统模板文件导入一个镜像,主要使用 docker [container] import 命令。命令 格式为 docker [image] import [OPTIONS] file|URL|-[REPOSITORY[:TAG]] ,要直接导入一个镜像,可以使用 OpenVZ 提供的模板来创建,或者用其他已导入的镜像模板来创建。OpenVZ 模板的下载地址为 http://openvz.org/Download/templates/precreated。
如:下载了 ubuntu:12.04 的模板压缩包,之后使用以下命令导入即可:
[root@docker ~]# cat ubuntu-12.04-x86-minimal.tar.gz | docker import - ubuntu:12.04
sha256:88216a4bfde304bde7e1195756880acab7921b368da20e3a8591e71afc81b11e
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 12.04 88216a4bfde3 5 seconds ago 146MB