Docker + VSCode组合丨学习记录

7,071 阅读8分钟

零、前言:

本文是笔者从零开始学习Docker的学习记录。

若笔者有任何疏忽纰漏之处,烦请不吝赐教。

一、Docker简介:

Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要, 而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。

Docker 的入门知识还有以下几点需要了解:

  1. 镜像 (image) 和容器 (container) 的关系:镜像是容器的模板,容器是镜像运行时的实例。

  2. Docker Hub:Docker Hub 是一个公共镜像仓库,可以在这里搜索和下载镜像。

  3. Dockerfile: 一个Dockerfile 文件是一个文本文件,包含了一条条指令,它告诉Docker如何构建一个镜像.

  4. 容器网络:Docker支持多种网络模式,包括host,bridge,overlay等.

  5. 数据管理:Docker支持将容器中的数据挂载到宿主机上,或者将容器间共享数据.

  6. 使用docker-compose:docker-compose是一个用来管理多个容器的工具,可以通过一个配置文件来管理多个容器,并且可以一键启动和停止.

  7. 注意事项:

    • 不要在root用户下运行Docker,需要使用sudo

    • 在开发过程中,需要注意容器的版本管理,保证不同环境的稳定性

    • 需要注意容器的网络配置,确保容器之间可以互相访问

    • 容器中的数据需要及时备份


二、小试牛刀

快速开始:

一个非常简单的办法,结合vscode:

以一个Go项目举例:

docker run -dit -v /d/goenv:/root/goenv golang 注意:地址可以自己更换

docker run 是用来启动一个新的 Docker 容器的命令。

  • -d : 后台运行容器,即在后台运行容器而不阻塞当前的终端。
  • -i : 保留标准输入的活性,这样可以在容器中使用命令行
  • -t : 分配一个伪终端(tty),这样可以在容器中使用命令行
  • -v /d/goenv:/root/goenv : 使用 -v 选项将主机的 /d/goenv 目录挂载到容器的 /root/goenv 目录。这样就可以在容器中访问主机上的文件。
  • golang : 指定要使用的 Docker 镜像的名称。

然后使用VSCODE连接就行了 之后就是初始化等等的操作 go mod init goenv 编写main.go等等...

重要概念

镜像:可以理解为软件安装包,可以方便的进行传播和安装。 容器:软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器。

常用相关命令

docker ps 查看当前运行中的容器 docker images 查看镜像列表 docker rm container-id 删除指定 id 的容器 docker stop/start container-id 停止/启动指定 id 的容器 docker rmi image-id 删除指定 id 的镜像 docker volume ls 查看 volume 列表 docker network ls 查看网络列表


Docker VS 普通虚拟机:

特性普通虚拟机Docker
跨平台通常只能在桌面级系统运行,例如 Windows/Mac,无法在不带图形界面的服务器上运行支持的系统非常多,各类 windows 和 Linux 都支持
性能性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来了性能好,只虚拟软件所需运行环境,最大化减少没用的配置
自动化需要手动安装所有东西一个命令就可以自动部署好所需环境
稳定性稳定性不高,不同系统差异大稳定性好,不同系统都一样部署方式

开发方面与WSL2的对比:

Docker 和 WSL 2 两者都可以在 Windows 系统上提供 Linux 环境,但是它们的工作原理和用途是有区别的。

WSL 2 是 Windows Subsystem for Linux 的第二版,可以在 Windows 系统上运行 Linux 子系统,并且支持运行原生 Linux 应用程序。WSL 2 可以让开发者在 Windows 上使用 Linux 环境进行开发,并且可以直接访问 Windows 系统上的文件。

Docker 是一个容器化平台,可以在宿主机上运行多个独立的容器,每个容器都可以运行不同的应用程序。Docker 可以将应用程序和其所需的环境封装在一起,方便进行部署和移植。使用Docker,可以在不同的环境下,方便的部署和调试,并且可以隔离这些环境,不会相互影响.

总的来说,WSL 2 主要用于在 Windows 上使用 Linux 环境进行开发,而 Docker 则更多用于将应用程序和其所需的环境封装在容器中,方便进行部署和移植。


镜像加速源:

镜像加速器镜像加速器地址
Docker 中国官方镜像registry.docker-cn.com
DaoCloud 镜像站f1361db2.m.daocloud.io
Azure 中国镜像dockerhub.azk8s.cn
科大镜像站docker.mirrors.ustc.edu.cn
阿里云https://<your_code>.mirror.aliyuncs.com
七牛云reg-mirror.qiniu.com
网易云hub-mirror.c.163.com
腾讯云mirror.ccs.tencentyun.com

Docker安装软件:

直接安装的缺点

  • 安装麻烦,可能有各种依赖,运行报错。例如:WordPress,ElasticSearch,Redis,ELK
  • 可能对 Windows 并不友好,运行有各种兼容问题,软件只支持 Linux 上跑
  • 不方便安装多版本软件,不能共存。
  • 电脑安装了一堆软件,拖慢电脑速度。
  • 不同系统和硬件,安装方式不一样

Docker 安装的优点

  • 一个命令就可以安装好,快速方便
  • 有大量的镜像,可直接使用
  • 没有系统兼容问题,Linux 专享软件也照样跑
  • 支持软件多版本共存
  • 用完就丢,不拖慢电脑速度
  • 不同系统和硬件,只要安装好 Docker 其他都一样了,一个命令搞定所有

VSCode + Docker

使用VSCode打开Docker中已开启的镜像:

在VSCode中安装Docker插件之后,直接点击,会看到很多已创建好的镜像,

右键然后在VSCode里打开就好了(具体的名字可能不是这个,翻译问题)

.code-workspace文件说明:

.code-workspace 文件是 Visual Studio Code 的工作区文件,它用于记录打开的文件夹和已安装的插件等配置信息。

在 Visual Studio Code 中,你可以通过以下方式生成 .code-workspace 文件:

  1. 在文件资源管理器中,右键单击文件夹并选择 "Save Workspace As..." 来保存当前工作区。
  2. 选择 "File" 菜单中的 "Save Workspace As..." 来保存当前工作区。
  3. 在命令面板中输入 "Save Workspace As..." 并回车来保存当前工作区。

保存后的工作区文件将会以 .code-workspace 为扩展名保存在你指定的位置.


三、继续向前

DockerFile相关:

先看一个例子:

FROM node:11
MAINTAINER easydoc.net

# 复制代码
ADD . /app

# 设置容器启动后的默认运行目录
WORKDIR /app

# 运行命令,安装依赖
# RUN 命令可以有多个,但是可以用 && 连接多个命令来减少层级。
# 例如 RUN npm install && cd /app && mkdir logs
RUN npm install --registry=https://registry.npm.taobao.org

# CMD 指令只能一个,是容器启动后执行的命令,算是程序的入口。
# 如果还需要运行其他命令可以用 && 连接,也可以写成一个shell脚本去执行。
# 例如 CMD cd /app && ./start.sh
CMD node app.js

Dockerfile 是用来构建 Docker 镜像的配置文件。其中,RUN 指令是用来在镜像构建过程中执行命令的。

在这个例子中,RUN npm install --registry=https://registry.npm.taobao.org 的作用是安装 npm 包,并将 npm 的镜像源设置为淘宝镜像,为了加速npm 的安装速度。

这个命令会在Docker容器中执行,会在容器中安装npm的包,在这个命令执行完成后,npm包已经安装在容器中了。

注意:使用 npm install 命令前需要先使用COPY或者ADD指令将项目文件复制到容器中。

参考:Dockerfile reference | Docker Documentation


目录挂载:

目录挂载可以解决的问题:

  • 使用 Docker 运行后,倘若修改项目代码不会立刻生效,需要重新buildrun,很麻烦。
  • 容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了。

目录挂载的方式

  • bind mount 直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上
  • volume 由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上
  • tmpfs mount 适合存储临时文件,存宿主机内存中。不可多容器共享。

bind mount 方式用绝对路径 -v D:/code:/app

volume 方式,只需要一个名字 -v db-data:/app,注意,这里的db-data就是名字,这块区域由容器自己来创建。

bind mount例:docker run -p 9090:8080 --name test-hello -v D:/code:/app -d golang:v1

  • 这里是把项目的代码目录挂载到容器里面的/app目录
  • 把容器的8080暴露到伺服器的9090端口
  • 容器名字命名为test-hello
  • 挂载绝对目录
  • -d表示在后台运行
  • golang:v1指定镜像的名字和版本

于是我们的代码就愉快的跑起来了;


余下内容未完待续...

谢谢大家的阅读,欢迎互动,也欢迎访问我的博客!

conqueror712.github.io/