Skip to content

如何在浏览器上写代码

如何使用 docker 部署 vscode

在 Docker 上部署 VS Code 需要使用一个特殊的版本的 VS Code,叫做 Code Server。Code Server 是一个允许你在远程服务器上运行 VS Code 的版本。

以下是一个基本的步骤:

  1. 安装 Docker:如果你还没有安装 Docker,你需要首先在你的机器上安装 Docker。你可以从 Docker 官网下载对应操作系统的 Docker 版本。

  2. 拉取 Code Server 镜像:你可以从 Docker Hub 上拉取 Code Server 的 Docker 镜像。这可以通过以下命令完成:

    docker pull codercom/code-server:latest
  3. 运行 Code Server 容器:下一步是运行 Code Server 的 Docker 容器。你可以使用以下命令来完成:

    docker run -it -p 127.0.0.1:8080:8080 -v "$HOME/.config:/home/coder/.config" -v "$PWD:/home/coder/project" codercom/code-server:latest

    这个命令做了以下几件事情:

    • -it 让容器在交互模式下运行。
    • -p 127.0.0.1:8080:8080 把容器的 8080 端口映射到宿主机的 8080 端口。
    • -v "$HOME/.config:/home/coder/.config" 把你的本地.config目录映射到容器中的/home/coder/.config。这样你就可以保持你的 VS Code 配置在不同的容器中保持一致。
    • -v "$PWD:/home/coder/project" 把你当前的工作目录映射到容器的/home/coder/project。这样你就可以在容器中编辑你的项目代码。
  4. 访问 VS Code:最后,你可以在你的浏览器中访问http://localhost:8080来使用 VS Code。

这只是一个基本的配置,你可能需要根据你的具体情况进行调整。例如,你可能需要安装额外的 VS Code 插件,或者配置 SSH 密钥等。

我的 8080 端口被占用了,我是修改前面还是后面

如果你的 8080 端口已经被占用,你可以选择其他未被占用的端口。在下面的命令中,我选择了 9090 作为新的端口:

docker run -it -p 127.0.0.1:9090:8080 -v "$HOME/.config:/home/coder/.config" -v "$PWD:/home/coder/project" codercom/code-server:latest

这个命令的意思是,把容器内的 8080 端口映射到主机的 9090 端口。这样,你就可以通过访问http://localhost:9090来使用 VS Code 了。

需要注意的是,修改的是冒号前面的部分(即主机端口),冒号后面的部分(即容器内部端口)通常保持不变,因为它是应用程序在容器内部监听的端口。

遇到这个问题,如何给他足够的权限

bash
[root@VM-20-6-centos ~]# docker run -it -p 127.0.0.1:9000:8080 -v "$HOME/.config:/home/coder/.config" -v "$PWD:/home/coder/project" codercom/code-server:latest
[2023-06-13T16:25:45.684Z] error EACCES: permission denied, mkdir '/home/coder/.config/code-server'

这个错误是由于容器内的用户(在这个例子中是coder)没有足够的权限来创建或写入到你主机上的$HOME/.config目录。

一种解决方案是改变这个目录的权限,使得任何用户都可以读写。你可以使用下面的命令来做这个操作:

bash
chmod -R 777 $HOME/.config

然后你可以再次尝试运行 Docker 命令。

但是请注意,这个命令将为所有用户提供对这个目录的读、写和执行权限。在一些情况下,这可能会导致安全问题。因此,你需要确保这个方案适合你的具体情况。

另一种可能更安全的方法是,将你要挂载的目录改为一个用户coder有权限访问的目录。例如,你可以创建一个新的目录,如$HOME/coder_config,然后改变它的所有者为coder

bash
mkdir $HOME/coder_config
chown -R coder:coder $HOME/coder_config

然后,在运行 Docker 命令时,把$HOME/.config改为$HOME/coder_config

bash
docker run -it -p 127.0.0.1:9000:8080 -v "$HOME/coder_config:/home/coder/.config" -v "$PWD:/home/coder/project" codercom/code-server:latest

这样,容器内的用户coder就应该能够访问和写入到/home/coder/.config目录了。

如何通过域名访问,是否必须要 https?

要通过域名访问你的 Code Server,你需要做以下几步:

  1. 域名解析:首先,你需要有一个已经注册的域名,并将这个域名解析到你的服务器的 IP 地址。这个操作需要在你的域名注册商的网站上完成。

  2. 端口映射:你需要确保你的服务器的防火墙允许从外部访问你的 Code Server 的端口(在上面的例子中是 9000 端口)。具体的步骤取决于你的服务器的操作系统和防火墙配置。

  3. 启动 Code Server:运行 Code Server 的 Docker 容器时,你需要把容器的端口映射到服务器的公网端口,而不是 127.0.0.1。这可以通过修改-p选项实现:

    bash
    docker run -it -p 0.0.0.0:9000:8080 -v "$HOME/.config:/home/coder/.config" -v "$PWD:/home/coder/project" codercom/code-server:latest

    这样,你的 Code Server 就可以从外部通过http://your-domain:9000访问了。

至于是否需要 HTTPS,这取决于你的具体需求。如果你只是在本地网络内使用 Code Server,或者你的网络环境是安全的,那么可能不需要 HTTPS。但是,如果你的 Code Server 需要从公网访问,或者你需要保护你的代码和密码不被窃取,那么你应该使用 HTTPS。

设置 HTTPS 需要一个有效的 SSL 证书。你可以从证书颁发机构(如 Let's Encrypt)获取一个免费的证书。设置 HTTPS 通常需要一个反向代理服务器,如 Nginx 或 Apache,来处理 HTTPS 连接并将其转发到 Code Server。这个过程的具体步骤超出了这个回答的范围,但你可以在网上找到许多相关的教程和资源。

下面这个错误如何解决

bash
fatal: detected dubious ownership in repository at '/home/coder/project/vite-docs'
To add an exception for this directory, call:

        git config --global --add safe.directory /home/coder/project/vite-docs

这个错误信息表明 Git 检测到/home/coder/project/vite-docs目录的所有者可能存在问题。这可能是由于你在容器内以coder用户身份运行 Git 命令,但是/home/coder/project/vite-docs目录是由其他用户创建的。

有几种方法可以解决这个问题:

  1. 更改目录所有者:你可以尝试更改/home/coder/project/vite-docs目录的所有者为coder用户。在宿主机上,你可以使用chown命令来完成这个操作:

    bash
    chown -R coder:coder /path/to/your/project/vite-docs

    注意,你需要将/path/to/your/project替换为你的项目在宿主机上的实际路径。

  2. 添加安全例外:如错误信息所示,你也可以通过添加一个安全例外来解决这个问题。你可以在容器内运行下面的命令:

    bash
    git config --global --add safe.directory /home/coder/project/vite-docs

    这会告诉 Git 忽略/home/coder/project/vite-docs目录的所有者检查。

无论你选择哪种方法,你都需要根据你的具体情况进行调整,并确保你的操作不会引起其他安全问题。

使用 dockerfile 运行 vscode

当然,你完全可以在 Docker 容器内部自己安装 Node.js。

事实上,这是一种更通用的做法,因为这样可以确保你的应用在所有环境中都有相同的行为。

你可以在 Dockerfile 中添加安装 Node.js 的命令,然后使用这个 Dockerfile 构建你的 Docker 镜像。以下是一个简单的示例:

Dockerfile
FROM codercom/code-server:latest

# Install curl (needed to download Node.js)
RUN apt-get update && apt-get install -y curl

# Install Node.js
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install -y nodejs

# Verify that Node.js was installed
RUN node -v
RUN npm -v

这个 Dockerfile 做了以下操作:

  • 从 codercom/code-server:latest 镜像开始构建
  • 安装 curl(需要用来下载 Node.js)
  • 通过 curl 下载并安装 Node.js
  • 验证 Node.js 是否已经安装

你可以将这个 Dockerfile 保存到一个文件中,然后在同一个目录下运行 docker build -t my-code-server . 命令来构建你的 Docker 镜像。然后,你就可以用这个新镜像来运行你的 Docker 容器了,例如 docker run -it -p 9000:8080 my-code-server

这样,你就有了一个包含 Node.js 的 code-server 环境。

这个部分如何增加到 dockerfile 中

-v "$HOME/.config:/home/coder/.config"
-v "$PWD:/home/coder/project" \

bash
docker run -it -p 9000:8080 \
  -v "$HOME/.config:/home/coder/.config" \
  -v "$PWD:/home/coder/project" \
  my-code-server

这两个 -v 选项在 docker run 命令中是用来映射宿主机和 Docker 容器之间的目录。这些目录映射(或卷映射)允许容器读取和修改宿主机上的文件和目录。

然而,这些映射不能直接添加到 Dockerfile 中。Dockerfile 用于构建 Docker 镜像,而不是运行容器。Dockerfile 中的每一条指令都会创建一个新的镜像层,而这些层是只读的,不能被修改。因此,你不能在 Dockerfile 中指定在运行时要修改的文件或目录。

但是,你可以在 Dockerfile 中使用 WORKDIR 指令来设置容器内的工作目录。例如,你可以添加以下行到你的 Dockerfile 中:

Dockerfile
WORKDIR /home/coder/project

然后,当你运行你的 Docker 容器时,你仍然需要提供 -v 选项来映射宿主机和容器之间的目录。例如:

bash
docker run -it -p 9000:8080 \
  -v "$HOME/.config:/home/coder/.config" \
  -v "$PWD:/home/coder/project" \
  my-code-server

在这个命令中,$HOME/.config 是你宿主机上的目录,/home/coder/.config 是容器内的目录。同样,$PWD 是你当前的工作目录,/home/coder/project 是容器内的工作目录。这两个 -v 选项分别将这两个目录对映射到了容器内。

这个命令是否可以通过 docker-compose.yml 来书写

是的,你可以使用 docker-compose.yml 文件来定义和运行你的 Docker 应用。以下是一个示例的 docker-compose.yml 文件,它运行一个 code-server 容器并设置了相应的端口和卷映射:

yaml
version: "3"
services:
  code-server:
    image: codercom/code-server:latest
    restart: always
    ports:
      - "9000:8080"
    volumes:
      - "$HOME/.config:/home/coder/.config"
      - "$PWD:/home/coder/project"

这个 docker-compose.yml 文件做了以下几件事情:

  • 定义了一个名为 code-server 的服务。
  • 这个服务使用 codercom/code-server:latest 镜像。
  • 如果这个服务由于任何原因停止,Docker Compose 将自动重新启动它。
  • 它将容器的 8080 端口映射到宿主机的 9000 端口。
  • 它将宿主机的 $HOME/.config 目录和当前工作目录 $PWD 分别映射到了容器的 /home/coder/.config/home/coder/project 目录。

你可以通过运行 docker-compose up 命令来启动这个服务。如果你想在后台运行,可以添加 -d 选项,例如 docker-compose up -d

要使用 这个 codercom/code-server:latest 镜像 最好还要有 python3 环境

如果你想在你的 Docker 镜像中添加 Python 3 环境,你可以在 Dockerfile 中添加一些步骤来安装 Python 3。下面是一个示例的 Dockerfile,它在安装 Node.js 的基础上,添加了安装 Python 3 的步骤:

Dockerfile
FROM codercom/code-server:latest

USER root

# Update the system and install curl
RUN apt-get update && apt-get install -y curl

# Install Node.js using Taobao's mirror
RUN curl -sL https://npmmirror.com/mirrors/node/latest-v16.x/node-v16.x-linux-x64.tar.xz | tar -Jxv -C /usr/local --strip-components=1

# Install Python 3 using the system package manager
# RUN apt-get install -y python3 python3-pip

# Switch back to coder user
USER coder

这个 Dockerfile 做了以下几件事情:

  • 从 codercom/code-server:latest 镜像开始构建
  • 安装 curl(需要用来下载 Node.js)
  • 通过 curl 下载并安装 Node.js
  • 安装 Python 3 和 pip(Python 的包管理器)
  • 验证 Node.js、npm、Python 3 和 pip 是否已经安装

你可以将这个 Dockerfile 保存到一个文件中,然后在同一个目录下运行 docker build -t my-code-server . 命令来构建你的 Docker 镜像。然后,你就可以用这个新镜像来运行你的 Docker 容器了,例如 docker run -it -p 9000:8080 my-code-server

这样,你就有了一个包含 Node.js 和 Python 3 的 code-server 环境。

要用上面的 docker-compose 来启动

要使用 docker-compose 来启动使用 Dockerfile 构建的镜像,你需要在 docker-compose.yml 文件中指定 build 选项而不是 image 选项。以下是一个修改后的示例:

yaml
version: "3"
services:
  code-server:
    build: .
    restart: always
    ports:
      - "9000:8080"
    volumes:
      - "$HOME/.config:/home/coder/.config"
      - "$PWD:/home/coder/project"
yaml
version: "3"
services:
  code-server:
    build: .
    restart: always
    ports:
      - "9000:8080"
    volumes:
      - "$HOME/.config:/home/coder/.config"
      - "/home/:/home/coder/project"
    environment:
      - PASSWORD=1234

在这个文件中,build: . 指示 Docker Compose 在当前目录下查找 Dockerfile,并使用它来构建服务的镜像。然后,它将执行与之前相同的端口和卷映射。

你可以通过运行 docker-compose up 命令来启动这个服务。如果你想在后台运行,可以添加 -d 选项,例如 docker-compose up -d

请注意,每次 Dockerfile 更改时,你需要运行 docker-compose up --build 来重新构建镜像。或者,你可以单独运行 docker-compose build 来构建镜像,然后运行 docker-compose up 来启动服务。

是否可以修改为淘宝镜像来安装 node 和 python

当然,你可以使用淘宝的镜像来更快地安装 Node.js 和 Python。以下是一个示例 Dockerfile:

Dockerfile
FROM codercom/code-server:latest

USER root

# Update the system and install curl
RUN apt-get update && apt-get install -y curl

# Install Node.js using Taobao's mirror
RUN curl -sL https://npmmirror.com/mirrors/node/latest-v16.x/node-v16.x-linux-x64.tar.xz | tar -Jxv -C /usr/local --strip-components=1

# Install Python 3 using the system package manager
# RUN apt-get install -y python3 python3-pip

# Switch back to coder user
USER coder

这个 Dockerfile 用淘宝的 Node.js 镜像代替了官方的 Node.js 安装源,可以加快在中国大陆的安装速度。然而,Python 3 依然使用的是系统的包管理器进行安装,因为我没有找到适合的淘宝 Python 镜像。如果你知道有更好的 Python 镜像源,你可以替换这个命令来使用它。

请注意,使用淘宝的镜像可能会引入一些安全风险,因为它可能不像官方的镜像那样频繁地更新和审核。如果你在一个安全敏感的环境下工作,我建议你坚持使用官方的镜像。

如何在浏览器访问 CodeServer 启动的项目

  1. 需要在docker-compose.yml 中指定公开到宿主主机的端口号
yml
version: "3"
services:
  code-server:
    build: .
    restart: always
    ports:
      - "9000:8080"
      - "5173:5173"
      - "5174:5174"
    volumes:
      - "$HOME/.config:/home/coder/.config"
      - "/home/:/home/coder/project"
    environment:
      - PASSWORD=1234
  1. 需要在云服务器进行端口放行

一般在防火墙哪里,不会的自行百度或者抖音找我都可以

  1. 启动的时候需要指定--host
bash
npx vitepress dev --host 0.0.0.0

解决VSCode无法使用宿主主机的git问题

bash
root@eea67d7ec1d9:/home/coder/project/vite-docs/# git commit -m 'feat: 更新服务器安装VSCode'
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'root@eea67d7ec1d9.(none)')
root@eea67d7ec1d9:/home/coder/project/vite-docs/#

修改下面的 volumes 注意拷贝后的目录是 /root

bash
version: "3"
services:
  code-server:
    build: .
    restart: always
    ports:
      - "9000:8080"
      - "5173:5173"
      - "5174:5174"
    volumes:
      - "/home/:/home/coder/project"
      - "$HOME/.config:/root/.config"
      - "$HOME/.gitconfig:/root/.gitconfig" # 使用宿主主机的git配置
      - "$HOME/.ssh:/root/.ssh" # 使用宿主主机的.ssh配置
      - "$HOME/.local:/root/.local" # 解决VSCode插件的问题 容器销毁后丢失的问题
    environment:
      - PASSWORD=123456

如何更换Code Serve favicon图标

如果你想更改 Code Server 的 Favicon 图标,可以按照以下步骤进行操作:

  1. 在你的项目文件夹中创建一个名为 Dockerfile 的文件(如果已经存在则跳过此步骤)。

  2. Dockerfile 中添加以下内容来自定义 Code Server 的 Docker 镜像:

Dockerfile
FROM codercom/code-server

# 将自定义的 Favicon 图标文件复制到 Code Server 的资源文件夹
COPY favicon.ico /usr/lib/code-server/src/browser/media/favicon.ico
  1. 准备一个新的 Favicon 图标文件,确保它是 ICO 格式的。你可以使用图标生成工具或在线转换工具将现有图像转换为 ICO 格式。

  2. 将新的 Favicon 图标文件重命名为 favicon.ico

  3. 在与 docker-compose.yml 文件相同的目录中,创建一个名为 code-server 的文件夹,并将新的 Favicon 图标文件放入其中。

  4. 更新你的 docker-compose.yml 文件,将 build 关键字添加到 code-server 服务中,并指定 Dockerfile 的路径:

yaml
version: "3"
services:
  code-server:
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    ports:
      - "9000:8080"
      - "5173:5173"
      - "5174:5174"
    volumes:
      - "/home/:/home/coder/project"
      - "$HOME/.config:/root/.config"
      - "$HOME/.gitconfig:/root/.gitconfig" # 使用宿主主机的git配置
      - "$HOME/.ssh:/root/.ssh" # 使用宿主主机的.ssh配置
      - "$HOME/.local:/root/.local" # 解决VSCode插件的问题 容器销毁后丢失的问题
    environment:
      - PASSWORD=0616
  1. 在终端中,使用 Docker Compose 启动 Code Server:
bash
docker-compose up --build -d

这样,新的 Favicon 图标文件将被复制到 Code Server 的 Docker 容器中,并在启动时生效。你可以通过访问 Code Server 的 Web 页面来验证 Favicon 图标是否已更换。