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断点调试即可