docker工作原理

  • 环境隔离

  • 手工快速部署

  • 工作原理

docker的整体分为四个部分:远程镜像仓库、本地镜像、本地容器、docker;
跟运行应用一样理解:github远程代码,本地克隆代码,运行应用,idea;
远程镜像仓库是云端的镜像仓库,供用户上传、下载需要的镜像,默认是dockerhub,也可以换成其他仓库;
本地镜像是下载好的镜像,或自己打包好的镜像,镜像可以理解为容器的模板,也可以理解为电脑安装操作系统的光盘
本地容器是真正运行的实例,容器是根据镜像创建的,容器被创建后,即可跟Linux系统一样独立使用。
docker软件是连接以上三个部分的基座,也是运行容器的引擎。docker是可以跨平台安装的,官方有详细的安装步骤说明,包括基于Linux、Unix的系统、Windows等。

所以一般相同镜像可以跨平台使用,其中Windows的docker存在一些限制。


docker镜像

docker镜像名称是两部分组成的,用冒号隔开。一是镜像名、二是tag版本,比如: mysql:8.0
值得一提的是,不同tag版本的镜像是完全独立的,技术上是不依赖关联的,更多是业务上的关联。

如mysql的5.7、8.0版本都有独立的tag版本,DockerHub等镜像仓库有镜像的使用说明和tag列表。

镜像相关的命令如图所示:包括查看本地镜像、搜索远程镜像仓库、 上传/下载镜像、打包/导入镜像文件等

常用命令如下:


docker容器

容器是真正的运行实例,容器可以隔离网络、文件、进程等环境,一个容器是一个沙盒隔离环境。
docker容器跟虚拟机技术是不同的。docker容器是基于系统内核的相关容器技术,不需要独立分配物理资源,不需要启动完整的操作系统,所以docker容器启动速度更快、更轻量,但是多个容器是共用宿主机的内存、CPU等物理资源的,可能会出现互相抢占物理资源的情况
容器是根据镜像创建的,容器被创建后,即可像操作Linux系统一样使用。容器中被修改的文件 不会同步更新到原来的镜像中,也不会影响通过相同镜像创建的其他容器。
常用命令如下:

容器创建的方式

创建Docker容器有两种方式:一是通过命令直接创建,二是通过dockerfile创建,两者的区别是:通过命令直接创建需要完整的镜像dockerfile则可以使用不完整的镜像,docker会根据dockerfile中的脚本指令进一步完善容器 ,诸如下载文件、修改设置等,执行完dockerfile的指令才算是容器创建完成。dockerfile更灵活一些,但是容器创建的时间更长、稳定性也不佳,特别是需要下载文件但网络不好的情况。
我们偏向使用命令直接创建容器,特别是项目交付、快速部署等场景。尽管完整的镜像更大一些,几个G是常有的事情,但是这样更稳定一些。

容器创建的命令

器创建的命令一般分为几个部分:基础参数、挂载宿主机目录、网络设置、环境变量设置、基础镜像、容器每次启动执行的命令等。

基础参数是设置容器的基础参数,如指定运行cpu、内存限制、后台启动、容器名称等

挂载宿主机目录是将宿主机的目录映射到容器当中,容器修改该目录下的文件,会影响到宿主机的文件

网络设置是设置容器的网络,默认情况下,容器的网络是隔离的,即容器内的127.0.0.1指向的是容器本身,而不是宿主机。网络设置一般设置端口映射,如将宿主机的8001映射到容器的8080,当访问宿主机的8001端口时,会自动转发到该容器的8080端口。
如果确定多个容器及宿主机的程序端口不会冲突,可以设置共用宿主机的网络,这样容器内的127.0.0.1会指向宿主机,容器内的端口也不需要额外映射

环境变量设置是设置容器内的环境变量,最常用的设置是设置时区,容器中使用常规设置环境变量的方法是不会生效的。另外,环境变量的设置也可以简化一下功能配置,如MySQL的镜像可以通过环境变量配置初始密码。

容器每次启动执行的命令,是容器每次启动、重启后执行的命令 一般为shell指令,当命令执行完成后,容器会自动停止。如果希望容器一直运行不退出,可以将执行的命令设置为bin/bash
如果容器需要启动多个程序,且这些程序都是后台运行的话,则一般是使用shell脚本,脚本中启动相关程序,在脚本的最后添加/bin/bash防止容器自动退出。

这里值得一提的是,容器中常规的开机启动程序的方法是不会生效的,解决方案也是通过shell脚本解决。