CS-Notes/notes/docker和kubernetes.md
HuaHero 13e5c888c2
Update docker和kubernetes.md
补充一些容器编排的引子
2023-11-30 14:48:42 +08:00

386 lines
8.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[TOC]
# 发展历程
1. 早期的物理机
2. 虚拟化技术--虚拟机
3. 容器化docker -- 典型的C/S架构Go语言开发适合高并发,[hub.docker.com]()
![image-20231129092939522](C:\Users\h00284904\Desktop\image-20231129092939522--dockerArchitecture.png)
```sh
docker pull **
docker push
docker run -d --name my-tomcat -p 9999:8080 tomcat:8.0
docker stop **
docker version
docker images/docker ls
# 取别名
docker tag
docker ps
docker rmi -f
```
# Image深入讨论
![image-20231129093219217](C:\Users\h00284904\Desktop\image-20231129093219217--Image深入.png)
在docker中任何一个imagetomcat\redis\mysql其最底层就是一个最小内核的linux kernel.
github.com/docker-library
dockerfile:
> FROM debian: buster-slim
>
> RUN ...
>
> CMD [mysqld]
docker build [dockerFinleName] .
4. 自定义镜像怎么办?
tomcat、redis、mysql、rocketmq等中间件都已有官方写好了的镜像
根据image就可以创建出container
而且image是可以发给不同的人使用的只要对应机器上安装了DockerEngine即可。
``` dockerfile
FROM openjdk:8
COPY dockerfile-demo-0.0.1-SNAPSHOT.jar jack-dockerfile-image.jar
CMD ["java","-jar","jack-dockerfile-image.jar"]
```
springboot项目-->image-->container
``` shell
docker build -t jack-dockerfile-image .
```
```sh
docker run -d --name sb01 -p 6661:8080 jack-dockerfile-image
```
```sh
docker logs [容器名称]
```
5. image共享给别人使用
* 需要创建一个镜像
* 上传到公共的仓库
* 当前本地需要登录一个公共仓
```shell
sudo docker login -username=hqh registry.cn-hangzhou.aliyuncs.com
```
* push到公共仓
``` sh
docker push registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/jack-dockerfile-image
```
* 其它人拉取使用
``` sh
docker pull registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/jack-dockerfile-image
```
*
# Container深入探讨
![ ](C:\Users\h00284904\Desktop\image-20231129110137511--container.png)
```sh
docker exec -it my-tomcat bash
cat /etc/issue
```
能否将已修改的container打包成新的镜像打包分享给其他人使用----可以。
```sh
docker commit [tomcat03] [gupao-customized-tomcat-image]
```
* container常见操作
```sh
docker ps -aq
docker rm -f conatiner
docker exec -it 容器名
docker commit
# 查看docker占用CPU等资源情况
docker stats
# 可以设置container使用资源的上限
docker run -d --memory 300M --name jack-tomcat-memory-limit tomcat:8.0
docker run -d --cup-shareds 10 --name jack-tomcat-cpu-limit tomcat:8.0
```
*
6. 为了资源隔离
* Linux已提供的支持
![image-20231129113551798](C:\Users\h00284904\Desktop\image-20231129113551798--linuxKernel.png)
kernel.org/doc
* 怎样降低开发或运维人员使用这些技术的门槛--Linux Container(LXC)
linuxcontainers.org——依然有门槛更多的还是针对 Linux运维人员出发点基于隔离出物理机的资源为了快速搭建出一个物理机中的虚拟资源
——未面向app
docker 在LXC基础上提出了针对具体的app进行隔离解决方案,image,contaner.
bocker
*
# Doker数据持久化和网络
```sh
docker volume ls
# 自定义
docker volume create 自定义volume名
docker volume inspect [volume名称]
docker volume rm -f *
```
## volume数据持久化
VOLUME /var/lib/mysql有了VOLUME关键字之后将容器的/var/lib/mysql实际在对应hosthost上建一个相应目录在/var/lib/docker/volumes/*下)。
```sh
docker run -d --name hqh-mysql -p 3301:3306 -v hqh-mysql-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=jack666 --privileged mysql:5.7
```
bind的概念
- -v ~/shop:/usr/local/tomcat/webapps/shop ,少民volume这个层次面试。bind mounting
- 把目录和专门的服务器绑定。
## docker中的网络
https://landscape.cncf.io/?category=container-runtime&grouping=category
```sh
# 本地网卡信息
ls /sys/class/net
ip a
ip link
cd /etc/sysconfig/network-scripts
ip addr add ip dev eth0
systemctl restart network
ipup eth0
ipdown eth1
docker network ls
```
不同namespace下的网络
```sh
ip netns add ns1
ip netns add ns2
ip netns add ns3
ip netns list
ip nets delete ns3 delete ns3
ip netns exec ns1 ip a
ip netns exec ns1 ifup lo
# 创建了veth-ns1和veth-ns2并成对
ip link add veth-ns1 type veth peer name veth-ns2
# 将各自关联到对应命名空间中
ip link set veth-ns1 netns1
ip link set veth-ns2 netns2
ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns2 ip link set veth-ns2 up
ip netns exec ns1 ping 192.168.0.12
```
veth pair: virtual ethernet pair,一个虚拟
![image-20231129162902479](C:\Users\h00284904\Desktop\image-20231129162902479--veth.png)
### docker网络之bridge
![image-20231129164624972](C:\Users\h00284904\Desktop\image-20231129164624972--veth2.png)
![image-20231129165011607](C:\Users\h00284904\Desktop\image-20231129165011607--veth4.png)
通过veth-pair彼此之间的通信。
```sh
docker network ls
docker network inspect bridge
# 也可以自定义网侧面
docker network create --subnet=172.18.0.0/24 tomcat-net-name
# 通过docker run命令
docker run -d --name nginx01 -p 6061:80 --network tomcat-net-name
# 将网络添加下
docker network connect tomcat-name-net tomcat2
```
其它模式none\network ls
各个namespace这间是共享宿主机分配的带宽还是分配固定的带宽——
## 基于Docker搭建MySQL高可用集群
MySQL单机部署--会增加不可用风险,
实现MySQL高可用搭建MySQL集群-->伴随要解决数据一致性问题。
### PXC
Percona Xtradb Cluster,percona.com
多主方案+同步复制-->强一制性,
方法(1) 原生 pxc 依赖 一步步手动搭建
2 docker image方式搭建
![image-20231129174636101](C:\Users\h00284904\Documents\ForWork\学习\docker\docker-mysql.pdf)
```sh
# 获取pxc镜像其实就相当于获取mysql镜像
docker pull percona/percona-xtradb-cluster:5.7.21
# 设置网络
docker network create -subnet=172.19.0.0/24 pxc-cluster-net bridge
# 数据持久化(后续让容器进行关联)
docker volume create pxc-v1
docker volume create pxc-v2
docker volume create pxc-v3
# 创建容器
docker tag percona/percona-xtradb-clustrer:5.7.21 pxc
docker run -d --name=node1 -p 3301:3306 pxc -e MYSQL_ROOT_PASSWORD=hqh666 -v pxc-v1:/var/lib/mysql -e CLUSTER_NAME=PXC --net=pxc-cluster-net -e XTRBACKUP_PASSWORD=hqh666 pxc
docker run -d --name=node2 -p 3302:3306 pxc -e MYSQL_ROOT_PASSWORD=hqh666 -v pxc-v2:/var/lib/mysql -e CLUSTER_NAME=PXC --net=pxc-cluster-net -e XTRBACKUP_PASSWORD=hqh666 -e CLUSTER_JOIN=node1 pxc
docker run -d --name=node3 -p 3303:3306 pxc -e MYSQL_ROOT_PASSWORD=hqh666 -v pxc-v3:/var/lib/mysql -e CLUSTER_NAME=PXC --net=pxc-cluster-net -e XTRBACKUP_PASSWORD=hqh666 -e CLUSTER_JOIN=node1 pxc
```
InnoDB cluster: 一主多从
## docker compose【一步创建多个容器--单台】-->docker swarm/Meos/kubernetes【一步创建多个容器--多台】
1安装docker-compose
```shell
sudo curl -L "https://github.com/docker/compose/release/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
2定义一个yaml文件
```yaml
version: "3.9"
# service <---->container
services:
# 第一个container名字
web:
# 本地 image Dockerfile
build: .
# -p 50005000
ports:
- "8000:5000"
# 第二个container名字
redis:
image: "redis:alpine"
networks:
app-net:
driver: bridge
```
3通过docker compose一键启动
```sh
docker compose up
```
## 容器编排&容器管理
如果是docker单机环境其实docker compose也就够用了
但是因为一台宿主机器资源毕竟有限所以肯定是希望多台docker组成的集群环境就需要一起管理容器。
Docker Swarm、Mesos、Kubernetes
* Docker Swarm
scheduler——调度、计算
network
health
discovery——manager要知道work node在哪w-->信息注册到manager