零、前语:

本文是笔者从零开始学习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指定镜像的姓名和版别

所以咱们的代码就愉快的跑起来了;


余下内容未完待续…

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

落雨乄天珀夜 (gitee.io)