---
url: /docker.md
---
```sh
cat /etc/issue

curl -fsSL https://get.docker.com -o get-docker.sh
 sudo sh get-docker.sh

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"  --no-trunc
docker run --rm -it --name=python python:3.11-slim /bin/bash
docker system df
docker-compose --compatibility up -d

docker-compose build --force-rm --no-cache

docker-compose down & docker volume prune

docker-compose build --force-rm --no-cache

docker-compose ps

docker-compose logs -f -t --tail nacos

docker-compose down --rmi all -v
docker compose down -v --remove-orphans --rmi="all"

docker compose down -v --remove-orphans --rmi="local"

sudo docker compose --compatibility up -d --build --force-recreate --renew-anon-volumes --remove-orphans –always-recreate-deps

docker compose --compatibility up -d --build --remove-orphans --pull=always --renew-anon-volumes --always-recreate-deps


sudo docker compose build --no-cache && sudo docker compose up -d --compatibility up -d  --renew-anon-volumes --remove-orphans

docker-compose --compatibility up -d  --renew-anon-volumes --remove-orphans
docker-compose up -d --build &&docker-compose restart

sudo docker compose build --no-cache && sudo docker compose up -d --scale mysql-go=50
sudo docker compose --compatibility up -d --build --force-recreate  --renew-anon-volumes --remove-orphans

docker compose -f xxx.yml build --no-cache

systemctl list-units --type=service --state=running

sudo docker stop $(sudo docker ps -a -q)

sudo docker start $(sudo docker ps -a -q)

sudo docker rm $(sudo docker ps -a -q)

sudo docker rmi $(sudo docker images -q)

sudo docker rmi $(sudo docker images | grep "none" | awk '{print $3}')

sudo docker rmi $(sudo docker images -f "dangling=true" -q)

 sudo docker system prune --volumes -f

 sudo docker system prune -a

sudo docker system prune --all   --volumes -f

du -Sh /var/lib/docker/overlay2 | sort -nr | head -n10

docker rmi -f $(docker images -aq)

docker pull --platform=arm64 --username=your_username --password=your_password your_registry/image_name:tag

docker image prune

docker cp elasticsearch:/usr/share/elasticsearch/config xxxxxx


ocker run --rm -v source_volume:/data -v $(pwd):/backup ubuntu tar czvf /backup/backup.tar.gz /data

docker run --rm -v /path/to/kafka-backups:/backups --volumes-from kafka busybox \
  cp -a /bitnami/kafka /backups/latest

docker run --rm -v /path/to/kafka-backups:/backups --volumes-from `docker-compose ps -q kafka` busybox \
  cp -a /bitnami/kafka /backups/latest

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

如果只是改动代码和配置文件等，docker-compose restart是没有问题的；

如果改动了docker-compose.yml里的内容，则必须down之后再up （restart是无法自动加载新变动的内容）


docker image inspect redis:latest|grep -i version

docker save xxxx -o xxx.tar


docker load -i xxx.tar


kubectl delete pods --all

wsl -s Debian wsl --shutdown

 wsl --export docker-desktop-data D:\docker\docker-desktop-data.tar
 wsl --unregister docker-desktop-data

  wsl --import docker-desktop-data D:\docker\ D:\docker\docker-desktop-data.tar --version 2
wsl --export Debian D:\docker\debian\debian.tar wsl --unregister Debian

wsl --import Debian D:\docker\debian\ D:\docker\debian\debian.tar --version 2

wsl --export Ubuntu D:\docker\ubuntu\ubuntu.tar


curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh


wsl --unregister Ubuntu wsl --import Ubuntu D:\docker\ubuntu\ D:\docker\ubuntu\ubuntu.tar --version 2

curl -L "https://github.com/docker/compose/releases/download/2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

{
    "builder": {
        "gc": {
            "defaultKeepStorage": "10GB",
            "enabled": true
        }
    },
    "debug": false,
    "experimental": true,
    "features": {
        "buildkit": true
    },
    "live-restore": false,
    "log-driver": "json-file",
    "log-opts": {
        "max-file": "1",
        "max-size": "10m"
    },
    "storage-driver": "overlay2",
    "exec-opts": [
        "native.cgroupdriver=systemd",
        "overlay2.override_kernel_check=true",
        "overlay2.size=10G"
    ],
    "raw-logs": false,
    "registry-mirrors": [
        "https://pb8evzri.mirror.aliyuncs.com"
    ],
    "dns": [
        "223.5.5.5",
        "223.6.6.6"
    ]
}



[wsl2]
memory=4GB

processors=2

localhostForwarding=true

pageReporting=false

debugConsole=false

nestedVirtualization=false

hardwarePerformanceCounters=false

guiApplications=false

swap=0

kernelCommandLine = vsyscall=emulate


docker login ccr.ccs.tencentyun.com --username=100008523020
docker pull ccr.ccs.tencentyun.com/custom-namespace/custom:[tag]

docker login --username xxxx

sudo docker tag mysql-go xxxx/mysql-go:latest

sudo docker push xxxxx/mysql-go:latest

 sudo docker login --username=wxw_****@163.com registry.cn-beijing.aliyuncs.com

docker login --username=wxw_****@163.com registry.cn-beijing.aliyuncs.com
docker tag [ImageId] registry.cn-beijing.aliyuncs.com/wxw-plus/w1106:[镜像版本号]
docker push registry.cn-beijing.aliyuncs.com/wxw-plus/w1106:[镜像版本号]

dockerd-rootless-setuptool.sh install

bcdedit /set hypervisorlaunchtype auto

bcdedit /set hypervisorlaunchtype off

```

## podman

```
unqualified-search-registries = [ "docker.io" ]
[[registry]]
prefix = "docker.io"
location = "pb8evzri.mirror.aliyuncs.com"



wsl --export podman-machine-default D:\docker\podman-machine-default.tar

 wsl --unregister podman-machine-default

  wsl --import podman-machine-default D:\docker\ D:\docker\podman-machine-default.tar --version 2
```

## docker compose 共用

## pipework

```
 pipework是一个用软件来为linux容器定义网络的工具，
 pipework允许你在一个复杂的环境下把容器连接在一起，
 pipework使用cgroup和namespace来和LXC容器协同工作，当然也可以和docker来一起工作,
 pipework的shell脚本来帮助你自动打通容器之间的网络连接,
 pipework br0 rp-meeting 192.168.1.36/24@192.168.1.1
```

## 漏洞扫描

```
trivy
```

## Harbor 企业级 registry

```
自签名证书

openssl genrsa -out /data/cert/harbor-ca.key 4096

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
 -key /data/cert/harbor-ca.key \
 -out /data/cert/harbor-ca.crt


！！！上传镜像，需要先新建项目


 ./install.sh --with-notary --with-trivy


```

## 持久化存储

mysql、mogodb 等需要数据卷，使用 volumes

## k8s

```

sudo swapoff -a

sudo sed -i '/ swap / s/^/#/' /etc/fstab

kubeadm reset

kubeadm init --image-repository registry.aliyuncs.com/google_containers --ignore-preflight-errors=all --v=5 --kubernetes-version v1.27.4

kubeadm init \
--apiserver-advertise-address=192.168.31.133  \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers


kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16

kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml

kubectl taint nodes --all node-role.kubernetes.io/control-plane-


kubeadm join 192.168.0.18:6443 --token j7t0sp.sl0n86pf01fx31sp \
        --discovery-token-ca-cert-hash sha256:0d82d2abd67dfd9e7a7afb8db3b4fd5216d113f35a0a5f0324014f88fcb8d10c


kubectl get svc app-front -o go-template --template '{{ .spec.clusterIP }}' -n app




kubeadm config image list

kubectl version -o json

 kubectl proxy  --port=8888  --address='0.0.0.0'  --accept-hosts='^.*'   >/dev/null 2>&1&


#1.自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器

#2.自我修复(自愈能力)
当容器失败时，会对容器进行重启
当所部署的 Node 节点有问题时，会对容器进行重新部署和重新调度
当容器未通过监控检查时，会关闭此容器直到容器正常运行时，才会对外提供服务

#3.水平扩展
通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况，对应用容器进行规模扩大或规模剪裁

#4.服务发现
用户不需使用额外的服务发现机制，就能够基于 Kubernetes 自身能力实现服务发现和负载均衡

#5.滚动更新
可以根据应用的变化，对应用容器运行的应用，进行一次性或批量式更新

#6.版本回退
可以根据应用部署情况，对应用容器运行的应用，进行历史版本即时回退

#7.密钥和配置管理
在不需要重新构建镜像的情况下，可以部署和更新密钥和应用配置，类似热部署。

#8.存储编排
自动实现存储系统挂载及应用，特别对有状态应用实现数据持久化非常重要
存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务

#9.批处理
提供一次性任务，定时任务；满足批量数据处理和分析的场景

Kubernetes 主要由以下几个核心组件组成：

1.  etcd 保存了整个集群的状态
2.  apiserver 提供了资源操作的唯一入口，并提供认证、授权、访问控制、API 注册和发现等机制
3.  controller manager 负责维护集群的状态，比如故障检测、自动扩展、滚动更新等
4.  scheduler 负责资源的调度，按照预定的调度策略将 Pod 调度到相应的机器上
5.  kubelet 负责维护容器的生命周期，同时也负责 Volume（CVI）和网络（CNI）的管理
6.  Container runtime 负责镜像管理以及 Pod 和容器的真正运行（CRI）
7.  kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡

除了核心组件，还有一些推荐的组件：
1．kube-dns 负责为整个集群提供 DNS 服务
2．Ingress Controller 为服务提供外网入口
3．Heapster 提供资源监控
4．Dashboard 提供 GUI 5. Federation 提供跨可用区的集群
6．Fluentd-elasticsearch 提供集群日志采集、存储与查询

Pod：最小部署单元，封装一个或多个容器（以及存储、网络等资源）。

Service：定义一组Pod的访问策略，为它们提供一个统一的入口。

Deployment：管理Pod的部署，包括滚动升级和回滚。

StatefulSet：管理有状态的Pod，保证Pod的顺序和唯一性。

DaemonSet：确保所有节点（或一些特定节点）运行一个Pod的副本。

Job：运行一次性任务直到完成。

CronJob：按计划运行Job（如定时备份）。

ConfigMap：在Pod中使用配置文件

https://github.com/kubernetes-sigs/metrics-server/releases
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.2/components.yaml

https://github.com/AliyunContainerService/k8s-for-docker-desktop
kubectl proxy
$TOKEN=((kubectl -n kube-system describe secret default | Select-String "token:") -split " +")[1]
kubectl config set-credentials docker-desktop --token="${TOKEN}"
echo $TOKEN

k8s 的控制类型

deployment：适合无状态的服务部署
StatefullSet：适合有状态的服务部署
DaemonSet：一次部署，所有的 node 节点都会部署，例如一些典型的应用场景：
运行集群存储 daemon，例如在每个 Node 上运行 glusterd、ceph
在每个 Node 上运行日志收集 daemon，例如 fluentd、 logstash
在每个 Node 上运行监控 daemon，例如 Prometheus Node Exporter
Job：一次性的执行任务
Cronjob：周期性的执行任务

k8s kind 类型
Pod 最小的单位
Deployment 弹性扩容，负载均衡

命令

kubectl create -f xxx.yml
kubectl apply -f xxx.yml
kubectl delete -f xxx.yml
kubectl get pods xxx -o wide
kubectl describe pod xxx
kubectl exec -it xxx sh

kubectl delete service xxxxx

kubectl get svc xxxxx -o wide

kubectl get events

kubectl logs -f --tail 20 xxxx
kubectl top pod

k8s 端口范围 30000-32767

k8s 访问 java 的地址: Service 名称.命令空间.Pod 容器端口

kubectl -n kubernetes-dashboard create token kubernetes-dashboard
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16

kubectl proxy  --port=8888  --address='0.0.0.0' --accept-hosts='^.*'   >/dev/null 2>&1&

http://172.25.12.166:8888/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/workloads?namespace=default

minikube start --image-mirror-country='cn' --driver=vmware
minikube start --driver=docker   --image-mirror-country='cn' -memory=2048 --cpus=2 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'

minikube start --driver=vmware --image-mirror-country=cn --kubernetes-version=1.23.9 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --registry-mirror=https://registry.docker-cn.com


minikube start  --container-runtime=docker --image-mirror-country='cn'
curl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v1.5.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

sudo snap install microk8s --classic --channel=1.12/stable

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server  --cluster-init --disable traefik


kubectl create secret docker-registry ali-registry-key --docker-server=registry.cn-beijing.aliyuncs.com --docker-username=wxw_0506@163.com  --docker-password=wang0506 --docker-email=475796288@qq.com

kubectl apply -f recommended.yaml -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml
kubectl proxy    --address='0.0.0.0'  --accept-hosts='^.*' --disable-filter=true >/dev/null 2>&1&
kubectl -n kubernetes-dashboard create token admin-user

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
https://172.28.95.80:30001/#/login

kubectl get pods --all-namespaces

kubectl get pods,svc,ingress,node,ingress,ingressRoute,hpa --all-namespaces -o wide

kubectl get svc xxx-n xxx -o go-template='https://{{.spec.clusterIP}}{{range.spec.ports}}{{if   eq .name "https"}}':'{{.port}}{{"\n"}}{{end}}{{end}}'

kubectl describe pods -l name=app-front -n app

kubectl describe pod app-back -n app

kubectl logs --tail="10" -f deployment/app-back --all-containers=true -n app

/usr/local/bin/k3s-uninstall.sh

kubectl get pods,svc,ingress,nodes --all-namespaces


mkdir /opt/ingress-nodeport/https
cd /opt/ingress-nodeport/https


openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"


kubectl create secret tls tls-secret --key tls.key --cert tls.crt

kubectl get secret


kubectl describe secret tls-secret

节点和Pod亲和力，是将Pod吸引到一组节点【根据拓扑域】（作为优选或硬性要求）。污点（Taints）则相反，它们允许一个节点排斥一组Pod。

容忍（Tolerations）应用于pod，允许（但不强制要求）pod调度到具有匹配污点的节点上。

污点（Taints）和容忍（Tolerations）共同作用，确保pods不会被调度到不适当的节点。一个或多个污点应用于节点；
这标志着该节点不应该接受任何不容忍污点的Pod。

说明：我们在平常使用中发现pod不会调度到k8s的master节点，就是因为master节点存在污点。
污点的目的是为了确保特定类型的Pod不会被误调度到某些特定的节点


 kubectl -n kube-system port-forward $(kubectl -n kube-system get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000 --address 0.0.0.0 >/dev/null 2>&1&

 http://xxxx:9000/dashboard/#/



```

## buildx

RUN 命令支持一个选项 --mount=type=cache，可以挂载一个临时目录来为编译器和包管理器缓存目录。

RUN --mount=type=cache,target=~/.m2,id=mvn_cache,sharing=locked

## multipass

```

 multipass info –all
multipass set local.driver=virtualbox|hyperv
multipass delete --all --purge
multipass set local.privileged-mounts=true

multipass set local.bridged-network=xxx

multipass find

multipass networks

MULTIPASS_STORAGE

multipass launch docker -n docker -m 4G -d 40G -c 4 --network bridged --cloud-init config.yaml -vvvv
multipass launch lts -n master -m 4G -d 20G -c 4 --cloud-init ./config.yaml -vvvv

multipass start docker

multipass shell docker

multipass delete docker --purge

multipass delete --all

multipass purge



sudo sed -i "s@PasswordAuthentication no@PasswordAuthentication yes@g" /etc/ssh/sshd_config

sudo sed -i "s@#PermitRootLogin prohibit-password@PermitRootLogin no@g" /etc/ssh/sshd_config

sudo sed -i "s@#   StrictHostKeyChecking ask@StrictHostKeyChecking no@g" /etc/ssh/ssh_config


sudo sed -i "s@#ClientAliveInterval 0@ClientAliveInterval 60@g"  /etc/ssh/sshd_config

sudo sed -i "s@#ClientAliveCountMax 3@ClientAliveCountMax 3@g"  /etc/ssh/sshd_config

sudo sed -i "s@#TCPKeepAlive yes@TCPKeepAlive yes@g"  /etc/ssh/sshd_config

sudo sed -i "s@archive.ubuntu.com@mirrors.aliyun.com@g" /etc/apt/sources.list

sudo systemctl restart ssh

sudo passwd ubuntu


 scp -rC -vvvv ./* ./.* ubuntu@xxxxx:~/docker

ssh user@server.com "mkdir -p /var/www/myproject"

scp -r myproject/* user@server.com:/var/www/myproject/


```

## docker k8s lab

https://labs.play-with-docker.com/

https://labs.play-with-k8s.com/

https://killercoda.com/kubernetes/scenario/playground

Ctrl/Command+ Insert copy

Shift + Insert paste

## jlink优化

[Dockerfile](./Dockerfile.md)
