零、前语:
本文是笔者从零开始学习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
指定镜像的姓名和版别
所以咱们的代码就愉快的跑起来了;
余下内容未完待续…
谢谢大家的阅读,欢迎互动,也欢迎拜访我的博客!
落雨乄天珀夜 (gitee.io)