什么是Docker
Docker是一种高级容器引擎,它可以简化创建、管理、运行和分发应用程序的过程。
Docker和虚拟机的不同
Docker的系统是依赖于宿主机的系统,而虚拟机是一个虚拟出来的系统。并且Docker仅仅只有能够运行某个镜像最小需要的部分,而虚拟机有额外的许多东西。综上Docker的镜像会比较小,并且启动会比虚拟机快。
Dockerfile
什么是Dockerfile
Dockerfile是一个文本文件,用来自动构建Docker镜像。由于docker镜像采用了联合文件系统,所以其实在Dockerfile中每一条命令就会构建一层,并且每一条指令本质上就是在描述该层如何构建。
Dockerfile常用的指令
- FROM
- 使用FROM为后续指令建立基础镜像。在所有有效的Dockerfile中,FROM是第一条指令
- LABEL
- 用户组织项目映像,模块,许可等。在自动化部署方面LAVEL也有很大用处。在 LABEL 中指定一组键值对,可用于程序化配置或布署 Docker 。
- CMD
- 指定容器启动后要干的事情
- Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
- 它和RUN命令的区别
- CMD是在docker run时运行
- RUN是在docker build时运行
- MAINTAINER
- 镜像维护者的姓名和邮箱地址
- RUN
- 容器构建是需要运行的命令
- 两种格式
- shell格式
- exec格式
- RUN是在docker build时运行
- EXPOSE
- 当前容器对外暴露的端口
- WORKDIR
- 指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点
- USER
- 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
- ENV
- 用来在构建镜像过程中设置环境变量
- 例如
JAVA_HOME
- 例如
- 用来在构建镜像过程中设置环境变量
- ADD
- 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
- COPY
- 与ADD相似,只不过ADD会进行一些处理,而COPY不会
- VOLUME
- 指定容器数据卷,用于数据保存和持久化工作
- ENTRYPOINT
- 也是用来指定一个容器启动时要运行的命令
- 类似CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序
- 说明
- ENTRYPOINT可以和CMD一起用,一般是变参才 会使用CMD,这里的CMD等于是在给ENTRYPOINT传参。
- 当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成
<ENTRYPOINT> "<CMD>"
虚悬镜像
是什么
仓库名和标签名都会<none>
的镜像,一般这种镜像都是失去存在价值的镜像,不建议使用。推荐删除掉虚悬镜像
批量删除方法
docker image prune
docker-compose
是什么
docker compose是一种.yml
格式的文本文件,用来统一管理多个docker容器组成一个应用。并且它能够帮助我们按顺序启动容器,也能够帮助我们一键启动,一键停止,而且能够通过这份文件做自动化部署。
使用docker-compose时要如何保证容器A先于容器B运行?
在docker-compose文件中,有一个depends_on
属性,在要部署的某个服务中,可以用该属性指定哪些服务要先于该服务运行(依赖关系)。
一个完整的Docker的组成部分
- DockerClient 客户端
- Docker Daemon 守护进程
- Docker image 镜像
- DockerContainer 容器
Docker容器的生命周期
- 创建
- 运行
- 暂停
- 取消
- 启动
- 停止
- 重启
- 杀死(kill)
- 销毁
Docker常用网络模式
- 网桥(bridge):默认模式
- 主机(host):与主机共用ip与端口
- 自定义模式:仅仅直接创建的话,是网桥模式的升级版,允许容器之间以服务名ping对方。
Docker配置文件的位置
- Ubuntu:/etc/default/docker
- CentOS:/etc/sysconfig/docker
Docker的优点
1.部署方便
只需要将镜像拉取到本地之后,执行一些命令就能启动,省去许多繁杂的配置
2.环境容易统一
我们经常遇到每个人的配置和环境都不太一样的情况,正常情况下,可能不会出现问题。但是一旦出现问题,将要耗费很多的人力物力去解决这些配置、环境、依赖的问题。但是使用了docker之后,可以很方便的统一环境和版本,而这仅需要一个相同的镜像。
3.隔离性好
不管是开发还是生产,往往我们一台机器上可能需要跑多个服务,而服务各自需要的依赖配置不尽相同,假如说两个应用需要使用同一个依赖,或者两个应用需要的依赖之间会有一些冲突,这个时候就很容易出现问题了。最好还是将其隔离起来。而容器在这方面有天生的优势,每一个容器就是一个隔离的环境
4.管理成本低
随着大环境的发展,docker等容器的使用和学习的成本也是愈发降低
什么是Docker Hub
Docker Hub是类似与GitHub的网站,GitHub是托管代码的平台,而Docker Hub是托管镜像的平台。
Dockerfile中ADD和COPY的区别(再强调一下)
COPY仅仅是把你需要的文件简简单单拷贝进去镜像一份,而ADD会将拷贝进去的压缩包进行解压。
一个Docker容器能够同时运行多个应用吗
可以,但是一般不推荐。前面提到docker有一个隔离性的优点,如果在容器中同时运行多个,那会导致整个优点消失。不过如果一定得运行多个应用的话,有其他的解决方案,比如:可以用过额外的进程管理机制
希望我的整理能够帮助到大家