前言: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下使用。开发在开发环境上调试好的代码,发给测试在测试环境上测试,最后在生产环境部署,理想中是这样的,但是真是的情况,会是什么样子呢?
- 开发环境没问题,测试环境报错:排查后发现是启动脚本里的jdk版本和代码要求版本不匹配
- 测试环境没问题,生产环境报错:生产环境中的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": [
]
}
加载配置使其生效
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