普通视图

Received before yesterday

Docker Compose

2024年11月27日 00:00

Docker Compose概述

  Docker Compose是Docker官方的开源项目,负责实现对Docker容器的快速编排,Docker建议每个容器只运行一项服务,因为容器运行的开销很小,但是同时部署多个应用需要每个容器都单独编写Dockerfile会显得非常复杂,因而Docker官方提供了多容器部署的编排工具Docker Compose

  Docker Compose允许用户通过一个单独的配置文件来定义一组相关联的应用容器为一个项目,Docker Compose可以管理多个Docker容器组成的一个应用,只需要定义好一个yaml格式的配置文件docker-compose.xml,写好多个容器之间的调用关系,然后只要一个命令就可以实现一键部署和一键启动和关闭这些容器。

  Docker Compose文件格式版本有多种,这里以最为主流的3.x为例

Docker Compose安装

先去下载docker-compose的可执行文件,Docker Compose发布在GitHub上面(https://github.com/docker/compose/releases/),我下载的版本是linux64位的v2.30.3,下载地址: https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64

安装很简单,只要将下载下来的可执行文件赋予执行权限,并链接即可,先将下载下来的文件docker-compose-linux-x86_64放到/opt目录下,然后作为可执行文件,并建立软链接

chmod +x ./docker-compose-linux-x86_64
ln -s /opt/docker-compose-linux-x86_64 /usr/local/bin/docker-compose

之后,就可以在任意目录执行docker-compose的命令了

Docker Compose文件

一个DockerCompose文件就是一个工程,工程由服务组成,服务就是一个个的应用实例,由一组关联的容器组成一个完整的业务单元就是工程。

文件内包含以下顶级元素:

  • version docker-compose文件版本,大多用3
  • name 应用部署的名称
  • services 服务,下面可以定义多个部署的应用
  • networks 自定义网络,供services下的应用使用
  • volumes 卷,应用用到的卷配置
  • configs 配置
  • secrets 密钥

每个顶级元素下又有以下常用配置项:

  • services.$service-name.image 使用的镜像和TAG
  • services.$service-name.privileged 设置容器权限
  • services.$service-name.container_name 容器名
  • services.$service-name.environment 环境变量
  • services.$service-name.restart 自启动,常见配置:总是always,出错时自启on-failure/on-failure:3
  • services.$service-name.command 自定义命令行参数
  • services.$service-name.ports 端口映射
  • services.$service-name.volumes 数据卷挂载
  • services.$service-name.depends_on 依赖哪个服务,在哪些服务启动后再启动
  • services.$service-name.networks 使用的自定义网络
  • networks.$network-name.driver 自定义网络的类型,不设置的话默认是bridge
  • networks.$network-name.ipam.config IP地址管理,用于管理网络的IP地址分配,不设置则Docker自动分配
  • networks.$network-name.ipam.config.subnet 自定义网络的网段,例如192.168.1.0/24
  • networks.$network-name.ipam.config.gateway 自定义网络的网关,例如192.168.1.1

例:

version: '3'name: my-demoservices:    app_1:       # 镜像:TAG       image: demo:1.0       # 容器名       container_name: demo       # 提升容器内权限       privileged: true       # 环境变量       environment:          - NAME1=VALUE1         - NAME2=VALUE2       restart: always              command: ["-c nginx.conf"]              # 宿主机端口:容器内端口       ports:         - "80:80"       # 扩展语法设置卷,允许更详细的配置,如设置卷驱动和选项       volumes:         # 绑定挂载,将主机上的一个具体目录或文件直接挂载到容器中         - type: bind           source: /var/lib/data           target: /data         # volume是由Docker管理的存储区域,通常在/var/lib/docker/volumes/下         - type: volume           source: my-data           target: /data           volume:              nocopy: true             subpath: sub       networks:         - my-network    app_2:       image: mysql:8        depends_on:         - app_1       # 绑定挂载,直接将主机路径映射到容器路径       volumes:          #宿主机路径:容器内路径         - /data:/var/data          #只读卷         - /host/path:/container/path:ro     app_3:       # 命名卷,由用户指定名称,Docker 管理其存储位置       volumes:          - my-data2:/var/lib/mysql    app_4:       # 匿名卷,由Docker自动生成,不指定主机路径或命名卷       volumes:          - /var/lib/mysql             #多容器共享卷    app_5:       image: mysql:8       volumes:          - my-data3:/var/lib/mysql    app_6:       image: mysql:8       volumes:          - my-data3:/var/lib/mysqlnetworks:  my-network:    driver: bridge    ipam:      config:        - subnet: 192.168.1.0/24          gateway: 192.168.1.1volumes:   my-data:   my-data2:    my-data3: 

Docker Compose常用命令

docker-compose.yml文件路径下执行以下命令,如果docker-compose.yml文件的路径不是./或文件名不是默认的docker-compose.yml,你可以使用-f参数来指定文件路径和文件名。这样,DockerCompose会使用你指定的文件来运行命令。

  • 帮助

    docker-compose -h
  • 上线所有的服务

    docker-compose up docker-compose  -f ./compose.yml up
  • 上线所有的服务并后台运行

    docker-compose up -d docker-compose  -f ./compose.yml up -d
  • 上线某一服务

    docker-compose up <service>docker-compose [-f ./compose.yml] up <service> 
  • 下线并删除容器、网络、数据卷和镜像

    docker-compose down 
  • 停止某一服务

    docker-compose stop <service>
  • 删除某服务容器

    docker-compose rm -f <service>
  • 进入容器实例内部

    docker-compose exec <service> /bin/bash
  • 展示当前docker-compose文件编排过的运行的所有容器

    docker-compose ps 
  • 展示当前docker-compose文件编排过的容器进程

    docker-compose top 
  • 查看容器输出的日志

    docker-compose logs  <service> 
  • 检查配置是否有语法错误

    docker-compose config  
  • 检查配置,有问题的才输出

    docker-compose -q  
  • 重启服务

    docker-compose restart  <service>
  • 启动服务

    docker-compose start <service>
  • 扩容,将服务名为app的应用扩容3份

    docker-compose scale <service>×3

案例:部署WordPress博客系统

1.编辑compose.yml

name: by_blogservices:    mysql:      privileged: true      image: mysql:8.0      ports:        - "3306:3306"      environment:         - MYSQL_ROOT_PASSWORD=123456        - MYSQL_DATABASE=wordpress      volumes:        - mysql-data:/var/lib/mysql        - /app/myconf:/etc/mysql/conf.d      networks:        - blog-network      restart: always          wordpress:      privileged: true      image: wordpress      ports:        - "8080:80"      restart: always      depends_on:         - mysql      environment:         - WORDPRESS_DB_HOST=mysql        - WORDPRESS_DB_USER=root        - WORDPRESS_DB_PASSWORD=123456        - WORDPRESS_DB_NAME=wordpress      volumes:        - wordpress-data:/var/www/html      networks:        - blog-networkvolumes:  mysql-data:  wordpress-data:networks:  blog-network:

2.执行docker-compose命令启动服务

docker-compose -f ./compose.yml up -d

命令行输出

[root@localhost opt]# docker-compose  -f ./compose.yml up -d[+] Running 35/24 ✔ wordpress 22 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                66.2s  ✔ mysql 11 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                               93.2s                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         [+] Building 0.0s (0/0)                                                                                                                     [+] Running 5/5 ✔ Network by_blog_blog-network     Created                                                                                            0.4s  ✔ Volume "by_blog_mysql-data"      Created                                                                                            0.0s  ✔ Volume "by_blog_wordpress-data"  Created                                                                                            0.0s  ✔ Container by_blog-mysql-1        Started                                                                                            2.6s  ✔ Container by_blog-wordpress-1    Started                                                                                            3.6s [root@localhost opt]# 

编排完成,服务成功启动,可以看到docker-compose先是创建了自定义的网络,然后是创建和挂载数据卷,然后在按顺序启动容器。

打开浏览器,简单进行初始化的操作后,WordPress博客系统便进入可用状态了。

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

DockerHub

2024年11月24日 00:00

截至本篇博客发布时间,中国内地访问DockerHub需要接入外网

1.DockerHub概述

DockerHub(https://hub.docker.com/)由Docker公司官方推出,是世界上最大的容器注册中心,用于存储、管理和共享Docker镜像,从而简化了开发过程。

说白了就是我们可以制作好Docker镜像,以命名空间和版本号的层次保存在云端,共享给其他人使用,类似将项目代码托管在GitHub进行开源那样。

DockerHub的主要功能:

  • 无限公共存储库
  • 私有存储库
  • Webhook用于自动化工作流程
  • GitHub和Bitbucket集成
  • 并发和自动构建
  • 具有高质量、安全图像的可信内容

除了图形界面之外,还可以使用DockerHub API或实验性DockerHub CLI工具与DockerHub进行交互。

2.推送镜像到DockerHub

首先输入命令,登录到DockerHub,按照提示输入DockerHub用户名和密码。

[root@localhost opt]# docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username: 130*****58@qq.comPassword: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

开始尝试将将本地的镜像rockey8_jdk17推送到DockerHub

[root@localhost opt]# docker imagesREPOSITORY                TAG                 IMAGE ID            CREATED             SIZErockey8_jdk17             1.0.0               fb5b6a2e5b81        3 months ago        642MB

首先要将本地自己制作好的镜像通过docker image tag命令为本地镜像创建一个带有命名空间等信息的新标签

docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • SOURCE_IMAGE[:TAG] 已有的本地镜像及其标签(TAG可选,默认是latest)。
  • TARGET_IMAGE[:TAG] 你想要创建的新标签的镜像名称(可以是新的仓库地址或新的标签)。

Docker镜像由多个部分组成,想要创建的新标签的镜像TARGET_IMAGE需要描述为:

[HOST[:PORT]/]NAMESPACE/REPOSITORY[:TAG]

例如:example.com:5000/team/my-app:2.0

  • HOST 指定镜像所在的registry位置。如果省略,Docker默认为DockerHub (docker.io)
  • PORT 端口号
  • NAMESPACE/REPOSITORY NAMESPACE命名空间通常代表用户或组织。REPOSITORY仓库用于标识特定的镜像。如果省略命名空间,Docker默认使用library,即为Docker官方镜像保留的命名空间,仓库是不可省略的
  • TAG 用于指定镜像特定版本,如果未提供标签,Docker默认使用latest

接下来,先在我的UID为changelzj的DockerHub账号上创建一个公共的仓库:rockey8_jdk17

然后将本地的rockey8_jdk17:1.0.0创建一个新标签changelzj/rockey8_jdk17:1.0.0,因为直接推到DockerHub故省略地址和端口

docker image tag别名docker tag

[root@localhost opt]# docker tag rockey8_jdk17:1.0.0 changelzj/rockey8_jdk17:1.0.0[root@localhost opt]#[root@localhost opt]# docker imagesREPOSITORY                TAG                 IMAGE ID            CREATED             SIZEchangelzj/rockey8_jdk17   1.0.0               fb5b6a2e5b81        3 months ago        642MBrockey8_jdk17             1.0.0               fb5b6a2e5b81        3 months ago        642MB

执行docker push命令推送到DockerHub的changelzj/rockey8_jdk17:1.0.0下

[root@localhost opt]# docker push  changelzj/rockey8_jdk17:1.0.0The push refers to repository [docker.io/changelzj/rockey8_jdk17]d453a92b860b: Pushed dc43c0708107: Pushed 4f09ab92a26b: Pushed 358121ca68a3: Pushed c1827ee010db: Mounted from library/rockylinux 1.0.0: digest: sha256:1bbc652c97e5166c51c20a8934765c894958d2acb479f0647b34ef8a52c3a1d4 size: 1373

登录DockerHub管理页面,然后可以看到rockey8_jdk17仓库下已经有了一个1.0.0版本的镜像

在尝试把同一镜像创建一个1.0.2版本的标签,推送,可以推送成功,管理页面也能看到,但是命令执行提示层已经存在,可能是同一个镜像的缘故

[root@localhost ~]# docker tag rockey8_jdk17:1.0.0 changelzj/rockey8_jdk17:1.0.1The push refers to repository [docker.io/changelzj/rockey8_jdk17]d453a92b860b: Layer already exists dc43c0708107: Layer already exists 4f09ab92a26b: Layer already exists 358121ca68a3: Layer already exists c1827ee010db: Layer already exists 1.0.1: digest: sha256:1bbc652c97e5166c51c20a8934765c894958d2acb479f0647b34ef8a52c3a1d4 size: 1373

3.DockerHub使用政策

为了防止资源滥用,保证公平使用,Docker官方对于DockerHub仓库数量和使用频率等都进行了限制。

截至本篇博客发布时间,对于免费用户,私有仓库最多只有一个,但可以享有无数个公共仓库,登录用户每6小时拉取次数最高200次,如果不登录就拉取镜像,则根据IP地址进行限制,6小时内每个IPv4地址或IPv6/64子网最多100次。

同时,Docker官方敬告:过高的数据传输、拉取速率或数据存储可能会导致流量限制或额外费用。为了确保资源的公平使用并维护服务质量,我们保留对数据和存储消耗过高的帐户施加限制或额外费用的权利。

官网文档具体介绍:https://docs.docker.com/docker-hub/usage/

使用虚拟机安装一个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 父容器名 镜像

Docker开篇

2022年1月15日 00:00

一、Docker概述

  Docker是一个开源的平台,是基于GO语言实现的开源项目,旨在让应用程序更简单地创建、部署和运行,解决了运行环境和配置问题。它是linux容器技术的落地实现,依赖已经存在的linux环境,实现应用程序及其依赖环境的打包,使得软件可以带着环境安装,一次镜像,处处运行,不受具体操作系统环境的限制。

  Docker官网:https://www.docker.com/

  Docker必须部署在Linux内核的系统上,实质上是在一个运行中的Linux环境上创建了一个隔离的文件环境。

Docker的优点

  • 快速的交付和部署
  • 提高硬件利用率
  • 便捷的升级和扩容缩容
  • 更简单的系统运维

二、Docker和虚拟机

  虚拟机就是带环境安装的一种解决方案,它可以在一种操作系统上面虚拟出硬件后,在上面完整运行另一种操作系统,再从这个操作系统上运行自己的软件,比如在Windows10系统里面运行Linux Centos7,应用程序对此毫无感知,因为虚拟机看起来和真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响,这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间逻辑不变。

  虚拟机存在明显的缺点:资源占用多,冗余步骤多,启动也很慢,因此Linux发展出了另一种虚拟化技术: Linux容器(Linux Containers,缩写LXC),Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件,容器提供的镜像包含了应用的所有依赖项。

  Linux容器不是模拟一个完整的操作系统而是对进程进行了隔离,有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中,容器与虚拟机不同,不需要捆绑一整套操作系统,容器内进程直接运行于宿主机的内核,容器没有自己的内核也没有虚拟的硬件,只需要软件工作所需的库资源和设置。容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会互相影响,系统因此变得高效轻量。

  总结:Docker是在操作系统层面实现虚拟化,直接复用本地的操作系统,而传统虚拟机则是在硬件层面虚拟化,因此和虚拟机相比,Docker启动更加的快速,占用体积明显减小。

三、Docker的三要素

  • 镜像 (Image)

  镜像是只读的模板,用于创建docker容器,一个镜像可以创建多个容器,相当于一个root文件系统

  • 容器 (Container)

  Docker利用容器独立运行一个或一组应用,容器是一个简易版的Linux运行环境(包括root权限,进程空间,用户空间和网络),以及运行在上面的应用程序,应用程序运行在容器里面,容器相当于一个虚拟化的运行环境,是利用镜像创建的运行实例,镜像是静态的,容器为镜像提供了一个标准的隔离的运行实体,容器可以被启动,开始,停止,删除,每个容器都是相互隔离,保证安全的。

  • 仓库 (Repository)

  Docker公司提供了一个保存各种Docker镜像的仓库,称之为DockerHub,地址: https://hub.docker.com
  还可以根据需要,搭建自己的私有仓库

四、Docker的架构和运行流程

  从其架构和运行流程快来看,Docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职。

Docker的基本运行流程为:

  1. 用户使用Docker Client与Docker Daemon建立Socket通信,并发送请求给后者。
  2. Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求。
  3. Docker Engine执行Docker内部的一些列工作,每一项工作都是以一个Job的形式存在。
  4. Job在运行过程中,当需要镜像时,从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以graph的形式存储。
  5. 当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境。
  6. 当需要限制Docker容器运行资源或执行用户指令操作时,则通过Exec driver来完成。
  7. Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。

五、Docker基础篇

序号文章名概述
1Docker的安装和配置docker的安装及常见的命令
2Docker的离线安装下载二进制文件并注册系统服务
3Docker的镜像操作镜像的一些操作,拉取,搜索,删除等
4Docker的容器操作容器的操作,新建,启动,停止,查看日志和容器内操作等
5Docker容器数据卷实现和宿主机共享文件
6Docker网络docker的4种网络类型以及自定义网络
7Dockerfile使用dockerfile构建镜像
8Docker Composedocker官方的容器编排工具,实现同时部署多个应用
9DockerHubDocker官方提供的全球最大的容器镜像、扩展和插件集合

六、Docker高阶篇

序号文章名概述
1Docker与联合文件系统docker镜像加载原理

参考

1.尚硅谷Docker实战教程,尚硅谷,2022-01-05

❌