Docker

简介


Docker是一个用于构建(build),运行(run),传送(share) 应用程序的平台

  1. 将应用程序打包为一个个的集装箱,小鲸鱼(Docker)就会帮我们将它们运送到任何需要的地方

集装箱

  1. 每个集装箱将下列文件打包在一起(应用程序和它运行时所需要的各种依赖包、第三方软件库、配置文件等),以便在任何环境中都可以正确的运行

集装箱内文件

为什么要使用Docker


比如我们写了一个网站:

  1. 前端使用Vue搭建界面

  2. 后端使用SpringBoot微服务框架来提供各种服务和接口

  3. 使用MySQL数据库来存储数据

  • 如果没有使用Docker,我们在生产环境和测试环境中都需要进行各种配置:

开发环境和测试环境

  • 如果有了Docker,我们可以将这些(前端、后端、数据库等)打包成一个个的集装箱,只要在开发环境中运行成功了,在其他环境中也一定可以成功。

开发环境和测试环境

Docker和虚拟机的区别


  1. 架构差异:虚拟机是基于虚拟化技术hypervisor)实现的,创建一个完整的虚拟硬件环境,模拟一台计算机,包括处理器、内存、硬盘等设备。而Docker则是基于容器化技术Containerization),使用Docker引擎访问宿主机操作系统,将应用程序打包到容器中。因此,Docker的架构更加轻量级,启动速度也更快。
  2. 隔离原理:虚拟机通常隔离整个操作系统,进程无法直接访问宿主机资源和数据,需要通过网络或共享文件夹等方式交互。Docker使用Linux内核的namespace和cgroups功能,实现对不同容器中进程的隔离,允许它们共享宿主机资源同时独立运行。

基本原理和概念


Docker中的镜像、容器和仓库

  • 镜像和容器的关系就像Java中的类和实例的关系一样:

    1. 镜像是一个只读的模版,它可以用来创建容器
    2. 容器是Docker的运行实例,它提供了一个独立的可移植的环境,可以在这个环境中运行应用程序
  • Docker仓库是用来存储Docker镜像的地方,最流行和最常用的仓库就是Dockerhub,实现镜像的共享和复用

Docker的安装


Docker Daemon

  1. Docker采用Client-Server架构模式

    • Docker Client和Docker Daemon之间通过Socket或者RESTful API进行通信
    • Docker Daemon就是服务端的守护进程,他负责管理Docker的各种资源
    • Docker Client负责向Docker Daemon发送请求,Docker Daemon接收到请求后进行处理,然后将结果返回给Client。因此我们在终端中输入的各种命令,都是Client发送给Docker Daemon的
  2. 容器化和Dockerfile

    容器化:顾名思义就是将应用程序打包为容器,在容器中运行应用程序的过程

    Dockerfile:是一个文本文件,里面包含了一条条的指令,用来告诉Docker如何来构建镜像,这个镜像中包含了我们应用程序执行的所有命令,也就是上边提到的依赖、第三方软件包、配置文件等

    这个过程简单来说可以分成三个步骤:

    • 首先需要创建一个Dockerfile,来告诉Docker构建应用程序镜像所需要的步骤和配置
    • 使用Dockerfile来构建镜像
    • 使用镜像创建和运行容器

实践环节


dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用官方Python运行时作为父镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 安装虚拟环境包
RUN python -m pip install --upgrade pip && \
pip install virtualenv

# 创建虚拟环境
RUN virtualenv venv

# 每次进入容器时激活虚拟环境
ENV VIRTUAL_ENV=/app/venv
ENV PATH=/app/venv/bin:$PATH

CMD ["bash"]

创建镜像:

1
2
3
# -t表示镜像标签 比如python-venv:1.0/python-venv:lastest等
# .表示dockerfile所在的目录
docker build -t python-venv .

创建容器:

1
2
3
# 当 -i 和 -t 一起使用时,Docker 将为你提供一个交互式 shell,类似于在本地终端中使用命令行。这意味着你可以在容器中执行命令、输入数据、查看输出等。这种方式特别适用于调试、运行交互式程序或者简单的命令行操作。
# --rm 会在容器停止后自动删除容器
docker run -it --rm --name my-python-container python-venv

假设主机上的文件夹路径是 /path/to/your/project,你想在容器中将这个文件夹挂载到 /app 目录下,可以使用以下命令启动容器:

1
docker run -it --rm -v /path/to/your/project:/app my-python-container

Docker
https://adzuki23.github.io/2024/05/15/Docker/
作者
Hongyu Li
发布于
2024年5月15日
更新于
2024年8月4日
许可协议