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

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

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 文件,内容如下图

添加图片注释,不超过 140 字(可选)

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

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

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

添加图片注释,不超过 140 字(可选)

4.排查问题

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

4.1.1 控制台日志

添加图片注释,不超过 140 字(可选)

4.1.2 高级日志查看手段

添加图片注释,不超过 140 字(可选)

4.1.3 本地文件查看日志

添加图片注释,不超过 140 字(可选)


4.1.4 此种日志方式的坑

添加图片注释,不超过 140 字(可选)

4.1.5 log文件内容如下图

添加图片注释,不超过 140 字(可选)

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

4.2 解决方案

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

永久解决方案:日志引擎

4.3 日志引擎

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

添加图片注释,不超过 140 字(可选)


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

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

4.3.2. EFK

添加图片注释,不超过 140 字(可选)

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

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

4.4. 系统日志

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

添加图片注释,不超过 140 字(可选)

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

添加图片注释,不超过 140 字(可选)

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

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

5.镜像原理

5.1. jdk制作镜像

添加图片注释,不超过 140 字(可选)

5.2. 指令解释

添加图片注释,不超过 140 字(可选)

5.3. docker构建

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

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

5.4. 镜像本质

解压镜像后文件如下图:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

非顶层json说明文件案例:

添加图片注释,不超过 140 字(可选)


解压layer看看

添加图片注释,不超过 140 字(可选)

总结:

每次执行 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/* 容器运行时文件

添加图片注释,不超过 140 字(可选)

文件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的目录名称

添加图片注释,不超过 140 字(可选)

文件案例

添加图片注释,不超过 140 字(可选)

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

添加图片注释,不超过 140 字(可选)

dt_socket:使用的通信方式

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

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

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

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

添加图片注释,不超过 140 字(可选)

相关文章

Nginx Proxy Manager - Docker 建站最佳伴侣

本文首发于: https://blog.frytea.com/archives/658/很长一段时间中,我都在思考容器建站的可行性。容器有诸多益处,各类好处就不一一列举了。在企业场景下,K8s 几乎一...

复杂系统如何在不停机升级同时保持稳定?你必须考虑以下几个点...

背景在互联网行业,线上服务的升级更新可谓家常便饭。据统计,在过去的一个季度中闲鱼工程师们执行了千余次发布,总计更新的代码数量超过百万行。这些发布中,有一些可能只更新了几行代码,而有一些可能执行了整个集...

redis 为什么这么快,除了io多路复用还有什么?

前言相信大家在面试过程中,都被面试官问到过这样一个问题,缓存中间件大名鼎鼎的 redis 速度为什么这么快呢?针对于面试过程中的痛点问题,笔者昨晚熬夜收集资料,并且通过走访大量使用者,整理出如下的结论...

什么是网关服务?

网关服务 (Gateway Service),也常被称为 API 网关 (API Gateway),在微服务架构中扮演着至关重要的角色。 简单来说,网关服务是微服务系统的单一入口点,就像建筑物的入口大...

「C++」频繁分配释放内存导致的性能问题的分析

现象1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C progra...

某大厂的C++协程框架(Kiev)技术内幕

Kiev框架简介kiev是该大厂推送平台目前使用的Linux-C++后台开发框架。先后由多位资深架构师、资深C++工程师倾力打造,已经在推送平台这个千万用户级的大型分布式系统上经历了近多年的考验。如今...