好几天没写博客了,虽然人有人在乎,但是我想写在这里。最近越学越迷茫,没有动力,自己写的博客也没有人看,就7个粉丝我快emo了。。。本人也是边学边写,如果有大佬可以指点一下,我是ikun,不好的评论我会删除
一、Docker的基本概念
- 容器:Docker容器是一个轻量级、可移植的软件打包技术,它允许开发者将应用程序及其依赖项打包到一个可执行的容器中。这些容器可以在任何支持Docker的平台上运行,无需修改代码或重新配置环境。
- 镜像:Docker镜像是一个轻量级的、可执行的独立软件包,它包含了运行某个软件所需的所有内容,包括代码、运行时环境、库、环境变量和配置文件等。镜像可以从Docker Hub等镜像仓库中拉取,也可以自己构建。
- Docker Hub:Docker Hub是Docker的官方镜像仓库,它提供了大量的官方镜像和第三方镜像供用户拉取和使用。用户也可以将自己的镜像推送到Docker Hub上,与其他用户共享。
docker的核心技术
容器在内核中支持2种重要技术:
-
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g,只有当需要修改时才复制一份数据)。
-
namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,主要通过以下技术实现容器运行空间的相互隔离:
| 隔离类型 | 功能 | 系统调用参数 | 内核版本 |
|---|---|---|---|
| MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 |
| IPC Namespace(Inter-Process Communication) | 提供进程间通信的隔离能力,包括信号量,消息队列和共享内存 | CLONE_NEWIPC | 2.6.19 |
| UTS Namespace(UNIXTimesharing System) | 提供内核,主机名和域名隔离能力 | CLONE_NEWUTS | 2.6.19 |
| PID Namespace(ProcessIdentification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24 |
| Net Namespace(network) | 提供网络隔离能力,包括网络设备,网络栈,端口等 | CLONE_NEWNET | 2.6.29 |
| User Namespace(user) | 提供用户隔离能力,包括用户和组 | CLONE_NEWUSER | 3.8 |
| TimeNamespace | 提供时间隔离能力 | CLONE_NEWTIME | 5.6 |
| syslogNamespace | 提供syslog隔离能力 | syslognamespace是由华为工程师RuiXiang(瑞翔)提出的,但没有合并到linux内核中,后systemd在2020年2在2020年2 月实现了一个名为“journalnamespace”的类似功能 | |
| Controlgroup(cgroup)Namespace | 提供进程所属的控制组的身份隔离 | Linux4.6 |
二、Docker的主要特点
- 轻量级:Docker容器共享宿主机的操作系统内核,因此比传统的虚拟机更加轻量级,启动速度更快,资源占用更少。
- 可移植性:Docker容器可以在任何支持Docker的平台上运行,无需修改代码或重新配置环境,从而实现了应用程序的跨平台部署和迁移。
- 隔离性:Docker容器之间彼此隔离,互不影响,确保了应用程序的安全性和稳定性。
- 自动化:Docker提供了丰富的命令行工具和API接口,支持自动化构建、测试和部署应用程序,提高了开发效率。
三、Docker的架构
Docker的架构主要由以下几个部分组成:
- Docker Client:Docker客户端是Docker的用户界面,它接受用户的命令和配置标识,并与Docker守护进程进行通信。
- Docker Daemon:Docker守护进程是一个运行在宿主机上的后台进程,它负责监听Docker API的请求,并管理Docker容器和镜像。
- Docker Registry:Docker镜像仓库是一个集中存储与分发Docker镜像的服务。用户可以将自己的镜像推送到镜像仓库中,也可以从镜像仓库中拉取所需的镜像。
四、Docker的使用场景
Docker广泛应用于开发、测试、运维等场景,具体包括:
- 应用程序的打包和分发:开发者可以将应用程序及其依赖项打包成Docker镜像,并分发给测试或生产环境。
- 持续集成和持续部署(CI/CD) :Docker支持自动化构建、测试和部署应用程序,与CI/CD工具结合使用可以大大提高开发效率。
- 微服务架构:Docker容器非常适合用于构建微服务架构,每个微服务都可以作为一个独立的容器进行部署和管理。
- 云原生应用:Docker与Kubernetes等云原生技术结合使用,可以构建高度可扩展、高可用的云原生应用程序。
五、Docker的安装和配置
yum部署docker
目前 Docker 只能支持 64 位系统。
systemctl stop firewalld.service
setenforce 0
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
--------------------------------------------------------------------------------------------
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
--------------------------------------------------------------------------------------------
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
##需要epel源
yum install -y epel-release.noarch
#安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker.service
systemctl enable --now docker.service
--------------------------------------------------------------------------------------------
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
--------------------------------------------------------------------------------------------
docker命令
查看docker版本
[root@localhost yum.repos.d]#docker version
docker info
镜像操作命令
镜像查看
[root@localhost ~]#docker search nginx
#搜索镜像
格式:docker search 关键字
docker search nginx
拉取镜像
[root@localhost ~]#docker pull nginx
[root@localhost ~]#docker images
[root@localhost ~]#docker pull nginx:1.18
[root@localhost ~]#docker images
#获取镜像
格式:docker pull 仓库名称[:标签]
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
查看本地有哪些镜像
docker images
1.
REPOSITORY:镜像属于的仓库;
1. TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
1. IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
1. CREATED:镜像创建时间;
1. VIRTUAL SIZE:镜像大小;
删除镜像
[root@localhost ~]#docker rmi test:1
[root@localhost ~]#docker rmi c2c45d506085
[root@localhost ~]#docker rmi a8758716bb6a -f
#删除镜像
格式:
docker rmi 仓库名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签
或者
docker rmi 镜像ID号 #会彻底删除该镜像
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
docker rmi nginx:web
镜像上传
申请阿里云的 阿里云镜像仓库
**创建镜像仓库 命名空间 仓库名称
之后上传即可