映射的概念:
将容器内的端口映射到主机的端口上,这样就可以通过主机的网络接口与容器内部进行通信。主机上对应端口的请求会被转发到容器内部,从而实现对容器内部程序的通信访问(注意!这里提到的容器内部的端口并不一定是dockerfile中EXPOSE指定的端口号,容器内部的端口号通常是指容器内部程序运行时指定的端口号)
实现映射:
通常实现映射(Mapping),是在启动容器时实现的。需要使用-p参数。
例如:执行命令 docker run -p host_port:container_port 镜像名
host_port:想要映射的主机端口号
container_port:容器内部端口号
通过上述命令新建容器之后,便可以通过:host_ip:host_port访问容器内部的程序
挂载的概念:
挂载是指将主机上的目录和文件与容器内部的文件系统进行关联。挂载完成之后,可以实现数据共享、持久化、文件资源共享、配置文件动态配置、日志收集、容器间相互通信。
数据持久化:挂载之后,容器内部的数据在容器重启或者删除之后,依然会存在于宿主机指定的目录或者文件中。
数据共享:重新创建容器时,再次指定该目录或者文件为容器的挂载目录或者文件时,新的容器仍可以继续访问之前容器的数据。
资源共享:文件共享(挂载目录或者的文件读写实时同步)、硬件设备共享(容器可以使用宿主机的usb、摄像头等)、网络设备共享(容器可以通过网络访问宿主机上的网络接口、访问外部网络或与其他容器进行网络通信)、环境变量共享等。
配置文件动态配置:将配置文件挂载到容器中,基于资源共享的特性,变更配置文件之后,无须重构镜像,配置变更也能在容器中直接生效。
日志收集:将宿主机的日志目录挂载容器中,容器内部的日志额可以实时写入宿主机,方便日志文件的收集和分析。
容器间相互通信:多个容器挂载统一目录或者文件实现相互通信。
实现挂载:
docker容器实现挂载的方式有多种,如使用 -v 参数 --mount参数、使用docker compose管理容器化程序、使用使用 Kubernetes 的挂载卷等。每种方式需要结合实际情况使用。下面我将以最简单的-v参数举例(因为我是测试,其他的我仅做了解,-v目前够用,其他的大家可以自行探索)
我以我代码挂载为例:我不想每次更改代码之后,都需要去重构镜像生效,因此我这里用到了挂载,挂载之后会基于资源共享的特性,完成代码实时更新同步,而不用去重新构建镜像。
使用-v 参数实现容器的挂载:
执行命令:docker run -d -v /host/path:/container/path 镜像名
其中,/host/path是我代码在宿主机中的路径,/container/path是指容器的内部的代码存放路径。
执行结果如下:出行了容器的ID之后,代表已经成功启动。
检查一下是否挂载成功,在宿主机更改一下代码的内容,我这更改的是网页名称,更改完成之后,重新刷新网页,发现网页名称已经同步更改。表示我已经成功挂载。
-------------学海无涯