Docker入门
Docker 入门
一、 Docker 介绍
Docker 是一个用于 构建(build)、运行(run)、传送(share) 应用程序的平台。
通过 Docker 我们可以将应用程序及其运行时所依赖的环境、第三方软件库、配置文件等打包在一起,行成一个个“集装箱”,运送至其他平台,以便于在任何环境中正确地运行。
二、 Docker 应用场景
应用隔离、环境配置、 安装部署、持续集成、持续发布、DevOps
例如,我们利用目前较为主流的前后端分离架构写了一个网站,前端使用 Vue 来构建网站的界面,后端使用 Java 的 SpringBoot 微服务架构来提供各种服务和接口,使用 MySQL 数据库来存储数据。
如果不使用 Docker,我们需要先安装 NodeJs 环境、安装各种 npm 依赖包,配置 Java 运行环境,安装 SpringBoot 微服务的各种第三方依赖包,安装 MySQL 数据库,以及配置各种环境变量、启动服务等。与此同时,如果要把该网站部署在测试环境和生产环境上,还需要将上述步骤再重复一遍。
相反,如果我们使用 Docker,只要我们在开发环境中配置好了所有环境并将其打包成一个“集装箱”,那么就可以直接在其他环境中直接运行。
三、容器和虚拟机的区别
(一)传统虚拟机
传统虚拟机软件包括:VMware 、 Virtalbox、 Parallels Desktop 、 WSL 、 Hyper-V 等
虚拟机是完整的操作系统,可以在该操作系统中运行各种支持的应用程序。虚拟机实际上是利用 虚拟化技术(Hypervisor) 将物理资源虚拟化为多个逻辑资源,它可以将一个物理服务器虚拟为多个逻辑服务器,每个逻辑服务器都有自己的操作系统、 CPU 、内存、硬盘和网络接口等。逻辑服务器之间是完全隔离的,可以独立运行。
虚拟机在一定程度上实现了资源的整合,可以将一台服务器的计算能力、存储能力、网络资源分配给多台虚拟服务器,实现多台服务器的功能。但虚拟机也存在一定的缺点,每台虚拟服务器都将占用非常多的资源,且启动速度慢。
实际上我们并不需要让每台服务器都运行多个虚拟机。通常情况下,每台物理服务器都有其特定的用途,如 Web 服务器只需提供收发数据包的功能即可,并不需要一个完整的操作系统,因此没有必要在该服务器上使用虚拟机来收发数据包。
(二)容器
容器是一个虚拟化技术,一定程度上类似虚拟机,是一个独立的环境。Docker 是容器的一种实现方式,是一个容器话的解决方案和平台。
与虚拟机不同的是,容器中并不需要运行一个完整的操作系统便可以运行应用程序,因此其占用的资源更少、启动速度更快。
四、基本原理
(一)镜像 images
镜像是一个只读模版,可以用来创建容器。(类)
(二)容器 containers
容器是 Docker 的运行实例,提供了一个独立的可移植的环境,可以在该环境中运行应用程序。(对象)
(三)仓库 registry
用于存储 Docker 镜像。
五、安装配置
(一)安装
macOS 安装
下载安装即可。安装后运行 Docker,便可以在终端中使用 Docker 命令。
Windows 安装
下载安装完毕后,需要在系统设置-Windows 功能中开启 Hyper-V 功能,才能正常启用 Docker 。
(二)容器化
- 将应用程序打包成容器,然后在容器中运行应用程序的过程。
- 容器化步骤:
- 创建一个 Dockerfile ;
- 使用 Dockerfile 构建镜像;
- 使用镜像创建和运行容器。
- Dockerfile:文本文件,包含了多条指令,用于指导 Docker 构建镜像。通常包括精简版的操作系统、应用程序的运行环境、应用程序本体、第三方依赖包或库、应用程序的配置文件、环境变量等。
六、常用命令
七、构建镜像并启动容器
(一)创建 Dockerfile 文件
创建 HelloDocker 文件夹;
在项目文件夹中创建 index.js 文件并键入简单 JS 命令,使之在控制台输出语句;
1
2// 在控制台输出语句
console.log("Hello World!")现在,在开发环境中已经可以输出语句了;
但是,如果我们需要在其他环境也运行该程序,就需要安装兼容的操作系统、JS 运行环境 NodeJS,并将该程序及其依赖包和配置文件一并复制到新的环境中,才能正常运行;
此时,就可以利用 Docker,将这些步骤打包起来,写入 Dockerfile 文件中。
在项目文件夹中创建 Dockerfile 文件并写入相关命令;
设置镜像
镜像是按层次结构来构建的,每一层都是基于上一层的,因此需要先指定一个基础镜像;然后在该镜像的基础上添加应用程序。
这里使用到了 NodeJS ,因此需要添加其对应的基础镜像,本来应该从 Linux 的基础镜像(操作系统)开始,例如 alpine ,但 NodeJS 的镜像实际上已经是基于 Alpine 镜像构建的了,所以我们可以直接使用 NodeJS 的镜像作为我们的基础镜像。
将应用程序复制到 Docker 中
1
COPY 源文件路径 目标路径
在镜像中运行应用程序
1
CMD ["可执行程序名", "可执行程序接受的参数"]
(二)创建镜像
在终端中创建镜像
1
2
3docker build -t 镜像名称[:版本号] 目录
// 版本号可省略,不指定版本默认使用最新版本
// . 表示当前目录查看镜像是否创建成功
1
2docker images
// docker image ls
(三)运行镜像
1 | docker run 镜像名称 |
(四)在其他环境中运行镜像
将镜像复制到当前环境中,运行即可;
将镜像上传至 Dockerhub 中,在任意环境中 pull 拉取再运行即可。
1
docker pull 用户名/镜像名称