一、docker基本介绍
1.docker的概念
Docker 是容器的称呼,常见的容器除了docker外,还有containerd、podman、CRI-O等,开 发写好的代码或者需要部署的服务,都打包到一个镜像里,然后基于docker或者containerd或者 podman运行镜像,就可以提供相应的服务了。
Docker 基本概念
镜像(Image):一个可运行的二进制文件,包含了运行应用程序所需的所有依赖项和配置信息。可 以通过编写 Dockerfile 文件来创建镜像。
容器(Container):一个运行中的镜像实例,包含了应用程序和其依赖项。可以使用 Docker CLI 或 Docker Compose 来创建和管理容器。
仓库(Registry):一个存储和分发镜像的地方。Docker Hub 是 Docker 官方提供的仓库,可以 在其中找到许多常用的镜像,也可以在其中上传和分享自己的镜像。
Docker 官方网站:
Docker 官网:https://www.docker.com/
Docker 的github 地址:https://github.com/moby/moby
Docker hub 官网:https://registry.hub.docker.com
Dockerhub 国内可能没法访问,替代网址: https://hub-stage.docker.com/
Dockerhub:Dockerhub 是存放docker镜像的一个官方网站,dockerhub上提供了很多常用的 镜像供用户下载,如ubuntu、centos、debian等操作系统镜像。通过dockerhub用户也可以存 自己的docker镜像,但是需要需要注册一个账号,在网站上创建一个docker仓库。
2.Docker 特性
优点: 1、高度可移植性:Docker 可以在任何支持 Docker 的平台上运行,而且容器可以在不同的环境 中快速、简单地部署和移植。
2、轻量级和高效:Docker 容器非常轻量级,启动和停止速度快,并且对系统资源的占用非常少。 3、隔离性好:Docker 使用 Namespace 和 cgroups 技术实现容器的隔离,每个容器都拥有自 己的进程、网络、文件系统和其他资源,保证了容器之间的隔离性和安全性。
4、易于管理和扩展:Docker 提供了一系列的命令行工具和图形化界面,可以方便地管理和监控容 器。同时,Docker 还支持容器编排工具,如 Kubernetes,可以轻松地管理和扩展容器集群。
5、生态系统丰富:Docker 拥有庞大的社区和生态系统,提供了丰富的容器镜像和插件,可以方便 地构建、部署和运行应用程序。
3.服务器、虚拟机、容器的区别
服务器:服务器可以理解为一种能够承载计算、存储和网络等功能的硬件设备,它 就像是一个装满书籍、文件、音乐等各种资源的大型图书馆,而这些资源就是我们在日常生活和工作中所 需要的各种数据。服务器还可以通过虚拟化技术将一台物理服务器划分成多个虚拟机或容器,从而实现 资源共享和资源利用率的最大化,就像是一座集装箱码头,可以最大限度地利用有限的资源,提高效率和 效益。
虚拟机(Virtual Machine)和容器(Container)是两种常见的虚拟化技术。它们都允许多个操 作系统环境在同一台物理计算机上运行,但是它们的实现方式和使用场景有所不同。
上图左侧是虚拟机的架构。可以看出,有4个操作系统(Operating System) ,分别是 Host Operating System 和 3个 Guest Operating System。每个虚机中都有一个独立的Kernel。 虚拟机技术通过虚拟化硬件资源(例如CPU、内存、存储等)来创建一个完整的虚拟计算机,其中 包含独立的操作系统、应用程序和用户数据。每个虚拟机都像一个独立的物理计算机,可以运行不同的操 作系统和应用程序。虚拟机的启动时间较慢,占用的系统资源相对较多。
右侧为容器架构,很明显图中只有一个操作系统,即只有一个独立的Kernel。容器可以共享宿主机 的操作系统内核,并在容器中运行应用程序及其依赖项。容器启动时间较快,占用的系统资源相对较少 相当于说你以前,1台服务器可以虚拟化10台不同操作系统的虚拟机,现在呢,1台服务器可以跑 100 个docker,机器利用率更高了,而且创建docker速度要比虚拟机快的多。
二、docker容器安装并配置镜像加速器
1.修改主机名
#修改主机名 hostnamectl set-hostname xuegod63 #让主机名生效 bash2.关闭selinux、停掉防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 注意:修改selinux配置文件之后,重启linux机器,selinux才能永久生效 getenforce #查看selinux 是否关闭 显示Disabled说明selinux成功关闭 #关闭防火墙并配置禁止开机自启 systemctl stop firewalld && systemctl disable firewalld3.配置时间同步
#安装chrony服务 yum -y install chrony #如果没有该服务安装一下 systemctl enable chronyd --now #设置 chronyd 开机启动并立即启动chronyd服务同步网络时间 #编辑 chronyd 配置文件,使用中国的时间服务器同步时间,速度更快 vim /etc/chrony.conf #文件最后增加如下内容 server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst server ntp1.tencent.com iburst server ntp2.tencent.com iburst systemctl restart chronyd date #查看当前时间 写个计划任务,定时同步时间: crontab -e * * * * * /usr/bin/systemctl restart chronyd systemctl restart crond4.开启包转发功能和修改内核参数
modprobe br_netfilter #加载透明防火墙 cat > /etc/sysctl.d/docker.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl -p /etc/sysctl.d/docker.conf 备注,内核参数相关说明: 1、net.bridge.bridge-nf-call-ip6tables = 1: 该参数启用了桥接网络设备(bridge)在IPv6包进行iptables规则过滤时,通过netfilter模块将数据包传递给iptables处理。这个参数通常用于虚拟化环境,如Docker等,以支持IPv6流量的转发 和安全过滤。如果不启用该参数,则在桥接设备上的IPv6流量无法进行iptables规则过滤。 2、net.bridge.bridge-nf-call-iptables = 1: 该参数启用了桥接网络设备(bridge)在IPv4包进行iptables规则过滤时,通过netfilter模块将 数据包传递给iptables处理。这个参数通常用于虚拟化环境,如Docker等,以支持IPv4流量的转发 和安全过滤。如果不启用该参数,则在桥接设备上的IPv4流量无法进行iptables规则过滤。 3、net.ipv4.ip_forward = 1: 该参数启用了Linux操作系统的IP转发功能,允许路由器将接收到的数据包转发到其他网络。这个 参数通常用于构建网络拓扑,如在一个局域网内部部署多台主机并让它们可以访问外部互联网。如果不启 用该参数,则Linux系统默认不会转发IP数据包。5.在线安装docker
配置安装docker-ce需要的国内yum源(阿里云) yum -y install yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo6.开始安装docker
yum install docker-ce wget net-tools nfs-utils gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo libaio-devel wget ncurses-devel autoconf automake zlib-devel epel-release openssh-server socat ipvsadm conntrack -y --allowerasing 备注,yum install 安装软件包,加参数—allowerasing,可以替换掉冲突的软件包 #启动docker服务 并配置开机自启 systemctl start docker && systemctl enable docker #查看Docker 版本信息 docker version #查看docker状态 systemctl status docker 显示running,说明docker正常起来了7.docker 基本用法-操作镜像
#搜索镜像 docker search centos #默认从Docker Hub 中搜索镜像。 #从docker hub上下载镜像 docker pull centos #本地加载离线镜像 docker load -i /root/nginx.tar.gz #下载好的镜像打包 docker save -o rockylinux.tar.gz rockylinux #列出所有本地镜像 docker images #删除镜像 docker rmi -f <镜像名字>:[tag] #镜像打标签,重新起名字 docker tag centos:latest centos:v1 #查看帮助命令 docker --help #如果不调整配置修改docker路径的话,镜像文件存放在 /var/lib/docker/image/overlay2/imagedb/content/sha256 #查看容器的基本西悉尼 docker inspect <容器 id | 容器的名字> #停掉docker容器 docker stop <容器 id | 容器的名字> #查看所有,包括停止的容器 docker ps -a #查看容器日志 docker logs <容器 id | 容器的名字> #容器改名 docker rename my_container new_container #容器启动 docker start <容器 id | 容器的名字> #访问正在运行的容器 docker exec -it <container id | name> /bin/bash #假设通过该Dockerfile构建的镜像名为 myimage。 docker build -t=myimage8.配置镜像加速器,根据自己的情况配置
tee /etc/docker/daemon.json << 'EOF' { "registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub mirror.c.163.com"] } EOF #重启docker服务使配置生效 #通过下面命令查看镜像是否生效 docker info三、通过docker部署应用
1.基于镜像启动容器,启动参数列举部分,如果想详细了解启动参数可以网上搜索
docker run -d -p 80:80 --name nginxd nginx -d 在后台运行 ; -p 物理机的80端口:容器实例的80端口 ,把容器中的80端口映射到物理机上的80端口 在物理机上查看容器状态: --name:指定容器的名字-it:以交互模式运行容器,允许与容器进行交互。 -v:挂载主机上的文件或目录到容器内部。 -e:设置容器的环境变量。 --restart:指定容器在退出时的重启策略。 --link:将容器连接到另一个容器,在两个容器之间建立网络连接。 --dns:指定容器使用的自定义 DNS 服务器。 --dns-search:指定容器的 DNS 搜索域。 --cap-add 和 --cap-drop:增加或删除容器的 Linux 能力,用于控制容器的权限。 --privileged:给容器赋予特权,可以访问主机的设备。 --tmpfs:在容器内创建临时文件系统,用于存储临时数据。 --ulimit:设置容器的资源限制,如最大打开文件数、最大进程数等。 --security-opt:设置容器的安全选项,如 AppArmor 配置、Seccomp 配置等。 --cpu-shares:设置容器的 CPU 份额,用于控制 CPU 资源的分配。 --memory:设置容器可使用的内存限制。 --network:指定容器使用的网络模式。 --hostname:设置容器的主机名。 --user:指定容器运行时的用户名或 UID。 --volume-driver:指定容器使用的卷驱动程序。 --shm-size:设置容器的共享内存大小。 --add-host:向容器的 /etc/hosts 文件添加自定义主机名和 IP 映射。 --read-only:将容器的文件系统设置为只读模式。 --cpu-period:设置容器的 CPU 周期,以微秒为单位。 --dns-option:为容器的 DNS 配置添加自定义选项。 --sysctl:设置容器的内核参数。 --label:为容器添加标签,用于识别和组织容器。 --workdir:设置容器的工作目录。2.基于dockerfile构建镜像
Dockerfile 是以关键字指令为基础构建的。每个指令都会创建一个镜像层,并根据该指令设置该层 的配置,然后这些配置将被持久化到一个新的镜像中。Dockerfile文件由注释行、空行和指令行组成。 注释行:Dockerfile 中的注释以#开头,并在#后面添加注释文本。 指令行:Dockerfile 中的指令为大写字母开头,指令可以有参数和选项,并以换行符(\)进行换 行。每个指令都会生成一个新的镜像层。
1)FROM:基础镜像,必须是可以下载下来的,例如FROM rockylinux:8.8,表示从dockerhub 上拉取rockylinux镜像
2)LABEL:LABEL指令可以为镜像添加各种元数据,包括作者、版本、描述等等。这些元数据可以 在后续的镜像构建和部署中使用,以帮助更好地管理和维护镜像。
3)RUN: RUN指令可以用于执行一些命令,并在当前镜像上创建一个新的中间镜像。这个指令的 作用类似于在容器内部运行一些命令,然后通过docker commit命令保存为新的镜像。 #shell 模式 RUN RUN yum install wget -y #exec 模式 RUN ["executable","param1","param2"] RUN ["/bin/bash","-c","yum install wget -y"] EXPOSE:用来声明端口的 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。 在运行时使用随机端口映射时,也就是 docker run -P ,会自动随机映射EXPOSE的端口。 格式: EXPOSE [...]
4)CMD指令可以指定容器启动时要执行的命令,但它可以被docker run命令的参数覆盖掉。
5)ENTRYPOINT 指令和CMD类似,用户指定容器启动时要执行的命令,但如果dockerfile中 也有CMD指令,CMD中的参数会被附加到ENTRYPOINT 指令的后面。 如果这时docker run命令 带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。这样当容 器启动后,会执行ENTRYPOINT 指令的参数部分。 可以看出,相对来说ENTRYPOINT指令优先级更高。
6)COPY: 复制指令,从linux机器复制文件或者目录到镜像里指定的路径。 格式: COPY [--chown=:] ... COPY [--chown=:] ["",... ""] [--chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。 :源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如: COPY hom* /mydir/ COPY hom?.txt /mydir/ :容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
7)ADD:指令和COPY的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同 之处如下: ADD 的优点:在执行 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情 况下,会自动复制并解压到 。 ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会 令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
8)ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。 格式: ENV ENV = =... 以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用: ENV NODE_VERSION 7.2.0