什么是Docker
Docker本质上是一种容器化技术,用于将应用程序及其所有依赖打包到一个标准化的单元中。这些单元(容器)可以在任何运行Docker的机器上运行。每个容器是相互隔离的,具有自己的文件系统、网络和进程空间。
以下是大白话的理解,也是我在理解Docker中的一些误区:
之前大家都说Docker就像一个集装箱,就跟它的图标一样,可是在我之前的理解中,比如创建一个docker_A,然后mysql、redis、mongodb等都安装在这个docker_A里,当我再重新建一个docker_B,又可以安装一套mysql、redis、mongodb等工具进去,有点类似于python的虚拟环境。这似乎也符合集装箱的思想,打包到一个Docker中,但这其实这样理解Docker是不对的。
Python虚拟环境是用于隔离Python项目的依赖,而**Docker容器是用于隔离整个应用程序及其所有依赖,包括操作系统级别的依赖。**Docker是可以跨服务器,跨平台的(PS:为了确保容器在不同环境中的稳定运行,可能需要对容器配置进行一些调整,Docker有提供工具)
在Docker的使用中,通常遵循单一职责原则,这意味着每个Docker容器运行一个服务或应用程序。
简单点说,你通过Docker镜像安装的Mysql、Redis都是独立的Docker,并不是放在一起才是一个Docker。
容器通过镜像(images)来提供应用程序运行所需的最小环境,这些镜像可能包含操作系统的某些部分(如Linux发行版的用户空间),但通常为了效率和可移植性而进行了优化和裁剪。
在一个宿主服务器上可以安装很多Docker,比如可以是Mysql、Redis等不同应用的Docker,也可以是多个Mysql应用的Docker。它们通过Docker网络互相通信。
可能你还有疑问,安装Docker和宿主机的操作系统有没有关系。而实际上是没关系的,每个Docker镜像都是从一个基础镜像(通常是某个操作系统的轻量级版本)开始构建的,并且包含了该操作系统和应用程序所需的所有依赖和配置。 也就是你在安装Mysql的时候其实已经选择安装了支持它运行的操作系统版本。
这个要深入体会一下,以上是我的理解。
Docker的组成
-
镜像(Image):
镜像是一个只读模板,包含了创建Docker容器的指令。镜像可以基于一个基础镜像(例如Ubuntu),然后在其上安装应用程序和依赖。 -
容器(Container):
容器是镜像的运行实例。容器是轻量级的、独立的,确保应用程序能在任何环境中一致运行。 -
Docker仓库(Registry):
Docker仓库用来存储Docker镜像。常见的公共仓库是Docker Hub。
Docker安装
参考我之前的文章:
Docker安装
一些Docker命令
# 查看镜像
docker images
# 检查正在运行的容器,sudo是获得超级管理员权限
sudo docker ps
# 停止容器
sudo docker stop mysql-container
sudo docker stop redis-container
# 启动容器
sudo docker start mysql-container
sudo docker start redis-container
# 删除容器
sudo docker rm mysql-container
sudo docker rm redis-container
Dockerfile
Dockerfile 是一个文本文件,用于定义 Docker 镜像的内容和构建步骤。它包含了一系列指令和参数,告诉 Docker 如何构建镜像,并指定在容器启动时如何运行这个镜像。
比如我们在部署一个项目的时候,我们可以通过设置Dockerfile来更方便的来部署和执行这个项目。
假设我们要创建一个运行简单Python应用程序的Docker镜像,Dockerfile的内容可能如下所示:
# 使用官方的Python基础镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录下的所有文件到容器的/app目录
COPY . /app
# 安装所需的Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露应用运行的端口
EXPOSE 5000
# 设置容器启动时运行的命令
CMD ["python", "app.py"]
Dockerfile 指令解释
FROM:指定基础镜像。这里使用的是官方的Python 3.8版本的精简镜像。
WORKDIR:设置工作目录。在此目录下执行后续指令。
COPY:将当前目录的所有内容复制到容器的/app目录。
RUN:执行命令。在这里是安装Python依赖项。
EXPOSE:声明容器监听的端口。这里是5000端口。
CMD:指定容器启动时要运行的命令。在这里是运行Python应用程序app.py。