K8S学习之前站一:docker学习

140 阅读14分钟

前言:Docker学习前的相关说明

学习docker之前,先要知道的几个网站

Docker官网:docs.docker.com

Docker的gitub地址:github.com/mboy/mboy

docker官方镜像仓库dockerhub:registry.hub.docker.com

Docker logo:

​编辑

服务器、虚拟机、容器之间的区别

服务器-----硬件虚拟化(vmware、openstack、kvm等)----软件虚拟化(docker、containerd、podman等)

​编辑

基于虚拟机的虚拟化(左图)

1、基础设施:硬件资源:存储、cpu、网络等

2、主机操作系统:安装在服务器上的操作系统:linux、windows、mac等

3、虚拟机管理程序:位于主机操作系统,负责创建和管理虚拟机(vmware、hypervisor、vmfusion、kvm、openstack等)

4、虚拟机:虚拟机管理程序创建出来的,就像独立的服务器

5、应用和依赖:每个虚拟机上安装的所需要的应用和库(Bins/Libs)

基于容器的虚拟化(右图)

1、基础设施:硬件资源:存储、cpu、网络等

2、主机操作系统:安装在服务器上的操作系统:linux、windows、mac等

3、容器引擎:运行在操作系统之上,负责创建和管理容器,如docker等

4、容器:包含应用及所有依赖,共享操作系统内核,但相互隔离

主要区别:

一、操作系统的开销:

1、虚拟机:每个虚拟机都有自己的操作系统,开销比较大

2、容器:所有容器共享操作主机系统内核,无多余的系统开销,资源利用率高效

二、启动时间:

1、虚拟机:启动操作系统,速度慢

2、容器:只需要启动依赖和库,速度快 

1. 为什么要学习docker

我们都经历过写代码调试代码的过程,比如一个java代码,用mvn编译后生成jar或者war文件,jar文件可以直接使用,war文件需要放置到tomcat下使用。开发在开发环境上调试好的代码,发给测试在测试环境上测试,最后在生产环境部署,理想中是这样的,但是真是的情况,会是什么样子呢?

  1. 开发环境没问题,测试环境报错:排查后发现是启动脚本里的jdk版本和代码要求版本不匹配
  2. 测试环境没问题,生产环境报错:生产环境中的tomcat版本和jdk版本不匹配

结果开发、测试、运维都觉得不是自己的问题,互相甩锅,互相扯皮,影响进度,影响关系,最关键可能会影响到绩效

docker就不一样了,可以把代码和用到的所有依赖,包括jdk、tomcat、war文件、jar文件等,甚至是linux文件,都打包到一起,放到镜像里,保持环境的一致性。只需要把这个镜像运行起来,就可以把服务运行起来,运行镜像的统称为容器运行时。

如果想要了解docker镜像,那就需要了解下iso这种文件,以及iso和daocker镜像之间的关系

iso文件

图片

编辑

·用途:iso文件通常用户创建光盘镜像,常见于操作系统的安装介质和光盘备份,他们通常用于系统安装、引导和分发完整的操作系统

内容:iso文件包含操作系统的完整文件系统,包括内核、驱动程序、应用程序、配置文件和引导 加载程序

结构:iso文件是一个扁平的文件系统镜像,包含一个光盘格式的文件系统(如ISO 9660),用于光盘刻录和挂载

使用方式:iso文件通常用于创建可启动的安装介质,通过虚拟机管理程序或物理引导安装操作系统

灵活性:iso文件较大,因为包含了完整的操作系统和相关工具等,适合系统初始化安装

管理:iso文件可以通过光盘、usb设备或网络分发,通常不会像docker镜像那样频繁更新和管理

Docker镜像

用途:docker镜像用于创建容器,这些容器可以运行特定的应用程序及其以            来。他们专注于应用程序的打包和部署

内容:docker镜像包含操作系统、应用程序代码、运行时环境、库、依赖和            配置文件等。每个镜像层都是只读的,容器在运行时会添加一个可写层

结构:docker镜像是分层的,每一层都是一个增量更改。镜像层通过联合文            件系统(如OverLayFS)组合在一起

使用方式:docker通过docker引擎来管理和运行,使用docker run命令启动            容器

灵活性:docker镜像可以非常小,只包含运行特定应用程序所需的最小环                境,非常适合微服务架构

管理:镜像可以存储在docker hub或者自用的docker仓库中,通过版本控制            进行管理

2. docker是什么

docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目,基于go语言开发,后来加入了Linux基金会进行维护,遵从Apache2.0协议,代码在GitHub上托管 github.com/moby/moby

docker的工作原理是通过将应用程序及其所有依赖打包到一个镜像中,然后使用docker命令将这个镜像运行起来。镜像包含了运行应用程序所需要的所有组件

3. docker的优点

便携性:镜像可以将应用程序及其以来打包在一起,使其可以在任何支持docker的环境中运行。这种一致性避免了“在我机器上可以运行,到你那里就不行了”的问题

轻量级:docker运行的容器,共享主机操作系统的内核,而不需要每个容器运行一个完整的操作系统,相比较虚拟机,大大减少了资源开销,提高了运行效率

隔离性:每个容器相互独立,拥有自己的文件系统、进程空间和网络接口。这种隔离性确保了容器不会相互影响,提高了安全性和稳定性。

快速启动:docker容器启动速度非常快,通常几秒内就能完成。这使得快速部署和扩展应用变得非常容器

一致的环境:docker镜像确保开发、测试和生产环境的一致性,减少了由于环境差异导致的各种问题

良好的社区和生态系统:daocker拥有一个潘达切活跃的社区,提供了丰富的景象、工具和文档。dockerhub上有大量官方和第三方镜像可供使用

4. docker的缺点

性能开销:虽然docker相比虚拟机更轻量级,但容器的性能可能仍然不如直接在物理机上运行应 用程序,尤其在处理I/O密集型任务时

安全性问题:由于容器共享操作系统内核,容器间的隔离性不如虚拟机,存在潜在的安全风险。 需要额外的安全措施来保护容器环境

5. 安装docker

docker几乎支持所有的平台,windows、linux、mac等,现以Centos7.9为例(centos停更了,不会继续打补丁了,学习可以用,生产就不建议用了,可以用centos平替的操作系统rockyLinux)

主机ip:172.16.80.140

配置:4Gib/4vCPU/100G存储

5.1 对linux机器初始化

5.1.1 修改机器IP,变成静态IP

vim /etc/sysconfig/network-scripts/ifcfg-ens33

图片

编辑

修改完配置有重启下网络服务 systemctl restart network

5.1.2 关闭selinux

        为什么要关闭selinux?selinux时Linux系统的一种安全机制,可以限制系统资源(如文件、网络等)的访问,提高系统的安全性。在docker运行过程中,需要访问系统资源,但是selinux可能会限制访问,从而影响docker的运行 

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

然后要重启服务器,执行getenforce,如果是Disabled,就说明修改成功了

5.1.3 安装基础包

centos的yum源无法使用,可以已使用阿里云的源

cd /etc/yum.repos.d

mv CentOS-Base.repo CentOS-Base.repo.backup

wget http://mirrors.aliyun.com/repo/Centos-7.repo

mv Centos-7.repo CentOS-Base.repo

cd /etc/yum.repos.d

mv CentOS-Base.repo CentOS-Base.repo.backup

wget mirrors.aliyun.com/repo/Centos…

mv Centos-7.repo CentOS-Base.repo

清除yum缓存,重新创建到本地

yun clean all && yum makecache

yun clean all && yum makecache

安装包

yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm

yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm

        #上述命令解释如下:                       
1. device-mapper-persistent-data:
2. lvm2:逻辑卷管理器,用于管理逻辑卷。          
3. wget:用于从网络下载文件的命令行工具。         
4. net-tools:包含了一系列网络工具,如ifconfig
5. nfs-utils:NFS(Network File Sys
6. lrzsz:提供了用于在UNIX系统和计算机终端之间传输文件
7. gcc:GNU编译器集合,用于编译C语言和C++程序。   
8. gcc-c++:GNU编译器集合的C++编译器。      
9. make:用于自动化编译和安装程序的工具。         
10.cmake:用于跨平台软件构建的工具。           
11.libxml2-devel:libxml2的开发库,用于开发
12.openssl-devel:OpenSSL的开发库,用于在应
13.curl:用于从命令行或脚本中进行URL数据传输的工具。  
14.curl-devel:libcurl的开发库,用于在应用程序
15.unzip:用于解压缩ZIP文件的命令行工具。       
16.sudo:用于以其他用户的身份执行命令的工具,通常用于提升权
17.ntp:网络时间协议客户端,用于同步系统时钟。       
18.libaio-devel:异步I/O(AIO)的开发库,用于
19.vim:文本编辑器,通常用于在命令行中编辑文本文件。    
20.ncurses-devel:ncurses的开发库,用于在文
21.autoconf:用于自动配置软件包的工具。        
22.automake:用于自动生成Makefile文件的工具。 
23.zlib-devel:zlib的开发库,用于在应用程序中进行
24.python-devel:Python的开发库,用于在应用程
25.epel-release:Extra Packages fo
26.openssh-server:OpenSSH服务器,用于远程
27.socat:多功能的网络工具,用于在不同类型的网络连接之间传
28.ipvsadm:IPVS管理工具,用于配置Linux内核中的
29.conntrack:用于查看和管理Linux内核连接跟踪表的
30.telnet:用于通过Telnet协议连接到远程主机的工具。

5.1.4 修改主机名

hostnamectl set-hostname docker && bash

hostnamectl set-hostname docker && bash

5.1.5 配置主机host文件

vi /etc/hosts

172.16.80.140  docker

      #备注:Linux机器配置主机名的用处:

1.标识主机:主机名是用来标识计算机或网络设备的名称。通过配置主机名,可以使得其他计算机或网络服务更容易地识别和定位该主机。在网络环境中,主机名是在进行网络通信时进行标识的重要信息之一。 

        2.管理网络服务:一些网络服务和应用程序可能需要知道主机的名称才能正常运行。通过配置主机名,可以确保这些服务能够正确地识别和绑定到正确的主机上。

        3.方便管理:在管理多台服务器或设备时,通过为每台设备配置唯一的主机名可以更轻松地进行识别和管理。这在进行系统日志分析、远程管理以及配置文件管理时特别有用。

        4.日志记录:主机名通常会出现在系统日志中,以标识生成日志的主机。通过主机名,可以更容易地跟踪和管理日志,特别是在分布式系统中。5.安全性:在一些情况下,主机名也用于识别访问权限。例如,通过配置防火墙规则或访问控制列表(ACL)时,可以基于主机名来限制对特定主机的访问。

5.1.6 关闭firewalld防火墙

systemctl stop firewalls

systemctl disable firewalld

5.1.7 配置时钟同步

yum intall chrony

systemctl start chronyd

systemctl enable chronyd

5.2 安装docker

5.2.1 配置安装docker需要的repo源

安装yum-utils,增强型yum命令

yum-config-manager管理yum配置文件和存储器,

yum install yum-utils -y

yum-config-manager --add-repo 

mirrors.aliyun.com/docker-ce/l…

yum clean all && yum makecache

5.2.2 修改机器内核参数

modprobe br_netfilter

vim /etc/sysctl.d/docker.conf 

输入如下内容:

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

加载参数配置

sysctl -p /etc/sysctl.d/docker.conf

参数含义:

net.bridge.bridge-nf-call-ip6tables = 1

这个参数启用了 IPv6 的iptables netfilter hook,允许 Linux 内核在网络层面上进行 IPv6 数据包的过滤和处理。在 Kubernetes 中,这个参数通常需要启用,因为 Kubernetes 网络通常是基于 iptables 实现的,而且在一些网络插件中可能会使用到 IPv6。这个参数的启用确保了 Linux 内核在处理 IPv6 数据包时会经过 iptables 过滤,从而确保网络功能的正常运行。

net.bridge.bridge-nf-call-iptables = 1

这个参数启用了 IPv4 的iptables netfilter hook,类似于前一个参数,但是针对 IPv4 数据包。它允许 Linux 内核在网络层面上进行 IPv4 数据包的过滤和处理。在 Kubernetes 中,这个参数通常需要启用,因为 Kubernetes 网络通常是基于 iptables 实现的,而且在一些网络插件中可能会使用到 Ipv4。这个参数的启用确保了 Linux 内核在处理 Ipv4 数据包时会经过 iptables 过滤,从而确保网络功能的正常运行。

net.ipv4.ip_forward = 1

这个参数启用了 Linux 内核的 IP 转发功能,允许 Linux 主机将收到的数据包从一个网络接口转发到另一个网络接口。在 Kubernetes 中,Pod 可能会跨越多个节点进行通信。例如,当一个 Pod 需要访问另一个 Pod 或外部服务时, 

        网络流量可能需要通过不同的节点进行路由。启用 IP 转发功能允许 Linux 主机将收到的数据包从一个网络接口转发到另一个网络接口,从而实现跨节点通信。            5.2.3 安装docker

yum install docker-ce

systemctl start docker

systemctl enable docker

systemctl status docker -l

6.配置docker镜像加速器

如果不配置镜像加速器,那么有可能在拉取镜像的时候速度很慢,或者根本无法拉取下来          vi /etc/docker/daemon.json

{

                 "registry-mirrors": [

                                                    "docker.m.daocloud.io",

                                                    "mirror.ccs.tencentyun.com"

                                                ]  

        }

加载配置使其生效

systemctl daemon-reload

重启docker服务

systemctl restart docker

测试:docker pull hello-world

  docker images

7.docker的基本用法

7.1 镜像相关操作

查找镜像(只能查找dockerhub,如果不通则会报错)

docker search centos

拉取镜像最新版本

docker pull busybox或者docker pull busybox:latest

把镜像做成离线文件

docker save -o busybox.tar.gz busy box

把离线文件里的镜像加载出来

docker loa -i busybox.tar.gz

查看本地镜像

docker images

删除本地镜像

docker rmi -f busybox

7.2 容器相关操作

以交互方式进入容器

docker run --name=busybox -it busybox /bin/sh

说明:

docker run是运行容器

--name=busybox 给这个容器起个名字

-it 其实是两个参数,i表示标准输入,t表示伪终端

busybox是指镜像名称

/bin/sh是在容器中启动sh

图片

编辑

查看docker 容器

docker ps -a

图片

编辑

status状态是Exited是因为参数没有 -d,exit就退出了

删除docker 容器

docker rm busybox   或者   docker rm 9e66607da429

停止正在运行的容器

docker stop busybox   或者   docker stop 9e66607da429

启动停止的容器

docker start busybox    或者   docker start 9e66607da429

进入容器

docker exec -it busybox /bin/sh 或者  

docker exec -it 9e66607da429  /bin/sh 

查看帮助

docker --help  或者 docker

查看docker配置

docker info

8.通过docker部署nginx

用rockyLinux镜像,启动容器并登录

docker run --name nginx -p  80 -itd docker.io/library/rockylinux:8.9 docker ps -a

图片

docker. exec -it nginx /bin/bash

在docker里部署nginx

yum install nginx -y

启动nginx

/usr/bin/nginx

在容器内测试

curl localhost:80

在容器外面测试

curl 172.16.80.140:32768

也可以通过浏览器查看`

图片