您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

Docker入门

f0c;防止恶意的程序破坏自身。
验证阶段的工作量占了整个类加载过程相当大的比重。


如果中间有发现字节流不符合Class文件格式约束,就抛出 java.lang.VerifyError 异常或者子类异常。


(1)文件格式验证
验证字节流是否满足Class文件格式的规范,并且能够被当前版本的虚拟机处理。
其中包括:魔数 0xCAFEBABE,主次版本号是否被当前版本虚拟机接受等等。
(2)元数据验证
对字节码描述的信息进行语义分析,保证符合《Java语言规范》。主要是对类的元数据信息进行校验。
(3)字节码验证
通过对数据流分析和控制流分析,确保语义合法、符合逻辑。主要是对类的方法体进行校验。
(4)符号引用验证
确保解析行为能正常进行。对类自身以外的各类信息进行匹配性校验,验证是否能访问到它依赖的某些外部类、字段、方法等资源。
如果无法通过符号引用的验证,Java虚拟机将会抛出一个 java.lang.InCompatibleClassChangeError 的子类异常,典型的有: java.lang.NoSuchFieldErrorjava.lang.NoSuchMethodErrorjava.lang.IllegalAccessError 等。

3.3 准备

准备阶段是正式为类中的静态变量分配内存并设置类变量初始值的阶段。
注意:类变量初始值是指当前类型的初始零值。如 int:0boolean : falsereference : null 等等。


但是,常量 ConstantValue,也就是被声明为 public static final 在准备阶段就是被设置成指定的初始值。

3.4 解析

解析阶段是把符号引用替换成为直接引用的过程。
笔者把它理解为 从符号标识 转换成为 目标内存地址或者句柄的过程,以便后续使用。

符号引用:以一组符号来描述所引用的目标,符号引用可以是任何形式的字面量,要求能准确无歧义地定位目标。
直接引用:直接指向目标的指针、偏移量或者简介定位句柄。


其中主要包括:

  1. 类或接口的解析;
  2. 字段解析;
  3. 类方法解析;
  4. 接口方法解析;
  5. 方法类型;
  6. 方法句柄;
  7. 调用点限定符;

3.5 初始化

类的初始化阶段是类加载的最后一个步骤。在类加载的众多过程之中,在初始化之前,一直是由虚拟机主导的控制。直到该阶段,虚拟机才把主导权移交给应用程序。


在准备阶段,已经为类变量赋予过一次初始零值。而在初始化阶段,将会根据程序员的定制编码去初始化类变量和其他资源。
从另一个方向理解,则是:**初始化阶段是执行类构造器 **<clinit>()**方法的过程。

(1) <clinit>() 方法是 javac编译器自动生成的产物,它不是编码产生,和类的构造函数也没有太大关系。

(2) <clinit>() 方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块 static {} 合并产生的。编译器收集的顺序是由源文件的出现顺序决定的。静态语句块中中能访问拿到定义在该语句块之前的类变量,定义在之后的变量,可以赋值但是不能访问。

public class Test {
	
    static int num1 = 1;
    static {
    	System.out.println(num1); //正常输出num1
        numb2 = 22; //不会报错
        System.out.println(num2); //编译器提示:"非法向前引用"
    }
    static int num2 = 官方仓库: https://hub.docker.com/


1.5安装以及版本

第一种:

wget curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

sed -i ‘s@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g’ docker-ce.repo

[root@clq yum.repos.d]# wget curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

[root@localhost yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@localhost yum.repos.d]# yum clean all
73 文件已删除
[root@localhost yum.repos.d]# yum -y install docker-ce

第二种:

[root@clq yum.repos.d]# cat docker-ce.repo 
[docker-ce]
name=docker-ce
enabled=1
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/stable/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum -y install docker-ce
1.6docker加速(了解)

1.开启docker服务

2.创建/etc/docker/daemon.json文件

3.重启服务

4.docker info查看

[root@clq ~]# cat /etc/docker/daemon.json
{
            "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
[root@clq ~]# docker info
 Registry Mirrors:
  https://docker.mirrors.ustc.edu.cn/
 Live Restore Enabled: false

查看版本:

[root@clq ~]# docker -v
Docker version 20.10.7, build f0df350
1.7Docker工作方式

容器易于管理,一个容器跑一个业务进程,比如nginx和php分别对应俩个容器,二者用通信逻辑进行通信。

传统LXC是把一个容器当虚拟机使用,里面有n个进程等,而docker的限制性使得一个容器对应一个进程业务,非常方便。

在这里插入图片描述

1.7docker优缺:

删除一个容器,不会影响其它容器的使用

调试不方便,占空间(容器需要自带调试工具,比如ps命令) #缺点

发布容易,编写即可导出运行

部署容易,无论底层是什么,只要是docker,均可run

分层构建,联合挂载

尽量不要把数据放在容器内


2.Docker容器的几个版本:

lxc --------->libcontainer---->runC

OCI:

  • 由linux基金会于2015年6月创立
  • 围绕容器格式和运行时制作一个开放的工业化标准
  • 包含俩个规范(运行时规范)(图像规范)

ocf:

开放容器格式

RunC:

根据oci规范生成和运行容器的cli工具

runc建立在lib容器之上的,同样的容器技术为数百万的码头引擎安装提供了动力。

docker提供了一个专门容纳容器镜像的站点: https://hub.docker.com/

3.Docker镜像与镜像仓库

Registry:镜像仓库名字

镜像是静态的,而容器是动态的,容器类似一个进程时刻在运行,随时可以删除,

而镜像类似于一个程序,不会被删掉。


4.Docker对象

当使用 docker 时,正在创建和使用图像、容器、网络、卷、插件和其他对象。

  • 镜像
    • 镜像是一个只读模板,其中包含创建 docker 容器的说明。
    • 通常,一个镜像基于另一个镜像,并带有一些额外的自定义。
    • 您可以创建自己的映像,也可以仅使用其他人创建并在注册表中发布的映像。
  • 容器
    • 容器是图像的可运行实例。
    • 您可以使用 docker API 或 CLI 创建、运行、停止、移动或删除容器。
    • 您可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建新映像。

5.Docker命令

docker images:查看镜像

docker search:查看镜像名所有版本信息

docker pull:拉取镜像到本地

docker rmi -f ${docker images -qa} :一次性删除全部镜像

sudo docker rm $(sudo docker ps -a -q) :一次性删除全部未进行的容器

docker create :创建一个新的容器

docker run:下载镜像并运行成容器 -it 交互式分配终端

docker ps:列出启动容器 docker ps -a 列出所有的容器

docker start 容器ID :开启容器

docker stop 容器ID :关闭容器

docker kill :杀死进程

docker rm:删除容器 docker rm -r :强制删除容器 rmi:删除镜像

docker exec:对运行中的容器进行操作

进入容器里面: docker exec -it 容器id /bin/bash docker attach 容器id(ctrl+c即为退出)

docker inspect:检查容器对象信息

docker logs:容器日志

#搜索镜像
[root@clq ~]# docker search httpd
NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                                   The Apache HTTP Server Project                  3608      [OK]       
centos/httpd-24-centos7                 Platform for running Apache httpd 2.4 or bui…   40                   
centos/httpd                                                                            34                   [OK]
arm32v7/httpd                           The Apache HTTP Server Project                  10                   
solsson/httpd-openidc                   mod_auth_openidc on official httpd image, ve…   2                    [OK]
hypoport/httpd-cgi                      httpd-cgi                                       2                    [OK]
salim1983hoop/httpd24                   Dockerfile running apache config                2                    [OK]
dariko/httpd-rproxy-ldap                Apache httpd reverse proxy with LDAP authent…   1                    [OK]
manageiq/httpd                          Container with httpd, built on CentOS for Ma…   1                    [OK]
publici/httpd                           httpd:latest                                    1                    [OK]
lead4good/httpd-fpm                     httpd server which connects via fcgi proxy h…   1                    [OK]
dockerpinata/httpd                                                                      1                    
clearlinux/httpd                        httpd HyperText Transfer Protocol (HTTP) ser…   1                    
inanimate/httpd-ssl                     A play container with httpd, ssl enabled, an…   1                    [OK]
jonathanheilmann/httpd-alpine-rewrite   httpd:alpine with enabled mod_rewrite           1                    [OK]
centos/httpd-24-centos8                                                                 1                    
appertly/httpd                          Customized Apache HTTPD that uses a PHP-FPM …   0                    [OK]
amd64/httpd                             The Apache HTTP Server Project                  0                    
trollin/httpd                                                                           0                    
e2eteam/httpd                                                                           0                    
ysli/httpd                              Httpd for DeepWeb                               0                    [OK]
interlutions/httpd                      httpd docker image with debian-based config …   0                    [OK]
manasip/httpd                                                                           0                    
manageiq/httpd_configmap_generator      Httpd Configmap Generator                       0                    [OK]
itsziget/httpd24                        Extende
#拉取镜像
[root@clq ~]# docker pull library/httpd
#创建容器
docker create httpd
#查看运行以及所有容器
[root@clq ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS         PORTS     NAMES
f1453132a9be   httpd     "httpd-foreground"   32 minutes ago   Up 4 minutes   80/tcp    blissful_hoover

docker内部运行架构图:
在这里插入图片描述


6.Docker登记处

docker registry 分类

  • Sponsor Registry:第三方的Registry,供客户和Docker社区使用
  • Mirror Registry:只让客户使用
  • Vendor Registry:发布docker镜像的供应商提供的registry
  • Privat Registry:通过防火墙和额外安全层的私有实体提供的registry

docker registry的组成

  • Repository

    1.由某特点的docker镜像的所有迭代版本组成的镜像仓库

    2.一个registry中可以存在多个repository
    ​ repository可以分为顶层仓库和用户仓库
    ​ 用户仓库名称格式为用户名和仓库名
    3.每个仓库可包含多个tag(标签),每个标签对应一个镜像

  • index
    ​ 1.维护用户账户,镜像的校验以及公共命名空间的信息
    ​ 2.为registry提供了一个完成用户认证等功能的检索接口


7.docker镜像的制作

7.1镜像的获取:

docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

7.2镜像生成途径:

  • dockerfile
  • 基于容器制作
  • 自动化构建
7.3基于容器制作镜像

参数:

-a :作者,描述

-c:将dockerfile指令应用于创建的映像

-m:提交信息

-p:提交镜像并且暂停容器

语法:docker commit [options] container [repository[:tag]]

具体操作:

#拉取小镜像到本地
[root@clq ~]# docker pull busybox
[root@clq ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    08b152afcfae   9 days ago    133MB
mysql        latest    c60d96bd2b77   9 days ago    514MB
httpd        latest    73b8cfec1155   9 days ago    138MB
busybox      latest    69593048aa3a   7 weeks ago   1.24MB
[root@clq ~]# docker run --name clq -it busybox
#运行并取名clq容器,交互式运行一个终端
[root@clq ~]# docker run --name clq -it busybox

#容器内创建内容
/ # mkdir data
/ # cd data/
/data # echo 'hello world' > index.html 
hello world


#第二个tty终端,提交暂停镜像(前提第一个终端不能关闭)
[root@clq ~]# docker commit -p clq
sha256:3988dbf16cbbcb5eff70cb87bcba1943c3eb60ad94b27ca9f2409f837d08c22f
[root@clq ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
<none>       <none>    3988dbf16cbb   2 minutes ago   1.24MB      #创建的没命名的镜像
nginx        latest    08b152afcfae   9 days ago      133MB
mysql        latest    c60d96bd2b77   9 days ago      514MB
httpd        latest    73b8cfec1155   9 days ago      138MB
busybox      latest    69593048aa3a   7 weeks ago     1.24MB
#标签指定 镜像id 以及docker的账户名字/容器名字:镜像版本
[root@clq ~]# docker tag  3988dbf16cbb  cailiqian/clq:v0.1       
[root@clq ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
cailiqian/clq   v0.1      3988dbf16cbb   2 minutes ago   1.24MB
nginx           latest    08b152afcfae   9 days ago      133MB
mysql           latest    c60d96bd2b77   9 days ago      514MB
httpd           latest    73b8cfec1155   9 days ago      138MB
busybox         latest    69593048aa3a   7 weeks ago     1.24MB


#登录
[root@clq ~]# docker login
Login 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: cailiqian
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#上传
[root@clq ~]# docker push cailiqian/clq:v0.1
The push refers to repository [docker.io/cailiqian/clq]
b1eaa1845b05: Layer already exists 
5b8c72934dfc: Layer already exists 
v0.1: digest: sha256:0cb41af4696189738ee06b85bd42d1d88945843197f0612ddab7289720ab54ad size: 734

在这里插入图片描述

在这里插入图片描述

上传成功的页面:

在这里插入图片描述

此时网上就有了属于你的镜像

使用你的镜像来创建新的容器,如下:

#创建99容器并且运行
[root@clq ~]# docker run --name 99 -it cailiqian/clq:v0.1
#或者直接进入容器
[root@clq ~]# docker exec -it 00039b5b3fdd  sh
/ # cat /data/php/index.html 
hello world

由此可知到,新创建的容器内有之前镜像的内容

默认情况下观察到是启动sh进程,如下:

[root@clq ~]# docker ps -a
CONTAINER ID   IMAGE                COMMAND              CREATED          STATUS                   PORTS     NAMES
00039b5b3fdd   cailiqian/clq:v0.1   "sh"                 21 minutes ago   Up 10 minutes                      99

之前创建以及上传的镜像方式非常传统,默认是采用sh进程,因此,现在需要重新创建一个基于httpd或者其它进程如(/bin/bash),进行上传,操作如下:

[root@clq ~]#  docker commit -a 'clq <clq@360.com>' -c 'CMD ["/bin/httpd","-f","-h","/data/php"]' -p clq cailiqian/clq:v0.2
[root@clq ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
cailiqian/clq   v0.2      f0b0ebd19d55   29 seconds ago   1.24MB
[root@clq ~]# docker push cailiqian/clq:v0.2           #上传
[root@clq ~]# docker run --name 999 -d cailiqian/clq:v0.2
[root@clq ~]# docker ps -a
CONTAINER ID   IMAGE                COMMAND                  CREATED              STATUS                   PORTS  
c504090f2df4   f0b0ebd19d55         "/bin/httpd -f -h /d…"   11 minutes ago       Up 11 minutes   
[root@clq ~]# curl 172.17.0.3
hello world

7.4镜像的导入与导出

我们有俩台主机,一台主机上做了镜像,另一台想用的话,怎么办呢?

重新创建,上传,构建,不不,这么太麻烦了!!

最有效的办法是在镜像的基础上把镜像打包成一个压缩文件,将其拷贝到另外一台主机上。

导出 docker save -o 导入docker load -i

docker save -o test.gz   docker账户名/镜像名

docker load -i test.gz     

分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进