前言
在自己的日常工作中,偏向开发的组件很多,自我接触比较多的就是Docker和k8s。
此处先学Docker,再去学习k8s,以备不时之需。
学习要求
- 学会安装Docker
- 学会简单的使用Docker
下载和安装
如果之前的镜像是国内的,或者自己有手段,可以翻墙的,那么直接yum安装Docker就可以了。
Docker权限的授予
在后面运行Compose的时候,会弹出某些程序我无权运行。
这意味着,Docker本身没有权限运行这些程序。
这个时候,可以按照下列步骤,解决权限问题。
- 新增
docker用户组(如果没有的话)。 - 将当前用户划到
docker用户组中(方便后续访问对应的Docker进程)。 - 修改
docker.sock文件的所属组,以及赋予对应组,可读可写该文件的权力。
# 1
sudo groupadd docker
# 2
sudo usermod -aG docker $USER
# 3
sudo chown root:docker /var/run/docker.sock
sudo chmod g+rw /var/run/docker.sock
完成上述操作,且完成后续Compose的配置文件的撰写后,即可开启Docker Compose。
Docker Compose的下载和安装
在询问AI,如何批量定义、管理多个容器的时候,AI有推荐我安装Docker Compose工具。
我的理解是,它就是一键批量脚本。你设定好每个容器的具体配置后,可以通过Compose一键管理多个容器。
直接去Github下载,按照自己的实际版本,选择具体的文件就行。
然后传回Linux中,改名,放在/usr/local/bin/里面,给执行权限之类的。
要是能显示版本,那就意味着安装成功了。
组件的“迁移”
以四个组件为例。
Grafana、Prometheus、Node Exporter以及之前那个,安装不上,需要环境依赖的Steam302。
后续发现,可以从网上直接拉对应的镜像,我决定直接舍弃本地的组件,尝试网上拉取,一步到位。
不过,Linux不能科学上网,得考虑先把网络环境解决掉。
Steam302就得优先处理了。
gcc库的编译和升级(尝试失败)
直接运行,尝试报错,依赖的so版本低了。
那就直接编译一个最新的出来吧(主要是Windows有方法,Linux没有,也懒得绑定Linux了,索性直接重头开始)。
太新也没必要,毕竟CentOS 7 本就是一个老版本。
# 安装编译所需的依赖
sudo yum install -y bzip2 wget make gcc gmp-devel mpfr-devel libmpc-devel
# 创建一个临时目录用于下载和编译
mkdir -p ~/gcc-build
cd ~/gcc-build
# 假设你已经将下载的源码文件移动到该目录,解压源码包
tar -xzvf gcc-<version>.tar.gz
cd gcc-<version>
# 下载必要的依赖文件
./contrib/download_prerequisites
# 创建一个构建目录
cd ..
mkdir build
cd build
# 配置编译选项
../gcc-<version>/configure --prefix=/usr/local/gcc --enable-languages=c,c++ --disable-multilib
# 编译(根据你的 CPU 核心数调整 -j 参数,以加快编译速度)
make -j$(nproc)
# 安装
sudo make install
version就是对应的版本号。
后续测试发现,编译一次耗时太长,跟本身给予虚拟机的CPU资源有限也有关系。
感觉还是玩不通,决定自己构造过桥梯了。
过程不做展示。
放弃迁移,新增容器
如果需要挂载,涉及权限问题,暂时解决不了,决定直接新建yml文件,从头开始。
[watcher@functiona docker-composes]$ sudo vim docker-compose.yml
services:
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
restart: always
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
restart: always
node_exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
restart: always
[watcher@functiona docker-composes]$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
docker-composes-grafana-1 grafana/grafana:latest "/run.sh" grafana 8 minutes ago Up 8 minutes 0.0.0.0:3000->3000/tcp
docker-composes-node_exporter-1 prom/node-exporter:latest "/bin/node_exporter" node_exporter 8 minutes ago Up 8 minutes 0.0.0.0:9100->9100/tcp
docker-composes-prometheus-1 prom/prometheus:latest "/bin/prometheus --c…" prometheus 8 minutes ago Up 8 minutes 0.0.0.0:9090->9090/tcp
遇到的问题——missing signature key
一般来说,这是docker版本过低导致的。
重新下载最新的docker就好了。
新增过程中的一个小技巧——挂载文件
在后续的容器下载、安装的过程中,发现一个问题——因为一些配置的变更,或者自身的环境测试,需要重启镜像。如果镜像重启了,那么所有的数据都会不见。
特别是,诸如Node Exporter这种采集的数据文件;以及类似Grafana的图表文件。
后续从互联网上了解到的一个小技巧就是,可以通过将容器中的某些文件/目录,挂载到实际的文件/目录上,就可以确保文件可以被保存,镜像重启后,也可以读取对应的文件。
[watcher@functiona docker-composes]$ cat docker-compose.yml
version: '3'
services:
grafana:
image: grafana/grafana:latest
network_mode: host
restart: always
volumes:
- /opt/grafana/data:/var/lib/grafana
prometheus:
image: prom/prometheus:latest
network_mode: host
volumes:
- /opt/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
- /opt/prometheus/data:/prometheus
restart: always
node_exporter:
image: prom/node-exporter:latest
network_mode: host
restart: always
nginx:
image: nginx:latest
network_mode: host
volumes:
- /opt/docker-composes/nginx.conf:/etc/nginx/nginx.conf
- /opt/docker-composes/sites-enabled:/etc/nginx/sites-enabled
图上所示,其中,volumes一栏,就是文件的挂载信息。
如,Linux上,/opt/prometheus/config/prometheus.yml文件,对应着Docker容器Prometheus中的 /etc/prometheus/prometheus.yml文件。
通过这一种,文件挂载的方式,可以保证一些配置文件可保存,后续如果要重启容器,不会出现配置丢失的情况。
另外,网络模式选择Host的原因是,方便NGINX服务器写规则的时候,直接调用127.0.0.1的对应端口,不需要考虑到docker容器内部的虚拟网络的IP(嫌麻烦)。
旧电脑再利用
后续发现,自己出租屋里,还有一个以前不知道什么时候买的电脑棒,上面是Windows系统。
反正不怎么用了,干脆直接安装上Linux系统,用作自己的学习宿主机了。
不过这一次安装的是Ubuntu系统。个人感觉,不同系统之间,除了个别操作命令的不同,本质上都是Linux的一个分支版本,核心的一些逻辑是相同的。
watcher@mylinux:~$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 39 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Vendor ID: GenuineIntel
Model name: Intel(R) Celeron(R) J4125 CPU @ 2.00GHz
CPU family: 6
Model: 122
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Stepping: 8
CPU(s) scaling MHz: 56%
CPU max MHz: 2700.0000
CPU min MHz: 800.0000
BogoMIPS: 3993.60
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm cons
tant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ss
se3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand lahf_lm 3dnowprefetch cpuid_fault cat_l2 cdp_l2 ssbd ibrs i
bpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust smep erms mpx rdt_a rdseed smap clflushopt intel_pt sha_ni xsaveopt x
savec xgetbv1 xsaves dtherm ida arat pln pts vnmi umip rdpid md_clear arch_capabilities
Virtualization features:
Virtualization: VT-x
Caches (sum of all):
L1d: 96 KiB (4 instances)
L1i: 128 KiB (4 instances)
L2: 4 MiB (1 instance)
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-3
Vulnerabilities:
Gather data sampling: Not affected
Itlb multihit: Not affected
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Mmio stale data: Not affected
Reg file data sampling: Mitigation; Clear Register File
Retbleed: Not affected
Spec rstack overflow: Not affected
Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Spectre v2: Mitigation; Enhanced / Automatic IBRS; IBPB conditional; RSB filling; PBRSB-eIBRS Not affected; BHI SW loop, KVM SW loop
Srbds: Not affected
Tsx async abort: Not affected
docker-compose批量安装容器
如果可以一步到位,直接全部拉起,而且不会重启,那么你一定做好了权限管理。或者你运气很好。
watcher@mylinux:/opt/docker-compose-projects$ docker-compose up -d
WARN[0000] /opt/docker-compose-projects/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 4/4
✔ Container docker-compose-projects-node_exporter-1 Started 0.3s
✔ Container docker-compose-projects-prometheus-1 Started 0.3s
✔ Container docker-compose-projects-grafana-1 Started 0.3s
✔ Container docker-compose-projects-nginx-1 Started 0.4s
我自己尝试up -d的时候,往往都会出现,某个容器无法正常运行的情况。
主要的问题,就是挂载了实际的目录/文件之后,出现的权限问题。
某某组件,没有权限读取/删除某个文件或者目录。
这种,一般来说,需要设定好对应用户(组)的读写权限。设定好之后,利用docker-compose重启即可。
当然,如果自身的容器所产生的数据,不需要被保存,那么确实可以不进行任何的挂载声明。只不过,每次docker的重启,都会导致数据的丢失。
docker容器部分使用截图
在Windows用Host绑定了域名和内网IP后,通过Linux的NGINX跳转,就可以实现常规上网的那种,只需要输入域名就可以访问的情况了。
IP加端口才能访问的方式,还是有点繁琐。
诸如docker的使用命令,打算在后续的学习中边实践边学习。
比如docker ps找容器ID,然后docker logs ids去看日志,如果报错了该怎么解决之类的。(因为文件目录权限问题,被折磨了好几天)
docker就先琢磨到这里,后续有需要再说。