Skip to content

容器简介

为什么需要容器

容器解决了开发最麻烦的事情: 环境配置

用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:"它在我的机器可以跑了",言下之意就是,其他机器很可能跑不了。

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

虚拟机--带环境安装的一种解决方案

它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

  1. 资源占用大

    虚拟机需要独占一部分内存和硬盘空间, 即使里面的软件没有使用到,虚拟机依然要几百MB的内存

  2. 冗余步骤多(运行效率低下)

    虚拟机内部是完整的系统, 一些系统级的操作无法跳过,

  3. 启动慢

    虚拟机启动过程和真实的电脑完全一样

为了解决这些问题, Linux 发展出了另一种虚拟化技术:Linux 容器

容器是什么

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个镜像文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、就像管理普通的代码一样。

容器如何工作

Docker 基于Linux cgroups和Linux namespace技术实现. 可以理解成Docker是一种轻量化的虚拟机, 它打包了应用程序和所需的环境, 去除了内部客户操作系统

Dockerfile是什么

Dockerfile 类似于C与C++中的makefile ,内容是一条条构建镜像的指令. 这样在拥有项目源代码时可以方便的通过简单的一条指令构建镜像

新版本的Docker支持多阶段构建, 构建时合适的编译时基础镜像, 构建完成再将文件复制到合适的运行时基础镜像的容器中. 这样构建的镜像文件较小, 而且镜像中不带有源代码. 不存在源码泄露风险

多阶段构建的Dockerfile样例

# 第一阶段 :选择Maven基础镜像(Gradle类型也可以选择相应Gradle基础镜像)完成项目编译,拷贝源代码到基础镜像并运行RUN命令,从而构建Jar包。
FROM maven:3.5.0-jdk-8-alpine AS builder

# 从源代码中复制pom.xml与源代码
ADD ./pom.xml pom.xml
ADD ./src src/

# 将项目打包成jar文件
RUN mvn clean package

# 第二阶段:拷贝第一阶段生成的Jar包到OpenJDK镜像中,设置CMD运行命令。
From openjdk:8-jre-alpine

# 从第一阶段复制jar文件
COPY --from=builder target/my-app-1.0-SNAPSHOT.jar my-app-1.0-SNAPSHOT.jar

# 声明容器8080端口对外服务 在启动镜像时使用 -p <主机端口>:8080 连接端口 未指定会随机绑定一个空端口
EXPOSE 8080

#用 java -jar 运行my-app-1.0-SNAPSHOT.jar
CMD ["java", "-jar", "my-app-1.0-SNAPSHOT.jar"]

DockerHub是什么

DockerHub类似与GitHub, Gitee 是Docker官方的镜像托管平台. 封装好的镜像可以push到网站上, 然后在服务器上pull下载.同时提供了很多官方的公开镜像提供下载,常见的有Ubuntu, Nginx, Node.js, MySQL, Tomcat, Python, Redis

Volumes是什么

为了能够保存(持久化)数据以及共享容器间的数据, 它的生命周期长于容器,可以被多个容器同时挂载