大家好,欢迎来到停止重构的频道。
本期我们讨论docker。
docker的好处是可以隔离环境,多容器间环境隔离互不影响。
而且得益于优秀的镜像机制,可以用于手工快速部署。
我们按这样的顺序展开讨论:
1、 docker的工作原理
2、 docker镜像
3、 docker容器
4、 容器创建的方式
5、 容器创建命令详解
docker的整体分为四个部分:远程镜像仓库、本地镜像、本地容器、docker软件。
远程镜像仓库是云端的镜像仓库,供用户上传、下载需要的镜像,默认是dockerhub,也可以换成其他仓库。
本地镜像是下载好的镜像,或自己打包好的镜像,镜像可以理解为容器的模板,也可以理解为电脑安装操作系统的光盘。
本地容器是真正运行的实例,容器是根据镜像创建的,容器被创建后,即可跟Linux系统一样独立使用。
docker软件是连接以上三个部分的基座,也是运行容器的引擎。docker是可以跨平台安装的,官方有详细的安装步骤说明,包括基于Linux、Unix的系统、Windows等。
所以一般相同镜像可以跨平台使用,其中Windows的docker存在一些限制。
镜像可以理解为电脑安装操作系统的光盘,是只读的,不能对镜像本身进行修改。
镜像是多种多样的,Linux镜像可以在Linux、windows的docker中使用,windows镜像只能在windows的docker中使用。
docker镜像名称是两部分组成的,用冒号隔开。一是镜像名、二是tag版本。如果忽略tag版本,则会默认选择latest版本。
值得一提的是,不同tag版本的镜像是完全独立的,技术上是不依赖关联的,更多是业务上的关联。
如mysql的5.7、8.0版本都有独立的tag版本,DockerHub等镜像仓库有镜像的使用说明和tag列表。
镜像相关的命令如图所示:包括查看本地镜像、搜索远程镜像仓库、 上传/下载镜像、打包/导入镜像文件等。
容器是真正的运行实例,容器可以隔离网络、文件、进程等环境,一个容器是一个沙盒隔离环境。
docker容器跟虚拟机技术是不同的。
docker容器是基于系统内核的相关容器技术,不需要独立分配物理资源,不需要启动完整的操作系统,所以docker容器启动速度更快、更轻量。
但是多个容器是共用宿主机的内存、CPU等物理资源的,可能会出现互相抢占物理资源的情况。
容器是根据镜像创建的,容器被创建后,即可像操作Linux系统一样使用。
容器中被修改的文件 不会同步更新到原来的镜像中,也不会影响通过相同镜像创建的其他容器。
如果需要将修改后的容器放到别的机器中运行。
一般的做法是:先将容器打包成镜像,然后将镜像上传到远程仓库或打包成镜像文件,之后在目标机器中下载或导入镜像,最后再根据此镜像创建容器。
关于容器的相关命令如图所示:如启动关闭容器、将容器打包成镜像等。
这里值得一题的是 ,一些容器设置是无法在容器创建后修改的,所以在容器创建时先弄好。
创建Docker容器有两种方式:一是通过命令直接创建,二是通过dockerfile创建。
两者都是基于docker镜像创建的。
但两者的区别是:通过命令直接创建需要完整的镜像,dockerfile则可以使用不完整的镜像。
docker会根据dockerfile中的脚本指令进一步完善容器 ,诸如下载文件、修改设置等,执行完dockerfile的指令才算是容器创建完成。
dockerfile更灵活一些,但是容器创建的时间更长、稳定性也不佳,特别是需要下载文件但网络不好的情况。
我们偏向使用命令直接创建容器,特别是项目交付、快速部署等场景。尽管完整的镜像更大一些,几个G是常有的事情,但是这样更稳定一些。
容器创建的命令一般分为几个部分:基础参数、挂载宿主机目录、网络设置、环境变量设置、基础镜像、容器每次启动执行的命令等。
基础参数是设置容器的基础参数,如指定运行cpu、内存限制、后台启动、容器名称等。
挂载宿主机目录是将宿主机的目录映射到容器当中,容器修改该目录下的文件,会影响到宿主机的文件。
网络设置是设置容器的网络,默认情况下,容器的网络是隔离的,即容器内的127.0.0.1指向的是容器本身,而不是宿主机。
网络设置一般设置端口映射,如将宿主机的8001映射到容器的8080,当访问宿主机的8001端口时,会自动转发到该容器的8080端口。
如果确定多个容器及宿主机的程序端口不会冲突,可以设置共用宿主机的网络,这样容器内的127.0.0.1会指向宿主机,容器内的端口也不需要额外映射。
docker也提供更加复杂的多容器网络环境设置,但是不太常用,这里不作展开。
环境变量设置是设置容器内的环境变量,最常用的设置是设置时区,容器中使用常规设置环境变量的方法是不会生效的。
另外,环境变量的设置也可以简化一下功能配置,如MySQL的镜像可以通过环境变量配置初始密码。
容器每次启动执行的命令,是容器每次启动、重启后执行的命令 一般为shell指令,当命令执行完成后,容器会自动停止。
如果希望容器一直运行不退出,可以将执行的命令设置为bin/bash。
如果容器需要启动多个程序,且这些程序都是后台运行的话,则一般是使用shell脚本,脚本中启动相关程序,在脚本的最后添加/bin/bash防止容器自动退出。
这里值得一提的是,容器中常规的开机启动程序的方法是不会生效的,解决方案也是通过shell脚本解决。
本期介绍了docker的基础知识和常用的技术细节 ,docker的其他功能和技术细节可以在遇到具体问题时再深入学习。
docker是对单台服务器的环境处理,如果是多台服务器的容器编排,则需要额外使用容器集群编排软件。