普通视图

Received today — 2026年6月7日Liu Zijian's Blog

Dockerfile

2024年11月24日 00:00

Dockerfile概述

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

从应用软件的角度来看,Dockerfile,Docker镜像,Docker容器分别代表软件的三个不同阶段

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器可以认为是软件的运行态

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及运维和部署,合力充当Docker体系的基石。

Dockerfile定义了进程需要的一切东西,Dockerfile涉及的内容包括执行代码或者文件,环境变量,依赖包,运行时环境,动态链接库,操作系统发行版,服务进程和内核进程(当应用程序需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等。

Docker镜像,在用Dockerfile定义了一个构建文件之后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会开始真正的提供服务。

Docker容器,是直接提供服务的进程。

Dockerfile构建过程:

  1. docker从基础镜像运行一个容器
  2. 执行一条指令,并对容器进行修改
  3. 执行类似docker commit的操作,提交一个新的镜像层
  4. docker再基于刚刚提交的镜像运行一个新容器
  5. 继续执行Dockerfile的下一条指令,直到所有指令都执行完成

Dockerfile的保留字指令

Dockerfile每个保留字指令均为大写,且后面至少跟随一个参数,指令从上到下顺序执行,用#表示注释。

  • FROM

    基本出现在第一行,意思是要构建的新镜像继承于或者说基于哪个已存在的镜像。

    FROM ubuntu:20.04
  • MAINTAINR

    维护者信息(姓名和邮箱地址)

  • ENV

    用于在构建镜像的过程中设置环境变量,这个环境变量可以在后续的任何RUN指令中使用,就像在命令前面指定了环境变量一样,也可以在其他指令中直接使用这些环境变量,比如WORKDIR $JAVA_HOME

    ENV PATH="/usr/local/bin:${PATH}"
  • RUN

    容器构建(docker build)时需要运行的命令,分为shellexec两种格式

    shell

    RUN apt-get update && apt-get install -y curl

    exec

    RUN ["apt-get", "install", "-y", "curl"]
  • EXPOSE

    声明容器运行时应该开放的端口。它不会自动开启端口,但为外部用户或其他容器提供信息

    EXPOSE 80 443
  • WORKDIR

    指定在创建容器后,终端默认登录进来的工作目录,当执行docker run -it 镜像ID /bash进入容器内部的时候,会默认落脚在哪个目录里

  • USER

    指定镜像以什么用户去执行,如果不指定,默认是root

    USER myuser
  • VOLUME

    容器数据卷,用于数据的保存和持久化,声明容器内的哪个目录需要在运行时挂载数据卷到宿主机上

    VOLUME ["/data"]
  • ADD

    ADD功能相比COPY更加强大,将宿主机内的文件拷贝进镜像,如果源文件是.tar.tar.gz等压缩格式的文件,ADD会自动解压到目标路径。ADD还可以从指定的URL下载文件并复制到容器内。

    ADD <宿主机源路径> <容器内目标路径>
  • COPY

    仅仅执行文件的复制,不支持自动解压或下载

    COPY <宿主机源路径> <容器内目标路径>
  • CMD

    指定容器启动后要做的事情,支持shellexec两种格式,还支持参数列表格式,如果指定了ENTRYPOINT指令,CMD就会被用来指定具体的运行参数

    注意事项

    1.RUNCMD的区别: RUN是构建镜像时执行,CMDdocker run容器启动时执行

    2.Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

    例如:tomcat的Dockerfile的最后一行是CMD ["catalina.sh", "run"],那么使用docker run -it tomcat /bin/bash命令启动这个镜像时,容器会启动,但是tomcat就不会被启动,因为被run后的命令/bin/bash替换掉了,故容器启动后会运行/bin/bash

  • ENTRYPOINT

    类似于CMD命令,但是不会被docker run后的命令覆盖,而且还会把docker run后的命令当作命令行参数传递给ENTRYPOINT指令指定的程序

    ENTRYPOINT ["可执行文件", "参数1", "参数2", ......]

    ENTRYPOINT可以和CMD一起用,一般是变参才会使用到CMD,这里的CMD等同于是在给ENTRYPOINT传参,当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,它们两个组合后会变成<ENTRYPOINT> "<CMD>"

    案例:

    FROM nginxENTRYPOINT ["nginx", "-c"] #相当于命令加定参CMD ["/etc/nginx/nginx.conf"] #相当于可替换的变参
    按照Dockerfile原样执行传参运行
    Docker命令docker run nginxdocker run nginx /etc/nginx/kms.conf
    容器实际执行nginx -c /etc/nginx/nginx.confnginx -c /etc/nginx/kms.conf

如果写成docker run nginx -c /etc/nginx/kms.conf也可以实现参数替换,-c不会被重复的叠加成docker run nginx -c -c /etc/nginx/kms.conf,因为ENTRYPOINT本身未包含-c,而CMD提供了-c的值

用Dockerfile构建镜像

  编写一个Dockerfile,用于构建一个自带Java17环境的RockyLinux9镜像,构建的镜像基于发行版rockylinux:8.9,新镜像内新增vimnet-tools组件,并将下载好的jdk17拷贝进去,并设置jdk相关的环境变量,让这个镜像构建的容器自带原版镜像不默认安装的一些工具,并且自带jdk17

找到一个空文件夹,vim Dockerfile编辑文件将构建命令写进去

FROM rockylinux:8.9MAINTAINER lzj2023@foxmail.comENV MYPATH /optWORKDIR $MYPATHRUN yum install -y vim net-tools RUN mkdir /opt/jdk# 此处使用相对路径,jdk-17.0.12_linux-x64_bin.tar.gz要和Dockerfile在同一目录ADD jdk-17.0.12_linux-x64_bin.tar.gz /opt/jdkENV JAVA_HOME /opt/jdk/jdk-17.0.12ENV PATH $JAVA_HOME/bin:$PATHCMD ["/bin/bash"]

编写完成后,再将要打包进去的jdk-17.0.12_linux-x64_bin.tar.gz放在同级目录,然后在这个目录内执行docker build命令,会用当前目录(.)下的Dockerfile构建镜像,镜像名称和标签是rockey8_jdk17:1.0.0

docker build -t rockey8_jdk17:1.0.0  .

执行输出

[root@localhost opt]# docker build -t rockey8_jdk17:1.0.0  .Sending build context to Docker daemon  566.8MBStep 1/11 : FROM rockylinux:8.98.9: Pulling from library/rockylinux9088cdb84e39: Pull complete Digest: sha256:9794037624aaa6212aeada1d28861ef5e0a935adaf93e4ef79837119f2a2d04cStatus: Downloaded newer image for rockylinux:8.9 ---> c79048e50f5fStep 2/11 : MAINTAINER lzj2023@foxmail.com ---> Running in 9c40b7e878e1Removing intermediate container 9c40b7e878e1 ---> e58d03a7ebaeStep 3/11 : ENV MYPATH /opt ---> Running in d8448a9b4329Removing intermediate container d8448a9b4329 ---> da5da26abbe3Step 4/11 : WORKDIR $MYPATH ---> Running in ddf20f025c3fRemoving intermediate container ddf20f025c3f ---> 2fe907e79d95Step 5/11 : RUN yum -y install  vim ---> Running in f88378120cc1Rocky Linux 8 - AppStream                       3.4 MB/s |  15 MB     00:04    Rocky Linux 8 - BaseOS                          2.5 MB/s | 9.4 MB     00:03    Rocky Linux 8 - Extras                          5.1 kB/s |  14 kB     00:02    Dependencies resolved.================================================================================ Package            Arch       Version                      Repository     Size================================================================================Installing: vim-enhanced       x86_64     2:8.0.1763-19.el8_6.4        appstream     1.4 MInstalling dependencies: gpm-libs           x86_64     1.20.7-17.el8                appstream      38 k vim-common         x86_64     2:8.0.1763-19.el8_6.4        appstream     6.3 M vim-filesystem     noarch     2:8.0.1763-19.el8_6.4        appstream      49 k which              x86_64     2.21-20.el8                  baseos         49 kTransaction Summary================================================================================Install  5 PackagesTotal download size: 7.8 MInstalled size: 30 MDownloading Packages:[MIRROR] gpm-libs-1.20.7-17.el8.x86_64.rpm: Curl error (52): Server returned nothing (no headers, no data) for http://au.mirrors.cicku.me/rocky/8.10/AppStream/x86_64/os/Packages/g/gpm-libs-1.20.7-17.el8.x86_64.rpm [Empty reply from server][MIRROR] vim-common-8.0.1763-19.el8_6.4.x86_64.rpm: Curl error (52): Server returned nothing (no headers, no data) for http://au.mirrors.cicku.me/rocky/8.10/AppStream/x86_64/os/Packages/v/vim-common-8.0.1763-19.el8_6.4.x86_64.rpm [Empty reply from server][MIRROR] vim-enhanced-8.0.1763-19.el8_6.4.x86_64.rpm: Curl error (52): Server returned nothing (no headers, no data) for http://au.mirrors.cicku.me/rocky/8.10/AppStream/x86_64/os/Packages/v/vim-enhanced-8.0.1763-19.el8_6.4.x86_64.rpm [Empty reply from server](1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm        4.6 kB/s |  38 kB     00:08    (2/5): vim-filesystem-8.0.1763-19.el8_6.4.noarc 172 kB/s |  49 kB     00:00    (3/5): vim-common-8.0.1763-19.el8_6.4.x86_64.rp 725 kB/s | 6.3 MB     00:08    (4/5): vim-enhanced-8.0.1763-19.el8_6.4.x86_64. 144 kB/s | 1.4 MB     00:09    [MIRROR] which-2.21-20.el8.x86_64.rpm: Curl error (52): Server returned nothing (no headers, no data) for http://au.mirrors.cicku.me/rocky/8.10/BaseOS/x86_64/os/Packages/w/which-2.21-20.el8.x86_64.rpm [Empty reply from server](5/5): which-2.21-20.el8.x86_64.rpm             7.4 kB/s |  49 kB     00:06    --------------------------------------------------------------------------------Total                                           449 kB/s | 7.8 MB     00:17     Rocky Linux 8 - AppStream                       1.6 MB/s | 1.6 kB     00:00    Importing GPG key 0x6D745A60: Userid     : "Release Engineering <infrastructure@rockylinux.org>" Fingerprint: 7051 C470 A929 F454 CEBE 37B7 15AF 5DAC 6D74 5A60 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficialKey imported successfullyRunning transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing        :                                                        1/1   Installing       : which-2.21-20.el8.x86_64                               1/5   Installing       : vim-filesystem-2:8.0.1763-19.el8_6.4.noarch            2/5   Installing       : vim-common-2:8.0.1763-19.el8_6.4.x86_64                3/5   Installing       : gpm-libs-1.20.7-17.el8.x86_64                          4/5   Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64                          4/5   Installing       : vim-enhanced-2:8.0.1763-19.el8_6.4.x86_64              5/5   Running scriptlet: vim-enhanced-2:8.0.1763-19.el8_6.4.x86_64              5/5   Running scriptlet: vim-common-2:8.0.1763-19.el8_6.4.x86_64                5/5   Verifying        : gpm-libs-1.20.7-17.el8.x86_64                          1/5   Verifying        : vim-common-2:8.0.1763-19.el8_6.4.x86_64                2/5   Verifying        : vim-enhanced-2:8.0.1763-19.el8_6.4.x86_64              3/5   Verifying        : vim-filesystem-2:8.0.1763-19.el8_6.4.noarch            4/5   Verifying        : which-2.21-20.el8.x86_64                               5/5 Installed:  gpm-libs-1.20.7-17.el8.x86_64                                                   vim-common-2:8.0.1763-19.el8_6.4.x86_64                                         vim-enhanced-2:8.0.1763-19.el8_6.4.x86_64                                       vim-filesystem-2:8.0.1763-19.el8_6.4.noarch                                     which-2.21-20.el8.x86_64                                                      Complete!Removing intermediate container f88378120cc1 ---> cb9eb843b319Step 6/11 : RUN yum install -y net-tools ---> Running in 15b13dec8321Last metadata expiration check: 0:00:29 ago on Sun Dec  8 07:29:48 2024.Dependencies resolved.================================================================================ Package         Architecture Version                        Repository    Size================================================================================Installing: net-tools       x86_64       2.0-0.52.20160912git.el8       baseos       321 kTransaction Summary================================================================================Install  1 PackageTotal download size: 321 kInstalled size: 942 kDownloading Packages:net-tools-2.0-0.52.20160912git.el8.x86_64.rpm   262 kB/s | 321 kB     00:01    --------------------------------------------------------------------------------Total                                           101 kB/s | 321 kB     00:03     Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing        :                                                        1/1   Installing       : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1   Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64              1/1   Verifying        : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 Installed:  net-tools-2.0-0.52.20160912git.el8.x86_64                                     Complete!Removing intermediate container 15b13dec8321 ---> 2e79057963a9Step 7/11 : RUN mkdir /opt/jdk ---> Running in 69bf76127e8dRemoving intermediate container 69bf76127e8d ---> 25f8d658823fStep 8/11 : ADD jdk-17.0.12_linux-x64_bin.tar.gz /opt/jdk ---> 83d8b92be129Step 9/11 : ENV JAVA_HOME /opt/jdk/jdk-17.0.12 ---> Running in 1f4043adc4cbRemoving intermediate container 1f4043adc4cb ---> 3c05d8189cadStep 10/11 : ENV PATH $JAVA_HOME/bin:$PATH ---> Running in 15d649530173Removing intermediate container 15d649530173 ---> c9f46f990422Step 11/11 : CMD ["/bin/bash"] ---> Running in 02d2ee2073eeRemoving intermediate container 02d2ee2073ee ---> fb5b6a2e5b81Successfully built fb5b6a2e5b81Successfully tagged rockey8_jdk17:1.0.0

提示构建成功,查看一下自己构建的镜像

[root@localhost opt]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZErockey8_jdk17       1.0.0               fb5b6a2e5b81        49 seconds ago      642MBrockylinux          8.9                 c79048e50f5f        12 months ago       198MB

用交互模式用刚刚构建成的镜像运行一个容器,执行命令java -version验证打包进去的jdk和环境变量,构建成功!

[root@localhost opt]# docker run -it rockey8_jdk17:1.0.0[root@a4703ffe3841 opt]# java -versionjava version "17.0.12" 2024-07-16 LTSJava(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)Java HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)

虚悬镜像

定义:REPOSITORYTAG都是<none>的镜像(dangling image),是由于构建和删除镜像时产生一些错误导致的,虚悬镜像会占用空间,因此需要清理掉它们

查出

docker image ls -f dangling=true

清理

docker image prune

使用虚拟机安装一个K8s集群

2024年11月17日 00:00

因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,拉取镜像,下载网络插件等操作,需要科学上网访问DockerHub。

安装全过程均使用ROOT权限。

1.安装前准备工作

这里采用3台CentOS虚拟机进行集群安装,安装前需要环境准备:

  1. 使用虚拟机VMware新建一个NAT类型网络(一般都会默认自带,只进行设置即可),我的起名叫VMnet8,设置VMnet8的子网IP为192.168.228.0,子网掩码为255.255.255.0,网关地址为192.168.228.2,起止IP地址范围192.168.228.3-192.168.228.254,并勾选”将主机虚拟适配器连接到此网络”为物理机分配IP地址,一般会分配192.168.228.1给物理机。

  2. VMware安装3台Linux虚拟机,可以安装一台,然后完整克隆,这里我采用的安装镜像版本是CentOS-7-x86_64-Minimal-2009,安装完成后,设置网络为VMnet8,将IP获取方式由DHCP修改为静态,并将IP地址分别设置为192.168.228.131192.168.228.132192.168.228.133,再分别设置网关,子网掩码,DNS,MAC地址,并保证MAC地址互相不重复。

系统下载地址 https://mirrors.aliyun.com/centos/7/isos/x86_64/

2.安装docker

K8s是个容器编排工具,需要容器环境,这里容器环境采用Docker,每台机器都要安装docker环境

3.安装K8s集群

3.1 安装条件

  • 兼容的Linux发行版(Ubuntu,CentOS等等)
  • 机器需要2GB内存,CPU2核及以上
  • 集群中机器网络彼此互通
  • 集群中不可有重复的主机名
  • 集群中不可有重复的MAC地址

3.2 安装规划

主节点一台机器,从节点两台机器

  • 主节点master

    主机名:k8s131, IP:192.168.228.131

  • 从节点node

    主机名:k8s132, IP:192.168.228.132
    主机名:k8s133, IP:192.168.228.133

3.3 安装前设置

三台机器都要进行设置。

1.设置主机名

在对应IP地址的机器上分别设置主机名为k8s131k8s132k8s133

hostnamectl set-hostname xxx

执行后,检查是否都设置好了

hostname

会话exit退出后重连shell,就会看到shell的计算机名已经变成了自己设置的计算机名root@k8s131

Last login: Thu Nov 21 17:47:02 2024 from 192.168.228.1[root@k8s133 ~]# 

2.关闭交换分区

使用free -m命令,可以查看交换分区情况,安装K8s前,需要关闭交换分区,且永久关闭

[root@localhost ~]# free -m              total        used        free      shared  buff/cache   availableMem:           1819         309        1166           9         342        1360Swap:          2047           0        2047

执行命令,永久关闭交换分区(将Swap设置为 0 0 0)

swapoff -a  sed -ri 's/.*swap.*/#&/' /etc/fstab

3.禁用,并永久禁用SELinux

sudo setenforce 0sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

4.设置允许iptables检查桥接流量

将IPV6流量桥接到IPV4网卡上,是K8s官方要求的做法

cat <<EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsudo sysctl --system

5.关闭防火墙

CentOS7默认打开防火墙firewalld,3台都需要关闭firewalld

systemctl stop firewalldsystemctl disable firewalld

3.4 安装K8s组件

1.安装kubelet、kubeadm、kubectl

首先添加k8s软件包的yum源到三台机器

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgexclude=kubelet kubeadm kubectlEOF

三台机器依次执行安装命令

sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

三台机器都启动kubelet,并设置开机启动

sudo systemctl enable --now kubelet

不停执行systemctl status kubelet会发现服务一直处于闪断状态,因为kubelet一直在等待

3.5 初始化主节点

使用kubeadm引导集群,初始化主节点。

1.首先所有机器都要先下载需要的镜像

docker pull registry.k8s.io/kube-apiserver:v1.20.9docker pull registry.k8s.io/kube-proxy:v1.20.9docker pull registry.k8s.io/kube-controller-manager:v1.20.9docker pull registry.k8s.io/kube-scheduler:v1.20.9docker pull registry.k8s.io/coredns:1.7.0docker pull registry.k8s.io/etcd:3.4.13-0docker pull registry.k8s.io/pause:3.2

下载完成后docker images验证

2.设置主节点域名映射

3台机器都必须添加master节点(又叫集群的入口节点)的域名映射,IP按实际情况修改。

echo "192.168.228.131  cluster-endpoint" >> /etc/hosts

3.初始化主节点

主节点所在机器上执行命令,初始化主节点

参数解释

  • --service-cidr, --pod-network-cidr 两项设置的网络范围不能重叠,也不能同服务器所在网络范围重叠。
  • --apiserver-advertise-address改成自己主节点的IP。
  • --control-plane-endpoint改为自己设置的主节点域名。

命令

kubeadm init \--image-repository registry.k8s.io \--apiserver-advertise-address=192.168.228.131 \--control-plane-endpoint=cluster-endpoint \--kubernetes-version=v1.20.9 \--service-cidr=10.96.0.0/16 \--pod-network-cidr=192.168.23.0/24 

等待初始化完成后,终端输出提示成功,说明初始化完成。输出的内容需要复制保存备用。

[root@k8s131 ~]# kubeadm init \> --image-repository registry.k8s.io \> --apiserver-advertise-address=192.168.228.131 \> --control-plane-endpoint=cluster-endpoint \> --kubernetes-version=v1.20.9 \> --service-cidr=10.96.0.0/16 \> --pod-network-cidr=192.168.23.0/24 [init] Using Kubernetes version: v1.20.9[preflight] Running pre-flight checks[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.7. Latest validated version: 19.03[preflight] Pulling images required for setting up a Kubernetes cluster[preflight] This might take a minute or two, depending on the speed of your internet connection[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'[certs] Using certificateDir folder "/etc/kubernetes/pki"[certs] Generating "ca" certificate and key[certs] Generating "apiserver" certificate and key[certs] apiserver serving cert is signed for DNS names [cluster-endpoint k8s131 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.228.131][certs] Generating "apiserver-kubelet-client" certificate and key[certs] Generating "front-proxy-ca" certificate and key[certs] Generating "front-proxy-client" certificate and key[certs] Generating "etcd/ca" certificate and key[certs] Generating "etcd/server" certificate and key[certs] etcd/server serving cert is signed for DNS names [k8s131 localhost] and IPs [192.168.228.131 127.0.0.1 ::1][certs] Generating "etcd/peer" certificate and key[certs] etcd/peer serving cert is signed for DNS names [k8s131 localhost] and IPs [192.168.228.131 127.0.0.1 ::1][certs] Generating "etcd/healthcheck-client" certificate and key[certs] Generating "apiserver-etcd-client" certificate and key[certs] Generating "sa" key and public key[kubeconfig] Using kubeconfig folder "/etc/kubernetes"[kubeconfig] Writing "admin.conf" kubeconfig file[kubeconfig] Writing "kubelet.conf" kubeconfig file[kubeconfig] Writing "controller-manager.conf" kubeconfig file[kubeconfig] Writing "scheduler.conf" kubeconfig file[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"[kubelet-start] Starting the kubelet[control-plane] Using manifest folder "/etc/kubernetes/manifests"[control-plane] Creating static Pod manifest for "kube-apiserver"[control-plane] Creating static Pod manifest for "kube-controller-manager"[control-plane] Creating static Pod manifest for "kube-scheduler"[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s[apiclient] All control plane components are healthy after 14.007116 seconds[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace[kubelet] Creating a ConfigMap "kubelet-config-1.20" in namespace kube-system with the configuration for the kubelets in the cluster[upload-certs] Skipping phase. Please see --upload-certs[mark-control-plane] Marking the node k8s131 as control-plane by adding the labels "node-role.kubernetes.io/master=''" and "node-role.kubernetes.io/control-plane='' (deprecated)"[mark-control-plane] Marking the node k8s131 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule][bootstrap-token] Using token: 4qn4kj.52saric9a3vqnk1w[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key[addons] Applied essential addon: CoreDNS[addons] Applied essential addon: kube-proxyYour Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:  mkdir -p $HOME/.kube  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  sudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:  export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:  https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of control-plane nodes by copying certificate authoritiesand service account keys on each node and then running the following as root:  kubeadm join cluster-endpoint:6443 --token 4qn4kj.52saric9a3vqnk1w \    --discovery-token-ca-cert-hash sha256:7f12181600006aeb62fb38bcb82582809a9ad1911e49065f1fd13f9c68c95774 \    --control-plane Then you can join any number of worker nodes by running the following on each as root:kubeadm join cluster-endpoint:6443 --token 4qn4kj.52saric9a3vqnk1w \    --discovery-token-ca-cert-hash sha256:7f12181600006aeb62fb38bcb82582809a9ad1911e49065f1fd13f9c68c95774 

4.配置文件目录

按照上述的输出提示“To start using your cluster, you need to run the following as a regular user” 还需要需要在主节点执行下面的命令

mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

5.部署网络插件

按照上述的输出提示 You should now deploy a pod network to the cluster. Run “kubectl apply -f [podnetwork].yaml”,接下来还需要部署一个pod网络插件到master节点上。

输入命令kubectl get nodes -A,测试下主节点状态,返回NotReady是因为还没有部署网络插件。

[root@k8s131 ~]# kubectl get nodes -ANAME     STATUS     ROLES                  AGE    VERSIONk8s131   NotReady   control-plane,master   5h5m   v1.20.9

k8s支持多种网络插件,例如calico,安装前要先将它的编排文件下载到本地目录

curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O  

配置文件中找到以下内容

# - name: CALICO_IPV4POOL_CIDR#   value: "192.168.0.0/16"

将默认的192.168.0.0/16修改为--pod-network-cidr=指定的地址192.168.23.0/24,并解除注释

- name: CALICO_IPV4POOL_CIDR  value: "192.168.23.0/24"

在主节点执行命令,部署网络插件calico,部署过程需要联网下载镜像

kubectl apply -f calico.yaml
[root@k8s131 opt]# kubectl apply -f calico.yaml configmap/calico-config createdcustomresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org createdclusterrole.rbac.authorization.k8s.io/calico-kube-controllers createdclusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers createdclusterrole.rbac.authorization.k8s.io/calico-node createdclusterrolebinding.rbac.authorization.k8s.io/calico-node createddaemonset.apps/calico-node createdserviceaccount/calico-node createddeployment.apps/calico-kube-controllers createdserviceaccount/calico-kube-controllers createdpoddisruptionbudget.policy/calico-kube-controllers created

输入kubectl get pods -A查看网络插件pod部署情况

状态为ContainerCreatingInit说明正在下载部署

[root@k8s131 opt]# kubectl get pods -ANAMESPACE     NAME                                       READY   STATUS              RESTARTS   AGEkube-system   calico-kube-controllers-577f77cb5c-wpxh7   0/1     ContainerCreating   0          21mkube-system   calico-node-7wb4z                          0/1     Init:2/3            0          9m3skube-system   coredns-76c6f6bbc9-4q5f9                   0/1     ContainerCreating   0          5h41mkube-system   coredns-76c6f6bbc9-nkdcl                   0/1     ContainerCreating   0          5h41mkube-system   etcd-k8s131                                1/1     Running             1          5h41mkube-system   kube-apiserver-k8s131                      1/1     Running             1          5h41mkube-system   kube-controller-manager-k8s131             1/1     Running             1          5h41mkube-system   kube-proxy-nt5jf                           1/1     Running             1          5h41mkube-system   kube-scheduler-k8s131                      1/1     Running             1          5h41m

完成后状态均为Running

[root@k8s131 opt]# kubectl get pods -ANAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGEkube-system   calico-kube-controllers-577f77cb5c-wpxh7   1/1     Running   0          24mkube-system   calico-node-7wb4z                          1/1     Running   0          12mkube-system   coredns-76c6f6bbc9-4q5f9                   1/1     Running   0          5h44mkube-system   coredns-76c6f6bbc9-nkdcl                   1/1     Running   0          5h44mkube-system   etcd-k8s131                                1/1     Running   1          5h45mkube-system   kube-apiserver-k8s131                      1/1     Running   1          5h45mkube-system   kube-controller-manager-k8s131             1/1     Running   1          5h45mkube-system   kube-proxy-nt5jf                           1/1     Running   1          5h44mkube-system   kube-scheduler-k8s131                      1/1     Running   1          5h45m

再次输入命令kubectl get nodes -A测试主节点状态,已经变为Ready,准备就绪,网络插件到此部署完成。

[root@k8s131 opt]# kubectl get nodes -ANAME     STATUS   ROLES                  AGE     VERSIONk8s131   Ready    control-plane,master   5h53m   v1.20.9

主节点至此初始化完成。

3.6 从节点加入集群

从节点加入集群的命令,在初始化主节点命令输出的内容中就有,在之前复制的输出内容中找到Then you can join any number of worker nodes by running the following on each as root:,并找到它下面的一行命令在每个从节点执行,该命令24小时内有效

kubeadm join cluster-endpoint:6443 --token 4qn4kj.52saric9a3vqnk1w \    --discovery-token-ca-cert-hash sha256:7f12181600006aeb62fb38bcb82582809a9ad1911e49065f1fd13f9c68c95774 

如果令牌忘记了,或者超过了24小时,在master节点上执行下面的命令,生成新的令牌

kubeadm token create --print-join-command

在两个从节点执行这个命令,执行后,以下提示,说明加入成功

[root@k8s132 ~]# kubeadm join cluster-endpoint:6443 --token bjme49.uhg7ubgjn2m16b76     --discovery-token-ca-cert-hash sha256:7f12181600006aeb62fb38bcb82582809a9ad1911e49065f1fd13f9c68c95774[preflight] Running pre-flight checks[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.7. Latest validated version: 19.03[WARNING Hostname]: hostname "k8s132" could not be reached[WARNING Hostname]: hostname "k8s132": lookup k8s132 on 192.168.228.2:53: server misbehaving[preflight] Reading configuration from the cluster...[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"[kubelet-start] Starting the kubelet[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...This node has joined the cluster:* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the new secure connection details.Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

回到主节点执行命令kubectl get nodes -A,查看节点状态,可以看到两个从节点了,但是状态是NotReady,此时执行kubectl get pods -A查看pods状态,发现是因为从节点的网络插件未初始化成功完成导致,此时需要耐心等待网络插件加载完成,以我的经验来说加载网络插件需要下载很久。

管理集群要靠主节点,kubectl命令只能在主节点执行

[root@k8s131 ~]# kubectl get nodes -ANAME     STATUS     ROLES                  AGE     VERSIONk8s131   Ready      control-plane,master   2d23h   v1.20.9k8s132   NotReady   <none>                 6m49s   v1.20.9k8s133   NotReady   <none>                 6m41s   v1.20.9
[root@k8s131 ~]# kubectl get pods -ANAMESPACE     NAME                                       READY   STATUS                  RESTARTS   AGEkube-system   calico-kube-controllers-577f77cb5c-wpxh7   1/1     Running                 1          2d18hkube-system   calico-node-7wb4z                          1/1     Running                 1          2d18hkube-system   calico-node-plcdp                          0/1     Init:ImagePullBackOff   0          8m22skube-system   calico-node-zwmrg                          0/1     Init:ImagePullBackOff   0          8m30skube-system   coredns-76c6f6bbc9-4q5f9                   1/1     Running                 1          2d23hkube-system   coredns-76c6f6bbc9-nkdcl                   1/1     Running                 1          2d23hkube-system   etcd-k8s131                                1/1     Running                 2          2d23hkube-system   kube-apiserver-k8s131                      1/1     Running                 2          2d23hkube-system   kube-controller-manager-k8s131             1/1     Running                 2          2d23hkube-system   kube-proxy-flrq9                           1/1     Running                 0          8m22skube-system   kube-proxy-nt5jf                           1/1     Running                 2          2d23hkube-system   kube-proxy-tcrjv                           1/1     Running                 0          8m30skube-system   kube-scheduler-k8s131                      1/1     Running                 2          2d23h

等到kubectl get pods -A全部变为Running,再次测试kubectl get nodes -A

[root@k8s131 ~]# kubectl get nodes -ANAME     STATUS   ROLES                  AGE   VERSIONk8s131   Ready    control-plane,master   3d    v1.20.9k8s132   Ready    <none>                 23m   v1.20.9k8s133   Ready    <none>                 22m   v1.20.9

所有节点状态都是Ready,至此,两个从节点加入了K8s集群并进入就绪状态,整个K8s集群安装完成!

Docker离线安装

2024年8月4日 00:00
  1. 下载二进制包
    https://download.docker.com/linux/static/stable/x86_64/

  2. 创建启动文件

vi /usr/lib/systemd/system/docker.service
[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.serviceWants=network-online.target[Service]Type=notifyExecStart=/usr/bin/dockerdExecReload=/bin/kill -s HUP $MAINPIDLimitNOFILE=infinityLimitNPROC=infinityTimeoutStartSec=0Delegate=yesKillMode=processRestart=on-failureStartLimitBurst=3StartLimitInterval=60s[Install]WantedBy=multi-user.target
  1. 解压可执行文件到/usr/bin/

  2. 加载服务

systemctl daemon-reloadsystemctl restart docker

Docker与联合文件系统

2024年4月6日 00:00

1. 联合文件系统

  • 概念

    UnionFS(联合文件系统)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次次的提交来一层一层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。联合文件系统是docker镜像的基础,镜像可以通过分层来实现继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

  • 特性

    一次加载多个文件系统,但在外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

2.docker镜像加载原理

docker的镜像实际上由一层一层文件系统组成,这种层级的文件系统就是UnionFS,bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导和加载kernel,Linux刚启动时会加载bootfs文件系统,在docker镜像最底层是bootfs,这一层与我们典型的Linux/Unix操作系统是一样的,包含boot加载器和内核,当boot加载完成之后,整个内核都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统会卸载bootfs。

rootfs(root file system)在bootfs之上,包含的就是典型Linux系统中/dev, /proc, /bin, /etc 等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如Ubuntu CentOS等。

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具和程序就可以了,因为底层直接用host的kernel,自己只需要提供rootfs就可以了,由此看见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs。这样最大的好处就是共享资源,比如多个镜像都从base镜像构建而来,那么宿主机只需要在磁盘上保存一个base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。支持通过拓展现有镜像,创建新的镜像。

docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称之为容器层,容器层之下的都叫镜像层,所有对容器的改动,无论添加删除还是修改文件,都只会发生在容器中,只有容器层是可写的,容器层下面所有镜像层都是只读的。

Docker的网络

2024年1月24日 00:00

Docker的网络用于容器间的互联和通信,以及宿主机端口映射,容器IP变动的时候可以设置网络直接使用服务名进行网络通信而不受影响。类似于虚拟机软件分配IP地址给各个安装的虚拟机以及物理机,虚拟机之间以及虚拟机和物理机之间可以相互通信。

1.查看容器的网络

1.查看容器网络类型

docker inspect命令查看关于Networks的部分

docker inspect 容器ID

当前容器是bridge网络,网关是172.17.0.1, IP是172.17.0.2

"Networks": {              "bridge": {                  "IPAMConfig": null,                  "Links": null,                  "Aliases": null,                  "NetworkID": "2def63006d0705d822ebd7269baf1512be0fc886c40e9047f35635ef21585b33",                  "EndpointID": "4fd79243a84032b34a57a39b0ffc03136bef175498980abdc097117e17f135fe",                  "Gateway": "172.17.0.1",                  "IPAddress": "172.17.0.2",                  "IPPrefixLen": 16,                  "IPv6Gateway": "",                  "GlobalIPv6Address": "",                  "GlobalIPv6PrefixLen": 0,                  "MacAddress": "02:42:ac:11:00:02",                  "DriverOpts": null              }          }

2.查看当前有多少个docker网络

docker network ls
[root@localhost ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPE2def63006d07        bridge              bridge              localf8b834999d26        host                host                localfd9dc003ef95        lzjnet              bridge              local2ca13d3f5552        none                null                local

3.查看网络的情况

docker network inspect 网络名

网络lzjnet的网络类型是bridge,还有IP等信息

[    {        "Name": "lzjnet",        "Id": "fd9dc003ef956e7b3f01d74b81f5fc6cc04c76ce5144beadc9707dd4a7a41134",        "Created": "2024-11-26T23:12:55.276879774+08:00",        "Scope": "local",        "Driver": "bridge",        "EnableIPv6": false,        "IPAM": {            "Driver": "default",            "Options": {},            "Config": [                {                    "Subnet": "172.18.0.0/16",                    "Gateway": "172.18.0.1"                }            ]        },        "Internal": false,        "Attachable": false,        "Ingress": false,        "ConfigFrom": {            "Network": ""        },        "ConfigOnly": false,        "Containers": {},        "Options": {},        "Labels": {}    }]

2.Docker的网络类型

几种常见的网络类型

网络模式简介
bridge默认为该模式,为每一个容器分配和设置IP,并将容器连接到默认的虚拟网桥docker0
host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
none容器有独立的network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等
container新创建的容器不会自动创建自己的网卡和配置IP,而是和一个指定的容器共享IP和端口范围等

2.1 bridge网络

1.主机和容器联网

Docker服务默认会创建一个网桥(上有一个docker0的内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

2.容器之间联网

Docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关,因为在同一宿主机内的容器都接入同一网桥,这样容器之间就可以通过容器的Container-IP直接通信。

3.bridge网络的分配机制

docker run的时候,没有指定network的话,默认使用的网桥模式就是bridge(docker0)。在宿主机ifconfig就可以看见docker0和自己创建的网络(eth0, eth1…..),lo代表127.0.0.1。

网桥docker0创建一对对等的虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配。

整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair)

每个容器内部也有一块网卡,每个接口叫eth0,docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

验证veth-pair:

查看正在运行的Docker容器

[root@localhost ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES38188376416b        tomcat              "catalina.sh run"   About a minute ago   Up About a minute   8080/tcp            inspiring_austin

宿主机执行ip addr查看宿主机的网络情况

[root@localhost ~]# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:0c:29:44:65:de brd ff:ff:ff:ff:ff:ff    inet 192.168.228.104/24 brd 192.168.228.255 scope global noprefixroute ens33       valid_lft forever preferred_lft forever    inet6 fe80::2ac6:ec4:9411:4da8/64 scope link noprefixroute        valid_lft forever preferred_lft forever3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default     link/ether 02:42:ff:ca:bc:ec brd ff:ff:ff:ff:ff:ff    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0       valid_lft forever preferred_lft forever    inet6 fe80::42:ffff:feca:bcec/64 scope link        valid_lft forever preferred_lft forever15: vethc5f3f03@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default     link/ether 26:9a:2e:de:95:5a brd ff:ff:ff:ff:ff:ff link-netnsid 1    inet6 fe80::249a:2eff:fede:955a/64 scope link        valid_lft forever preferred_lft forever

进入容器,一般需要先更新tomcat容器的yum,再安装工具iproute2

sudo apt-get updatesudo apt-get upgradeapt-get install -y iproute2

然后,在容器内执行ip addr查看容器的网络情况

root@38188376416b:/# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default     link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0       valid_lft forever preferred_lft forever

然后可见宿主机的网卡 15: vethc5f3f03@if14 和容器网卡 14: eth0@if15两两匹配,互互相同

2.2 host网络

直接使用宿主机的IP地址与外界通信,不需要额外进行NAT转换。

容器将不再获得一个独立的网络名称空间,而是和宿主机共用一个网络名称空间,容器将不会虚拟出自己的网卡,而是使用宿主机的IP和端口,容器没有自己的IP。

这种模式下,使用-p端口映射是无效的,也是没有任何意义的。

2.3 none网络

等同于禁用网络功能,不为容器进行任何网络配置,容器没有网卡,路由等信息,只有一个本地回环网卡lo

2.4 container网络

新建的容器和一个已经存在的容器共享一个网络IP配置而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等,同样,两个容器除了网络方面,其他的例如文件系统,进程列表等还是隔离的。

需要注意的是:

1.继承和被继承的容器的容器内端口不能是相同的,否则会导致冲突,因为两个容器共享网段和IP

验证:先启动一个tomcat容器tomcat86,该容器内的程序会占用容器的8080,在启动另一个tomcat容器tomcat87和前者共享网络,因为也是基于tomcat镜像,所以同样会占用容器的8080,两个容器端口范围是共享的,导致报错Error response from daemon: conflicting options: port publishing and the container type network mode.

docker run -d --privileged=true -p 8086:8080  --name tomcat86    tomcatdocker run -d --privileged=true -p 8086:8080 --network container:tomcat86  --name tomcat87    tomcat
[root@localhost ~]# docker run -d --privileged=true -p 8086:8080  --name tomcat86    tomcatc8464b5448296b51bc5b4e4598acce709513aa6ac7fac6ef335e5a39e8a785f3[root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMESc8464b544829        tomcat              "catalina.sh run"   4 seconds ago       Up 2 seconds        0.0.0.0:8086->8080/tcp   tomcat860bad9102a5a7        alpine              "/bin/sh"           11 minutes ago      Up 11 minutes                                alpine1[root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docker run -d --privileged=true -p 8086:8080 --network container:tomcat86  --name tomcat87    tomcatdocker: Error response from daemon: conflicting options: port publishing and the container type network mode.See 'docker run --help'.

2.被继承的容器结束运行后,继承它的容器也会失去网络功能,只剩下一个回环网卡lo

验证:先运行一个精简版Linux容器alpine1,在运行一个同样的容器alpine2,指定和alpine1共享网络,查看容器内网络可见网卡名称和IP地址都是完全一样的

docker run -it --name alpine1   alpine /bin/sh
[root@localhost ~]# docker run -it --name alpine1   alpine /bin/sh/ # ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0       valid_lft forever preferred_lft forever
docker run -it --name alpine2 --network container:alpine1   alpine /bin/sh
[root@localhost ~]# docker run -it --name alpine2 --network container:alpine1   alpine /bin/sh/ # ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0       valid_lft forever preferred_lft forever

关闭容器alpine1,进入容器alpine2查看IP,发现eth网卡跟着消失了,只剩下lo

[root@localhost ~]# docker stop alpine1alpine1[root@localhost ~]# docker exec -it alpine2 /bin/sh/ # ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever

2.5 自定义网络

为什么要自定义网络?

1.容器间的互联和通信以及端口映射
2.bridge模式网络分配给容器的IP是可能随着容器的启动关闭而导致分配的地址发生变动的,但是Docker自带的bridge网络比较简单,没有内置DNS功能,自定义网络后,容器IP变动的时候可以通过服务名直连网络而不受影响,当用户创建自定义网络时,Docker自动配置了一个内置DNS服务器,这个DNS服务器会根据容器的名称自动解析对应的IP地址。

自定义网络默认也是采用桥接模式bridge,只是功能比默认的那个更强,自然就维护好了容器名和IP的映射关系(DNS)

验证:

创建一个网络lzjnet

docker network create lzjnet

创建容器tomcat1 tomcat2,指定我们自己创建的网络,然后互PING

docker run -it --privileged=true  --network lzjnet   --name alpine81    alpinedocker run -it --privileged=true  --network lzjnet   --name alpine82    alpine
[root@localhost ~]# docker attach alpine81/ # ping alpine82PING alpine82 (172.18.0.3): 56 data bytes64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.889 ms64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.195 ms64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.181 ms64 bytes from 172.18.0.3: seq=3 ttl=64 time=0.167 ms64 bytes from 172.18.0.3: seq=4 ttl=64 time=0.547 ms^C--- alpine82 ping statistics ---5 packets transmitted, 5 packets received, 0% packet lossround-trip min/avg/max = 0.167/0.395/0.889 ms
[root@localhost ~]# docker attach alpine82/ # ping alpine81PING alpine81 (172.18.0.2): 56 data bytes64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.079 ms64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.133 ms64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.169 ms64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.186 ms64 bytes from 172.18.0.2: seq=4 ttl=64 time=0.663 ms64 bytes from 172.18.0.2: seq=5 ttl=64 time=0.260 ms64 bytes from 172.18.0.2: seq=6 ttl=64 time=0.176 ms^C--- alpine81 ping statistics ---7 packets transmitted, 7 packets received, 0% packet lossround-trip min/avg/max = 0.079/0.238/0.663 ms

可以发现可以使用容器名相互PING通

3.总结

Docker可以使用4种网络模式来实现容器之间以及和宿主机的网络通信,自己实现自定义的网络桥接模式功能更强。

Docker的镜像操作

2023年11月17日 00:00

从镜像仓库中拉取镜像时,需要科学上网访问DockerHub

1.镜像

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。

2.常见镜像操作

1.列出本地所有镜像

docker images
[root@localhost ~]# docker imagesREPOSITORY               TAG                 IMAGE ID            CREATED             SIZEredis                    7.0.11              4695a05c473a        16 months ago       130MBnacos/nacos-server       v2.2.3              17169ab516b8        17 months ago       814MBsonatype/nexus3          3.54.1              9dcc5d2a8db6        18 months ago       550MBmysql                    8.0.31              c2c2eba5ae85        2 years ago         535MBgitlab/gitlab-ce         latest              46cd6954564a        2 years ago         2.36GBadolfintel/speedtest     latest              1bb6f28b9d23        2 years ago         439MBprom/prometheus          latest              a3d385fc29f9        2 years ago         201MBgrafana/grafana          latest              9b957e098315        2 years ago         275MBportainer/portainer-ce   latest              0df02179156a        2 years ago         273MBmysql                    5.7                 db39680b63ac        4 years ago         437MBkibana                   7.4.2               230d3ded1abc        5 years ago         1.1GBelasticsearch            7.4.2               b1179d41a7b4        5 years ago         855MB

各列含义

  • REPOSITORY 镜像的仓库源
  • TAG 镜像的标签
  • IMAGE ID 镜像的ID
  • CREATED 镜像的创建时间
  • SIZE 镜像大小

2.列出本地所有镜像(含中间镜像层)

docker images -a 
[root@localhost ~]# docker images -aREPOSITORY               TAG                 IMAGE ID            CREATED             SIZEredis                    7.0.11              4695a05c473a        16 months ago       130MBnacos/nacos-server       v2.2.3              17169ab516b8        17 months ago       814MBsonatype/nexus3          3.54.1              9dcc5d2a8db6        18 months ago       550MBmysql                    8.0.31              c2c2eba5ae85        2 years ago         535MBgitlab/gitlab-ce         latest              46cd6954564a        2 years ago         2.36GBadolfintel/speedtest     latest              1bb6f28b9d23        2 years ago         439MBprom/prometheus          latest              a3d385fc29f9        2 years ago         201MBgrafana/grafana          latest              9b957e098315        2 years ago         275MBportainer/portainer-ce   latest              0df02179156a        2 years ago         273MBmysql                    5.7                 db39680b63ac        4 years ago         437MBkibana                   7.4.2               230d3ded1abc        5 years ago         1.1GBelasticsearch            7.4.2               b1179d41a7b4        5 years ago         855MB

3.显示所有镜像ID

docker images -q
[root@localhost ~]# docker images -q4695a05c473a17169ab516b89dcc5d2a8db6c2c2eba5ae8546cd6954564a1bb6f28b9d23a3d385fc29f99b957e0983150df02179156adb39680b63ac230d3ded1abcb1179d41a7b4

4.摘要信息

docker images --digests 
[root@localhost ~]# docker images --digestsREPOSITORY               TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZEredis                    7.0.11              sha256:1008c73f08e9f913868e2fa2e843212b62ea5bf3c66435d87bc7a6207bc0f1b4   4695a05c473a        16 months ago       130MBnacos/nacos-server       v2.2.3              sha256:cd7aa1cda9c639fbf6791d4bfea11a2596be18cc0d7f86f62ebd168076dd10c5   17169ab516b8        17 months ago       814MBsonatype/nexus3          3.54.1              sha256:d1d3bd124102e98e2e2ab8aec865b7c5f2d34205e5487bac5e9cadb8b64363ae   9dcc5d2a8db6        18 months ago       550MBmysql                    8.0.31              sha256:d4055451e7f42869e64089a60d1abc9e66eccde2910629f0dd666b53a5f230d8   c2c2eba5ae85        2 years ago         535MBgitlab/gitlab-ce         latest              sha256:5a0b03f09ab2f2634ecc6bfeb41521d19329cf4c9bbf330227117c048e7b5163   46cd6954564a        2 years ago         2.36GBadolfintel/speedtest     latest              sha256:9716783d60e87a25e916869a73f0d2ccdc9d579e19820df6c98ef58052aca9c4   1bb6f28b9d23        2 years ago         439MBprom/prometheus          latest              sha256:cb9817249c346d6cfadebe383ed3b3cd4c540f623db40c4ca00da2ada45259bb   a3d385fc29f9        2 years ago         201MBgrafana/grafana          latest              sha256:18d94ae734accd66bccf22daed7bdb20c6b99aa0f2c687eea3ce4275fe275062   9b957e098315        2 years ago         275MBportainer/portainer-ce   latest              sha256:4f126c5114b63e9d1bceb4b368944d14323329a9a0d4e7bb7eb53c9b7435d498   0df02179156a        2 years ago         273MBmysql                    5.7                 sha256:b38555e593300df225daea22aeb104eed79fc80d2f064fde1e16e1804d00d0fc   db39680b63ac        4 years ago         437MBkibana                   7.4.2               sha256:355f9c979dc9cdac3ff9a75a817b8b7660575e492bf7dbe796e705168f167efc   230d3ded1abc        5 years ago         1.1GBelasticsearch            7.4.2               sha256:543bf7a3d61781bad337d31e6cc5895f16b55aed4da48f40c346352420927f74   b1179d41a7b4        5 years ago         855MB

5.不截取

docker images --no-trunc
[root@localhost ~]# docker images --no-truncREPOSITORY               TAG                 IMAGE ID                                                                  CREATED             SIZEredis                    7.0.11              sha256:4695a05c473aa2db2dff0384abb06c2174832183ca0783d0a2720a922792add6   16 months ago       130MBnacos/nacos-server       v2.2.3              sha256:17169ab516b8dcbd1b79448471545063f827bca0cec8054101970d9d8e9cbb55   17 months ago       814MBsonatype/nexus3          3.54.1              sha256:9dcc5d2a8db635dab8c98eec3bd1a10ae7deabfa0a6e73f51087ba09b0972961   18 months ago       550MBmysql                    8.0.31              sha256:c2c2eba5ae857a8ab9bffd11c5f15ed693dc65ac035948696f370f2895ae3062   2 years ago         535MBgitlab/gitlab-ce         latest              sha256:46cd6954564a5a4ba6edd0cb19f6e0594d8a84c9d4a10a49f5f2caa485981fe8   2 years ago         2.36GBadolfintel/speedtest     latest              sha256:1bb6f28b9d2386924b3d69790f59097680d0721afdb9b8f277201d314f8c583e   2 years ago         439MBprom/prometheus          latest              sha256:a3d385fc29f926eed67f0d60ffaf72d199f3f9c24af5d55cd1802f2dc1dc9b4b   2 years ago         201MBgrafana/grafana          latest              sha256:9b957e098315598ae58c7a62bcc140ed086bbe619b38c31a52b21abbd5eb21e2   2 years ago         275MBportainer/portainer-ce   latest              sha256:0df02179156afbf727443d0be50e8b9cdab8c044050691517539cea2e3ed01fd   2 years ago         273MBmysql                    5.7                 sha256:db39680b63ac47a1d989da7b742f7b382af34d85a68214f8977bad59c05901a6   4 years ago         437MBkibana                   7.4.2               sha256:230d3ded1abc1468536e41d80a9cc6a67908358c0e4ebf065c29b8ef0370ba4b   5 years ago         1.1GBelasticsearch            7.4.2               sha256:b1179d41a7b42f921f8ea0c5fa319c8aac4a3083dd733494170428917007e55f   5 years ago         855MB

6.搜索镜像

docker search jenkins
[root@localhost ~]# docker search jenkinsNAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATEDjenkins                            DEPRECATED; use "jenkins/jenkins:lts" instead   5696                [OK]                jenkins/jenkins                    The leading open source automation server       4049                                    jenkins/jnlp-slave                 a Jenkins agent which can connect to Jenkins…   157                                     [OK]jenkins/inbound-agent              This is an image for Jenkins agents using TC…   138                                     jenkins/agent                      This is a base image, which provides the Jen…   71                                      jenkins/ssh-agent                  Docker image for Jenkins agents connected ov…   60                                      jenkins/slave                      base image for a Jenkins Agent, which includ…   49                                      [OK]jenkins/ssh-slave                  A Jenkins slave using SSH to establish conne…   41                                      [OK]jenkins/jnlp-agent-maven           A JNLP-based agent with Maven 3 built in        10                                      jenkins/jnlp-agent-docker                                                          10                                      jenkins/evergreen                  An automatically self-updating Jenkins distr…   5                                       jenkins/pct                        Plugin Compat Tester - no longer published a…   5                                       [OK]jenkins/jenkinsfile-runner         Jenkinsfile Runner packages                     3                                       jenkins/jnlp-agent-python          A JNLP-based agent with Python built in         3                                       jenkins/jnlp-agent-python3                                                         3                                       jenkins/jenkins-experimental       Experimental images of Jenkins. These images…   3                                       [OK]jenkins/jnlp-agent-coresdk                                                         2                                       jenkins/jnlp-agent-alpine                                                          2                                       jenkins/ath                        Jenkins Acceptance Test Harness                 1                                       [OK]jenkins/remoting-kafka-agent       Remoting Kafka Agent                            1                                       [OK]jenkins/core-pr-tester             Docker image for testing pull-requests sent …   1                                       jenkins/jnlp-agent-node                                                            1                                       jenkins/jnlp-agent-ruby                                                            1                                       jenkins/core-changelog-generator   Tool for generating Jenkins core changelogs     1                                       jenkins/custom-war-packager        Custom WAR Packager                             1                                       [OK]

7.搜索star数目不少于多少的镜像

docker search --filter=stars=3  jenkins
[root@localhost ~]# docker search --filter=stars=3  jenkinsNAME                           DESCRIPTION                                     STARS               OFFICIAL            AUTOMATEDjenkins                        DEPRECATED; use "jenkins/jenkins:lts" instead   5696                [OK]                jenkins/jenkins                The leading open source automation server       4049                                    jenkins/jnlp-slave             a Jenkins agent which can connect to Jenkins…   157                                     [OK]jenkins/inbound-agent          This is an image for Jenkins agents using TC…   138                                     jenkins/agent                  This is a base image, which provides the Jen…   71                                      jenkins/ssh-agent              Docker image for Jenkins agents connected ov…   60                                      jenkins/slave                  base image for a Jenkins Agent, which includ…   49                                      [OK]jenkins/ssh-slave              A Jenkins slave using SSH to establish conne…   41                                      [OK]jenkins/jnlp-agent-maven       A JNLP-based agent with Maven 3 built in        10                                      jenkins/jnlp-agent-docker                                                      10                                      jenkins/pct                    Plugin Compat Tester - no longer published a…   5                                       [OK]jenkins/evergreen              An automatically self-updating Jenkins distr…   5                                       jenkins/jnlp-agent-python      A JNLP-based agent with Python built in         3                                       jenkins/jenkins-experimental   Experimental images of Jenkins. These images…   3                                       [OK]jenkins/jenkinsfile-runner     Jenkinsfile Runner packages                     3                                       jenkins/jnlp-agent-python3                                                     3                                       

8.只列出自动构建类型的镜像

docker search --filter=is-automated=true  jenkins
[root@localhost ~]# docker search --filter=is-automated=true  jenkinsNAME                           DESCRIPTION                                     STARS               OFFICIAL            AUTOMATEDjenkins/jnlp-slave             a Jenkins agent which can connect to Jenkins…   157                                     [OK]jenkins/slave                  base image for a Jenkins Agent, which includ…   49                                      [OK]jenkins/ssh-slave              A Jenkins slave using SSH to establish conne…   41                                      [OK]jenkins/pct                    Plugin Compat Tester - no longer published a…   5                                       [OK]jenkins/jenkins-experimental   Experimental images of Jenkins. These images…   3                                       [OK]jenkins/ath                    Jenkins Acceptance Test Harness                 1                                       [OK]jenkins/remoting-kafka-agent   Remoting Kafka Agent                            1                                       [OK]jenkins/custom-war-packager    Custom WAR Packager                             1                                       [OK]

9.拉取镜像

从远程仓库拉取一个镜像,版本号不写默认是last

docker pull  名称:版本
[root@localhost ~]# docker pull tomcatUsing default tag: latestlatest: Pulling from library/tomcatafad30e59d72: Pull complete 918d361e6529: Pull complete cf4dd2a7e40b: Pull complete d152af7a0148: Pull complete a5d7958ebd69: Pull complete 409b41a58ed4: Pull complete 4f4fb700ef54: Pull complete 9eabaa92f491: Pull complete Digest: sha256:2ade2b0a424a446601688adc36c4dc568dfe5198f75c99c93352c412186ba3c9Status: Downloaded newer image for tomcat:latest

10.删除镜像

删除镜像

版本号不写默认是last

docker rmi  名称:版本
[root@localhost ~]# docker rmi tomcatUntagged: tomcat:latestUntagged: tomcat@sha256:2ade2b0a424a446601688adc36c4dc568dfe5198f75c99c93352c412186ba3c9Deleted: sha256:f77539e7e45f7c6337c681589fe18ee6407640e4066c450fcfb8c6a4ba5575b2Deleted: sha256:ec216f70111f7e403bf2dd00786888a33e31e0b7d40b7a6963c413312b916a72Deleted: sha256:0269bb8ab7750b1ccbbcee578df3af6edcba46c367891e319e3b874366c91b2eDeleted: sha256:5ff949a6a98fa0b9294d5feab73bc2bd31947ecdf546d426d49401a5a5d8b9f4Deleted: sha256:5e4268f1622d7392ab023aa0c458ee836bda8833e0b0f9d6b3333fff071bb761Deleted: sha256:f9d1f11193bf543add78ce5660c14322fe3e03e957e07e2f6c4bbc3483fa2201Deleted: sha256:5e2c15d15d3c100456584750cce4319bb58c9360f5dc2aa80a6ab92cf9910184Deleted: sha256:ddf4cde2ad1fd66d3c8ea0d44fbd044cfa2928439880d5df6478af4f86e8efefDeleted: sha256:958ed2862447477e5282173a7b21fbf9a5c83b8452b6e808f654fcea08613454Deleted: sha256:27123a71e85e0540333291adccf7b9c340d089e8c3717c380d3b75cc8c7df90f

强制删除 

docker rmi  -f  镜像ID

删除全部

docker rmi  -f  $(docker images -qa)

删除多个

docker rmi  -f  镜像名1:tag 镜像名2:tag

11.查看镜像/容器/数据卷所占空间

docker system df
[root@localhost ~]# docker system df TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLEImages              12                  11                  7.769GB             737.3MB (9%)Containers          13                  1                   461MB               461MB (100%)Local Volumes       9                   5                   710.5MB             501.2MB (70%)Build Cache         0                   0                   0B                  0B

Docker的容器操作

2023年10月17日 00:00

因阿里云加速服务调整,从镜像仓库中拉取镜像时,需要科学上网访问DockerHub

1.容器

Docker容器是基于Docker镜像创建的一个运行实例。它是应用程序运行的隔离环境,类似于虚拟机,但更轻量和高效。与虚拟机相比,容器不需要包含操作系统的完整内核,而是共享宿主机的操作系统内核。容器只包含应用运行所需的最小依赖项,从而大幅降低资源占用。容器之间相互隔离,每个容器拥有自己的文件系统、进程空间、网络接口等。

容器启动速度极快(通常是秒级),因为它无需加载完整的操作系统。

2.容器常见操作

2.1 新建并启动容器

容器由镜像实例化启动,启动容器时会先寻找镜像,如果本地没有容器会向远端拉取。

启动容器的方式有很多种。

1.前台启动容器

docker run 镜像名:版本

2.后台运行容器

即启动守护式容器,返回容器ID。容器后台-d运行时,必须有一个前台进程,如果容器运行的命令不是那些一直挂起的命令,例如toptail,容器会自动退出,这个是docker机制的问题,例如nginx,正常情况下启动服务只需要启动对应的service,systemctl start nginx,但是这样做nginx在后台运行,导致docker前台没有运行的应用,docker认为无事可做,便会退出。最佳的解决方案是让你的应用以前台进程的方式运行。

docker run -d 镜像名:版本
[root@localhost ~]# docker run -d sonatype/nexus3:3.54.1516d486e69d863c41e41fc5e908ffb40350c662966b3790c7868225b0684e126

3.以交互模式运行容器,通常配合-t使用

docker run -i 镜像名:版本

4.为容器重新分配一个伪终端,通常配合-i使用

docker run -t 镜像名:版本

5.以交互式建立容器

指定运行的终端/bin/bash

docker run -it 镜像名:版本 /bin/bash

如果镜像的默认命令(通过 CMD 或 ENTRYPOINT 指定)是交互式的Shell(例如 /bin/bash 或 /bin/sh),那么bash/bin/bash可以省略,Docker会直接运行默认命令,比如ubuntu默认会运行/bin/bash

docker run -it ubuntu

输出结果:容器ubuntu开始运行,并自动切换到容器中的/bin/bash root@c067a19d427c:/#

[root@localhost ~]# docker run -it ubuntuUnable to find image 'ubuntu:latest' locallylatest: Pulling from library/ubuntuafad30e59d72: Pull complete Digest: sha256:278628f08d4979fb9af9ead44277dbc9c92c2465922310916ad0c46ec9999295Status: Downloaded newer image for ubuntu:latestroot@c067a19d427c:/# 

6.随机端口映射

docker run -P 镜像名:版本

7.指定端口映射,有以下四种形式

  • ip:hostPort:containerPort
    将容器内的 containerPort 映射到指定主机的 hostPort,并绑定到特定的 IP 地址。
  • ip::containerPort
    将容器内的 containerPort 映射到随机的主机端口,并绑定到特定的 IP 地址
  • hostPort:containerPort
    将容器内的 containerPort 映射到主机的 hostPort,不指定绑定 IP。
  • containerPort
    将容器内的 containerPort 映射到主机的随机端口,绑定到主机的所有网络接口。
docker run -d -p 13306:3306 镜像名:版本

8.运行并为容器指定一个新名字

docker run -d --name="mynexus" sonatype/nexus3:3.54.1

9.环境变量

使用-e指定环境变量,这些环境变量可以被容器内的应用程序所访问到

docker run -e MY_ENV=production my_image

指定多个

docker run -e VAR1=value1 -e VAR2=value2 my_image

2.2 查看运行的容器

正在运行的

docker ps 
[root@localhost ~]# docker ps -a CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                       PORTS                                                      NAMES508a327eac81        1bb6f28b9d23                    "docker-php-entrypoi…"   14 months ago       Exited (137) 13 months ago                                                              frosty_ritchiebe633e9bd4b0        1bb6f28b9d23                    "docker-php-entrypoi…"   14 months ago       Exited (137) 14 months ago                                                              epic_brattain0d6691a51729        1bb6f28b9d23                    "docker-php-entrypoi…"   14 months ago       Exited (137) 14 months ago                                                              pedantic_liskov02efe5a0233f        redis:7.0.11                    "docker-entrypoint.s…"   16 months ago       Exited (0) 14 months ago                                                                redis7ae8dd5ed8c76        prom/prometheus:latest          "/bin/prometheus --c…"   17 months ago       Exited (0) 17 months ago                                                                prometheusd380ff361ad5        nacos/nacos-server:v2.2.3       "bin/docker-startup.…"   17 months ago       Exited (143) 17 months ago                                                              nacos-standaloneed47411ae068        grafana/grafana:latest          "/run.sh"                17 months ago       Exited (0) 17 months ago                                                                grafana1b297c5ff801        portainer/portainer-ce:latest   "/portainer"             17 months ago       Up About an hour             0.0.0.0:8000->8000/tcp, 0.0.0.0:9443->9443/tcp, 9000/tcp   portainer5aed508fc491        sonatype/nexus3:3.54.1          "/opt/sonatype/nexus…"   17 months ago       Exited (137) 17 months ago                                                              nexus6c365985f133        gitlab/gitlab-ce:latest         "/assets/wrapper"        19 months ago       Exited (137) 17 months ago                                                              gitlabc5b4c8217fc0        mysql:5.7                       "docker-entrypoint.s…"   19 months ago       Exited (0) 14 months ago                                                                mysql5.73951414b08ba        kibana:7.4.2                    "/usr/local/bin/dumb…"   4 years ago         Exited (0) 19 months ago                                                                kibanaeaff1b448829        elasticsearch:7.4.2             "/usr/local/bin/dock…"   4 years ago         Exited (143) 19 months ago                                                              elasticsearch

现在和历史运行过的容器

docker ps -a 

最近n个运行过的容器

docker ps -n 2

只显示容器编号

docker ps -q  
[root@localhost ~]# docker ps -q1b297c5ff801

不截取输出

docker ps  --no-trunc   
[root@localhost ~]# docker ps  --no-truncCONTAINER ID                                                       IMAGE                           COMMAND             CREATED             STATUS              PORTS                                                      NAMES1b297c5ff8019abf47c6fe6bf23cc93507835ba98c1b0a88d4e92f52b1bab4c9   portainer/portainer-ce:latest   "/portainer"        17 months ago       Up About an hour    0.0.0.0:8000->8000/tcp, 0.0.0.0:9443->9443/tcp, 9000/tcp   portainer

2.3 容器的停止

1.停止容器

docker stop 容器ID

2.启动容器

docker start 容器ID

3.重启容器

docker restart 容器ID

4.立刻停止容器

docker kill 容器ID

2.4 操作运行中的容器

1.docker attach进入容器

进入一个正在运行的容器,附加到其主进程的标准输入、输出和错误流,看到容器中运行的程序的实时输出,并直接与容器的主进程交互,例如正在运行top的容器,可以看到top实时输出,还可以输入命令和top交互。

docker attach 容器ID

2.docker exec -it进入容器

进入一个正在运行的容器,在运行的容器中启动一个新进程,通常是交互式Shell,不依赖容器的主进程,可以独立运行,不影响容器的主进程运行。

如果容器指定了默认shell,那么bash部分/bin/bash可省略。

docker exec -it 容器ID /bin/bash

3.exit 停止并退出容器

当你进入容器后,完成任务并希望关闭容器时使用,当通过docker exec或docker attach进入容器后,输入exit会停止运行的Shell进程,如果这个进程是容器的主进程(例如一个 Bash 会话或主要的服务进程),exit 会直接停止整个容器。

4.Ctrl+P+Q 停止并退出容器

从一个已附加的容器中退出交互界面,同时容器继续运行。当需要离开容器的交互环境,但希望容器继续在后台运行时使用,使用 docker attach 容器ID 附加到容器时,按下Ctrl+P,然后按 Q,会退出到宿主机终端,但是容器仍在运行。

2.5 删除容器

1.删除容器

docker rm 容器ID

2.强制删除容器

docker rm -f 容器ID

3.删除全部容器

docker rm $(docker ps -aq)

2.6 提交容器

通过commit将容器提交为一个新的镜像,具体语法是docker commit -m "描述" -a="作者" 容器ID 新镜像名称:标签

docker commit -m "new image" -a="zuozhe" c54fcba2de61 lzj/alpine:1.0.0

2.7 查看容器的日志

t 时间戳
f 跟随最新日志
--tail 数字,显示最后多少条

docker logs -f -t  容器ID

2.8 查看容器内运行的进程

docker top 容器ID

2.9 查看容器内部的细节

docker inspect 容器ID

Docker的安装和配置

2023年9月14日 00:00

1.在CentOS上安装Docker

在CentOS上安装Docker的过程相对简单,可以通过官方提供的安装包安装。以下是详细的安装步骤。

1.安装依赖包

在安装Docker之前,确保安装了一些必要的依赖包。

yum install -y yum-utils  device-mapper-persistent-data   lvm2

2.设置Docker的YUM仓库

Docker的安装包需要从仓库获取,执行以下命令来添加阿里云的Docker仓库。

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装Docker引擎

使用YUM安装Docker社区版(docker-ce,即Docker Community Edition)。

yum install -y docker-ce docker-ce-cli containerd.io

4.启动Docker服务

安装完成后,需要启动Docker服务,并且将其设置为开机自启。

sudo systemctl start dockersudo systemctl enable docker

5.检查Docker是否正确安装

可以通过以下命令检查Docker的安装是否成功。

sudo docker version

如果成功安装,你会看到Docker客户端和服务端的版本信息。

6.测试Docker安装

运行以下命令,拉取一个测试镜像并启动一个容器,以验证Docker安装是否正常。

sudo docker run hello-world

如果Docker安装成功,命令会拉取hello-world镜像并启动容器,屏幕上会显示一条测试成功的信息。

7.配置阿里云镜像加速

因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,从镜像仓库中拉取镜像时,需要科学上网直接访问DockerHub

注册登录阿里云,并找到容器镜像服务。

进入管理控制台,找到镜像加速器

复制粘贴对应目标操作系统的命令,然后在服务器上执行命令,创建或修改 /etc/docker/daemon.json 配置文件后,重新启动docker。

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://**********.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker

2.常见的客户端命令

1.版本号

docker version 
[root@localhost ~]# docker version Client: Version:           18.09.6 API version:       1.39 Go version:        go1.10.8 Git commit:        481bc77156 Built:             Sat May  4 02:34:58 2019 OS/Arch:           linux/amd64 Experimental:      falseServer: Docker Engine - Community Engine:  Version:          18.09.6  API version:      1.39 (minimum version 1.12)  Go version:       go1.10.8  Git commit:       481bc77  Built:            Sat May  4 02:02:43 2019  OS/Arch:          linux/amd64  Experimental:     false

2.信息

docker info 
[root@localhost ~]# docker infoContainers: 13 Running: 1 Paused: 0 Stopped: 12Images: 12Server Version: 18.09.6Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: trueLogging Driver: json-fileCgroup Driver: cgroupfsPlugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: runcDefault Runtime: runcInit Binary: docker-initcontainerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30init version: fec3683Security Options: seccomp  Profile: defaultKernel Version: 3.10.0-957.el7.x86_64Operating System: CentOS Linux 7 (Core)OSType: linuxArchitecture: x86_64CPUs: 2Total Memory: 2.848GiBName: localhost.localdomainID: RCBQ:PBOK:LB2T:BZ2E:IPLL:63L6:ZCUO:3WLF:5G4M:OV5A:7TA6:5ARPDocker Root Dir: /var/lib/dockerDebug Mode (client): falseDebug Mode (server): falseRegistry: https://index.docker.io/v1/Labels:Experimental: falseInsecure Registries: 127.0.0.0/8Registry Mirrors: https://6k782adh.mirror.aliyuncs.com/Live Restore Enabled: falseProduct License: Community EngineWARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip6tables is disabled

3.帮助

docker --help 

Docker容器数据卷

2023年9月4日 00:00

1.容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统(不属于容器内),因此能够绕过联合文件系统,提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时,删除其挂载的容器卷。

简而言之就是将docker容器内的数据保存进宿主机的磁盘中,并可以实现主机写,容器知道。容器写,主机知道,互通有无,互读互写。

特点:

  1. 容器卷可以在容器之间共享或重用数据。
  2. 卷中的更改可以实时生效。
  3. 数据卷中的更改不会包含在容器的更新中。
  4. 数据卷的生命周期一直到没有容器使用它为止。

2.数据卷的使用

1.添加数据卷

命令

docker run -it -v /宿主机内绝对路径:/容器内目录 镜像名(默认可读可写)

可以绑定挂载多个,就像一台电脑可以连接多个U盘

docker run -it \-v /宿主机内绝对路径:/容器内目录  \-v /宿主机内绝对路径:/容器内目录  \image

如果提示Permission denied错误,追加--privileged=true在后面即可

原因:CentOS7的安全模块会比之前版本的系统有所增强,不安全的会先禁止,所以目录挂载的情况被默认为是不安全的行为,在SELinux里面挂载目录被禁止了,如果要开启,一般用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,使用该参数,容器内才真正拥有root权限,否则,容器内的root只是外部的一个普通用户权限。

docker run -it --privileged=true -v /宿主机内绝对路径:/容器内目录 镜像名

2.查看是否关联成功

docker inspect 容器ID

会以json串形式打印显示所有容器内细节,找到Mounts节点了解容器数据卷的挂载情况,"Type": "bind"表示的意思就是容器内相对宿主机的映射关系

"Mounts": [    {        "Type": "bind",        "Source": "/data/nexus-data",        "Destination": "/nexus-data",        "Mode": "",        "RW": true,        "Propagation": "rprivate"    }]

3.限制只读

默认情况数据卷是可读可写的,但是有时出于对数据的保护,需要容器内只能读不能写,如果宿主机写入了内容,会同步给容器,只会限制容器,不限制宿主机,容器内强行写,会报错Read-Only file system

做法: 命令上追加 ro : read only

docker run -it --privileged=true -v /宿主机内绝对路径:/容器内目录:ro 镜像名

3.数据卷的继承和共享

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,称为数据卷容器。

数据卷的生命周期一直到没有容器使用为止,挂载数据卷后被继承的父容器,即使被停止,继承的子容器也会保持数据卷和宿主机的关联,也就是说子容器只是继承了父容器文件映射的规则而已。

docker run -it --name 容器名 --volumes-from 父容器名 镜像

Kubernetes开篇

2022年1月15日 00:00

一、引言

往常我们在部署应用到服务器时,有这样三种方式

  • 直接部署到服务器
  • 利用虚拟机将服务器的硬件资源虚拟化成无数个虚拟机,将应用部署在虚拟机上,进行隔离
  • 利用容器化技术,例如docker,将应用部署到容器中,利用容器实现轻量级的隔离

当直接部署到服务器时,如果一个应用出现了故障,例如内存泄漏,则可能导致部署在上面的所有应用全部宕机。使用虚拟机部署可以实现应用隔离但是虚拟机比较重占用资源很大,更好的方式是使用容器化技术

但是,容器化技术也会带来一些问题,例如部署的容器很多,管理和监控以及故障修复都很不便,因此需要一个针对大规模容器的编排系统,而Kubernetes就是一个实现容器编排的工具。

二、Kubernetes概述

Kubernetes,简称K8s,是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。K8s拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。K8s具有以下功能:

  • 服务发现和负载均衡

    K8s可以使用DNS名称或自己的IP地址来暴露容器。 如果进入容器的流量很大, K8s可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排

    K8s允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚

    你可以使用K8s描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为期望状态。例如,你可以自动化K8s来为你的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。

  • 自动完成装箱计算

    你为K8s提供许多节点组成的集群,在这个集群上运行容器化的任务。你告诉K8s每个容器需要多少CPU和内存(RAM)。K8s可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。

  • 自我修复

    K8s将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理

    K8s允许你存储和管理敏感信息,例如密码、OAuth令牌和SSH密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

  • 批处理执行

    除了服务外,K8s还可以管理你的批处理和CI(持续集成)工作负载,如有需要,可以替换失败的容器。

  • 水平扩缩

    使用简单的命令、用户界面或根据CPU使用率自动对你的应用进行扩缩。

  • IPv4/IPv6 双栈

    为Pod(容器组)和Service(服务)分配IPv4和IPv6地址。

  • 为可扩展性设计

    在不改变上游源代码的情况下为你的K8s集群添加功能。

三、Kubernetes架构和组件

K8s采用集群方式部署,集群中有master和worker两个不同的角色,

Kubernetes Cluster = N Master Node + N Worker Node:N主节点+N工作节点; N>=1

四、Kubernetes的基本使用

序号文章名概述
1使用虚拟机安装一个K8s集群安装K8s集群,并部署网络插件calico
❌