docker build alpine dns error
使用 alpine 构建 Ddockerfile ,导致 docker 打包失败,错误如下:
1 | fetch https://mirrors.aliyun.com/alpine/v3.13/main/x86_64/APKINDEX.tar.gz |
使用 alpine 构建 Ddockerfile ,导致 docker 打包失败,错误如下:
1 | fetch https://mirrors.aliyun.com/alpine/v3.13/main/x86_64/APKINDEX.tar.gz |
使用 marp 制作的用于内部分享的 docker && k8s 的文档。
marp: true
theme: uncover
paginate: false
header: ‘NXDev‘
是新技术吗?
解决了什么问题 ?
linux 的Namespaces + Cgroup
配合一种被称为 Union file system 的文件系统
最后打成一个包。
Docs : https://docs.docker.com
https://docs.docker.com/get-docker/
Linux
1 | curl -fsSL https://get.docker.com -o get-docker.sh |
先看看 怎么用的
gin-hello
mysql
镜像 (Image)
容器 (Container)
仓库 (Repository)
相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
1 | $ docker images |
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
1 | $ docker ps |
仓库可看成一个代码控制中心,用来保存镜像。
Namespaces
Cgroup
Union file systems
Container format
linux 内核做资源隔离的两个概念。
Namespaces
资源隔离
Cgroup:控制程序对资源的占用。
对进程组使用的资源总额进行限制;
通过分配CPU时间片数量/磁盘IO/带宽大小,实际上就是相当于控制子进程运行的优先级。
统计系统资源使用量,比如CPU使用时间,内存使用量等
进程控制,恢复执行进程
boots:
boot loader + kernel ,用户不可修改 (共享主机的内核)
root file system : 包括典型的 linux 目录结构:/dev
/proc
/bin
/etc
/lib
/usr
/tmp
等配置文件,二进制文件,库文件
AUFS (Union FS) : 支持将不同的目录挂载到虚拟目录下。
1 | func main() { |
1 | go build . -o main |
1 | FROM scratch |
1 | docker build -t ginhello . |
1 | 语法 |
1 | docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql |
运行 docker 的命令又长 参数又多,怎么办?
还是来用一个文件来描述刚才我们的 run 命令
1 | # docker-compose.yml |
1 | version: '3' |
接下来命令变得简单了
gin-hello
1 | docker-compose build gin-hello |
mysql
1 | docker-compose run mysql |
K8s 是什么 ?
容器的调度和管理。
minikube
1 | # 安装 kubectl |
example :gin-hello
整体
master
Node
kubernetes 它都管理了什么
一切都是资源,根据需要去申请。网络
,存储
,cpu
,内存
有状态服务
,无状态服务
,任务
,定时任务
,配置
……
所有的资源都靠一行命令:
1 | kubectl apply -f <filename.yaml> |
应用控制
https://kubernetes.io/zh/docs/concepts/services-networking/service/#loadbalancer
service 的四种网络
1 | internet |
ingress 被称为server 的 server。
被用来作为网络的七层代理
其实它就是做 Nginx 的事情
在使用七层代理时,我们需要对代理做一些配置
比如 nginx 的 upstream proxy_pass
Ingress Controllers 通过 watch ingress,将它转化为数据平面的配置。
1 | internet |
Kong = Openresty + config
Openresty = Nginx + lua
Sysctl 用于配置运行时的内核参数,正常情况下修改 /etc/sysctl.conf
. 然后执行 sysctl -p
就能够设置成功。
当使用 Docker 启动服务时,使用 sysctl -p 来配置 docker 的参数时会出现问题。比如
1 | sysctl: cannot stat /proc/sys/net/core/rmem_max: No such file or directory |
Docker 镜像是由 Layers 组成,Dockerfile 中每一条指令都会创建一个层,层数最多 127 层。
选择更小的基础镜像
通常我们使用的镜像有 Ubuntu 、CentOs、 debian 、Alpine 。其中推荐使用 Alpine ,Alpine 的基础镜像只有 4.4M 左右,
1.1 scratch 镜像
scratch 镜像是空镜像。如果要运行一个包含所有依赖的二进制文件,可以直接使用 scratch 作为基础镜像。
1.2 busybox 镜像
scratch是个空镜像,如果希望镜像里可以包含一些常用的Linux工具,busybox镜像是个不错选择,镜像本身只有1.16M,非常便于构建小镜像。
在使用 docker 编译 openwrt 遇到了两个坑,问题不复杂,却折腾了一天。
环境如下
Dockerfile 定义编译 openwrt 的编译环境
docker-compose.yml 定义变化 openwrt 的运行配置,主要是将代码目录 data 使用 -v 映射到容器中
/data 代码存放目录
在使用服务时使用同一台服务器的 mysql 的 docker 服务。想到 external-links 这个配置。
按照文档的配置添加了如下配置
1 | external_links: |
但是配置无论如何都不成功。
https://docs.docker.com/compose/compose-file/#external_links
官方文档相关的描述,
If you’re using the version 2 or above file format, the externally-created containers must be connected to at least one of the same networks as the service that is linking to them.
也就是说想要使用 external_links 是需要两个服务在同一个网络段,这里只提了一句,对第一次写配置文件的开发者非常的不友好。
安装minikube
1 | curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && \ |
阿里修改版的
1 | curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.30.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/ |
从11月开始到现在,项目开始从 php 转换到 nodejs + 后端服务,相应的部署环境转换到docker。
在使用纯php环境,上线比较简单,主要是代码拉取,拷贝和软链切换。 运行环境使用docker后相应的需要引入一个打包的过程,所以前面所依靠的上线部署系统无法满足当前的需求。
目前来说,Jenkins 作为自动化的流水线工具,几乎是不二的选择。
将 Jenkins 作为流水线工具,在打包阶段依赖 docker-compose。 上线阶段依赖 ansible 。
Harbor是
VMware公司开源的企业级
Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的
Docker registry`服务。
它以Docker
公司开源的registry
为基础,提供了管理UI
,基于角色的访问控制(Role Based AccessControl
),AD/LDAP
集成、以及审计日志(Auditlogging
) 等企业用户需求的功能,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution
。
1
2
3
4
5
6
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose version 1.22.0, build f46880fe
下载Harbour版本的二进制文件 https://github.com/vmware/harbor/releases
1 | wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.0.tgz |
官方的链接正常无法下载,感谢戴亚同学帮忙。
下载解压后进入解压的文件夹
解压后目录下生成 harbor.conf 文件,根据需要修改配置文件。
1 | ./install.sh |
1 | docker ps -a |
根据需要修改docker-compose.yml 文件的端口
1 | proxy: |
1 | sudo docker run -d -p 5000:5000 --restart=always --name registry \ |
运行后会自动到docker hub 上拉取
1 | sudo docker images |