docker系列之了解docker

237 阅读8分钟

前言

以下所有操作均在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去做什么?

  1. 使用docker去创建开发环境。
  2. 使用docker去创建生产环境。

安装

在window电脑上安装docker和简单,在官网地址下载Docker Desktop直接一键安装即可。

官网地址:docs.docker.com/get-docker/

验证安装是否成功

docker -v

============如果你是window家庭版请阅读本段,否则跳过即可。============

window 家庭版安装说明

因为电脑没有Hyper-V,所以需要先安装一下。

  1. 安装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 功能

  1. 家庭版伪装成专业版

由于家庭版的系统不支持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.

解决办法:

  1. 使用win+R输入control appwiz.cpl
  2. 点击 启用或关闭window功能
  3. 选中 适用于linux的windows子系统
  4. 点击提示框中的蓝色链接,打开下图页面,点击下载,更新 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去做什么?

  1. 本地0环境,使用docker去创建开发环境。
  2. 服务器0环境,使用docker去创建生成环境。
1、本地0环境,使用docker去创建开发环境。

我们接下来的工作大概是这样的

  1. 搭建好一个具有开发环境的容器
  2. 在容器中运行项目,端口映射到本地。
  3. 在本地主机中进行编码与预览效果。

假如我们现在有一个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,然后回头来看。

我们需要完成的工作大概是这样

  1. 在服务器中生成一个生产环境的镜像
  2. 用生成的镜像去创建容器
  3. 把容器的端口映射到服务器外网

接下来我们利用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端口即可打开项目了。