Docker


Docker

昨天实习面试被问到了docker,但是我上一次写dockerfile和使用docker-compose编排服务的时候还是在去年,忘得一干二净/(ㄒoㄒ)/~~

结果一问三不知,所以在这里做个笔记当作复习吧。

什么是Docker

  • Docker 是世界领先的软件容器平台。
  • Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核 提供的 CGroup 功能和 namespace 来实现的,以及 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
  • Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
  • 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker和虚拟机的区别

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

下面是对比图

image-20220428102645555

  • 容器是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动
  • 虚拟机 (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

未完待续。。。


Author: qwq小小舒
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source qwq小小舒 !
  TOC