Docker容器基础篇

发布于:2024-07-30 ⋅ 阅读:(97) ⋅ 点赞:(0)

一.Docker容器简要介绍

Docker 是一个开源项目,旨在提供轻量级的应用容器化解决方案。它允许开发者打包应用及其所有依赖项到一个标准化的单元中,称为容器。这些容器可以在开发人员的工作环境中构建,然后轻松地在不同的计算机、服务器或云平台上运行,而无需担心环境差异或依赖问题。

1.操作系统的组成

Bootloader (引导加载程序)

引导加载程序是启动计算机时加载操作系统的程序。它位于计算机的固件或引导设备的特定分区中,并负责引导操作系统的加载过程。

Shell (命令行解释器)

Shell 是用户与操作系统交互的主要界面,它可以理解和执行用户输入的命令。Shell 提供了命令行界面(CLI),允许用户通过输入命令来操作文件、进程以及运行其他程序。

Kernel (内核)

内核是操作系统的核心部分,负责管理计算机的硬件资源和提供基本的服务给其他软件。它管理内存、处理器、设备驱动程序和系统调度,确保软件和硬件资源的有效利用和安全运行。

Desktop Environment (桌面环境)

桌面环境是操作系统中提供给用户的图形用户界面(GUI),它包括窗口管理器、面板、图标、工具栏等,使得用户可以通过鼠标点击和图形化方式来操作和管理计算机系统。

Graphical Server (图形服务器)

图形服务器是操作系统的一个子系统,负责管理和渲染图形输出到显示器上。它接收来自应用程序的图形指令,并将它们转换为适合显示器显示的像素信息。

Applications (应用程序)

应用程序是用户直接使用的软件,用于执行特定的任务和操作。这些可以是办公软件如 Word、Excel,也可以是浏览器、媒体播放器等等。

Daemons (守护进程)

守护进程是在后台运行的服务程序,通常在系统启动时启动,并持续运行以提供某种服务或支持功能。它们通常不与用户交互,而是在系统运行时处理特定的任务或服务,例如网络服务、打印服务等。

 2.什么是内核kernel

内核(Kernel)是操作系统的核心组件,它在计算机系统中扮演着至关重要的角色。下面是内核的主要任务和功能:

进程管理

内核负责管理系统中的进程(也称为任务或线程),包括进程的创建、调度、终止和进程间通信。

内存管理

内核管理系统的物理内存和虚拟内存,包括内存的分配、释放、虚拟内存到物理内存的映射等。

I/O管理

内核管理输入输出操作,包括对设备(如硬盘、网络接口、显示器等)的访问和控制。

系统调用

内核提供系统调用接口,允许用户程序请求操作系统提供的服务,如文件操作、网络通信等。

设备驱动程序

内核通过设备驱动程序与硬件设备交互,驱动程序允许内核控制和管理各种硬件设备的操作。

安全性和权限管理

内核确保系统的安全性,包括权限管理、用户身份验证、访问控制等。

系统调度

内核根据预定的调度策略和优先级,决定哪个进程在何时运行,以优化系统资源的利用。

错误处理和容错

内核负责处理系统的错误和异常情况,以保证系统的稳定性和可靠性。

3.什么是内核空间和用户空间

内核空间

内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。

用户空间

用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。

用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。

4.容器和虚拟机表现比较

  1. 资源利用率更高

    容器确实比传统的虚拟机利用资源更高效。这是因为容器直接运行在宿主操作系统的内核上,无需额外的操作系统层,减少了资源消耗。虚拟机则需要独立的操作系统镜像和虚拟化管理层,因此通常会有更大的资源开销。
  2. 启动速度更快

    容器启动速度通常比虚拟机快得多。容器之间可以共享宿主操作系统的内核,因此它们可以在几秒钟内启动,而虚拟机需要启动完整的操作系统,通常需要数十秒到数分钟的时间。
  3. 占用空间更小

    容器通常占用的磁盘空间比虚拟机小得多。容器镜像一般以MB为单位,因为它们共享宿主操作系统的文件系统和资源。虚拟机则需要完整的独立操作系统镜像,因此通常以GB为单位。
  4. 集成性更好

    容器由于其轻量级和快速启动的特性,更适合与持续集成和持续部署(CI/CD)工具集成。开发团队可以更容易地将应用程序打包为容器镜像,并在不同环境中快速部署和运行,实现自动化和高效的开发生命周期管理。

5.Docker的组成

docker 官网: http://www.docker.com

帮助文档链接: https://docs.docker.com/

docker 镜像: https://hub.docker.com/

docker 中文网站:http://www.docker.org.cn/

  • Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点

  • Docker 服务端(Server): Docker守护进程,运行docker容器

  • Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API

  • Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合

  • Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor

  • Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程

6.验证系统cgroups

Cgroups在内核层默认已经开启,从CentOS 和 Ubuntu 不同版本对比,显然内核较新的支持的功能更多。

grep CGROUP /boot/config-3.10.0-693.el7.x86_64

cgroups具体实现

  • blkio: 块设备IO限制

  • cpu: 使用调度程序为 cgroup 任务提供 cpu 的访问

  • cpuacct: 产生 cgroup 任务的 cpu 资源报告

  • cpuset: 如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存

  • devices: 允许或拒绝 cgroup 任务对设备的访问

  • freezer: 暂停和恢复 cgroup 任务

  • memory: 设置每个 cgroup 的内存限制以及产生内存资源报告

  • net_cls: 标记每个网络包以供 cgroup 方便使用

  • ns: 命名空间子系统

  • perf_event: 增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程

7.Docker的缺点

  • 多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底

  • 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐

  • 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费

二.安装Docker

官方网址: https://www.docker.com/

OS系统版本选择:

Docker 目前已经支持多种操作系统的安装运行,比如Ubuntu、CentOS、Redhat、Debian、Fedora,甚至是还支持了Mac和Windows,在linux系统上需要内核版本在3.10或以上

Docker版本选择:

docker版本号之前一直是0.X版本或1.X版本,但是从2017年3月1号开始改为每个季度发布一次稳定版,其版本号规则也统一变更为YY.MM,例如17.09表示是2017年9月份发布的Docker之前没有区分版本,但是2017年推出(将docker更名为)新的项目Moby,github地址: https://github.com/moby/moby,Moby项目属于Docker项目的全新上游,Docker将是一个隶属于的Moby的子产品,而且之后的版本之后开始区分为 CE(Docker Community Edition,社区版本)和EE(Docker Enterprise Edition,企业收费版),CE社区版本和EE企业版本都是每个季度发布一个新版本,但是EE版本提供后期安全维护1年,而CE版本是4个月,以下为官方原文:

https://blog.docker.com/2017/03/docker-enterprise-edition/

如果要布署到kubernets上,需要查看相关kubernets对docker版本要求的说明,比如:

https://github.com/kubernetes/kubernetes/blob/v1.17.2/CHANGELOG-1.17.md

安装可以参考以下文档

阿里云文档: https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11guHCWE

官方文档 : https://docs.docker.com/engine/install/

1.yum安装

CentOS 6 因内核太旧,即使支持安装docker,但会有各种问题,不建议安装

CentOS 7 的 extras 源虽然可以安装docker,但包比较旧,建议从官方源或镜像源站点下载安装docker

CentOS 8 有新技术 podman 代替 docker

因此建议在CentOS 7 上安装 docker

#extras 源中包名为docker
yum list docker

官方地址下载 rpm包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里云地址下载
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

cd /etc/yum.repos.d/
#CentOS 7 安装docker依赖三个yum源:Base,Extras,docker-ce

yum install -y yum-utils device-mapper-persistent-data lvm2
#安装 依赖工具
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#添加源信息
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#修改配置文件
yum makecache fast
yum list docker-ce
#查看最新版本
yum list --showduplicates docker-ce
#查看所有的可用版本
yum list --help
#可以使用帮助查看
yum list docker-ce.x86_64 --showduplicates
#显示可安装版本
yum -y install docker-ce-19.03.15-3.el7 docker-ce-cli-19.03.15-3.el7  containerd.io
# 安装指定版本的Docker-CE和客户端,注意客户端也要指定,否则或造成不一致
#yum -y install docker-ce-[VERSION]
#如不指定版本默认最新

[root@localhost yum.repos.d]# mkdir -p /etc/docker
[root@localhost yum.repos.d]# tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://ifxbyp3x.mirror.aliyuncs.com"]
> }
> EOF
{
  "registry-mirrors": ["https://ifxbyp3x.mirror.aliyuncs.com"]
}
验证运行
[root@localhost yum.repos.d]# systemctl daemon-reload
[root@localhost yum.repos.d]# systemctl restart docker
[root@localhost yum.repos.d]# docker run hello-world

软件 作用
docker-ce(Docker Community Edition) 这是 Docker 的社区版。Docker 社区版是免费的, 面向开发者、小型团队和个人使用。它包含了 Docker Engine, 这是一个用于构建和运行容器的开源容器运行时。
docker-ce-cli(Docker Command Line Interface) 这是 Docker 的命令行工具, 它允许用户与 Docker Engine 交互,执行容器相关的操作。 通过 Docker CLI,用户可以构建、运行、管理和发布容器。
containerd.io 它负责管理容器的生命周期,包括容器的创建、运行、暂停、继续和销毁等

三.基础操作

1.docker程序环境

1.1 环境配置文件

/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker

1.2  Unit File

/usr/lib/systemd/system/docker.service

1.3  docker-ce 配置文件

/etc/docker/daemon.json

1.4  Docker Registry 配置文件

/etc/containers/registries.conf

2. 基础操作

2.1  查看docker 版本

docker version

2.2 docker 信息查看

[root@localhost data]#docker info 
Client: Docker Engine - Community
 Version:    26.1.4
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.14.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.27.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 2                     # 容器数量           
  Running: 0
  Paused: 0
  Stopped: 2
 Images: 4                       # 镜像数量          
 Server Version: 26.1.4          # server 版本
 Storage Driver: overlay2        #docker 使用的是 overlay2 文件驱动  
  Backing Filesystem: xfs        ## 宿主机上的底层文件系统
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs          # Cgroups 驱动
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-693.el7.x86_64             # 宿主机的相关信息
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 1.781GiB
 Name: localhost.localdomain
 ID: 39eee203-7863-4c80-a955-9aef575138c1
 Docker Root Dir: /var/lib/docker                    # docker 数据存储目录
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://6ijb8ubo.mirror.aliyuncs.com/                   # registry 地址
 Live Restore Enabled: false

2.3 镜像仓库加速

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

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ifxbyp3x.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

四.镜像管理

制作镜像  上传镜像  下载镜像  查找镜像  导出镜像  导入镜像  删除镜像  查询镜像

命令 含义 例子
docker --help 查看帮助
docker image --help 查看镜像帮助 docker image --help
docker search 镜像名称 搜索相关镜像 docker search nginx
docker pull 镜像名称:标签 下载镜像(不加标签默认使用latest) docker pull nginx
docker images 查看所有已有镜像 docker images
docker images 镜像名称 查看单个镜像 docker images nginx
docker inspect 镜像ID 查看镜像的详细信息 docker inspect 56b21e040954
docker tag 旧名称 新名称 修改镜像的 标签 docker tag nginx:latest lucky/nginx:1.25

1.搜索镜像

官方网站进行镜像的搜索

官网: http://www.docker.org.cn/

#格式
docker search 关键字
#NAME: 列出了搜索结果中各个镜像的名称。
#DESCRIPTION: 描述了每个镜像的简要说明或介绍。
#STARS: 显示了每个镜像的星级评分或受欢迎程度。星级数量越高表示该镜像的受欢迎程度越高。
#OFFICIAL: 表示是否是官方构建的镜像,OK表示是官方构建的。
#AUTOMATED: 表示是否是自动构建的镜像,这个字段没有值表示不是自动构建的。

2.下载镜像

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

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
  -a, --all-tags               Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output

#NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
#:TAG: 即版本号,如果不指定:TAG,则下载最新版镜像  工作中指定版本号
docker  pull nginx

3.查看镜像的信息

docker images
docker image inspect nginx   #可以指定名字
docker image inspect 605c77e624dd   #指定id
du /var/lib/docker/overlay2/
#此目录下有镜像文件了

4.镜像导出

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

格式:

docker save [OPTIONS] IMAGE [IMAGE...]
选项:  
-o, --output string   Write to a file, instead of STDOUT

常见用法:

docker save -o /path/file.tar IMAGE1 IMAGE2 ...
docker save IMAGE1 IMAGE2 ... > /path/file.tar

示例:

docker save alpine >/data/alpine.tar

docker save  -o /data/alpine.tar  #-o指定导出目录

5.删除镜像

格式:

docker rmi 镜像名称
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker image rm [OPTIONS] IMAGE [IMAGE...]
#选项:
-f, --force     Force removal of the image
    --no-prune   Do not delete untagged p

docker images -q
列出系统中所有 Docker 镜像的 ID
docker rmi -f `docker images -q`
#删除所有镜像

示例: 

docker rmi apline

6.恢复镜像

格式:

docker load -i 镜像源路径

示例: 

docker load -i /data/alpine.tar

查看运行中的容器

docker ps -a
#查看运行中的容器

docker run -d httpd
#运行容器 如果没有会去官网下载后运行
#镜像相当于模板   容器相对于虚拟机

7.镜像打标签

docker tag
docker tag busybox 192.168.240.11/data/buysbox:v1.0
docker images
docker rmi 192.168.240.11/data/buysbox:v1.0

8.上传镜像

默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号,注册地址https://hub.docker.com。
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传

docker tag nginx:latest  zxy/nginx:latest
docker images

docker login								
#登录公共仓库

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zxyjing/zxy:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/zxyjing/zxy:[镜像版本号]
#上传镜像


网站公告

今日签到

点亮在社区的每一天
去签到