帖子用于记录docker学习中自己碰见的疑惑,方便日后回看:
docker组成
先记录一个困扰我很久的问题:就是dockerfile与docker-compose.yml及image、container之间到底是什么关系?
首先,我在官网上看到这样一个docker-compose.yml的示例:
看完这个示例之后,让我疑惑的是,在一个container(容器)中可以运行多个image?实际,docker的逻辑应该是:
如果把一个docker比喻成房子的话,那么:
1.dockerfile就是基石。在dokerfile中会指定基础image(父image,文件中的FROM命令)。除此之外,还有各种docker指令。这些指令类似linux命令,用于在启动时执行,比如:RUN xxxx、COPY xxxx、ADD xxxx、USER xxx等。
2.docker-compose.yml就是框架。在docker-compose.yml中可以配置多个子image,以及子image的基础配置(端口号、目录、网络配置等等)。多个子image就是一个多服务的docke程序。
3.container就是成品。这个成品是image run之后形成的。
当dockerfile与docker-compose.yml配置好了之后,运行build命令。那么,所获得image就是我所需要的最终的image。这就好像,image是一个完整的java项目,dockerfile定义了运行的环境(linux或者window),docker-compose.yml则定义了需要用的各项目服务(数据库、jdk等)
image(镜像)与container(容器)的区别:
image(镜像)是”只读“的,当image通过docker run命令启动后会创建一个container(容器)。简单理解,这个container(容器)与image(镜像)可以说是关系不大了。container有操作层,并且对container的操作会保存到文件中。而image是“只读”的,并且,image可以通过docker run创建多个container。
整理一下,到目前的收获。自己启动的container(容器)分为两种,一种是直接下载完整的image通过docker run命令配置相应的启动参数(挂载卷、端口等)来创建一个container(容器)。比如,直接在宿主机上通过docker pull mysql镜像,并创建一个container(容器)。
另外一种就是上文通过docker-compose来创建一个略为复杂的container(容器)。可以通过docker-compose.yaml文件来配置多个image,并且分别为多个image设置不同的启动参数、网络设置等。也可以通过docker-compose.yaml中配置image并通过build参数指定一个Dockerfile文件,通过Dockerfile的RUN等指令实现下载安装软件等操作。融合docker-compose.yaml中配置的image和Dockerfile中指令内容共同build一个image或者直接启动为一个container(容器)。