晓楼揽胜
发布于 2023-11-15 / 15 阅读
0

docker基础

1. 作为一个新兴的技术,问题很多,为什么要用

1.直接原因:技术宅,渴望探索新技术

2. docker优势如下

一. 一次创建或配置,可以在任意地方正常运行

二. docker的优势:相较传统虚拟机,docker可以做到秒级、甚至毫秒级的启动时间

三. docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,不会因为环境原因造成bug

2.离线安装

2.1 依赖包

docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm

docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm

docker-compose

2.2 执行下面脚本安装即可

17版本安装

检查yum源,新环境都需要替换掉 /etc/yum.repos.d/CentOS-Base.repo
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum install -y policycoreutils-python selinux-policy
yum install -y docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
yum install -y docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
yum install -y vim
docker-compose文件放到 /usr/local/bin 目录里面
chmod u+x /usr/local/bin/docker-compose
建立软连接 ln -sf /usr/local/bin/docker-compose /usr/bin/

最新18版本安装

首先检查yum源,新环境都需要替换掉 /etc/yum.repos.d/CentOS-Base.repo
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
yum install -y docker-ce-18.06.1.ce-3.el7.x86_64.rpm
vim /usr/lib/systemd/system/docker.service
在里面的EXECStart的后面增加后如下:
ExecStart=/usr/bin/dockerd --graph /home/docker
docker-compose文件放到 /usr/local/bin 目录里面
chmod u+x /usr/local/bin/docker-compose
建立软连接 ln -sf /usr/local/bin/docker-compose /usr/bin/
systemctl start docker
docker load < jdk8.tar

2.2.1 修改docker 默认安装位置

为何标红,看图,生产环境,磁盘空间总共只有8G

2.2.2 解决方案–->修改默认安装位置

修改docker.service文件

vim /usr/lib/systemd/system/docker.service

在里面的EXECStart的后面增加后如下:

/data目录有45G的空间,所以docker的路径改为/data/docker

ExecStart=/usr/bin/dockerd --graph /data/docker

2.3 启动docker 导入离线镜像jdk81

systemctl start docker 或者systemctl enable docker
docker load < jdk8.tar

3. 构建第一个项目

3.1. 利用原生docker命令

docker run -d --name redis7003_1 --net=host -p 7003:7003 -v /home/redis/7003/redis.conf:/usr/local/redis/redis.conf google/cluster-redis:4.0.10

缺点:第二个人无法运维,无法写出一模一样的语句

3.2. 利用docker-compose.yml构建第一个项目

3.2.1 docker-compose的本质是调用docker提供的api接口

3.2.2 编写docker-compose.yml 文件,内容如下图

3.2.3将docker-compose.yml 文件放到/data下面

3.2.4 必须在/data下面执行创建容器并启动服务的命令:docker-compose up d ,或者在任意目录下执行,但是需要制定docker-compose.yml文件位置

3.2.5 查看docker是否成功启动: docker ps

4.排查问题

4.1. 查看系统运行日志命令

4.1.1 控制台日志

4.1.2 高级日志查看手段

4.1.3 本地文件查看日志

4.1.4 此种日志方式的坑

4.1.5 log文件内容如下图

从上图可知其实log内容就是(docker logs f -tail 200 容器名)命令看到的控制台内容

4.2 解决方案

  临时解决方案echo ''>05a9e5b5a3d29362732612f6baa0791a43a8d92c97ad6c769103b4e9fa1ae040-json.log

永久解决方案:日志引擎

4.3 日志引擎

4.3.1. json-file 默认形式配置如下图

必需配置max-size来限制上图中的最大日志大小,否则会无限叠加

优点是可以通过docker logs 或者docker-compose 来查看实时日志

4.3.2. EFK

优点便于在ES search上搜索日志

缺点:无法通过docker-compose查看实时日志

4.4. 系统日志

直接查看进程日志:journalctl -f -u docker.service

默认只能查看error级别日志,基本看不出来问题,所以需要改变日志级别

systemctl deamon-reload 是保存进程当前的现状,否则直接重启docker会报错,好处是docker restart后所有的服务会自动启动

debug级别可以用来调试docker本身的bug,比如docker pull images 拉不下来可以看到原因

5.镜像原理

5.1. jdk制作镜像

5.2. 指令解释

5.3. docker构建

 docker build -t jdk8/hikvisionmall-crt:latest .

必须在dockerfile文件所在的目录下执行,默认工作区,会把此路径下所有的文件复制进镜像所在工作区中,工作区为所有命令执行的目录

5.4. 镜像本质

解压镜像后文件如下图:

非顶层json说明文件案例:

解压layer看看

总结:

每次执行 FROM COPY RUN ADD 这些指令都会新建一个layer,

跟据命令执行的顺序形成单向依赖的链,后执行的命令依赖它之前的层

利用镜像创建容器即执行所有的指令,形成最终的工作区,即在简化的linux中安装运行jar包所需要的软件和环境

综上:镜像的目的是构建一个能运行最终服务所依赖的linux或其他操作系统的环境

5. 镜像仓库

公司镜像仓库地址:http://habor.xxxx.com.cn

5.1 配置镜像仓库地址

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

配置镜像仓库地址地址,内容如下

{
"insecure-registries":["habor.xxx.com.cn"],
"registry-mirrors": ["http://habor.xxx.com.cn"],
"debug": true
}

配置完成够重启docker

systemctl daemon-reload (此命令会保存重启前各个容器以及服务的状态,docker重启后会自动恢复服务)
systemctl restart docker

5.2 拉取镜像

docker pull cloud-merchants/jdk83

5.2.1 镜像仓库需要登录才能push镜像,

所以先登录:docker login habor.xxx.com.cn 然后输入用户名和密码(如有需求找我要,登录之前必须配置上面的daemon.json否则必定登录失败,登录成功后才能推送)

5.2.2 为当前服务器已经存在的镜像(docker images -a 可看到) 重命名(tag即docker重命名的方式)

docker tag jdk8/xxxmall-crt habor.xxx.com.cn/cloud-merchants/jdk8/xxxmall-crt:latest
命令解释: jdk8/xxxmall-crt为本地(docker images -a 能看到的)镜像
habor.xxx.com.cn前缀是固定值,向habor中推送镜像必须的前缀,habor文档所规定
cloud-merchants 是habor中建立的项目名称,
cloud-merchants/jdk8/xxxxmall-crt:latest 为镜像名称:版本号

5.2.3 推送镜像:

                docker push habor.xxxx.com.cn/cloud-merchants/jdk8/xxxxmall-crt

5.2.4 拉取镜像

                docker pull habor.xxx.com.cn/cloud-merchants/jdk8/xxxxmall-crt

harbor示意图

6. 镜像生成容器并启动一个服务

6. 1. 容器和服务

服务的本质是为客户提供有价值的内涵,例如:提供接口服务,nginx负载服务,mysql数据库服务
容器是提供服务运行所必须的环境

6.2. 容器内部一探究竟

         docker exec it 容器名称 /bin/bash,进入上面创建的第一个容器
         docker exec -it xxxbash    // bash = /bin/bash

容器在物理机上的文件映射,默认在/var/lib下面

文件1:/var/lib/docker/containers/* 容器运行时文件

文件2:/var/lib/docker/overlay

这里存放的是镜像的每一层layer解压后的结果,以及基于每一个镜像生成容器后,对镜像合并挂载后的目录和对应的init目录

docker ps -a 的容器数量等于此文件下的xxx-init的文件数量,容器创建(docker run)和销毁 (docker rm)时会创建和删除对应的文件

xxxx-init为容器起始文件,里面的内容为顶层layer的所在目录,然后按照 依赖链可以找到所有的layer

每个容器 docker inspect 容器名称 ,可以看到init文件目录名称,即下图中的MergedDir,LowerDir为顶层layer的目录名称

文件案例

7. 运行中的docker迁移默认路径/var/lib/docker

             df  -h 查看最大的一个盘为/data
             在/data下新建路径docker: mkdir docker
             cp -R -v /var/lib/docker/*  /data/docker
             修改docker默认存储路径:vim /usr/lib/systemd/system/docker.service  
              ExecStart=/usr/bin/dockerd --graph /data/docker
              systemctl daemon-reload (守护进程重启,如果失败,先docker stop掉所有的正在运行的docker服务,重启后,会自动运行之前所有的正在运行的服务)
              通过docker info 可以看到新的路径为:  Docker Root Dir: /data/docker
              删掉原来的路径,过一阵如果没问题直接删掉,mv /var/lib/docker /var/lib/docker_bak
有问题回滚:  修改docker默认存储路径,删掉新加的–graph,然后 mv /var/lib/docker_bak /var/lib/docker 最后重启systemctl daemon-reload 即可

8. 远程调试

1. 开放端口5005, 宿主机要开通防火墙端口

2. 配置启动命令 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

dt_socket:使用的通信方式

server:是主动连接调试器还是作为服务器等待调试器连接,默认是y

suspend:是否在启动JVM时就暂停,并等待调试器连接,默认是y

address:地址和端口,地址可以省略,两者用冒号分隔

3. 本地IDEA 代码切到跟测试环境同一个分支,配置Remote断点调试即可