零、前言:
本文是笔者从零开始学习Docker的学习记录。
若笔者有任何疏忽纰漏之处,烦请不吝赐教。
一、Docker简介:
Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要, 而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。
Docker 的入门知识还有以下几点需要了解:
-
镜像 (image) 和容器 (container) 的关系:镜像是容器的模板,容器是镜像运行时的实例。
-
Docker Hub:Docker Hub 是一个公共镜像仓库,可以在这里搜索和下载镜像。
-
Dockerfile: 一个Dockerfile 文件是一个文本文件,包含了一条条指令,它告诉Docker如何构建一个镜像.
-
容器网络:Docker支持多种网络模式,包括host,bridge,overlay等.
-
数据管理:Docker支持将容器中的数据挂载到宿主机上,或者将容器间共享数据.
-
使用docker-compose:docker-compose是一个用来管理多个容器的工具,可以通过一个配置文件来管理多个容器,并且可以一键启动和停止.
-
注意事项:
-
不要在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
文件:
- 在文件资源管理器中,右键单击文件夹并选择 "Save Workspace As..." 来保存当前工作区。
- 选择 "File" 菜单中的 "Save Workspace As..." 来保存当前工作区。
- 在命令面板中输入 "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 运行后,倘若修改项目代码不会立刻生效,需要重新
build
和run
,很麻烦。 - 容器里面产生的数据,例如 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
指定镜像的名字和版本
于是我们的代码就愉快的跑起来了;
余下内容未完待续...
谢谢大家的阅读,欢迎互动,也欢迎访问我的博客!