小提示: 如果你想动手实操一下,那可以不用看用一用目录下的Docker安装步骤,在用 vue 创建个项目整整目录下会教你重新安装阿里云相关镜像的Docker(外网镜像拉取忒慢了,不建议用)
话痨时刻
小插曲: 在大学生时代,没钱这一块,在很多大学生眼里,那就是硬伤呀。虽然知识付费 是应该的,但其实心里想的还是能白嫖就绝不谈钱。
浅浅认识下Docker
Docker 是一个基于轻量级虚拟化技术的容器,Docker 可以将我们的应用程序打包封装到一个容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可以实现方便快速并且与平台解耦的自动化部署方式,无论你部署时的环境如何,容器中的应用程序都会运行在同一种环境下。
Docker 其中包括 镜像、容器、仓库,很简单,目的就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的产品(可以是 web 应用或者数据库应用)及其环境能够做到一次封装,到处运行。
如果你想具体了解一下 Docker ,你可以看看这个:什么是 Docker
小八卦: Docker 公司原名 dotCloud , 主要提供基于 PaaS(Platform as a Service, 平台即服务)的云计算服务。本来 Docker 只是用于该公司自己的项目上的,并没有提供开源,直到公司干不下去了即将濒临破产,Docker 的开发者心想(这么好的技术可不能因为公司倒闭而埋没于世吧,那就太可惜了)。于是就把 Docker 技术开源了,没过多久,Docker 就火的 "一塌糊涂",那确实没办法 Docker 产品开源后实在太火了,后来公司也就改用 Docker 命名了。就下面这位大神,Solomon Hykes Docker创始人所罗门海克斯。虽然如今 Docker 被 Mirantis 收购了,但是它对于计算机领域的贡献和地位还是无法轻易撼动的。
为啥说它好
- 首先:开源免费
它是开源的呀,开源代表啥,那就是可以不要花钱免费使用呀,这对于大学生来讲它不香吗,难不成让大学生去买阿里云、腾讯云的服务器呀,那好贵,用不起呀。
- 其次:更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
- 更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
- 一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
- 持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 DockerFile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
- 更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
- 更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
用一用
先说好哈,能白嫖的我们绝不知识付费,实在不能白嫖的话其实也是可以知识付费一点的。
但是(我是绝不会告诉你还有破解这一名词的,我可啥都没有说哈,说了的话你就当没看见,谢谢您嘞!)
虽然我们买不起阿里云、腾讯云的服务器,但是我们可以在本地部署呀,等以后进公司了有钱了,再买也行。
安装 VMware 并配置 Linux 系统
首先,VMware 那肯定不是免费的,那就不用我多说了,你懂的。
安装好 VMware 后,可以配置 Linux 系统了,俺这里以 Centos7 为例(如果要问俺为啥要用 Centos7 ,其实吗,俺也不知道,都说 Centos7 好,然后我就用了。)
-
VMware +Linux +Centos7 安装配置:Linux环境搭建(俺看的是这个配置的)
SSH客户端
VM自带的终端讲真的,太丑了,用着一点都不习惯
俺推荐使用 MobarXterm 作为SSH客户端:MobaXterm free Xserver and tabbed SSH client for Windows (mobatek.net)
- 创建一个会话
3:将你之前截的以太网相关信息的图上的IP地址填上;
4:设置用户名;
6:为该会话命名;
点击 OK 后,会提示你是第一次连接,点击yes后会让你设置密码,随便设就可以了,下面默认选择然后点击确定就可以了
- 设置一下默认编辑器,这样我们通过 MobarXterm 的FTP工具打开文件时会以指定的编辑器打开,方便修改。我这里配置的是 vscode
- 复制粘贴是很常用的配置,MobarXterm默认左键选中即复制 ,但是需要配置右键点击为粘贴
- 关闭X-Server服务,因为刚接触基本用不到
、
- 默认的登录用户
- ssh保持连接
- 取消连接成功后的欢迎banner
安装 Docker
卸载旧版本
以前没有安装过也执行一下,保险起见吗
cmd
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
配置Docker的yum库
首先要安装一个yum工具,在上一步时,如果你报错了,因为你没用配置yum,所以无法访问yum命令
cmd
yum install -y yum-utils
安装成功后,执行命令,配置Docker的yum源:
cmd
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker
cmd
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
查看docker版本
cmd
docker -v
cmd
docker images
报错是因为你没有启动dockers,所以无法连接到docker的守护进程
启动Docker
cmd
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
配置镜像加速,这里以阿里云镜像加速为例
你先要在阿里云注册一个账号,www.aliyun.com/
找当镜像加速器
输入以下命令
cmd
# 创建目录
mkdir -p /etc/docker
# 切换到docker目录
cd /etc/docker/
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://yp0vmvz0.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
你的docker就部署好啦。由于 dockerHub 访问不了,如果你需要用这个的话,你可以在本地部署,对于新手来说,就没这必要了。
docker常用命令
cmd
# 搜索镜像
docker search 镜像名称
# 拉取对应版本的镜像
docker pull 镜像名称:版本号
# 默认拉取最新的镜像
docker pull 镜像名称
# 查看本地已下载的镜像
docker images
# 查看正在运行的容器
docker ps
# 查看所有的容器(包括run、stop、exited状态的)
docker ps -a
# 查看正在运行的容器
docker container ls
# 只能删除没有在运行的容器
docker rm 容器ID
# 可以删除正在运行的容器
docker rm -f 容器ID
docker run -p 本地主机端口号:容器服务端口号 --name 容器名字 [-e 配置信息修改] -d 镜像名字
# 启动容器
docker start 容器ID
# 终止容器
docker stop 容器ID
# 删除镜像
docker rmi 镜像名称orID
# 强制删除镜像
docker rmi 镜像名称orI --force
拉取个镜像试试
这里俺以hello-world为例
拉取镜像
cmd
docker pull hello-world
查看镜像
cmd
docker images
运行镜像
cmd
docker run hello-world
可视化管理
你可以下载docker的桌面端应用在 Windows 上安装 Docker Desktop |Docker 文档,也可以使用Portainer 容器化管理平台
- 创建 Portainer Server 将用于存储其数据库的卷:
cmd
docker volume create portainer_data
- 下载并安装 Portainer Server 容器:
cmd
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
- 登入
cmd
https://localhost:9443
这样你肯定是无法访问的,因为你的Docker运行地址不是本机,将localhost改为Docker运行地址,俺的是192.168.169.128。
无法访问的话,点击高级后点击继续访问,就行了
设置好密码后,点击Create User进入首页
但如果你无法进入首页,那你可以试着重启一下 portainer。
如果第二次打不开的话,可能会有以下原因:
-
可能是你之前的虚拟机是在后台运行的,再开启电脑时可能虚拟机还在后台,运行这,你需要重启一下虚拟机
-
Portainer默认使用9000端口提供Web界面访问。但是,如果该端口已经被其他应用程序使用,那么Portainer将无法成功绑定到该端口上。为了解决这个问题,我们可以修改Portainer的监听端口。
-
有时候,防火墙可能会阻止外部网络对Portainer的访问。这可能是因为防火墙规则限制了9000端口的访问。为了解决这个问题,我们可以通过修改防火墙规则来允许9000端口的访问。
这些问题网上都有对应的文章去解决,可以去搜一下。
数据卷
所有的镜像只拥有它运行所必须的命令,没有啥vi、ll等命令它都是没有的,那就无法去简单的去修改文本,因此需要用到数据卷了。
数据卷(
volume
)一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
命令 | 说明 |
---|---|
docker volume create |
创建数据卷 |
docker volume ls |
查看所有数据卷 |
docker volume rm |
删除数据卷 |
docker volume inspect |
查看数据卷详情 |
docker volume prune |
清除数据卷 |
DockerFile语法
网络
部署应用时,同时需要部署项目的环境,像mysql、redis等,还需要他们之间可以相互访问,每个容器都是相互隔离的,那如何相互访问呢
cmd
docker network ls
# 创建新的网关(1为网关,其他的到16都是网桥)
docker network create doudou
# 查看ip
ip addr
新的网络:
nginx
nginx介绍:Nginx简介
-
拉取镜像:
docker pull nginx mysql
- 创建mysql容器:
ini
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=12345678 \
3218b38490ce
docker run
:创建并运行一个容器,-d
是让容器在后台运行--name mysql_container
:给容器起个名字,必须唯一-p 3306:3306
:端口映射-e KEY=VALUE
:设置环境变量3218b38490ce
:指定运行的镜像的ID
输入对应的虚拟机IP,数据库容器端口,用户和密码,点击测试链接显示已成功就表示没有问题。
那如何让一个容器一创建就连上之前创建的网络呢:
ini
docker rm -f mysql
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=12345678 \
--network doudou \
3218b38490ce
用 vue 创建个项目整整
这里我采用 vue3 框架创建个初始化项目
在 Docker 配置相关环境
- 拉取项目对应版本的 node(俺这里是 node:16.20.0 的):
cmd
docker pull node:16.20.0
好,麻烦事来了,这里你会发现,这拉取速度,也忒慢了吧(给俺滴心发慌)。没事,别怕,咋们可以换个镜像源试试,阿里云镜像仓库、华为云镜像仓库等,但是俺之前配置了阿里云镜像仓库,为啥还是慢呀,没事,网上有很多关于配置源和镜像的方法,但俺觉得,还没有直接执行快照快,因为可以避免很多不必要的麻烦和 报一些乱七八招的错误,可能会越配置会越乱,直接执行快照省事的很。
执行快照以后,你的虚拟机会回到初始状态,好,接下来,你需要把之前教你如何配置Docker步骤都忘了(把那都看成是垃圾,不用记)。
重新安装一下Docker
- 安装一个yum和其他的一些必要工具:device mapper与device-mapper-persistent-data 和 lvm2
cmd
yum install -y yum-utils device-mapper-persistent-data lvm2
- 配置Docker的yum源:俺用的阿里的
cmd
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 本地索引缓存:
cmd
yum makecache fast
- 安装docker:各个配置项的功能解释
cmd
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 查看Docker版本:
cmd
docker version
- 启动docker
cmd
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
- 配置镜像源:
cmd
# 创建目录
mkdir -p /etc/docker
# 切换到docker目录
cd /etc/docker/
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://yp0vmvz0.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
如果到这了还是慢的话,那只能是你的网络问题了,不然俺是真不知道了,没遇到过呀。
拉取好后,看下镜像列表:
cmd
docker images
创建一个容器
arduino
docker run -it --name node_container c56ec223ce19 /bin/bash
然后你就可以在Portainer中看到node_container的容器了
docker run
: 这是Docker命令的入口,用于启动一个新的容器。-it
:-i
表示以交互式模式运行容器,-t
表示分配一个终端。这样在容器内执行命令时,可以直接看到输出结果。--name node_container
: 给容器指定一个名称,便于识别和管理。c56ec223ce19
: 这个是镜像的ID,表示要运行的镜像。/bin/bash
: 这是要执行的命令,这里指定要运行的shell,这里是bash shell。
运行完上述命令后,您将进入容器的命令行界面。在该界面中,您可以执行任何Node相关的操作,例如安装包、运行脚本等。
本地整个vue项目
sql
pnpm create vue
√ 请输入项目名称: ... great
√ 是否使用 TypeScript 语法? ... 是
√ 是否启用 JSX 支持? ... 是
√ 是否引入 Vue Router 进行单页面应用开发? ... 是
√ 是否引入 Pinia 用于状态管理? ... 是
√ 是否引入 Vitest 用于单元测试? ... 否
√ 是否要引入一款端到端(End to End)测试工具? >> 不需要
√ 是否引入 ESLint 用于代码质量检测? ... 是
√ 是否引入 Prettier 用于代码格式化? ... 是4
项目构建完成,可执行以下命令:
cd great
pnpm install
pnpm format
pnpm dev
来打个包
php
// vite.config.ts
略
export default defineConfig({
base: './', // 方便打包后预览
publicDir: 'public', // 默认 public
略
build: {
cssCodeSplit: true,
emptyOutDir: true,
sourcemap: false,
assetsDir: 'assets', // 默认 assets
outDir: 'dist', // 默认 dist
/** 消除打包大小超过 500kb 警告 */
chunkSizeWarningLimit: 2000
},
略
})
bash
# 打包命令
pnpm build
生成dist目录:
nginx 的配置文件dist.conf
ini
server {
listen 5173;
server_name localhost; # 修改为docker服务宿主机的ip
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
用来构建 Docker 镜像的 Dockerfile 文件
bash
# 该镜像是基于nginx:latest镜像构建的
FROM nginx
# 添加说明,MAINTAINER指令docker弃用了
# MAINTAINER doudou_sir
# 将dist.conf复制到/etc/nginx/conf.d/下,用本地的dist.conf配置来替换nginx镜像里的默认配置
ADD dist.conf /etc/nginx/conf.d/
# 将项目根目录下dist文件夹(构建之后才会生成)下的所有文件复制到镜像/usr/share/nginx/html/目录下
COPY dist/ /usr/share/nginx/html/
构建镜像
俺将dist目录、Dockerfile文件、和dist.conf文件都拖拽到了宿主机root目录下,需要在有Dockerfile文件的目录下构建
erlang
docker build -t vue_demo .
docker images
构建容器
css
docker run -d --name vue_demo -p 5173:5173 --network doudou vue_demo
跑一下试试
成功啦😎