介绍
docker之前就有过了解,最近工作中有用到,便准备系统的学习一下,顺便通过博客的形式做笔记。
docker和虚拟机(如VMware)的区别:docker比虚拟机要轻量级,虚拟机是模拟硬件,然后在虚拟的硬件上安装操作系统,操作系统本身就是重量级软件,而docker则是基于容器的虚拟化技术,你可以把容器理解为沙箱环境,当然容器化的技术是依赖于操作系统的,在Linux中是基于cgroups来实现的,Windows家庭版安装docker貌似还是依赖虚拟机(Windows专业版则基于Hyper-V实现)。容器中只会有需要运行的应用以及它依赖的必要库(比如依赖一些操作系统的必要库文件,而不向虚拟机一样需要整个操作系统)。docker容器中的软件是直接与系统通信,而虚拟机中的软件与系统通信则多了一层“从操作系统”(虚拟机中的操作系统)。
举个例子,假设我电脑上已经安装了MySQL,但是我需要安装另外一个版本的MySQL做测试用,如果我使用虚拟机,则需要在电脑中安装并启动一个虚拟机,在虚拟机中安装操作系统,然后在虚拟机操作系统中安装MySQL,整个虚拟机跑起来占用资源是相当大的(操作系统+MySQL)。
如果我使用docker,则只需要一个MySQL镜像,将镜像加载到容器中,然后启动容器,这样就运行了一个完全独立于本机的MySQL服务,效果与虚拟机的完全一样,而且这个MySQL服务占用的资源很小,只有MySQL软件本身和一些必要的库文件(必要的库+MySQL),而不是整个操作系统+MySQL软件,非常轻量级的。
几个概念
docker的三个重要概念:
- 镜像
在docker中,镜像属于只读层,可以理解为一个软件包,有点类似操作系统镜像的IOS文件,不过比操作系统较轻量级很多。 - 容器
简单的说,容器可以理解为一个镜像在docker中的实例,容器启动之后便是 docker daemon 的一个子进程,同一个镜像可以多次运行,可以形成多个容器,每个容器都会有一个容器ID(containerID),当然你也可以指定一个容器名称(containerName),容器名称要唯一。
用面向对象语言来打个比方,如果用Java语言中的类来比作镜像(如Thread类),则容器是这个类的一个对象实例(即 new Thread()),容器本身可以运行和停止,有点像 thread.start() 和tread.stop(),这个比方不一定恰当,能够增强理解就行。
注意: docker本身不是容器,它是创建容器的工具,是一个容器引擎。 - 仓库
仓库是用于存放镜像的,有点类似于maven仓库。用于集中管理镜像文件。
常用命令
镜像相关命令
以运行Python容器为例:
docker search python #搜索Python镜像
docker pull python:3.8.2 #拉取Python3.8.2的镜像
docker images #查看本地镜像列表,找到 Python 对应的 IMAGE ID。
docker images python #列出名称未python的所有镜像
docker image ls #执行效果好像与”docker images“相同,没有具体研究过差异
docker history [imageId] #查看镜像创建历史
run命令
如下 “b5b4d78bc90c” 为我电脑中Python的 imageId。
可以执行 “docker images python” 找到 imageId 。
docker run -it b5b4d78bc90c /bin/bash #用镜像启动一个容器,并且直接进入该容器:输入"exit"退出容器后容器进程也停止,使用“docker ps -a”可以查看该容器运行状态为Exited。
docker run -itd b5b4d78bc90c /bin/bash #使用镜像启动一个容器,并在后台执行&#