doocker
参考中文官网:开始使用 -- Docker官方文档|Docker中文文档|Docker中文文档|Docker官方教程
我是使用vscode的wsl配置的,最开始测试时发现docker run hello-world总是error,用了阿里云加速都没用,后来下载了Docker Desktop,每次用之前先打开就莫名其妙好了。
记得测试:
1.一些基本指令
docker version #显示docker详细信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker --help #docker帮助命令手册
2.镜像命令
我是这么理解的:镜像 = 类 容器 = 实例
docker images #查看所有本地主机的镜像
docker search 镜像名 #搜索镜像
docker pull 镜像名 [标签] #下载镜像(如果不写tag,默认是latest)
docker rmi 镜像名 [标签] #删除镜像 docker rmi -f $(docker images -aq) 删除全部镜像
docker tag 镜像名:版本 新镜像名:版本 #复制镜像并且修改名称
docker commit -a "xxx" -c "xxx" 镜像ID 名字:版本 #提交镜像
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
docker load -i /xxx/xxx.tar #导入镜像
docker save -o /xxx/xxx.tar #保存一个镜像为一个tar包
3.容器命令
docker run [可选参数] image 命令 #启动容器(无镜像会先下载镜像)
#参数说明
--name = "Name" 容器名字
-c 后面跟待完成的命令
-d 以后台方式运行并且返回ID,启动守护进程式容器
-i 使用交互方式运行容器,通常与t同时使用
-t 为容器重新分配一个伪输入终端。也即启动交互式容器
-p 指定容器端口 -p 容器端口:物理机端口 映射端口
-P 随机指定端口
-v 给容器挂载存储卷
docker build #创建镜像 -f:指定dockerfile文件路径 -t:镜像名字以及标签
docker logs 容器实例的ID #查看容器日志
docker rename 旧名字 新名字 # 给容器重新命名
docker top 容器实例的ID #查看容器内进程
docker ps -a #列出所有容器(不加-a就是在运行的)
docker rm 容器实例的ID #删除容器(正在运行容器不能删除,除非加-f选项)
docker kill 容器实例的ID #杀掉容器
docker history 镜像ID #查看docker镜像的变更历史
docker start 容器实例的ID #启动容器
docker restart 容器实例的ID #重启容器
docker stop 容器实例的ID #停止正在运行的容器
docker attach /docker exec 容器实例的ID #同为进入容器命令,不同的是attach连接终止会让容器退出后台运行,而exec不会。并且,docker attach是进入正在执行的终端,不会情动新的进程,而docker exec则会开启一个新的终端,可以在里面操作。
docker image inspect 容器名称:容器标签 #查看容器内源数据
docker cp 容器id:容器内路径 目的主机路径 #从容器内拷贝文件到主机(常用)或者从主机拷贝到容器(一般用挂载)
exit #直接退出容器
crlt + P + Q #退出容器但是不终止运行
docker run的三种方式
第一种:交互方式创建容器,退出后容器关闭。
docker run -it 镜像名称:标签 /bin/bash
第二种:守护进程方式创建容器。
docker run -id 镜像名称:标签
通过这种方式创建的容器,我们不会直接进入到容器界面,而是在后台运行了容器,
如果我们需要进去,则还需要一个命令。
docker exec -it 镜像名称:标签 /bin/bash
通过这种方式运行的容器,就不会自动退出了。
push的时候,按照官网说明
docker build -t usrname/dockerfile:latest .
然后很快就能在自己的repository看到了
3. 顺便使用docker下载学习了 nginx
1.隔离问题
使用 Docker 运行的 Nginx 容器默认与宿主机环境隔离,但可以通过 Docker 提供的命令 查看容器内部状态 或 进入容器内调试。以下是关键命令的使用方法:
1. docker top <容器名或ID>
查看容器内正在运行的进程(类似于宿主机的 ps
或 top
命令)。
# 假设容器名为 nginx
docker top nginx
# 输出示例:
UID PID PPID C STIME TTY TIME CMD
root 1234 456 0 10:00 ? 00:00:00 nginx: master process nginx -g daemon off;
www 5678 1234 0 10:00 ? 00:00:00 nginx: worker process
- 快速检查 Nginx 的主进程(
master process
)和工作进程(worker process
)是否正常运行。 - 确认容器内是否有其他意外进程。
2. docker exec
:进入容器或执行命令
# 进入容器的 Bash 终端(如果容器支持 Bash)
docker exec -it nginx /bin/bash
# 如果容器基于 Alpine 镜像(无 Bash),使用 sh
docker exec -it nginx /bin/sh
# 查看容器内的文件列表
docker exec nginx ls /etc/nginx
# 检查 Nginx 配置语法是否正确
docker exec nginx nginx -t
# 重载 Nginx 配置(无需进入容器)
docker exec nginx nginx -s reload
2.在Nginx中,server
和location
是配置虚拟主机和请求路由的核心模块。
server{}
块的作用**
-
定义虚拟主机
- 每个
server{}
块代表一个虚拟主机(Virtual Host),用于处理特定域名、端口或IP的请求。 -
是否代表一个网站?
- 是的。通常情况下,一个
server{}
块对应一个网站(如一个域名)。 - 但一个物理服务器上可以运行多个
server{}
块(即多个虚拟主机),实现一台服务器托管多个网站。
- 是的。通常情况下,一个
-
默认服务器
- 如果请求未匹配任何
server_name
,Nginx会使用第一个匹配监听端口(如listen 80
)的server{}
块作为默认响应。 - 可通过
listen
指令的default_server
参数显式指定默认主机
- 如果请求未匹配任何
- 每个
location{}
块的作用**
-
URI路由
location{}
块嵌套在server{}
内部,用于匹配请求的URI,并定义如何处理这些请求。
完整的配置结构
# 定义第一个虚拟主机(网站:example.com)
server {
listen 80;
server_name example.com;
location / {
root /var/www/example;
index index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
# PHP处理配置
}
}
# 定义第二个虚拟主机(网站:another-site.com)
server {
listen 80;
server_name another-site.com;
location / {
root /var/www/another;
index index.html;
}
}
kubernetes
推荐学习视频:
https://www.bilibili.com/video/BV1Se411r7vY?vd_source=3d0a14a267c9cbda8f2a6184dd8c564d
简介
- 定义:开源容器编排系统,用于自动化部署、扩展和管理容器化应用。
- 核心功能:
- 自动化容器调度与负载均衡。
- 自我修复(自动重启失败容器)。
- 水平扩展(根据负载动态调整实例数量)。
- 应用场景:微服务架构、CI/CD流水线、混合云部署。
核心组件
kubernetes通过奖容器放入在节点(Node)上运行的Pod中来执行工作负载
1. Ingress(入口)
- 作用:管理外部访问集群服务的HTTP/HTTPS路由规则(如域名、路径路由)。
- 功能:
- 替代NodePort直接暴露服务,提供更灵活的流量管理。
- 支持TLS终止、负载均衡(需配合Ingress Controller如Nginx、Traefik)。
- 示例场景:将
example.com/api
路由到后端API服务。
2. StatefulSet(有状态集)
- 特点:
- 为有状态应用(如数据库、Redis)提供稳定的Pod标识(固定主机名、持久化存储)。
- 按顺序部署/扩展(Pod名称后缀为有序索引,如
mysql-0
、mysql-1
)。
- 与Deployment区别:
特性 Deployment StatefulSet Pod名称 随机哈希 固定有序索引 存储卷 临时卷 持久化卷(PVC) 适用场景 无状态应用 MySQL、MongoDB等
3. ConfigMap(配置映射)
- 用途:将非敏感配置(如环境变量、配置文件)与容器镜像解耦。
- 使用方式:
- 挂载为容器内的文件(如
application.properties
)。 - 直接注入为环境变量。
- 挂载为容器内的文件(如
4. Secret(密钥)
- 作用:存储敏感数据(如密码、TLS证书),Base64编码但需额外加密(建议结合Vault)。
- 与ConfigMap对比:
# ConfigMap示例 apiVersion: v1 kind: ConfigMap data: LOG_LEVEL: "INFO" # Secret示例 apiVersion: v1 kind: Secret data: DB_PASSWORD: "MTIzNDU2" # Base64编码的"123456"
5. Volumes(存储卷)
- 类型:
- 临时卷(emptyDir):Pod生命周期内有效。
- 持久卷(PersistentVolume/PV):独立于Pod生命周期,需绑定PVC(PersistentVolumeClaim)。
- 常见后端:NFS、AWS EBS、Ceph。
组件间协作关系
- 用户请求流程:
Ingress
→Service
→Pod
(由Deployment/StatefulSet
管理) → 读取ConfigMap/Secret
或挂载Volume
。 - 数据流示例:
- 前端应用(Deployment)通过Service访问后端数据库(StatefulSet)。
- 数据库密码从Secret获取,配置文件通过ConfigMap挂载。
- Master节点组件:
- API Server:集群入口,处理REST操作。
- Scheduler:分配Pod到Node。
- Controller Manager:维护集群状态(如副本数)。
- etcd:分布式键值存储,保存集群数据。
- Worker节点组件:
- kubelet:与Master通信,管理容器生命周期。
- kube-proxy:实现服务网络代理和负载均衡。
- 容器运行时(如Docker/containerd):运行容器。