Jesse's home


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

docker学习笔记---docker网络之host,Container,None网络

发表于 2020-06-29 | 分类于 docker |

docker官网学习-7.docker网络之host,Container,None网络

host网络介绍

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。


创建host网络

1
2
3
4
5
6
7
8
9
10
11
docker run -tid --net=host --name busybox busybox1

#host网络下的容器没有虚拟网卡,而是和宿主机共享网络
[root@localhost ~]$docker exec -it busybox1 ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:89:26:D1:C9
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1072032 errors:0 dropped:0 overruns:0 frame:0
TX packets:1997027 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:61915874 (59.0 MiB) TX bytes:1934238839 (1.8 GiB)

注:host网络只能工作在Linux主机上.

如果容器没有暴露任何端口,那host网络没有任何效果

阅读全文 »

docker学习笔记---Dockerfile

发表于 2020-06-29 | 分类于 docker |

Dockerfile


介绍

到目前位置我们接触的镜像都是从docker官方hub.docker.com所下载的官方镜像.官方镜像一般分为两类:

  • OS镜像
  • 应用镜像.(例如nginx.php-fpm,mysql)

但是无论是哪种镜像,官方的标准镜像(或者是通用镜像)都只包含最基础的系统或者应用环境,如果需要使用适合个人或者企业场景的自定义镜像,那么就只能自己制作镜像.

制作镜像的方法:

  • 以容器为基础,制作镜像

这有点类似于快照,用一个基础镜像运行容器,然后在容器的交互式界面,安装或者配置之定义环境,然后将该容器制作成一个镜像.但是这种方法有很大的缺陷.

例如,如果有多个环境的容器,那么可能容器的应用配置文件不一样,此时可能需要将多个容器制作成多个镜像.例如dev环境容器,beta环境容器,生产环境容器等.而且容器一旦修改以后,可能又需要重新commit制作成镜像,这样一来,镜像的体积将无限大.

  • Dockerfile制作镜像

Dockerfile可以用来编译一个docker镜像.Dockerfile是一个包含一系列指令的文本文档,非常类似于一个shell脚本,.docker调用dockerfile中每行的命令,聚集成最终的镜像.使用docker build命令,用户可以依据dockerfile和上下文编译一个镜像.


Dockerfile语法格式

dockerfile的格式非常简单.只有2种:

  • #开头的语句表示注释
  • INSTRUCTIONS arguments 指令 参数

instructions指令大小写非敏感,但是约定俗成的写法是指令全部用大写字母,dockerfile按自上而下的顺序,一次执行每一个指令.

Dockerfile文件中第一个指令必须是FROM指令,用来表示当前的docker镜像是哪个基础镜像.在dockerfile中,必须要一个基础镜像.(有点类似编程中,所有的类必须要有一个基类)


Dockerfile上下文

docker build编译镜像时,默认在当前目录下寻找文件名为Dockerfile的文件.如果找不到,则会报错,所以Dockerfile(第一个字母必须大写)的文件名一般是固定的.

docker会将当前目录下的Dockerfile和所有文件打包添加发送到docker daemon服务端.所以一般情况下创建一个空目录编辑Dockerfile文件.然后将需要放到镜像中的文件放进和dockerfile同一目录下,或者子目录下.当然,也可以像Git那样,在当前目录下编辑一个名为.dockeringnore的隐藏文件,列出排除文件或者目录.这样dockerfile在制作镜像时,不会将该文件或者目录提交到docker服务端

为什么需要一个空目录防止Dockerfile文件呢?

因为docker在编译镜像之前,就会将该目录下的所有文件打包发送到docker daemon服务端中,并且加载到镜像.所以最终产生的镜像体积会非常庞大.(无论你是否使用了目录下的文件或者文件夹).试想一下如果在/目录下打包Dockerfile镜像,会是什么后果

由于上下文的关系,在Dockerfile中添加文件到docker镜像时.不要使用绝对路径.例如/home/work/a.txt.这是因为docker deamon只能识别到当前上下文环境,无法识别到其他目录.但是可以使用当前上下文的相对路径.


Dockerfile构建过程

使用docker build命令可以将当前目录下的Dockerfile文件编译成一个镜像,docker daemon会隐含式的用Dockerfile中FROM指令指定的镜像启动一个容器,并且从上到下依次在该容器中执行Dockerfile文件中的指令.最终将改容器打包成一个新的镜像.

其本质上和我们启动一个容器,执行命令,然后保存成一个镜像没有多大区别,只不过是docker的build命令帮助我们完成以上一系列动作.所以需要注意的是,我们在Dockerfile中编辑的指令和参数,其作用对象和执行环境并非是宿主机,而是基础镜像..如果基础镜像不支持Dockerfile文件中的指令,那么build执行过程中很可能会报错


Dockerfile变量

Dockerfile支持变量替换,其变量赋值和调用方法和shell脚本中非常类似.

  • 变量赋值: ENV version 3.0 #设一个名为version的变量,其值为3.0

  • 变量调用: \$version 或者 \${version}

当然,还支持${variable: -word}和${variable: +word}等更多的变量字符串截取.这里不做说明

变量可以方便我们构建不同版本的应用.在编译多个版本的同一应用镜像时,我们不需要去修改Dockerfile的指令内容,只需要修改变量名即可


dockerfile打包镜像命令

命令docker build用来编译制作镜像.其支持许多参数,但是常用的格式如下:

1
docker build -t image:tag .

使用-t参数指定新的镜像和标签, .小数点表示当前目录.docker会在当前目录下搜索Dockerfile文件,且将当前目录的所有文件和子目录打包到docker daemon


使用dockerfile需要注意一些事项

1.上下文

docker build编译镜像时,会将当前目录下的Dockerfile和所有文件打包添加发送到docker daemon服务端.所以一般情况下创建一个空目录编辑dockerfile文件.然后将需要copy和add的文件放进和dockerfile同一目录下.

dockerfile中的copy以及add命令,添加文件到docker镜像中时.不要使用绝对路径.例如/home/work/a.txt..docker deamon只能识别到当前上下文环境,无法识别到其他目录.但是可以使用当前上下文的相对路径.

2.分层

dockerfile编译镜像时,每条指令都是一个镜像层.除了From指令外,每一行指令都是基于上一行生成的临时镜像运行一个容器.执行一条指令就类似于docker commit命令生成一个新的镜像.所以两条指令之间互不关联.

阅读全文 »

docker学习笔记---Docker存储驱动篇

发表于 2020-06-29 | 分类于 docker |

docker笔记——存储驱动篇

介绍

通过前一篇的镜像笔记,我们知道docker的镜像是只读的,而且通过同一个镜像启动的docker容器,他们共享同一份底层镜像文件.

这里主要说一说.这些分层的多个只读Image镜像是如何在磁盘中存储的.


docker存储驱动

docker提供了多种存储驱动来实现不同的方式存储镜像,下面是常用的几种存储驱动:

  • AUFS
  • OverlayFS
  • Devicemapper
  • Btrfs
  • ZFS

下面说一说AUFS、OberlayFS及Devicemapper,更多的存储驱动说明可参考:http://dockone.io/article/1513

阅读全文 »

docker学习笔记---docker使用阿里云私有仓库

发表于 2020-06-29 | 分类于 docker |

docker使用阿里云私有仓库

注册阿里云镜像服务:

以下是我的阿里云镜像仓库链接:
https://cr.console.aliyun.com/cn-hangzhou/repositories

一.使用阿里云镜像加速器
https://cr.console.aliyun.com/cn-hangzhou/mirrors

镜像加速地址:

1
https://0w5ygvsg.mirror.aliyuncs.com

如果是Centos系统,可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://0w5ygvsg.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

阅读全文 »

docker安装最新版Kong(v1.0)+konga

发表于 2020-06-26 | 分类于 Linux-Web , kong |

docker安装最新版Kong(v1.0)+konga

参考以下文档:

Kong installation

konga github


docker安装kong+postgresql

1.创建一个docker网络用于docker,postgresql和konga容器间通信

1
docker network create kong-net

2.启动posgtresql容器

1
2
3
4
5
6
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
postgres:9.6

3.初始化postgresql数据库

1
2
3
4
5
6
$ docker run --rm \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations bootstrap

注意两点:

1.最好是先删除本地的kong镜像.因为本地的Kong:lastest镜像不一定就是最新版

2.如果本地的kong:latest镜像地域0.15版本,则不支持bootstrap命令.可以将bootstrap命令替换成up

阅读全文 »

kong+casssandra集群环境部署

发表于 2020-06-26 | 分类于 Linux-Web , kong |

kong+casssandra集群环境部署

kong简介

Kong是Mashape开源的一款API网关,起初是用来管理 Mashape 公司15000个微服务的,后来在2015年开源,现在已经在很多创业公司、大型企业和政府机构中广泛使用。基于nginx,Lua和Cassandra或PostgreSQL,支持分布式操作,有很强的可移植性和可扩展性。可以在任何一种基础设施上运行,作为应用和API之间的中间层,加上众多功能强大的插件,可以实现认证授权、访问控制等功能。并且提供易于使用的RESTful API来操作和配置系统。

有关kong的详细介绍请参考官网.

–

cassandra简介

Cassandra 是一个来自 Apache 的分布式数据库,具有高度可扩展性,可用于管理大量的结构化数据。它提供了高可用性,没有单点故障。kong支持PostgreSQL或者Cassandra两种数据库.这里我们选择了cassandra.

有关cassandra的详细介绍和使用方法.请参考官网

阅读全文 »

kong+postgresql+konga集群环境部署

发表于 2020-06-26 | 分类于 Linux-Web , kong |

kong+postgresql+konga集群环境部署

kong简介

Kong是Mashape开源的一款API网关,起初是用来管理 Mashape 公司15000个微服务的,后来在2015年开源,现在已经在很多创业公司、大型企业和政府机构中广泛使用。基于nginx,Lua和Cassandra或PostgreSQL,支持分布式操作,有很强的可移植性和可扩展性。可以在任何一种基础设施上运行,作为应用和API之间的中间层,加上众多功能强大的插件,可以实现认证授权、访问控制等功能。并且提供易于使用的RESTful API来操作和配置系统。

有关kong的详细介绍请参考官网.

–

postgreSQL简介

PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。

–

集群架构

  • kong cluster

kong 集群并不意味着客户端请求将会负载均衡到kong集群中的每个节点上,kong集群并不是开箱即用,仍然需要在kong集群多节点上层搭建负载均衡,以便分发请求。 一个kong集群只是意味着集群内的节点,都共享同样的配置。

有关Kong cluster集群的详细介绍请参考官网:Kong cluser document

为了提高冗余性和健壮性.我们对kong的每个环节都进行了冗余设计.一个基本的kong集群架构大概如下图所示:

阅读全文 »

harbor私有仓库部署

发表于 2020-06-26 | 分类于 docker |

harbor私有仓库部署

介绍

harbor是docker的私有仓库,可以部署在局域网服务器上,用来管理docker镜像.虽然docker官方也提供公共镜像仓库,但是由于是境外网站,拉取镜像速度非常慢,而且有被墙的可能.部署私有仓库非常有必要

harbor是vmware公司开源的企业级的docker registry管理项目.

处于数据脱敏需要,以下内容中隐藏了真实域名.而使用hub.xxxxxx.com替代


社区

harbor github: goharbor/harbor

官网文档介绍: harbor doc

在部署中遇到的各种坑,都可以通过查阅文档,或者搜索github的issue解决


框架

harbor是docker-compose部署的.包括一系列组件:nginx.core,log,register等等.

但是由于本机已经存在一个Nginx镜像.所以用Nginx代理到harbor的Nginx.如果是独立的服务器部署Harbor的话,则不会存在这个问题,可以直接跳过这一章节.

nginx代理框架大概是:

nginx—->harbor-nginx—–>habor

由于docker提交镜像需要Https协议,所以:

nginx—301跳转到nginx https—–>harbor-nginx http—-> habor

但是这样的部署方式,有一个问题:

私有仓库可以正常login但是push镜像的时候,又提示未验证.

该问题尝试过很多解决方案,但是均无法解决

阅读全文 »

k8s挂载NFS网络磁盘

发表于 2020-06-26 | 分类于 kubernetes |

k8s挂载NFS网络磁盘

按照这本书NFS做持久化存储的例子,发现了一个坑.,启动pod失败,报如下错误

1
chown: changing ownership of '/data/db': Operation not permitted

网上也有人遇到这个问题.可以参考这篇文档: Kubernetes 集群挂载NFS Volume

阅读全文 »

kubernetes API服务器权限(ServiceAccount && RBAC)

发表于 2020-06-26 | 分类于 kubernetes |

kubernetes API服务器权限(ServiceAccount && RBAC)

ServiceAccount介绍

​ 每个Pod都与一个ServiceAccount相关联,它代表了运行在pod中应用程序的身份证明.每个pod在启动的时候kubernetes会自动挂载ServiceAccount的TOKEN到pod容器的/var/run/secretes/kubernetes.io/serviceaccount/token文件.pod内的应用程序通过这个token连接API服务器.API服务器的身份验证插件会对ServiceAccount进行身份认证.ServiceAccount所拥有的权限决定了pod内的应用程序所尝试执行的操作是否被允许

​ ServiceAccount只不过是一种运行在pod中的应用程序和API服务器身份认证的一种方式.应用程序通过在请求中传递serviceaccount的token和API服务器通信


了解ServiceAccount资源

​ ServiceAccount和pod,Secret,ConfigMap等一样,本身也是一种资源.他们作用在单独的命名空间.kubernetes为每个命名空间自动创建一个默认的ServiceAccount(名字是default),可以像查看其它资源一样使用kubectl get sa来查看ServiceAccount列表

阅读全文 »
1…567…21
Jesse

Jesse

求知若饥,虚心若愚.

209 日志
44 分类
41 标签
RSS
© Tue Jun 12 2018 08:00:00 GMT+0800 (GMT+08:00) — 2021 Jesse