目录
前言
Docker简介
1. 什么是docker
2. Docker和vm有什么区别
3. Docker架构
4. Docker特性
Docker安装
1. Docker版本介绍
2. Centos7安装docker
3. Docker校验
4. Docker启动
5. Docker配置文件
前言
接下来准备记录云原生系列的相关知识,主要分为两大类,一是:docker;二是:kubernetes。在kubernetes 1.24版本开始就已经默认不在使用docker了,但是基于实际生产环境大多数还是在使用docker的,因此我们在说kubernetes之前,先详细说说docker相关知识吧。
Docker简介
1. 什么是docker
Docker最初是dotCloud公司的一个内部项目,诞生于 2013 年初,由google公司开源的Go语言开发。
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
2. Docker和vm有什么区别
从概念上来看,Docker和传统的虚拟机比较类似,只是更轻量级,更方便使用。Docker和虚拟机最主要的区别有以下几点:
- 虚拟化技术依赖的是物理CPU和内存,是硬件级别的;Docker是构建在操作系统层面的,复用操作系统的容器化技术,所以Docker同样可以运行在虚拟机上面。
- 在linux主机上docker统linux主机共用linux内核,实际上是对用户空间的隔离(namespace),而vm虚拟机是内核空间和用户空间的隔离。
- 虚拟机中的操作系统是一个完整的操作系统镜像,比较复杂;而Docker比较轻量级,我们可以用Docker部署一个独立的redis,就类似于在虚拟机当中安装一个redis应用,但Docker部署的应用是完全隔离的。
- 传统的虚拟机技术是通过快照来保存状态的;而Docker引入了类似于源码管理的机制,将容器历史版本一一记录下来,切换成本非常之低。
- 传统的虚拟化技术在构建系统的时候非常复杂;而Docker可以通过一个简单的Dockerfile文件来构建整个容器,更重要的是Dockerfile可以手动编写,这样应用程序开发都可以通过发布Dockerfile来定义应用的环境和依赖,对于持续交付非常有利。
以下是docker和vm虚拟机的对比图
3. Docker架构
Docker使用C/S体系的架构,Docker客户端与Docker守护进程(docker daemon)通信,Docker守护进程负责构建,运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API通过unix套接字或网络接口进行通信。
下面是Docker核心组件及元素说明:
- Docker Daemon: dockerd,用来监听Docker API的请求和管理Docker对象,比如镜像、容器、网络和Volume。
- Docker Client:docker,docker client是我们和Docker进行交互的最主要的方式方法,比如我们可以通过docker run 命令来运行一个容器,然后我们的docker client会把命令发送给上面的Dockerd,主它来负责处理。
- Docker Registry:用来存储Docker镜像的仓库,Docker hub是官方提供的一个公共仓库,而且Docker默认也是从Docker Hub上查找镜像的。当然你也可以很方便的运行一个私有仓库,当我们使用docker pull或者docker run命令时,就会从我们配置的docker镜像仓库中去拉取镜像,使用docker push时,会将我们构建的镜像推送到对应的镜像仓库中。
- Images:镜像,镜像是一个只读模板 ,带有创建docker容器的说明。一般来说,镜像会基于另外的一些基础镜像构建并加上一些额外的自定义功能。比如你可以构建一个基于centos的镜像,然后在这个基础镜像上面安装一个Nginx应用,这样就可以构建成属于我们自己的镜像了。
- Containers:容器,容器是一个镜像的运行实例。可以使用Docker REST API或者CLI来操作容器。容器的实质是进程,但与直接在宿主机执行的进程不同,容器进行运行于属于自己独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户id空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主机运行更加案例。
值得注意是,Docker Daemon实际是是分为docker api和docer engine(docker引擎)
- Docker api:接收请求,接收docker客户端发送指令,比如docker run,pull,push,build等等
- Docker engine:将api接收的请求转换为实际动作(管理容器对象,上传下载镜像,构建镜像等等。)
4. Docker特性
Docker的特性:
标准化
- 保证一致的运行环境
- 弹性伸缩,快速扩容
- 方便迁移
- 持续集成、持续交付与持续部署
高性能
- 不需要进行硬件虚拟以及运行完整的操作系统
轻量级
- 快速启动
隔离性
- 进程隔离
Docker安装
1. Docker版本介绍
- docker-io:docker早期版本,支持到1.13,在centos 6.x系统上只能使用docker-io
- docker-ce:当前docker发行版本
- docker-ee:docker商业版本
2. Centos7安装docker
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
3. Docker校验
[root@lvs-1 system]# docker version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:51:00 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 23.0.1
API version: 1.42 (minimum version 1.12)
Go version: go1.19.5
Git commit: bc3805a
Built: Thu Feb 9 19:48:42 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.18
GitCommit: 2456e983eb9e37e47538f59ea18f2043c9a73640
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@lvs-1 system]#
4. Docker启动
默认dockerd是监听在本地套接字上的。因此dockerd不允许外部docker-cli进行连接,但是我们可以修改为网络监听。
修改/lib/systemd/system/docker.service的ExecStart字段为如下:
ExecStart=/usr/bin/dockerd -H fd:// -H 0.0.0.0:3276 --containerd=/run/containerd/containerd.sock
端口任意设置
修改后:
随后其他客户就可以访问本地的dockerd,也可以操作创建docker容器,(实际工作中我们并不会这么去做,因为不安全。)
[root@clinet ~]# docker -H 192.168.194.130:3276 version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:51:00 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 23.0.1
API version: 1.42 (minimum version 1.12)
Go version: go1.19.5
Git commit: bc3805a
Built: Thu Feb 9 19:48:42 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.18
GitCommit: 2456e983eb9e37e47538f59ea18f2043c9a73640
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@clinet ~]#
5. Docker配置文件
配置文件为:/etc/docker/daemonr.json ,默认该配置文件不存在,需要我们自己创建,docker配置文件参数很多,说几个关键参数。
{
#镜像存储路径
"data-root":"/var/lib/docker",
#镜像加速的地址。支持写多个(列表格式),增加后在 docker info 中可查看
"registry-mirrors":["https://o0o4czij.mirror.aliyuncs.com"],
#docker0网桥ip
"bip":"172.17.0.1/16",
#存在本地json文件,也可以是journalctl,也可以是网络日志存储器
"log-driver":"json-file",
#日志级别:还有debug,error,warring等
"log-level":"info",
#日志存储方式,可以存10个文件每个文件大小为100M
"log-opts":{
"max-size":"100m",
"max-file":"10"
}
}
详细配置见官方文档:Docker daemon configuration overview