wmenjoy / awesome-knowleges

汇总有用的知识
38 stars 7 forks source link

玩转Docker #16

Open wmenjoy opened 4 years ago

wmenjoy commented 4 years ago

Docker 概念

Docker 是什么?

正如Docker官网所言:

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

Docker 简单来讲是一个基于容器的生态开源平台,它不仅仅是容器,而且集成了软件的生命周期的管理, 利用Docker平台集成的应用程序的开发,发布,运行管理的功能和容器的优势,你可以很好的将软件和基础设施隔离,实现软件的快速交付。同时容易是轻量级的,具有很强的隔离性和安全性,这样可以提供给你一种成本更低的软件开发方案。

Docker Engine

Docker 技术的核心便是Docker Engine, 他是一个CS架构的应用程序,主要有三个组件

Docker 本身灵活,高效可移植,松耦合,可扩展,安全;

lexible: Even the most complex applications can be containerized. Lightweight: Containers leverage and share the host kernel, making them much more efficient in terms of system resources than virtual machines. Portable: You can build locally, deploy to the cloud, and run anywhere. Loosely coupled: Containers are highly self sufficient and encapsulated, allowing you to replace or upgrade one without disrupting others. Scalable: You can increase and automatically distribute container replicas across a datacenter. Secure: Containers apply aggressive constraints and isolations to processes without any configuration required on the part of the user.

Docker可以用来做什么?

应用程序快速一致性的交付

Docker 的基于容器的平台支持高度可移植的工作负载。 Docker 容器可以在开发人员的本地笔记本电脑上运行,也可以在数据中心的物理或虚拟机、云提供商或混合环境中运行。

Docker使用容器来标准化应用程序和服务的环境,能够极大简化软件的开发周期,避免配置异常的问题,对CI/CD非常有用:

响应式的部署和扩展

Docker 的可移植性和轻量级特性使得动态管理work Loads变得非常容易,可以根据业务需求以接近实时的方式扩展或拆卸应用程序和服务。

相同硬件上可以部署更多的应用

Docker是轻量级和快速的。 它为基于虚拟机监控程序的虚拟机提供了一个可行的、经济有效的替代方案,因此您可以使用更多的计算能力来实现业务目标。 Docker 非常适合高密度环境和中小型部署,在这些环境中您需要用更少的资源完成更多的工作。

容器和虚拟机的对比

容器在 Linux 上本地运行,并与其他容器共享主机的内核。 它运行一个离散的进程,占用的内存不比其他任何可执行文件多,因此它是轻量级的。

相比之下,虚拟机(VM)要完全运行一个操作系统,通过管理程序虚拟访问主机资源。 一般来说,除了您的应用程序逻辑所消耗的内容之外,vm 还会产生大量的开销。 image image

Docker 的架构

image 如上图所示,Docker使用CS体系结构,Client通过和Docker的Daemon来完成Docker容器的构建、发布、运行工作,Client和Daemon可以在同一台主机,也可以在不同主机上(通过网络进行交互)

Docker Daemon

Docker Daemon(dockerd)监听 通过 Docker API 过来的请求,并管理 Docker 对象,如图像、容器、网络和卷。 守护进程还可以与其他守护进程通信,用来管理 Docker 服务。

Docker Client

Docker Client(Docker命令)是许多 Docker 用户与 Docker 交互的主要方式。 当使用诸如 docker run 之类的命令时,客户机将这些命令发送给 dockerd,然后又dockerd执行这些命令。 Docker 命令使用 Docker API和dockerd进行通信。 Docker 客户机可以与多个守护进程通信。

Docker Registries

Docker Registries 用来存储Docker Image, Docker Hub是一个公共Docker Regstires, 类似于公用的maven仓库,是Docker默认配置的。 你也可以注册自己的私有Regsitries

当您使用 docker pull 或 docker 运行命令时,所需的映像将从您配置的Regsitries中提取出来。 当您使用 docker push 命令时,您的映像将被推送到您配置的Regsitries中。

Docker 对象

对象

这里所说的Docker对象指的是镜像(images), 容器(containers), 网络(networks), 卷(volume), 插件,和其他对象

镜像(Image)

镜像是一个创建Docker Container的只读指令模板,通常,一个镜像基于另一个镜像(dockerfile中农的FROM),并在基础上增加一些定制,比如在centos镜像的基础上,增加nginx服务器,以及运行nginx所需的配置

可以使用其他人在Docker Registries创建好的镜像,也可以创建自己的镜像,创建镜像,需要一个dockerfile.Dockerfile用间接的语法来描述创建和运行镜像所需要的步骤。Dockerfile 中的每条指令都在图像中创建一个图层。 当您更改 dockerfile 并重新生成图像时,只会重新生成已更改的图层。 与其他虚拟化技术相比,这是使映像如此轻量化、小巧和快速的部分原因。

容器(Container)

容器是镜像的可运行实例。可以使用Docker Rest API或者Docker CLI 来创建,启动,停止,移动,删除容器,也可以将容器连接成一个或多个网络,可以给镜像添加存储卷,生成可以基于当前的状态创建一个新的镜像 默认情况下,容器与其他容器及其主机相对隔离较好。 可以控制容器的网络、存储或其他基础子系统与其他容器或主机的隔离程度。

容器是由其镜像以及创建或启动时提供给它的任何配置选项定义的。 当移除容器时,对其状态的任何未存储在持久性存储中的更改都将消失。

服务(Service)

严格的将,这个Service 是对Docker 容器所运行服务的一个更上层抽象,借助于负载均衡,不同容器的管理机制,来提供一个整体的引用程序,比如K8s的服务概念,Docker Swarm的服务概念

底层的技术

基础技术

Docker 是用go编写,利用lInux提供的Namespace, Control group 和Union File System来实现功能

Namespace

Docker 使用Namespace技术提供称为容器的隔离工作区。 运行容器时,Docker 为该容器创建一组Namespace

这些Namespace提供了一个隔离层。 容器的每个方面都运行在一个单独的Namespace中,它的访问受到该Namespace的限制。

linux提供了7种Namespace,Docker目前使用了一下5种(User name space没有使用)

Control Groups

Linux 上的 Docker Engine 还依赖于另一种称为cgroups的技术。 Cgroup 将应用程序限制为一组特定的资源。 Control Groups允许 Docker 引擎向容器共享可用的硬件资源,并可选地实施限制和约束。 例如,可以将可用内存限制为特定容器。

Union file systems

nion 文件系统,或 UnionFS,是通过创建层来操作的文件系统,这使得它们非常轻量级和快速。 Docker Engine 使用 UnionFS 为容器提供构建块。 Docker Engine 可以使用多个 UnionFS 变体,包括 AUFS、 btrfs、 vfs 和 DeviceMapper。

容器格式 format

Docker Engine 将Namespace、Controle group和 UnionFS 组合成一个称为Container format 的包装器,默认的容器格式是 libcontainer。 在未来,Docker 可能会通过集成技术来支持其他容器格式,如 BSD Jails 或者 Solaris Zones.

参考

  1. Docker 架构
  2. Docker灵魂探讨
  3. Docker学习 3.Docker入门篇(一)之docker基础
  4. Docker的使用场景
  5. 62张图教你干趴 Docker - 知乎 image

image

image

wmenjoy commented 4 years ago

Docker的安装

在线安装

离线宝安装

源代码安装

常见问题

1. centos7下修改docker工作目录

①添加并配置 /etc/docker/daemon.json 文件

②修改systemd管理的docker服务文件 /usr/lib/systemd/system/docker.service

参考

  1. centos7下修改docker工作目录
wmenjoy commented 4 years ago

如何使用Docker快速部署一个服务

  1. clone 你的代码
  2. 编译代码
  3. 编写dockerfile
  4. build 和测试你的镜像 假如你的服务名为bulletinoard,,版本为1.0
    docker image build -t bulletinboard:1.0 .

    可以根据当前生成的image启动你的容器

    # --publish -p 使用主机端口和docker进行固定映射,从而能够使外部服务访问docker 提供的功能
    # --detach 以后台进程运行docker
    #  --name 给docker container起一个别名,后续会用到他
    docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0

    可以通过访问端口,来判断服务是否进行成功,也可以

    docker exec -it   bulletinboard:1.0 /bin/bash 

    进入docker, 进行服务日志的查看 当容器已经测试正常,可恶意删除别名

    
    docker container rm --force bb
wmenjoy commented 4 years ago

Docker 镜像的保存

wmenjoy commented 4 years ago

开发基于Docker的应用程序

image

参考

  1. Develop with Docker
wmenjoy commented 4 years ago

Docker的网络

host模式

docker 不会使用独立的namespace 而是使用主机的ip和端口

container模式

指定新创建的容器和已经存在的一个容器共享一个Network Namespace

none 模式

在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

bridge 模式

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。 image image

参考

  1. Docker入门篇(二)之docker的单主机网络
  2. Docker 网络的四种模式
  3. Docker的4种网络模式
wmenjoy commented 4 years ago

管理Docker的数据

wmenjoy commented 4 years ago

运行Docker

wmenjoy commented 4 years ago

dockerfile 学习

什么是dockerfile

Docker可以从Dockerfile中读取指令来自动构建镜像。Dockerfile是一个文本文件,它包含了用户可以在命令调用以制作镜像的命令。用户可以使用docker build连续执行一些命令行指令来开启一个自动构建。

如何根据dockerfile定制镜像

dockerfile格式

构建镜像详解

指令详解

参考

  1. Docker Dockerfile
  2. Dockerfile reference
  3. Dockerfile参考
  4. docker使用centos7系统构建oraclejdk镜像
wmenjoy commented 4 years ago

常见问题

1. docker:pull access denied for xxxxx, repository does not exist or may require 'docker login'.

提示很明显,执行

docker login 
docker login -u xxx
docker login -u xxx  host:port #私有Docker Registries

2. 其他非root用户如何访问本主机的dockerd

sudo chmod 666 /var/run/docker.sock

3. 如何访问远程的docker

参考

  1. 解决docker:pull access denied for hello-wrold, repository does not exist or may require 'docker login'.
  2. 设置docker容许非root用户操作
  3. 远程访问dockerd
wmenjoy commented 4 years ago

Docker 命令学习

容器生命周期管理

run

start/stop/restart

kill

rm

pause/unpause

create

exec

容器操作

ps

inspect

top

attach

events

logs

wait

export

port

容器rootfs命令

commit

cp

diff

镜像仓库

login

pull

push

search

本地镜像管理

images

rmi

tag

build

history

功能

docker history : 查看指定镜像的创建历史。

语法

docker history [OPTIONS] IMAGE

OPTIONS说明

参考

  1. Docker 命令大全
wmenjoy commented 4 years ago

Docker 端口映射

参考

  1. Docker端口映射
  2. 给docker添加新的端口
wmenjoy commented 4 years ago

Docker数据卷

image

参考

  1. Docker学习笔记(6)——Docker Volume 2.Use volumes 3.详解挂载运行的docker容器中如何挂载文件系统
wmenjoy commented 4 years ago

Alpine

参考

  1. Alpine Manual
wmenjoy commented 4 years ago

Docker的compser

参考

  1. Docker入门篇(三)之docker-compose单机编排
wmenjoy commented 4 years ago

镜像安全

  1. 全面易用的镜像漏洞检测工具:Trivy
  2. Reverse Engineering a Docker Image — The Art of Machinery
  3. ContainerSolutions/ImageWolf: Fast Distribution of Docker Images on Clusters
  4. genuinetools/img: Standalone, daemon-less, unprivileged Dockerfile and OCI compatible container image builder.
wmenjoy commented 4 years ago

Docker 基础镜像选型

操作系统选型

  1. 基本主流的选型: Alpine, centos, debian
  2. docker公司对选型的影响,最早,docker需用debian作为基础镜像,后来改为alpine
  3. centos 相对于debian来说更加稳定, debain 但是有更快的更新,以及对新驱动的支持

选型:

2017年的时候,Red Hat公司给出的一个对比

Image Type Red Hat Enterprise Linux 7 Standard Image Red Hat Enterprise Linux Atomic Image Fedora Fedora Modular CentOS Debian Stable Ubuntu LTS Alpine
Architecture                
C Library glibc glibc glibc glibc glibc glibc glibc musl c
Packaging Format rpm rpm rpm rpm rpm dpkg dpkg apk
Core Utilities GNU Core Utils GNU Core Utils GNU Core Utils GNU Core Utils GNU Core Utils GNU Core Utils GNU Core Utils Busybox
Size Across Wire 73MB 30MB 75MB 33MB 72MB 45MB 47MB 2MB
Size on Disk 200MB 78MB 230MB 85MB 192MB 100MB 120MB 4MB
Life Cycle 10 years 6 months 6 months 6 months variable 2 years 5 years unknown
Compatibility Guarantees Based on Tier Generally within minor version Generally, within a major version Generally, within minor version Follows RHEL Generally within minor version Generally within minor version Unknown
Troubleshooting Tools Integrated with Technical Support Integrated with Technical Support Tools Container Tools Container Tools Container Standard Packages Standard Packages Standard Packages
Technical Support Commercial & Community Commercial & Community Community Community Community Community Commercial & Community Community
ISV Support Large Commercial l LargeCommercial Large Community Community Community Community Large Community Small Community
Security                
Updates Commercial Commercial Community Community Community Community Community Community
Tracking OVAL Data, CVE Database, Vulnerability API & Errata, Lab Tools OVAL Data, CVE Database, Vulnerability API & Errata, Lab Tools Errata Errata Announce List, Errata OVAL Data, CVE Database, & Errata OVAL Data, CVE Database, & Errata Limited Database
Proactive Security     Response Team Commercial & Community Commercial & Community Community Community None Community Commercial & Community None
Performance                
Automated Testing Commercial Commercial None None None None Found None Found None Found
Proactive Performance Engineering Team Commercial Commercial Community Community Community Community Community Community

选型建议

1、 系统镜像大小并不是决定因素, 因为加入引用中间件后,最终大小并没有太大区别 2、优先考虑稳定性 ,安全性,以及当前公司的基础架构带来的维护成本和兼容性成本

最新benchmark测试结果

Clear Linux 赢得了47% 的选票,而平分秋色的第二名分别是 Ubuntu 18.04、 Debian 9和 Arch Linux。 赢得10% 以下的是 Fedora 28,Alpine Linux 3.8,和 CentOS 7。 毫不奇怪,最慢的是 CentOS 7,因为默认情况下它的包比较老,但是已经证明 / 成熟了。

参考

  1. comparison-linux-container-images
  2. docker benchmark
wmenjoy commented 4 years ago

其他

测试

  1. cis-docker-benchmark

资料

  1. crunchtools
  2. alibaba Image-syncer
  3. alibaba Devops
  4. Docker入门一篇足以 5.SUSE & Rancher Community 6.docker资料
wmenjoy commented 4 years ago

Docker 日志收集

参考

  1. alibaba log-pilot
wmenjoy commented 4 years ago

Docker Registry

Docker 仓库应该具备哪些功能

  1. 提供docker 的仓库功能, 有很强的安全功能,做自己独有的private仓库
  2. 提供对docker hub 的代理和cache功能。最好能够private和dockerhub 的代理同时支持
  3. 很棒的ui管理功能
  4. 不同的docker 仓库之间的同步功能

Docker Registry 服务

  1. Docker Distribution:The Docker toolset to pack, ship, store, and deliver content
  2. [Harbor](): 只能做proxy 或者私有仓库,有很棒的ui
  3. [Docker registry]() 官方,只能做proxy 或者私有仓库
  4. Nexus3: nexus 从 3开始支持docker registy, 即能做cache, 又能做私有仓库,同时还提供了pull的分发的group功能,但是ui管理不直观

选型

  1. 对ui没要求可以直接使用 nexus3
  2. 对ui有要求的可以结合 nexus3 和 harbor

安装

nexus 安装

参考Using Nexus 3 as Your Repository – Part 3: Docker Images

docker 安装

docker volume create --name nexus-data
docker run -d --name nexus  --restart=always -p 5000:5000 -p 8081:8081 -v nexus-data:/nexus-data  sonatype/nexus3

harbor 安装

参考harbor手册

配置dockerd

  1. 给dockerd 增加 insecure-registries, linux 配置文件位于 /etc/docker/daemon.json
    {
    "insecure-registries": [
    "your-repo:8082",
    "your-repo:8083"
    ]
    }
  2. 给dockerd 增加 registry-mirrors, linux 配置文件位于 /etc/docker/daemon.json
    {
    "insecure-registries": [
    "your-repo:8082"
    ]
    }
  3. 使dockerd 配置生效
    
    ## 如果配置不正确,是不生效的,请检查日志,查看是否正确
    sudo kill -SIGHUP $(pidof dockerd)

如果使用systemctl

sudo systemctl reload docker



## 镜像同步
1. [同步外网到本地](https://github.com/AliyunContainerService/sync-repo)
2. [不同docker registy之间的同步](https://github.com/AliyunContainerService/image-syncer)
3. [Harbor doesn't support pull cache as a mirror registry](https://github.com/goharbor/harbor/issues/120)

## 参考
4. [看Nexus3能代替Harbor 哪些的工作](https://www.2[]cto.com/net/201804/739065.html)
5. [kubernetes搭建Harbor无坑及Harbor仓库同步](https://www.cnblogs.com/keep-live/p/11395973.html)
6. [使用harbor和nexus作为docker registry](https://blog.csdn.net/weixin_34088838/article/details/91378874)
7. [Using Nexus 3 as Your Repository – Part 3: Docker Images](https://blog.sonatype.com/using-nexus-3-as-your-repository-part-3-docker-images)
8. [nexus 3: docker registy](https://help.sonatype.com/repomanager3/formats/docker-registry)
9. [Docker搭建Nexus私有仓库](https://www.jianshu.com/p/ecc4d430f992)
10. [Docker Mirror](https://github.com/docker/docker.github.io/blob/master/registry/recipes/mirror.md)
11. [Docker之Harbor私服的搭建及使用](https://blog.csdn.net/weixin_42082634/article/details/82850298)
12. [k8s集成habor](https://www.jianshu.com/p/b95e38a3471e)
13. [harbor手册](https://goharbor.io/docs/)
14.  [Registry as a pull through cache](https://docs.docker.com/registry/recipes/mirror/)
15. [Docker 修改镜像源地址](https://blog.csdn.net/yhjay88/article/details/73790487)
wmenjoy commented 4 years ago

dockerd

configure and run docker

docker 日志

日志位置

wmenjoy commented 4 years ago

docker client

配置

本机其他用户访问docker

gpasswd -a $user docker
newgrp docker

参考

  1. docker client配置
wmenjoy commented 4 years ago

Docker的镜像制作

docker文件系统说明

Docker镜像由很多镜像层(Layers)组成(最多127层),镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts)等技术. 详情参考UnionFS, 但是总得来说,Dockerfile中的每条指令都会创建一个镜像层,继而会增加整体镜像的尺寸。这样很容易我们的docker镜像就变的相当庞大

镜像精简

精简Docker镜像尺寸的好处:

基本制作步骤:

  1. 选择制作镜像的出发点
    1. 直接使用源代码: 需解决跨机房docker仓库分发的问题,开发同学需要感知docker镜像的存在
    2. 对编译成功进行编译镜像: 用户无需感知dockerfile的存在,但是镜像制作和部署紧耦合。会造成docker restry的过大
  2. 选择合适的基础镜像
    1. 基础镜像建议使用centos和ubuntu。尽量考虑现有操作系统的版本。这样的好处就是对开发同学可以平滑建议而且稳定
    2. 基础镜像可以根据不同的环境做不同的定制,开发环境增加开发相关的工具,线上尽量减少不必要的工具
    3. 设置正确的时区。
  3. 规范目录结构
    1. 非root用户
    2. 日志,监控等
    3. 启动脚本约定。 程序Ready,健康检查约定
  4. 输出端口的规范
    1. 根据微服务思想,建议一个docker一个primary端口,可以有其他的辅助端口,primary端口用来唯一表示服务

参考

  1. spring docker
  2. Java程序制作Docker Image

参考

  1. 精简Docker镜像的五种通用方法
  2. Docker技术原理之Linux UnionFS
  3. unionfs(联合文件系统)笔记
  4. 设置时区
  5. "Distroless" Docker Images
  6. bitnami/minideb: A small image based on Debian designed for use in containers
  7. Comparing Modern-Day Container Image Builders: Jib, Buildpacks and Docker | SUSE & Rancher Community
wmenjoy commented 4 years ago

Docker 运维

  1. 批量删除指定镜像
    docker image list|grep helloworld|awk  '{print $1":"$2}'|sed 's/^/docker image rm /g;' |sh
  2. docker 编译go
    
    #拉取镜像
    docker run golang go get -v github.com/golang/example/hello/...
    # 编译go代码
    docker run -e GOPROXY=$proxyHost--rm -v"$PWD":/test -w /test golang go build .
    # 以指定版本的go编译
    docker run -e GOPROXY=$proxyHost--rm -v"$PWD":/test -w /test golang:v1.3.0 go build .
    # 一次性使用容器(--rm)并且执行
    docker run --rm golang sh -c \
    "go get github.com/golang/example/hello/... && exec hello"

直接安装到$PATH docker run -v /usr/local/bin:/go/bin \ golang get github.com/golang/example/hello/...

跨平台编译 mac 编译arm64

docker run -e GOOS=darwin -e GOARCH=amd64 -v /tmp/crosstest:/go/bin \ golang go get github.com/golang/example/hello/...


#### 问题汇总
1、如何不依赖于libc
要使用它,只需在go get选项加入-tags netgo -installsuffix netgo。
* tags netgo指示工具链使用netgo。
* installsuffix netgo确保结果库(任何)被一个不同的,非默认的目录所替代。如果做多重go get(或go build)调用,这将避免代码创建和用不用netgo之间的冲突。如果像目前我们讲到的这样,在容器里创建,是完全没有必要的。因为这个容器里面永远没有其他Go代码要编译。但它是个好主意,习惯它,或至少知道这个标识存在。
####
## 参考
1.[docker与go的巧妙结合](http://dockone.io/article/1712)
2.[go交叉编译](https://dave.cheney.net/2015/08/22/cross-compilation-with-go-1-5)
wmenjoy commented 4 years ago

Docker Machine

Docker Machine is a tool that lets you install Docker Engine on virtual hosts, and manage the hosts with docker-machine commands. You can use Machine to create Docker hosts on your local Mac or Windows box, on your company network, in your data center, or on cloud providers like Azure, AWS, or DigitalOcean. image

参考:

  1. Docker Machine Tools
wmenjoy commented 4 years ago

Docker 导出

# 列出
docker images
# 导出
docker save eb40dcf64078> /root/mydjango-save-1016.tar 
## 导入
docker load <  /root/mydjango-save-1016.tar 
docker tag eb40dcf64078 django:latest 

docker 镜像导入导出有两种方法:

一种是使用 save 和 load 命令

使用例子如下:

docker save ubuntu:load>/root/ubuntu.tar
docker load<ubuntu.tar

一种是使用 export 和 import 命令

使用例子如下:

docker export 98ca36> ubuntu.tar
cat ubuntu.tar | sudo docker import - ubuntu:import

需要注意两种方法不可混用。

参考

  1. Docker save 命令
wmenjoy commented 4 years ago

问题排查

docker 重启失败

  1. 记一次错误的docker问题排查过程
  2. kernel crash after "unregister_netdevice: waiting for lo to become free. Usage count = 3" #5618
  3. unregister_netdevice: waiting for eth0 to become free. Usage count = 1
  4. [](
wmenjoy commented 4 years ago

僵尸进程

引子

什么是僵尸进程

为什么会有僵尸进程

僵尸进程怎么处理

docker 如何处理僵尸Docker

docker 产生僵尸进程,对k8s有什么影响?

k8s 如何处理僵尸docker

参考

  1. Docker和孤儿进程、僵尸进程
  2. 构建容器的最贱实践
  3. Share Process Namespace between Containers in a Pod
  4. 一次 Docker 容器内大量僵尸进程排查分析
  5. Tini - A tiny but valid init for containers
  6. Docker - init, zombies - why does it matter?
  7. Docker and the PID 1 zombie reaping problem
  8. A minimal Ubuntu base image modified for Docker-friendliness
  9. Docker 和 PID 1 僵尸进程问题
  10. Linux服务器上top后发现僵尸进程的解决办法
  11. docker 假死 僵尸状态
  12. docker 容器 defunct 僵尸进程 - 灰信网(软件开发博客聚合)
  13. Docker和孤儿进程、僵尸进程-阿里云开发者社区
wmenjoy commented 4 years ago

时区修改

  1. 操作系统修改时区

     # 1、CentOS6、Ubuntu16
      cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
     # 2、CentOS7、RHEL7、Scientific Linux 7、Oracle Linux 7 最好的方法是使用timedatectl命令
     timedatectl list-timezones |grep Shanghai    #查找中国时区的完整名称
     Asia/Shanghai
     timedatectl set-timezone Asia/Shanghai    #其他时区以此类推
    
      # 3、直接手动创建软链接
      ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    如果不生效,还需要安装tzdate

  2. 对于docker镜像,可以通过三种防水扩展

    1. 通过启动时候环境变量,设置TZ=Asia/Shanghhai
    2. 如果能够制定docker的启动镜像,可以执行RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    3. 自定义docker镜像,替换原始镜像

        FROM xxxx
        ENV TZ=Asia/Shanghai
      
        RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
      
        RUN apt-get update
      
        RUN apt-get install tzdata
      
        RUN dpkg-reconfigure --frontend noninteractive tzdata
    4. 通过挂在本地服务来实现

       apiVersion: v1
       kind: Pod
       metadata:
       name: james-java
       namespace: james
       labels:
          name: james-java
       spec:
       containers:
         - name: james-java
           image: 192.168.0.252/szlaozi/java:v0.0.1
           volumeMounts:
              - name: tz-config
              mountPath: /etc/localtime
           ports:
             - containerPort: 7102
           volumes:
             - name: tz-config
           hostPath:
              path: /etc/localtime
      

参考

  1. Docker时间不一致,时区设置
  2. How to Change Timezone on Ubuntu 18.04 & 16.04 LTS
  3. dockerfile解决docker ubuntu16.04 时区问题
  4. k8s修改时区的问题
wmenjoy commented 4 years ago

Docker Registy 清理

清理策略

1、 根据创建时间来清理 2、根据是否使用的时间 3、每一个docker image 保留固定的版本(不会误器清理)

Nexus3 清理

  1. 安装nexus-cli
    wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli
  2. 配置
    [root@fs02-192-168-126-16 ~]# ./nexus-cli configure
    Enter Nexus Host: http://192.168.xxx.xxx:xxx
    Enter Nexus Repository Name: docker-private
    Enter Nexus Username: xxxx
    Enter Nexus Password: xxxx
  3. 清理
    keepDate=3
    ./nexus-cli image ls|grep -v Total|sed "s#^#\./nexus-cli image delete -keep $keepDate -name #"|sh
  4. 配置压缩任务 创建一个 Compact Blob Store Task image

注: 前三步,可以写成一个定时任务

参考

  1. 基于nexus3.X的Docker image清理方案
  2. google/go-containerregistry: Go library and CLIs for working with container registries
wmenjoy commented 3 years ago

Nexus3 db修复

问题

nexus3 磁盘空间满后 docker 启动报"cannot open local storage '/nexus-data/db/config' with mode=rw"

java.lang.NullPointerException: null
        at com.orientechnologies.orient.core.storage.impl.local.paginated.wal.ODiskWriteAheadLog.cutTill(ODiskWriteAheadLog.java:919)
        at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.makeFullCheckpoint(OAbstractPaginatedStorage.java:3706)
        at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.doClose(OAbstractPaginatedStorage.java:4413)
        at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.close(OAbstractPaginatedStorage.java:581)
        at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.open(OAbstractPaginatedStorage.java:316)
        at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.open(ODatabaseDocumentTx.java:259)
        at org.sonatype.nexus.orient.DatabaseManagerSupport.connect(DatabaseManagerSupport.java:178)
        at org.sonatype.nexus.orient.DatabaseManagerSupport.createInstance(DatabaseManagerSupport.java:312)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
        at org.sonatype.nexus.orient.DatabaseManagerSupport.instance(DatabaseManagerSupport.java:289)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
        at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
2020-11-19 01:57:31,172+0000 ERROR [ForkJoinPool.commonPool-worker-1] *SYSTEM com.orientechnologies.orient.core.storage.impl.local.paginated.OLocalPaginatedStorage - Exception `47820D6D` in storage `plocal:/nexus-data/db/config`: 2.2.36 (build d3beb772c02098ceaea89779a7afd4b7305d3788, branch 2.2.x)
com.orientechnologies.orient.core.exception.OStorageException: Cannot open local storage '/nexus-data/db/config' with mode=rw^M
        DB name="config"
        at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.open(OAbstractPaginatedStorage.java:323)
        at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.open(ODatabaseDocumentTx.java:259)
        at org.sonatype.nexus.orient.DatabaseManagerSupport.connect(DatabaseManagerSupport.java:178)
        at org.sonatype.nexus.orient.DatabaseManagerSupport.createInstance(DatabaseManagerSupport.java:312)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
        at org.sonatype.nexus.orient.DatabaseManagerSupport.instance(DatabaseManagerSupport.java:289)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
        at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.NullPointerException: null
        at com.orientechnologies.orient.core.storage.impl.local.paginated.wal.ODiskWriteAheadLog.cutTill(ODiskWriteAheadLog.java:919)
        at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.makeFullCheckpoint(OAbstractPaginatedStorage.java:3706)
        at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.recoverIfNeeded(OAbstractPaginatedStorage.java:3937)
        at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.open(OAbstractPaginatedStorage.java:288)
        ... 14 common frames omitted

问题分析

刚开始以为整的是磁盘满导致的,清理重启,发现不行,后搜寻发现,是磁盘满了导致索引损坏导致的。开始着手修复db

修复

  1. 清空之前的文件(目录、/home/jenkins/nexus_data)
  2. 执行修复工具
    docker run --rm -v /home/jenkins/nexus-data:/nexus-data -it sonatype/nexus3:3.29.2 bash
    java -jar ./lib/support/nexus-orient-console.jar
    CONNECT plocal:/nexus-data/db/component admin admin 
    REBUILD INDEX *
    REPAIR DATABASE --fix-graph
    REPAIR DATABASE --fix-links
    REPAIR DATABASE --fix-ridbags
    REPAIR DATABASE --fix-bonsai
    DISCONNECT
    EXIT
  3. 授权 默认不需要授权,如果文件权限错乱,需要调整,比如赋值db文件为777
  4. 重启
    docker-compose stop 
    docker-compose up -d 

参考

  1. nexus3 磁盘空间满后 docker 启动报"cannot open local storage '/nexus-data/db/config' with mode=rw" - 特拉仔的个人空间 - OSCHINA - 中文开源技术交流社区
  2. Nexus日常运维问题记录及解决(持续更新)_cxs13942222cxs的博客-CSDN博客
  3. Unable to start Nexus repository on CentOS 7 running on AWS
wmenjoy commented 3 years ago

Nexus_Cli

文档

  1. Thiago Figueiró / docker-nexus3-cli · GitLab
  2. nexus3-cli · PyPI
  3. nexus3-casc-cli/Dockerfile at master · vjda/nexus3-casc-cli
  4. Thiago Figueiró / Nexus 3 CLI · GitLab
wmenjoy commented 3 years ago

镜像的连线制作

操作系统相关资源

centos

  1. CentOS Mirror

镜像编译工具

  1. Cutting Build Time In Half with Docker’s Buildx Kubernetes Driver
wmenjoy commented 3 years ago

最佳实践

  1. Top 20 Dockerfile best practices for security | Sysdig
  2. The worst so-called “best practice” for Docker
wmenjoy commented 3 years ago

Docker的替代品

  1. Beyond Docker: A Look at Alternatives to Container Management | SUSE & Rancher Community
  2. Docker, Kaniko, Buildah. Different ways to build container… | by Luc Juggery | ITNEXT
wmenjoy commented 3 years ago

镜像简化

  1. docker-slim/docker-slim: DockerSlim (docker-slim): Don't change anything in your Docker container image and minify it by up to 30x (and for compiled languages even more) making it secure too! (free and open source)
wmenjoy commented 3 years ago

镜像与集群

  1. ContainerSolutions/ImageWolf: Fast Distribution of Docker Images on Clusters