概念
Docker是容器技术的标准化实现,核心是容器,它是一种特殊的进程,运行在独立的运行环境中,拥有自己的文件系统和网络栈。与传统的虚拟机相比,容器不需要额外的操作系统开销,因此可以更快地启动和更高效地利用资源。Docker镜像是构建容器的基础元素,它是一个只读模板,包含了运行应用程序所需的所有内容:code、运行时环境、库、环境变量和配置文件。Docker提供了简单易用的命令行工具,方便用户创建、运行和管理容器。
与虚拟机的对比
图2:与虚拟机特性对比
图3:与虚拟机资源对比
如图3所示,在资源方面,容器包括应用程序及其所有依赖项,但是他们与其他容器共享OS内核,在主机操作系统上的用户控件作为独立进程运行;虚拟机包括应用程序、必需的库或二进制文件以及完整的来宾操作系统,与容器化相比,完全虚拟化需要更多资源。
核心组件与架构
客户端(Client):是Docker的用户端,可以接受用户命令和配置标识,并与Docker daemon通信。
镜像(Image):只读模板,包含应用代码、依赖库和配置文件,通过分层存储(Union File System)实现高效复用。例如,Python 应用镜像可基于官方 Python 基础镜像构建,减少重复下载。
容器(Container):镜像的运行实例,通过 Namespace 和 Cgroups 实现隔离。容器可随时创建、停止、删除,保证环境一致性。
Registry:镜像仓库,分公有(Docker Hub、Quay.io)和私有(Harbor),支持版本管理和团队协作。
架构图如图4所示。
图4:Docker架构图
1)Docker 镜像(Image)
Docker 镜像可以被认为是 Docker 容器的模板。Docker 镜像是用于创建 Docker 容器的基础。简单来说,Docker 镜像就是一个只读的模板,用来创建 Docker 容器,一个镜像可以创建多个容器。
镜像包含了运行容器所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。Docker 镜像是由文件系统叠加而成,每一层都代表 Dockerfile 中的一条指令,层与层之间是互相依赖的。
2)Docker 容器(Container)
Docker 容器是 Docker 镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。简单来说,容器就是用镜像创建的运行实例。它可以被启动、开始、停止、移动和删除。每个容器之间是相互隔离的、保护的,每个容器都有自己的文件系统,每个容器之间运行的进程都是相互隔离的。
容器的定义和镜像几乎一样,也是一系列的层的集合,不同的是容器的最上面那一层是可读可写的,而镜像的最上层是只读的。
3)Docker 仓库(Repository)
Docker 仓库是用来保存镜像的地方。Docker 仓库可以被认为是代码控制中的代码仓库一样。Docker 用户可以在仓库中创建一个账户,存储和分享自己的镜像。也可以从 Docker 仓库中下载别人分享的镜像。
Docker 仓库分为公开和私有两种形式。公开的 Docker 仓库是 Docker 公司提供的,可以被所有用户使用。DockerHub 就是最知名的公开 Docker 仓库。私有的 Docker 仓库可以在本地部署,只能被内部用户使用。
总的来说,Docker 的工作流程是,首先从 Docker 仓库中获取 Docker 镜像,然后用这个镜像创建 Docker 容器,最后对容器进行操作(启动、停止等)。
实践
1.Docker的安装
安装参考:最详细的ubuntu 安装 docker教程-腾讯云开发者社区-腾讯云
ubuntu下自带了docker的库,不需要添加新的源。但是ubuntu自带的docker版本太低,需要先卸载旧的再安装新的。
apt-get remove docker docker-engine docker.io containerd runc
1)更新软件包
在终端中执行以下命令来更新Ubuntu软件包列表和已安装软件的版本:
sudo apt updatesudo apt upgrade
2)安装docker依赖
Docker在Ubuntu上依赖一些软件包。执行以下命令来安装这些依赖:
apt-get install ca-certificates curl gnupg lsb-release
3)添加Docker官方GPG密钥
执行以下命令来添加Docker官方的GPG密钥:
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4)添加Docker软件源
执行以下命令来添加Docker的软件源:sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
5)安装docker
执行以下命令来安装Docker:apt-get install docker-ce docker-ce-cli containerd.io
6)配置用户组(可选)
默认情况下,只有root用户和docker组的用户才能运行Docker命令。我们可以将当前用户添加到docker组,以避免每次使用Docker时都需要使用sudo。命令如下:sudo usermod -aG docker $USER
注:重新登录才能使更改生效。
7)运行docker
我们可以通过启动docker来验证我们是否成功安装:systemctl start docker
安装工具:apt-get -y install apt-transport-https ca-certificates curl software-properties-common
重启docker:service docker restart
验证是否成功:sudo docker run hello-world
因为之前没有拉取过hello-world,所以运行命令后会出现本地没有该镜像,并且会自动拉取的操作。
这里在拉取时若是一直显示超时,通过配置加速地址成功运行Docker:
参考博客:从Docker拉取镜像一直失败超时?这些解决方案帮你解决烦恼_docker拉取镜像超时-CSDN博客
上面拉取了hello-world的镜像,现在可以通过命令sudo docker images来查看镜像
出现上述情况,表示成功在Ubuntu系统上安装了docker。
2.Docker容器
使用docker run命令管理容器的运行
docker ps命令列出系统上的容器。
3. Dockerfile
Docker允许创建自己的Docker镜像。Dockerfile是一个用于创建Docker镜像的配置文件,文本格式,里面包含了创建镜像的指令。Docker通过读取Dockerfile中的指令,自动构建镜像。
1. 创建一个名为“Dockerfile”的文件
docker build命令用于从Dockerfile构建镜像。
docker build -t myimg:0.1 .在本目录创建名字为myimg,Tag为0.1的镜像。
查看定制的镜像:docker images
运行定制的镜像:docker run myimg:0.1
4.JAVA案例
Docker可以执行任何应用程序。
下面将创建一个Java应用程序,并使用Docker运行它。
1. 创建项目目录
把这个项目的相关文件,集中放到一个目录docker-java:
2. 创建Java文件
在docker-java目录下,创建一个Java文件:openlab.java
3. 创建Dockerfile
创建Java文件之后,创建一个Dockerfile,其中包含了Docker的指令。在java目录下创建Dockerfile,文件名必须是Dockerfile。
4. 构建 Docker 镜像
切换到java目录,运行docker build -t zs-java .命令,构建Docker镜像。Docker镜像可以任意取名,此处命名为zs-java。
构建镜像失败—这个错误由于 Docker 无法从官方镜像源拉取java:8基础镜像导致的。具体来说,错误代码522表示与镜像源的连接超时,通常是网络问题或镜像源不可用造成的。
# 修改Dockerfile文件第一行为:FROM openjdk:8-jdk-alpine # 轻量级Alpine版本,
5. 查看创建好的镜像:docker images
6.运行镜像:docker run zs-java
成功运行。