Docker
昨天实习面试被问到了docker,但是我上一次写dockerfile和使用docker-compose编排服务的时候还是在去年,忘得一干二净/(ㄒoㄒ)/~~
结果一问三不知,所以在这里做个笔记当作复习吧。
什么是Docker
- Docker 是世界领先的软件容器平台。
- Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核 提供的 CGroup 功能和 namespace 来实现的,以及 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
- Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker和虚拟机的区别
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
下面是对比图
- 容器是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
- 虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序允许多个 VM 在一台机器上运行。每个 VM 都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此 占用大量空间 。而且 VM 启动也十分缓慢 。
总之:虚拟机更擅长于彻底隔离整个运行环境;Docker 通常用于隔离不同的应用,例如前端,后端以及数据库。
Docker 的基本概念:镜像、容器、仓库
镜像
是一种轻量级、可执行的独立软件包,我们把应用程序和配置依赖打包好形成一个可交互的运行环境(包括代码、运行时需要的库、环境变量、配置文件等),这个打包好的运行环境就是image镜像文件
Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构 。镜像实际是由多层文件系统联合组成。
容器
镜像运行的实体,它们的关系就像java中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此
仓库
集中存放镜像文件的地方
常用命令
1.基本命令
docker version # 查看docker版本
docker images # 查看所有已下载镜像,等价于:docker image ls 命令
docker ps #查看正在运行的容器,加-a查看包括已经停止的容器
docker image prune # 清理临时的、没有被使用的镜像文件。-a, --all: 删除所有没有用的镜像,而不仅仅是临时文件;
2.拉取镜像
docker search mysql # 查看mysql相关镜像
docker pull mysql:5.7 # 拉取mysql镜像
docker images # 查看所有已下载镜像
docker images redis # 该指令能够查询指定镜像名
3.删除镜像
通过 docker rmi [image] (可以通过标签名称或者镜像 ID删除)
4.容器指令
运行一个容器:
docker run redis
通过该方式运行的 tomcat 是不能直接被外部访问的,因为容器具有隔离性,若是想直接通过 3306 端口访问容器内部的 redis,则需要对宿主机端口与容器内的端口进行映射:
docker run -p 6379:6379 redis:6.0.8
第一个 6379为宿主机端口,第二个 6379为容器内的端口,外部访问 6379端口就会通过映射访问容器内的 6379端口。
容器还能够以后台的方式运行,这样就不会占用终端:加个参数 -d
启动容器时默认会给容器一个名称,但这个名称其实是可以设置的,使用指令:
docker run -d -p 6379:6379 --name redis-test redis-test
容器的停止、重启指令:
启动容器:
docker start redis-test
重启容器
docker restart redis-test
停止容器
docker stop redis-test
当容器被停止之后,容器虽然不再运行了,但仍然是存在的,若是想删除它,则使用指令
docker rm redis-test
当容器以后台的方式运行时,我们无法知晓容器的运行状态,若此时需要查看容器的运行日志,则使用指令
docker logs redis-test
这样的方式显示的日志并不是实时的,若是想实时显示,需要使用-f
参数;通过-t
参数还能够显示日志的时间戳,通常与-f
参数联合使用
docker logs -ft redis-test
进入容器
docker exec -it redis-test bash
Dockerfile
未完待续。。。