前言
以下所有操作均在win10系统上进行,终端使用的是PowerSheel。案例讲解均为前端vue项目。
为什么要使用docker?
案例一: 小明所在的公司来了一个新的员工参与他所在的项目开发工作,新员工第一天入职时正准备安装开发环境,拉取代码,过程相当繁琐。小明对新员工说:安装一个
docker
,我把镜像给你直接安装就可以直接开发了。
案例二: 公司有一个项目在测试服务器上完成了开发测试,现在准备卖给n个客户,需要在每个客户的服务器上都单独部署一套,一想到每台服务器都需要做大量的重复性工作就头疼,于是心生一计,在每台服务器上都安装好
docker
,直接使用镜像部署就ok了。
docker是怎么运作的?
先来分析下上方的案例一,流程如下
分析完,相信你已经了解了docker
的基本流程,以及镜像和容器的关系了。
- 镜像(
Image
):Docker 镜像(Image
),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。 - 容器(
Container
):镜像(Image
)和容器(Container
)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 - 仓库(
Repository
):仓库可看成一个代码控制中心,用来保存镜像。
接下来我们可以安装docker
了。
我要用docker去做什么?
- 使用docker去创建开发环境。
- 使用docker去创建生产环境。
安装
在window电脑上安装docker
和简单,在官网地址下载Docker Desktop
直接一键安装即可。
官网地址:docs.docker.com/get-docker/
验证安装是否成功
docker -v
============如果你是window家庭版请阅读本段,否则跳过即可。============
window 家庭版安装说明
因为电脑没有Hyper-V,所以需要先安装一下。
- 安装Hyper-V
将以下内容保存为.cmd文件,然后右键以管理员身份运行。运行成功后输入Y重启电脑。
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
重启电脑后查看Hyper-V是否安装成功,并且都保持勾选状态。
查看方法:win+R输入appwiz.cpl打开程序与功能,点击 启用或关闭 windows 功能
- 家庭版伪装成专业版
由于家庭版的系统不支持Docker Desktop版本的安装,所以我们得把家庭版伪装成专业版从 而绕过软件的检测。
管理员权限打开cmd,输入以下命令修改注册表。
REG ADD "HKEY_LOCAL_MACHINE\software\Microsoft\Windows NT\CurrentVersion" /v EditionId /T REG_EXPAND_SZ /d Professional /F
注意,这个修改会在电脑重启之后恢复原状。只要后续安装成功的话就没有影响了。
完成以上两步后即可正常安装了。
window 家庭版注意安装时只勾选这一项
安装完成后运行您可能遇到以下报错。
- WSL 2 is not installed
解决: 管理员打开cmd运行以下命令。
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /Al
============不是是window家庭版请从以下内容开始。============
你可能遇到的问题
- 未开启虚拟化功能
这是因为电脑没有开启虚拟化功能,在BIOS
中开启虚拟化功能即可。(开启方式自行百度)
检查是否开启了虚拟化
- WSL 2 installation is incomplete.
解决办法:
- 使用win+R输入control appwiz.cpl
- 点击 启用或关闭window功能
- 选中 适用于linux的windows子系统
- 点击提示框中的蓝色链接,打开下图页面,点击下载,更新 Linux 内核包
常用命令
以下仅记录了最常用的命令。
镜像
# 查看镜像
docker images
# 获取镜像
docker pull XXX
# 获取指定版本镜像
docker pull xxx:xxx # 冒号后面为指定tag
# 删除镜像
docker rmi -f 镜像id
-f # 强制删除 (即使有容器使用了该镜像也可以删除镜像,删除了镜像后,容器使用不受影响)
容器
# 以下所有容器名均可以换成容器id
# 创建容器
docker run --name 容器名 -d 镜像名 /bin/bash
-i # 交互式操作
-t # 终端
-d # 不进入容器
-p # 端口映射 -p 本地端口:容器内端口
-v # 目录映射 -v 本地目录绝对路径:容器目录绝对路径
--name # 自定义容器名
# 重命名
docker rename 容器名 新容器名
# 运行容器
docker run 容器名
# 停止运行容器
docker stop 容器名
# 重启容器
docker restart 容器名
# 查看容器列表
docker ps -a
-a 显示所有容器
-q 只显示容器id
# 进入容器
docker exec -it 容器名 /bin/bash
-t # 分配一个伪终端
# 退出容器
exit
# 删除容器
docker rm -f 容器名
导出容器为镜像
docker export 容器id > 保存的路径
导入文件为镜像
cat 文件路径 | docker import - 镜像名
实战
搭建一个nginx服务器
1、安装nginx镜像
docker pull nginx
2、创建一个容器
# 使用nginx镜像创建一个容器
docker run --name test -d -p 8888:80 -v C:\Users\Huan\Desktop\nginx:/usr/share/nginx/html nginx
# -d表示不进入容器,
# -p 8888:80 将容器的80端口映射到本地8888端口
# -v C:\Users\Huan\Desktop\nginx:/usr/share/nginx/html 将容器的/usr/share/nginx/html目录映射到本机的C:\Users\Huan\Desktop\nginx。/usr/share/nginx/html为nginx的默认根目录
3、测试
在主机的 C:\Users\Huan\Desktop\nginx 下创建 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>test</title>
</head>
<body>
<h1>我是docker创建的Nginx服务器</h1>
</body>
</html>
打开浏览器访问 http://localhost:8888
部署前端项目到服务器
假如我们有一个vue项目,已经运行npm run build
后生成了dist文件夹待发布。
接下来我们只需要进入服务器,运行一个nginx的容器,将dist文件丢到nginx的根目录去即可。参考上一个案例。
我要用docker去做什么?
- 本地0环境,使用docker去创建开发环境。
- 服务器0环境,使用docker去创建生成环境。
1、本地0环境,使用docker去创建开发环境。
我们接下来的工作大概是这样的
- 搭建好一个具有开发环境的容器
- 在容器中运行项目,端口映射到本地。
- 在本地主机中进行编码与预览效果。
假如我们现在有一个vue项目,目录结构大概是这样的。所在位置为 C:\Users\Huan\Desktop\dockerTest
现在来完成第一步搭建好一个具有开发环境的容器
# 拉取node镜像,版本根据自己的来。
docker pull node:14.16.0
# 生成一个容器,名字为webDev,容器8080端口映射到本机8080,容器/web目录映射到本地C:\Users\Huan\Desktop\dockerTest,这样在本机开发就具有热更新效果。
docker run --name webDev -d -p 8080:8080 -v C:\Users\Huan\Desktop\dockerTest:/web node:14.16.0
到这里我们就搭建好了容器,接下来运行项目开始搬砖~。
# 进入容器
docker exec -it webDev /bin/bash
# 进入工作目录
cd /web
# 安装依赖
npm config set registry https://registry.npm.taobao.org
npm install
# 运行项目
npm start
# 如果运行起来,在主机却无法访问,请确保vue.config.js文件中
devServer: {
host: '0.0.0.0', 这里必须是0.0.0.0 主机才可以访问。
}
本地浏览器访问 http://localhost:8080/,就可以看到项目运行了。
接下来只需要修改本地的项目文件进行开发,容器内文件会自动更新。
2、服务器0环境,使用docker去创建生成环境。
开发完项目了当然是为了部署到生产环境,根据我们现有的项目我们完全可以像以前一样,在容器中去执行 npm run build
,然后拿着dist文件夹去发布到服务器中(服务器需要nginx等运行环境)。不过既然我们使用了docker,就可以达到服务器0环境来运行。
以下内容涉及到Dockerfile
知识,可以先看看这篇文章了解下Dockefile
,然后回头来看。
我们需要完成的工作大概是这样
- 在服务器中生成一个生产环境的镜像
- 用生成的镜像去创建容器
- 把容器的端口映射到服务器外网
接下来我们利用Dockerfile
去创建镜像,然后生成一个生产环境的容器
在根目录下新建Dockerfile,内容如下
# 使用nginx作为基础镜像
FROM nginx
# 将发布包复制到nginx根目录去
COPY ./dist /usr/share/nginx/html
# 声明80端口
EXPOSE 80
在根目录下打开终端,生成镜像,然后我们可以把镜像导出为文件复制到服务器去,在服务器去生成镜像,生成容器即可。
# 生成镜像
docker build -t myapp .
# 生成开发环境的容器
docker run --name prod -d -p 80:80 myapp
# -p 80:80 容器中的80映射到服务器的80
外网访问服务器80端口即可打开项目了。