随着docker/K8S技术的日渐成熟, 越来越多的公司将自己的服务放进docker里面来运行, 以此来做到资源隔离和部署的简化。
docker与虚拟机的区别
从下图可以看出, docker与VM相比, 结构要简单, 更加轻量一些, docker的dockerd程序是操作系统的一个进程, 每个docker内部也不是有自己的操作系统, 这些都是公用主机的资源, 因此docker比虚拟机要轻很多, 与之相应的,它的隔离性比虚拟机要差一些。
docker的基本原理
docker是通过namespace来隔离每个的docker, 使得用户感觉在独立使用一套自己的环境。待续。。。
docker镜像
要创建docker, 必须先创建镜像, 这里包含了docker索要包含的程序以及相关的依赖, 如何初始化并且启动应用程序。
- 获得基础镜像
通常可以先到官方的镜像上面下载一个基础镜像, 作为我们自己的镜像的基础,如果有的话更好,没有的话, 可以通过docker search命令查找摸个关键字相关的现有镜像, 然后下载到本地, 通过docker history命令来查看某个镜像的分层情况, 选择某个commitID作为新镜像的基础。docker search centos docker pull centos docker history centos
- 生成Dockerfile文件
在获得了基础镜像之后, 我们有需要产生一个Dockerfile文件, 来制定我们的镜像里面需要的操作, 常见的有如下几个:命令 说明 ADD 将本地文件添加到镜像里面去, 注意有些类型的压缩文件是会自动解压缩的, 比如, tar.gz, 而有些如.zip不会 RUN 后面跟shell命令, 注意这是在docker里面 CMD 只能有一条, 多个区最后一条 ENTRYPOINT docker启动时, 执行的第一条命令, 可以是可执行程序, 加参数 EXPOSE 对外暴露的端口号 - 生成镜像
生成镜像可以用如下命令:docker build -t "xxx:1.0.0" .
- 特殊情况处理
正常情况下, 一个docker应该包含一个应用程序, 并且由它作为docker内的1号进程, 这样docker的生命周期与其内部运行的程序相互绑定, 通过外部工具, 比如K8S的监控, 可以实现自动failover的功能。
但是有时候, 我们的应用程序由于某些原因, 需要多个程序运行在一个docker内, 这时候就需要先启动一个init进程, 由它来block住docker不会退出, 其他的要运行的程序采用开机启动的方式。
docker的运行与管理
常见的docker命令:
- 启动docker
docker run -it -d --privilege IMAGE_XXX -v host_path:docker_path -p 8080:8080
- 监控docker状态
docker ps; docker inspect dockerId
- 删除docker
docker rm -f dockerid