我们写程序时,都会搭建相关的环境,比如写了一个web,使用了tomcat、nginx等,现在想要把程序部署到云服务器或者在其他电脑上运行,就需要重新部署一遍环境,尤其是项目开源后,上手成本大。

docker

介绍

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 (来源于菜鸟教程)

安装

docker依赖于linux内核,因此在windows系统中需要安装Hyper-V(类似于 VMWare 或 VirtualBox)或者WSL,然后进入docker desktop官网下载安装程序,双击运行即可。安装完成后可以在虚拟机中运行命令docker —version检查是否成功安装。

镜像和容器的区别

Docker 中镜像(Image)和容器(Container)是两个核心概念,它们有以下主要区别:

  1. 定义和用途:
      1. 镜像(Image):镜像是一个只读的文件系统快照,它包含了一个应用程序及其运行环境所需的所有内容,包括代码、库、依赖项、配置等。镜像是用于创建容器的模板,可以看作是一个静态的、不可更改的应用程序打包。 1. 容器(Container):容器是一个运行时实例,它是基于镜像创建的,包含了应用程序及其所有依赖项的运行环境。容器可以被启动、停止、删除等,它提供了一个隔离的运行环境,使应用程序能够在不同的容器中运行,而不受主机环境的影响。
  2. 可变性:
      4. 镜像是不可更改的,一旦创建就不能修改。如果需要对应用程序或环境进行更改,必须创建一个新的镜像。 4. 容器是可变的,可以在运行时进行修改。你可以进入容器、安装软件、修改配置等,然后保存为新的镜像,以便将更改保存下来。
  3. 生命周期:
      7. 镜像的生命周期是静态的,它存在于磁盘上并可以被多个容器实例使用。 7. 容器的生命周期是动态的,它可以被创建、启动、停止和销毁。容器是临时的运行实体。
  4. 资源消耗:
      10. 镜像通常占用磁盘空间,并且资源消耗较低,因为它们是静态的。 10. 容器占用系统资源(CPU、内存等),因为它们正在运行应用程序和服务。

总之,镜像是容器的模板,用于创建容器实例。容器是在镜像基础上运行的可执行实体,具有自己的运行时状态。Docker 的强大之处在于它允许你使用镜像来轻松创建、分发和管理容器,从而实现应用程序的隔离和可移植性。

dockerhub

Docker Hub 是一个在线的 Docker 镜像仓库和容器注册表服务。它是 Docker 公司提供的官方服务,用于帮助开发人员和运维团队存储、分享和获取 Docker 镜像。Docker Hub 允许用户上传、存储和管理 Docker 镜像。这些镜像可以包含操作系统、应用程序、服务和其他容器化的组件,供其他用户下载和使用,类似于Github仓库。

如果要上传一个镜像,就需要编写dockerfile脚本文件,在这个文件中写入环境配置的命令行。

docker和虚拟机区别

Docker 和虚拟机是两种不同的虚拟化技术,它们在应用、资源消耗、启动时间和隔离等方面有一些重要区别。以下是 Docker 和虚拟机之间的主要区别: 架构和隔离: Docker:Docker 使用容器技术,容器共享主机操作系统的内核,但在容器内部提供隔离的用户空间。这意味着容器之间共享操作系统内核,使其轻量且启动迅速。容器之间的隔离通过 Linux 内核的命名空间和控制组技术实现。 虚拟机:虚拟机是完全虚拟化的技术,每个虚拟机都运行自己的操作系统内核。这意味着虚拟机需要更多的资源,并且启动速度较慢,因为它们需要模拟整个操作系统。 资源消耗: Docker:由于容器共享主机操作系统的内核,所以 Docker 容器通常比虚拟机更轻量,需要较少的内存和存储资源。 虚拟机:虚拟机通常需要更多的资源,因为每个虚拟机都包含自己的操作系统内核和系统文件。 启动时间: Docker:Docker 容器可以在几秒内启动,因为它们不需要启动整个操作系统内核。 虚拟机:虚拟机通常需要更长的时间来启动,因为它们需要模拟和启动整个操作系统。 应用部署和管理: Docker:Docker 容器的部署和管理相对简单,可以使用 Docker Compose 和 Kubernetes 等工具来自动化管理多个容器。 虚拟机:虚拟机的部署和管理相对复杂,需要使用虚拟化管理工具来创建、配置和监视虚拟机。 跨平台支持: Docker:Docker 容器可以在不同的操作系统上运行,前提是它们都支持 Docker。 虚拟机:虚拟机通常需要适用于特定虚拟化平台的映像,并且不太容易跨平台移植。 隔离性: Docker:容器提供了一定程度的隔离,但不如虚拟机隔离得严格。容器之间可以共享操作系统内核,这意味着一些攻击可能会影响多个容器。 虚拟机:虚拟机提供了更强的隔离性,每个虚拟机都有独立的内核和资源,攻击一个虚拟机不会影响其他虚拟机。 根据你的需求和用例,你可以选择使用 Docker 或虚拟机来虚拟化和隔离应用程序。Docker 更适合轻量级、可扩展的应用程序,而虚拟机通常更适合需要更严格隔离或运行不同操作系统的应用程序。在实际应用中,有时也会同时使用 Docker 和虚拟机,以充分利用它们各自的优势。

更改镜像源

docker默认镜像源速度很慢,可以更改为以下镜像源:

1
2
3
4
5
6
7
8
{
"registry-mirrors": [
"https://registry.hub.docker.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}

使用

可以将代码拉取到虚拟机本地,然后把代码上传到docker,进入容器,执行代码,参考以下命令

1
2
3
4
5
6
拉取代码
git clone https://github.com/oceanbase/miniob.git
挂载方式新建一个新容器,-v表示挂载,:前面表示本地文件目录,:后面表示你要在docker 容器中挂载的位置(随意,没有该目录也会新建)
docker run -it -v /usr/lyjps/miniob:/lyjps oceanbase/miniob
执行下面的命令进入容器,并创建bash终端,此时就可以使用Linux终端方式进行一些开发工作
docker exec -it miniob bash