车斌的技术博客

微习惯,每天看1分钟


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

06丨打破次元壁:容器该如何与外界互联互通

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Kubernetes
本文字数: 13k | 阅读时长 ≈ 12 分钟

思考并回答以下问题:

  • docker cp a.txt 062:/tmp如果源路径是宿主机那么就是把文件拷贝进容器,如果源路径是容器那么就是把文件拷贝出容器,注意需要用容器名或者容器ID来指明是哪个容器的路径。062是什么?
  • 虚拟机有一种“共享目录”的功能可以在宿主机上开一个目录,然后把这个目录“挂载”进虚拟机,这样就实现了两者共享同一个目录,一边对目录里文件的操作另一边立刻就能看到,没有了数据拷贝,效率自然也会高很多。怎么理解?
  • 需要在docker run命令启动容器的时候使用-v参数,具体的格式是“宿主机路径: 容器内路径”。docker run -d --rm -v /tmp:/tmp redis。怎么理解?
  • 我本机上只有Python 2.7,但我想用Python 3开发,如果同时安装Python 2和Python 3很容易就会把系统搞乱。要怎么办呢?
  • docker run -d --rm --net=host nginx:alpine直接使用宿主机网络,相当于去掉了容器的网络隔离(其他隔离依然保留),所有的容器会共享宿主机的 IP 地址和网卡。这种模式没有中间层,自然通信效率高,但缺少了隔离,运行太多的容器也容易导致端口冲突。怎么理解?
  • 解决端口冲突的方法就是加入一个“中间层”,由容器环境例如Docker来统一管理分配端口号,在本机端口和容器端口之间做一个“映射”操作,容器内部还是用自己的端口号,但外界看到的却是另外一个端口号,这样就很好地避免了冲突。端口号映射需要使用bridge模式,并且在docker run启动容器时使用-p参数,形式和共享目录的-v参数很类似,用:分隔本机端口和容器端口。怎么理解?
阅读全文 »

05丨镜像仓库:该怎样用好Docker Hub这个宝藏

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Kubernetes
本文字数: 10k | 阅读时长 ≈ 9 分钟

思考并回答以下问题:

阅读全文 »

04丨创建容器镜像:如何编写正确、高效的Dockerfile

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Kubernetes
本文字数: 16k | 阅读时长 ≈ 14 分钟

思考并回答以下问题:

  • 如果要从本机向镜像拷贝文件,就必须把这些文件放到一个专门的目录,然后在docker build里指定“构建上下文”到这个目录才行。
  • RUN指令实际上就是Shell编程。
  • .dockerignore文件在“构建上下文”目录里是什么作用?
阅读全文 »

03丨容器化的应用:会了这些你就是Docker高手

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Kubernetes
本文字数: 12k | 阅读时长 ≈ 11 分钟

思考并回答以下问题:

  • 这些“镜像”都有一些相同点:只读,不允许修改,以标准格式存储了一系列的文件,然后在需要的时候再从中提取出数据运行起来。怎么理解?
  • 镜像就是静态的应用容器,容器就是动态的应用镜像。怎么理解?
  • 镜像是容器运行的根本,先有镜像才有容器。怎么理解?
  • 镜像是容器的静态形式,它打包了应用程序的所有运行依赖项,方便保存和传输。使用容器技术运行镜像,就形成了动态的容器,由于镜像只读不可修改,所以应用程序的运行环境总是一致的。怎么理解?
  • 所谓的“容器化的应用”,或者“应用的容器化”,就是指应用程序不再直接和操作系统打交道,而是封装成镜像,再交给容器环境去运行。怎么理解?
阅读全文 »

02丨被隔离的进程:一起来看看容器的本质

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Kubernetes
本文字数: 7.7k | 阅读时长 ≈ 7 分钟

思考并回答以下问题:

  • 容器技术是动态的容器、静态的镜像和远端的仓库这三者的组合。怎么理解?
  • 容器,就是一个特殊的隔离环境,它能够让进程只看到这个环境里的有限信息,不能对外界环境施加影响。为什么需要创建这样的一个隔离环境,直接让进程在系统里运行不好吗?
  • 虚拟化是计算机界的一门传统技术,例如虚拟CPU、虚拟内存、虚拟磁盘、虚拟网卡等等,其目的是资源共享,提高资源利用率。怎么理解?
阅读全文 »

01丨初识容器:万事开头难

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Kubernetes
本文字数: 9.2k | 阅读时长 ≈ 8 分钟

Docker的形态

首先,我们需要对Docker的形态有所了解。目前使用Docker基本上有两个选择:Docker Desktop和Docker Engine。

Docker Desktop是专门针对个人使用而设计的,支持Mac和Windows快速安装,具有直观的图形界面,还集成了许多周边工具,方便易用。

不过,我个人不是太推荐使用Docker Desktop,原因有两个。第一个,它是商业产品,难免会带有Docker公司的“私人气息”,有一些自己的、非通用的东西,不利于我们后续的Kubernetes学习。第二个,它只是对个人学习免费,受条款限制不能商用,我们在日常工作中难免会“踩到雷区”。

Docker Engine则和Docker Desktop正好相反,完全免费,但只能在Linux上运行,只能使用命令行操作,缺乏辅助工具,需要我们自己动手DIY运行环境。不过要是较起真来,它才是Docker当初的真正形态,“血脉”最纯正,也是现在各个公司在生产环境中实际使用的Docker产品,毕竟机房里99%的服务器跑的都是Linux。

Docker的安装

先让我们尝试输入命令docker,会得到“命令未找到”的提示,还有如何安装的建议:

1
2
Command 'docker' not found, but can be installed with:
sudo apt install docker.io

还要在安装完毕后执行下面的两条命令:
1
2
sudo service docker start         #启动docker服务
sudo usermod -aG docker ${USER} #当前用户加入docker组

第一个service docker start是启动Docker的后台服务,第二个usermod -aG是把当前的用户加入Docker的用户组。这是因为操作Docker必须要有root权限,而直接使用root用户不够安全,加入Docker用户组是一个比较好的选择,这也是Docker官方推荐的做法。当然,如果只是为了图省事,你也可以直接切换到root用户来操作Docker。

上面的三条命令执行完之后,我们还需要退出系统(命令exit),再重新登录一次,这样才能让修改用户组的命令usermod生效。

现在我们就可以来验证Docker是否安装成功了,使用的命令是docker version和docker info。

docker version会输出Docker客户端和服务器各自的版本信息:

下面是我从中摘出的比较关键的版本号和系统信息。可以看到,我使用的是Docker Engine 20.10.12,系统是Linux,硬件架构是arm64,也就是Apple M1:

1
2
3
4
5
6
7
Client:
Version: 20.10.12
OS/Arch: linux/arm64
Server:
Engine:
Version: 20.10.12
OS/Arch: linux/arm64

docker info会显示当前Docker系统相关的信息,例如CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统等等,这里我也摘录了一部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Server:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 8
Server Version: 20.10.12
Storage Driver: overlay2
Backing Filesystem: extfs
Cgroup Driver: systemd
Default Runtime: runc
Kernel Version: 5.13.0-19-generic
Operating System: Ubuntu Jammy Jellyfish (development branch)
OSType: linux
Architecture: aarch64
CPUs: 2
Total Memory: 3.822GiB
Docker Root Dir: /var/lib/docker

docker info显示的这些信息,对于我们了解Docker的内部运行状态非常有用,比如在这里,你就能够看到当前有一个容器处于停止状态,有8个镜像,存储用的文件系统是overlay2,Linux内核是5.13,操作系统是Ubuntu 22.04 Jammy Jellyfish,硬件是aarch64,两个CPU,内存4G。

Docker的使用

首先,我们使用命令docker ps,它会列出当前系统里运行的容器,就像我们在Linux系统里使用ps命令列出运行的进程一样。

因为我们刚刚安装好Docker环境,这个时候还没有运行任何容器,所以列表显然是空的。

接下来,让我们尝试另一个非常重要的命令docker pull,从外部的镜像仓库(Registry)拉取一个busybox镜像(image),你可以把它类比成是Ubuntu里的“apt install”下载软件包:

1
docker pull busybox #拉取busybox镜像

docker pull会有一些看起来比较奇怪的输出信息,现在我们暂时不用管,后续的课程会有详细解释。

我们再执行命令docker images,它会列出当前Docker所存储的所有镜像:

可以看到,命令会显示有一个叫busybox的镜像,镜像的ID号是一串16进制数字,大小是1.41MB。

现在,我们就要从这个镜像启动容器了,命令是docker run,执行echo输出字符串:

1
docker run busybox echo hello world

这条命令会在我们的终端上,输出计算机世界最著名的语句“hello world”:

然后我们再用docker ps命令,加上一个参数-a,就可以看到这个已经运行完毕的容器:

初次接触容器的你可能会感到很困惑,这些命令都做了什么?看起来并没有展示出什么特别神奇的本领啊?可能还不如直接写一个Shell脚本来得省事。

有同样感想的不止你一个,不要着急,我们在后续的课程再逐步讲解这其中的奥妙。

Docker的架构

Docker Engine的架构

刚才我们敲的命令行docker实际上是一个客户端client,它会与Docker Engine里的后台服务Docker daemon通信,而镜像则存储在远端的仓库Registry里,客户端并不能直接访问镜像仓库。

Docker client可以通过build、pull、run等命令向Docker daemon发送请求,而Docker daemon则是容器和镜像的“大管家”,负责从远端拉取镜像、在本地存储镜像,还有从镜像生成容器、管理容器等所有功能。

所以,在Docker Engine里,真正干活的其实是默默运行在后台的Docker daemon,而我们实际操作的命令行工具“docker”只是个“传声筒”的角色。

Docker官方还提供一个“hello-world”示例,可以为你展示Docker client到Docker daemon再到Registry的详细工作流程,你只需要执行这样一个命令:

1
docker run hello-world

它会先检查本地镜像,如果没有就从远程仓库拉取,再运行容器,最后输出运行信息:

小结

1,容器技术起源于Docker,它目前有两个产品:Docker Desktop和Docker Engine,我们的课程里推荐使用免费的Docker Engine,它可以在Ubuntu系统里直接用apt命令安装。

2,Docker Engine需要使用命令行操作,主命令是docker,后面再接各种子命令。

3,查看Docker的基本信息的命令是docker version和docker info,其他常用的命令有docker ps、docker pull、docker images、docker run。

4,Docker Engine是典型的客户端/服务器(C/S)架构,命令行工具Docker直接面对用户,后面的Docker daemon和Registry协作完成各种功能。

课下作业

Docker Engine为什么要设计成客户端/服务器(C/S)架构?它有什么样的好处?

C/S架构更重要的是实现了功能分离,利于分布式应用,不限于单机,比如运行一个docker daemon,然后多个客户端都向这个服务器发命令。

结束语 | 再聊Go并发编程的价值和精进之路

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Go
本文字数: 82 | 阅读时长 ≈ 1 分钟

思考并回答以下问题:

  • 总结一下,这章作者最主要想表达什么观点?
阅读全文 »

20 | 在分布式环境中,队列、栅栏和STM该如何实现?

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Go
本文字数: 4.4k | 阅读时长 ≈ 4 分钟

思考并回答以下问题:

阅读全文 »

19 | 在分布式环境中,Leader选举、互斥锁和读写锁该如何实现?

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Go
本文字数: 43k | 阅读时长 ≈ 39 分钟

思考并回答以下问题:

阅读全文 »

18 | 分组操作:处理一组子任务,该用什么并发原语?

发表于 2022-09-12 | 更新于 2024-09-02 | 分类于 Go
本文字数: 8k | 阅读时长 ≈ 7 分钟

思考并回答以下问题:

阅读全文 »
上一页1…293031…57下一页
CheBin

CheBin

参与开源就是出路
561 日志
19 分类
39 标签
近期文章
  • 棋牌游戏-1
  • 第11章 并发模式:拿来即用的经验总结
  • go并发之美:多个channel合并/多个数据流合并
  • 第12章 分布式链路追踪
  • 第11章 统一认证与授权
© 2018 – 2024 CheBin | 站点总字数: 4m | 站点阅读时长 ≈ 60:19
由 Hexo 强力驱动
|
主题 – NexT.Pisces
0%