特点
轻量 : 在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
标准 : Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。
安全 : Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。
镜像、容器、仓库:
一个镜像就代表一个软件;
基于某个镜像运行就是生成一个程序实例,这个程序实例就是容器;
仓库是用来存储 Docker 中所有镜像的。
其中仓库又分为远程仓库和本地仓库,和 Maven 类似,倘若每次都从远程下载依赖,则会大大降低效率,为此,Maven 的策略是第一次访问依赖时,将其下载到本地仓库,第二次、第三次使用时直接用本地仓库的依赖即可,Docker 的远程仓库和本地仓库的作用也是类似的。
容器与虚拟机的比较
容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
因此容器要比传统虚拟机更为轻便。
虚拟机更擅长于彻底隔离整个运行环境 。如云服务提供商通常采用虚拟机技术隔离不同的用户。
Docker 通常用于隔离不同的应用 ,例如前端,后端,数据库,消息队列。
常用命令
systemctl start docker
当开启了Docker服务的时候,docker的守护进程 会一直等待客户端发出命令,一旦接收到命令,docker就会去镜像仓库去找,然后拉到本地。
docker images 查看所有镜像
docker rmi 删除镜像 -f强制删除
docker pull + 镜像名
docker run:先看本地是否有镜像,没有的话自动pull
docker run = docker create+ docker start
-d(在后台运行) , --name 指定名称 -p 做端口映射
docker start 开启容器内的进程,docker stop 关闭容器内的进程
docker exec 进入容器中的进程
重启虚拟机的时候,容器只是被关闭了,不需要docker run,直接docker start就可以了。
如果每次都docker run,就会重复创建容器。
端口映射 就是通过宿主机的端口能访问到的,比如我docker容器中有两个mysql服务,需要映射到两个不同的端口,否则怎么区分我用哪个呢?
数据卷
一个虚拟目录,作为中间桥梁,完成容器内目录和宿主机(虚拟机)目录的映射,这样对宿主机目录进行操作的时候,容器目录也会有相应的变动。
容器创建时,如果数据卷不存在,则自动创建(不需要手动create数据卷)
同时,如果没有指定数据卷,也会默认分配一个匿名卷(名字随机生成的)
这样创建,我们就可以指定数据卷的名称
docker volume inspect 可以看宿主目录的具体位置
docker volume ls 可以看一共有哪些数据卷(包括匿名卷)
删除数据的时候,先删数据,再删数据卷。
使用docker volume prune:提前打开要用的容器,再prune,以防删除有用的数据。
本地目录
数据卷目录的结构比较深(Docker服务指定的目录),不易记忆
因此我们也可以直接挂载到本地目录,即直接将宿主目录与容器目录进行挂载
数据卷挂载和本地挂载
数据挂载是通过增加一个数据卷(桥梁),将容器内的数据流向数据卷,再流向宿主机目录,这个目录是由docker指定的,不可更改。正是因为这个目录不可改变性,将来在进行宿主机之间的数据迁移的时候,很方便,安全。同时数据卷挂载一般用来存放需要持久化的文件。
本地挂载是直接将容器内的数据挂载到宿主机目录(可以自定义,方便记忆的路径)。因此不受docker管理维护,将来在数据迁移的时候不安全。也可以用来存放持久化的文件。本地挂载更适合需要直接访问宿主机文件系统的场景。
自定义镜像
之前用的都是别人准备的,如果自己要部署一个java项目,并将其打包成镜像。
镜像的结构:分层存储的架构 。镜像实际是由多层文件系统联合组成。
TODO