📝 Windows + Docker + VS Code Remote-Containers 故障排查与恢复

📝 Windows + Docker + VS Code Remote-Containers 故障排查与恢复#

1️⃣ 背景问题#

常见报错:

  • remote-containers.explorerTargetsRefresh: stream is closed

  • An error occurred attaching to the container

  • Unable to read file '…package.json'

原因一般为:

  1. Docker context 错误(VS Code 连接到错误 Docker 引擎)

  2. Remote-Containers / Dev Containers 扩展损坏或缓存残留

  3. VS Code 内部缓存或 workspaceStorage 被锁

  4. 容器本身缺 shell 或 ENTRYPOINT 阻塞(本次案例排除)


2️⃣ 排查 Docker Context#

docker context ls
  • 正确 context 应该指向 Windows Docker 引擎:
default *
  • 如果 context 是 desktop-linux,切换回默认:
docker context use default
  • 验证容器可访问:
docker ps
docker exec -it <container> sh
docker exec -it <container> bash

✅ 能进入容器说明容器正常。

Podman

Podman#

docker img

常用命令#

2. 启动容器并进入交互模式#

你可以使用 docker run 命令启动容器并进入容器的交互式 shell。这样你就可以进入容器内部进行调试。

复制代码

docker run -it --entrypoint /bin/bash nova-crawler:latest

参数说明:#

  • -it-i 表示以交互模式运行容器,-t 给容器分配一个伪终端,这样你就可以在终端与容器交互。
  • --entrypoint /bin/bash:这将覆盖容器的默认入口点,直接启动一个 bash shell 以便你进入容器进行调试。
  • nova-crawler:latest:你要运行的镜像名称。

3. 启动容器并调试特定命令#

如果你不想进入容器的 shell,而是想直接执行调试命令(比如启动应用并在调试模式下运行),可以使用以下命令:

bash

复制代码

docker run -it --entrypoint /bin/bash nova-crawler:latest -c "your-debug-command"

4. 查看容器日志#

如果你希望在调试时查看容器的日志输出,可以使用以下命令:

bash

复制代码

docker logs <container_id>

你可以通过 docker ps 查找运行的容器 ID,然后查看日志输出。

5. 调试时挂载本地目录(可选)#

如果你需要调试代码,并且希望挂载本地目录到容器中进行实时编辑,可以使用 -v 参数来挂载本地目录。例如,假设你的本地代码在 /path/to/your/code 目录下:

bash

复制代码

docker run -it -v /path/to/your/code:/app --entrypoint /bin/bash nova-crawler:latest

k8s技术分享

k8s技术分享#

工作负载资源#

一、pod#

1. 概要#

  1. 可创建管理、最小的可部署计算单元,是可以在主机上运行的容器的集合
  2. 我们的服务都在其中运行。如我们的服务是nginx,则最内层是我们的服务 nginx,运行在 container 容器当中。container (容器) 的本质是进程,而 pod 是管理这一组进程的资源
  3. 所以pod可视为一个极为轻量化、没插网线的电脑,如果所需任务无需交互,那么用pod就很合适。例如给它挂载一个文件来训练模型、生成报表,可以根据场景使用 Job 或者 CronJob 或者其它

图示关系如下#

![[k8s-pod-insert.png]]

2. pod网络#

  1. 当然,pod 可以管理多个 container,又因为container (容器) 的本质是进程,如果有本地网络通信需求(使用 localhost 或者 Socket 文件进行本地通信),在这些场景中使用 pod 管理多个 container 就非常的推荐。

  2. 如下图展示了Pod网络所依赖的3个网络设备

    1. eth0是节点主机上的网卡,支持该节点流量出入的设备、也是支持集群节点间IP寻址和互通的设备;

    2. docker0是一个虚拟网桥,可以简单理解为一个虚拟交换机,支持该节点上的Pod之间进行IP寻址和互通的设备;

    3. veth0则是Pod1的虚拟网卡,支持该Pod内容器互通和对外访问的虚拟设备;

    4. docker0网桥和veth0网卡,都是linux支持和创建的虚拟网络设备;

    5. pause属于特殊容器,其运行的唯一目的是为Pod建立共享的veth0网络接口

![[k8s-nginx-pod.png]]

二、deploymentStatefulSet#

1. 概要#

  1. Deployment 使得 Pod 和 ReplicaSet 能够进行声明式更新

  2. StatefulSet 表示一组具有一致身份的 Pod:

    1. 身份定义为:

        - 网络:一个稳定的 DNS 和主机名。

        - 存储:根据要求提供尽可能多的 VolumeClaim。

        StatefulSet 保证给定的网络身份将始终映射到相同的存储身份。

        虽然pod完全具备在生产环境中部署独立的单体服务的能力,但在生产环境中,我们基本上不会直接管理 pod,我们会使用deployment 代为控管。延续上面的比喻就是将 deployment 视为一个好用的机房管理员:帮助我们进货,对pod进行开关机,对pod做系统升级和重装系统以实现功能升级和回滚。 StatefulSet 也相同,只不过每次它会保证一致性,而不像deployment 每次重启都是随机分配

Docker

Docker#

docker img

教程手册#

好用的使用教程

Install#

略过~ 😁

打镜像和跑#

docker build -t server:v0 . -f server.dockerfile

#

docker run -p 9080:80 --name server server:v0

指定启动命令#

sudo docker run -it -p 9080:80 --name nova_server nova_server:v0 sh -c "echo hello"

加入自定义网络#

--network {{network name}} 详见:[[#Network]]

跑出问题-进入容器排查#

sudo docker run -it -p 9080:80 --name nova_server nova_server:v0 sh -c "bash"

使用-it进入容器手动执行命令进行调试

启动全部容器#

docker ps -a | grep "Exited" | awk '{print $1}' | xargs docker start

Network#

  1. docker run时容器加入方法-redis为例
  2. 后期加入方式
  3. 创建一个新网
  4. 检测
    init_redis:
    	docker run -p 6379:6379 \\
    	--network websafe-network \\
    	--name redislatest redis:latest --requirepass 3b21d032a7fd8eb51fa7bd8a2e812b78b7b3a36f 
    
    join_network:
    	docker network connect websafe-network mysql56
    	docker network connect websafe-network daemon-xxx
    
    init_network:
    	docker network create websafe-network
    
    check_network:
    	docker network inspect websafe-network
    	docker network inspect websafe-network | findStr IPv4Address
    

删除#

可视化#

go install github.com/jesseduffield/lazydocker@latest

如果需要sudo权限的话无法直接执行命令,只能where获取原始路径后sudo+原始路径执行 如:

Docker

Docker#

docker img

教程手册#

好用的使用教程

Install#

略过~ 😁

基础命令#

打镜像和跑#

#

docker build -t server:v0 . -f server.dockerfile

dockerignore#

如果您想在 Dockerfile 中将当前目录中的所有文件都复制到 Docker 镜像中,可以使用 Dockerfile 中的 COPY 指令。具体的语法如下:

COPY . /目标路径/

其中. 表示当前目录,/目标路径/ 表示目标路径,这里可以是绝对路径或相对路径。 这将会将当前目录中的所有文件复制到镜像中的 /app/ 目录下。请注意,在这种情况下,所有文件和文件夹都会被复制到镜像中,包括隐藏文件和文件夹。如果您不想复制某些文件或文件夹,可以在运行 COPY 指令之前通过 .dockerignore 文件来指定忽略的文件和文件夹。

#

docker run -p 9080:80 --name server server:v0

指定启动命令#

sudo docker run -it -p 9080:80 --name nova_server nova_server:v0 sh -c "echo hello"

加入自定义网络#

--network {{network name}} 详见:[[#Network]]

跑出问题-进入容器排查#

sudo docker run -it -p 9080:80 --name nova_server nova_server:v0 sh -c "bash"

使用-it进入容器手动执行命令进行调试