第三章 Kubernetes之Docker必知必会

3-1 为什么需要Docker?k8s与Docker的关系?

3.1.1 Docker VS 虚拟机

image

官方解释:Package Software into Standardized Units for Development, Shipment and Deployment.

3.1.2 为什么需要Docker

image

3.1.3 Docker的系统组成

image

3.2 Docker namespace 隔离

3.2.1 Docker通过 Namespace 实现进程隔离

通过clone()在创建新进程的同时创建namespace。

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);

3.2.2 Namespace 隔离类型

  • UTS namespace

UTS(UNIX Time-sharing System)namespace提供了主机名与域名的隔离,这样每个docke容器就可以拥有独立的主机名和域名了,在网络.上可以被视为- -个独立的节点,而非宿主机.上的一个进程。

  • IPC namespace

进程间通信(nter-Pracess Communication,IPC)涉 及的IPC资源包括常见的信号量、消息队列和共享内存。在同一个IPC namespace下的进程彼此可见,不同IPC namespace下的进程则互相不可见。

  • PID namespace

PID namespace隔离非常实用,它对进程PID重新标号,即两个不同namespace下的进程可以有相同的PID。每个PID namespace都有自己的计数程序。内核为所有的PID namespace维护了一个树状结构,最顶层的是系统初始时创建的,被称为root namespace,它创建的心PID namespace被称为

child namespace(树的子节点)。

通过这种方式,不同的PIDnamespace会形成一个层级体系。所属的父节点可以看到子节点中的进程,并可以通过信号等方式对子节点中的进程产生影响。反过来,子节点却不能看到父节点PID。

3.2.3 实践:通过unshare()在原先进程上进行namespace隔离

最后要说明的系统调用是unshare(),它与clone()很像,不同的是,unshare()运行 在原先的进程上,不需要启动一个新进程。

$ sudo unshare --fork --pid --mount-proc bash
ps aux
image

3.2.4 Docker 的实现原理:Docker 如何通过 Namespace 聚合进程,实现进程间隔离。

docker run -d -p 8083:8083  nginx
ps -ef|grep docker 
ls -al /proc/[PID]/ns

3.3 Docker 的资源配额 CGroups

  1. Docker 使用CGroups实现资源的配额管理。
  • Cgroups (control groups)

  • 2007年由谷歌工程师研发

  • 2008年并入 Linux Kernel 2.6.24

  • C语言实现

  1. CGroups 限制进程的 CPU使用时间。 Docker中的 CPU,内存,网络的限制均通过 cgroups 实现
    image
  2. 实践 在宿主机上创建一个让 CPU 飙升到100%的进程: (此操作有风险,慎用)

while : ; do : ; done &

记录下 PID = 27358

cd /sys/fs/cgroup/cpu
mkdir cgroups_test
echo 20000 > /sys/fs/cgroup/cpu/cgroups_test/cpu.cfs_quota_us
echo 27358 > /sys/fs/cgroup/cpu/cgroups_test/tasks

20000代表2万微秒,也就是20%的CPU配额

清理该进程

kill -9 27358

  1. docker 里如何加参数进行资源配额 docker run -it --cpus=".5" nginx /bin/sh,其中的.5表示0.5即50% 进入容器查看是否有对应的 cgroup 设置
cd /sys/fs/cgroup/cpu
cat cpu.cfs_quota_us

配置显示 500000即50%的CPU配额,证明--cpus=".5"的参数已经生效

image

3-4 Docker镜像

3.4.1 Docker镜像的由来

  • 虽然 Docker 实现了运行环境的隔离,但如何将一个运行的容器快速进行启动,复制,迁移到其他的主机上运行?
  • 如果容器无法快速进行复制,迁移,那么和以 VMware 为代表的虚拟化技术相比并没有太多优势

3.4.2 Docker 镜像的特性

  • Docker 镜像具备了应用运行所需要的所有依赖

  • 一次构建,处处运行

  • Docker 镜像的存储是基于 checksum 的去重存储,大大降低存储空间

3.4.3 Docker 镜像常用命令

  • 下载 Docker 镜像 docker pull nginx

  • 为镜像打版本号 docker tag

  • 上传 Docker 镜像 docker push


3-5 编写博客 应用的 Dockerfile

FROM openjdk:8-jdk-alpine
MAINTAINER QingFeng
VOLUME /tmp
ADD target/kubeblog.jar /kubeblog.jar
EXPOSE 5000
ENTRYPOINT ["java","-jar","/kubeblog.jar"]

3-6 为博客应用构建 Docker 镜像

  • 增加 mysql57 hosts 记录,作为数据库的域名
vi /etc/hosts
127.0.0.1    mysql57
  • 下载代码,构建 mvn package
git clone <git url>
cd /root/kubeblog/Final
mvn package
  • 构建 Docker 镜像
docker build -t kubeblog .
  • 查看 docker 镜像
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kubeblog            1.0                 f9bb30633155        4 minutes ago       148MB
  • 将镜像推到自己的dockerhub
[root@swarm-manager Final]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: insaneloafer
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@swarm-manager Final]#
[root@swarm-manager Final]# docker tag kubeblog:1.0 insaneloafer/kubeblog:1.0
[root@swarm-manager Final]#
[root@swarm-manager Final]# docker push insaneloafer/kubeblog:1.0
The push refers to repository [docker.io/insaneloafer/kubeblog]
b0e8272da662: Pushed
138726990cf7: Mounted from library/openjdk
5b40c5fb5220: Mounted from library/openjdk
717b092b8c86: Mounted from library/openjdk
1.0: digest: sha256:3023f7b6ae04313c72504dd608f6b8bc1e5268aaa97d5529ba7d7cd360dae243 size: 1159
image

3-7 Docker run --link运行博客应用

  • docker run --link运行博客应用

--link表示运行容器时与哪个容器进行网络连接。

docker run --name kubeblog -d -p 5000:5000  --link mysql57 kubeblog:1.0

-进入容器查看环境变量 evn

docker exec -it kubeblog sh
env |grep MYSQL
MYSQL57_ENV_MYSQL_MAJOR=5.7
MYSQL57_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL57_ENV_MYSQL_ROOT_PASSWORD=password
MYSQL57_ENV_GOSU_VERSION=1.12
MYSQL57_PORT_3306_TCP_PORT=3306
MYSQL57_PORT_3306_TCP_PROTO=tcp
MYSQL57_PORT_33060_TCP_ADDR=172.17.0.2
MYSQL57_PORT=tcp://172.17.0.2:3306
MYSQL57_PORT_3306_TCP=tcp://172.17.0.2:3306
MYSQL57_PORT_33060_TCP_PORT=33060
MYSQL57_ENV_MYSQL_VERSION=5.7.30-1debian10
MYSQL57_PORT_33060_TCP_PROTO=tcp
MYSQL57_NAME=/kubeblog/mysql57
MYSQL57_PORT_33060_TCP=tcp://172.17.0.2:33060
  • 更新/etc/hosts文件
cat /etc/hosts

127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  mysql57 401b104b930a
172.17.0.3  2028007380c4
  • 在宿主机访问 centos 虚拟机上的 kubeblog 应用,需要关闭虚拟机防火墙
systemctl stop firewalld
192.168.99.101:5000
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容