Docker 基本原理及镜像管理

153 阅读8分钟

一、 基础介绍

1. Docker概述

Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。

Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。

Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。

2. 容器的特点

  • 灵活:即使是最复杂的应用也可以集装箱化。(比如ELK)
  • 轻量级:容器利用并共享主机内核。(共享!!)
  • 可互换:可以即时部署更新和升级。
  • 便携式:可以在本地构建,部署到云,并在任何地方运行。(一次封装,到处运行)
  • 可扩展:可以增加并自动分发容器副本。
  • 可堆叠:可以垂直和即时堆叠服务。

3. 容器在内核中支持2种重要技术

docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g,只有当需要修改时才复制一份数据)。

3.1 Namespace 实现资源隔离

Namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:

Linux六大namespace(命名空间):

namespace 隔离类型系统调用参数隔离内容
UTSCLONE_NEWUTS主机名和域名
IPCCLONE_NEWWIPS信号量,消息队列和共享内存
PIDCLONE_NEWPID进程编号
NETWORKCLONE_NEWNET网络设备,网络栈,端口等
MOUNTCLONE_NEWNS挂载点(文件系统)
USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持)

3.2 Control groups 实现资源限制

如果不对一个容器做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等。

Cgroups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。

4. Docker三大核心概念

1. 镜像

Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。

通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。

2. 容器

Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。

可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。

3. 仓库

Docker仓库是用来集中保存镜像的地方,分为公有库和私有库。当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。

Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker

二、 安装Docker

yum安装2024版本

  • 安装依赖包
[root@localhost ~]#  yum install -y yum-utils device-mapper-persistent-data lvm2
  • 设置阿里云镜像源
[root@localhost ~]#  yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//下载yum仓库
  • 安装docker
[root@localhost ~]#  yum install -y docker-ce docker-ce-cli containerd.io
//docker-ce服务端  docker-ce-cli客户端
//此处安装最新版,如果不想安装最新版可以使用yum list --showduplicates docker-ce帮助查看可用版本

三、 基础操作

1. 查看docker版本

[root@localhost ~]#  docker version
docker version.png

2. 查看docker信息

[root@localhost ~]#  docker info
docker info.png

3. 镜像仓库加速

docker 配置文件位置:/etc/docker/daemon.json

//镜像加速下载
浏览器访问 `https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors` 获取镜像加速器配置

[root@localhost ~]#  mkdir -p /etc/docker
[root@localhost ~]#  tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"]
> }
> EOF
[root@localhost ~]#  systemctl daemon-reload
[root@localhost ~]#  systemctl restart docker
镜像加速器.png

四、 镜像管理

1. 上传镜像

docker push 镜像名   //上传镜像

2. 下载镜像

从 docker 仓库将镜像下载到本地,命令格式如下:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
//NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
//:TAG: 即版本号,如果不指定TAG则默认下载最新版镜像,工作中要指定版本号!

示例:

[root@localhost ~]#  docker pull nginx   //下载nginx镜像
Using default tag: latest           //默认下载最新版本
latest: Pulling from library/nginx  //分层下载
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31 //摘要
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest   //下载的完整地址
docker pull.png

3. 查看镜像

1. 查看所有镜像

docker images 可以查看下载至本地的镜像

[root@localhost ~]#  docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB

docker images -q  //仅展示镜像ID
docker images.png

2. 查看指定镜像的详细信息

[root@localhost~]#  docker inspect nginx
//可以指定名字
[root@localhost~]#  docker inspect 605c77e624dd
//也可以指定image id
docker image inspect.png

4. 镜像打标签

命令格式:

docker tag  镜像的id  新的标签

示例:

[root@localhost ~]#  docker tag 605c77e624dd nginx:my-latest
docker tag.png

5. 导出镜像

利用docker save命令可以将从本地镜像导出为一个打包 tar文件,然后复制到其他服务器进行导入使用

命令格式:

docker save [-o] IMAGE [IMAGE...]
//-o指定保存目录

docker save -o 保存的镜像名称 镜像的标签(如果使用镜像id,导回时标签会为空)

示例:

[root@localhost ~]#  docker save -o /mnt/nginx.tar nginx
[root@localhost ~]#  ls /mnt
nginx.tar
docker save.png

6. 导入镜像

命令格式:

docker load  -i 镜像包的名称
docker load  <  镜像包的名称

示例:

[root@localhost mnt]#  docker load -i nginx.tar
docker load.png

7. 删除镜像

docker rmi 命令可以删除本地镜像

命令格式:

docker rmi [-f] IMAGE [IMAGE...]
//-f强制删除  (强制删除正在使用的镜像,也会删除对应的容器)

示例:

[root@localhost ~]#  docker rmi -f 605c77e624dd
docker rmi.png

8. 搜索相关镜像

命令格式:

docker search 镜像名称

示例:

[root@localhost ~]#  docker search nginx
docker search.png

五、 总结命令

命令作用
docker  login登录镜像仓库
docker  push 镜像上传镜像
docker  pull  nginx[:tag]拉取镜像  加tag版本nginx:1.18
docker  run  -d  nginx运行镜像如果本地没有,默认去官方站点拉取  -d后台运行
docker  images查看所有镜像
docker  images  -q仅展示镜像ID
docker  inspect 镜像名/id查看指定镜像的详细信息
docker  tag 镜像的id  新的标签镜像打标签(例:docker tag 605c77e624dd nginx:my-latest)
docker  rmi 镜像id删除镜像
docker  save  -o 保存的镜像名称 镜像的标签打包镜像到本地文件  -o指定保存目录(如果使用镜像id,导回时标签会为空)
docker  load  -i 镜像包的名称docker  load  < 镜像包的名称导入镜像 -i参数指定了要读取的tar文件的路径
docker search 镜像名称搜索相关镜像
docker  version查看docker版本
docker  info查看docker软件信息