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

3.1.1 Docker VS 虚拟机

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

3.1.2 为什么需要Docker

image.png

3.1.3 Docker的系统组成

image.png


3.2 Docker namespace 隔离

3.2.1 Docker通过 Namespace 实现进程隔离

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

  1. 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()运行 在原先的进程上,不需要启动一个新进程。

  1. $ sudo unshare --fork --pid --mount-proc bash
  2. ps aux

image.png

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

  1. docker run -d -p 8083:8083 nginx
  2. ps -ef|grep docker
  3. 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.png
  2. 实践
    在宿主机上创建一个让 CPU 飙升到100%的进程: (此操作有风险,慎用)
  1. while : ; do : ; done &

记录下 PID = 27358

  1. cd /sys/fs/cgroup/cpu
  2. mkdir cgroups_test
  3. echo 20000 > /sys/fs/cgroup/cpu/cgroups_test/cpu.cfs_quota_us
  4. echo 27358 > /sys/fs/cgroup/cpu/cgroups_test/tasks

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

清理该进程

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

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


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

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

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

  • 增加 mysql57 hosts 记录,作为数据库的域名
  1. vi /etc/hosts
  2. 127.0.0.1 mysql57
  • 下载代码,构建 mvn package
  1. git clone <git url>
  2. cd /root/kubeblog/Final
  3. mvn package
  • 构建 Docker 镜像
  1. docker build -t kubeblog .
  • 查看 docker 镜像
  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. kubeblog 1.0 f9bb30633155 4 minutes ago 148MB

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

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2791505/1642323690459-f4d035d2-6b25-42b1-adac-a8c7ed12af8b.png#clientId=u689c36a2-1d1f-4&from=paste&height=675&id=u22cd70f2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1350&originWidth=2560&originalType=binary&ratio=1&size=261284&status=done&style=none&taskId=u9cb9941b-dcb9-4567-aa2a-218503c9ceb&width=1280)
  2. ---
  3. <a name="91faf3dd"></a>
  4. # 3-7 Docker run --link运行博客应用
  5. - docker run --link运行博客应用
  6. > `--link`表示运行容器时与哪个容器进行网络连接。
  7. ```bash
  8. docker run --name kubeblog -d -p 5000:5000 --link mysql57 kubeblog:1.0

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

  1. docker exec -it kubeblog sh
  2. env |grep MYSQL
  3. MYSQL57_ENV_MYSQL_MAJOR=5.7
  4. MYSQL57_PORT_3306_TCP_ADDR=172.17.0.2
  5. MYSQL57_ENV_MYSQL_ROOT_PASSWORD=password
  6. MYSQL57_ENV_GOSU_VERSION=1.12
  7. MYSQL57_PORT_3306_TCP_PORT=3306
  8. MYSQL57_PORT_3306_TCP_PROTO=tcp
  9. MYSQL57_PORT_33060_TCP_ADDR=172.17.0.2
  10. MYSQL57_PORT=tcp://172.17.0.2:3306
  11. MYSQL57_PORT_3306_TCP=tcp://172.17.0.2:3306
  12. MYSQL57_PORT_33060_TCP_PORT=33060
  13. MYSQL57_ENV_MYSQL_VERSION=5.7.30-1debian10
  14. MYSQL57_PORT_33060_TCP_PROTO=tcp
  15. MYSQL57_NAME=/kubeblog/mysql57
  16. MYSQL57_PORT_33060_TCP=tcp://172.17.0.2:33060
  • 更新/etc/hosts文件 ```bash 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

  1. - 在宿主机访问 centos 虚拟机上的 kubeblog 应用,需要关闭虚拟机防火墙
  2. ```bash
  3. systemctl stop firewalld
  4. 192.168.99.101:5000