某次阿里云的自动流水线失败了,代码本地跑起来莫得问题,错误日志提示让我跑一下npm run build ,但是俺忽然发现,我跑了,文件打包好了,但是往哪里运行呢?这涉及到要构建一个环境供打包文件部署吧?于是查了查,想起了之前大佬说过的docker。
于是有了这一篇研究笔记,over。本笔记的目的就是研究一下docker怎么用,最终成果是把俺的项目用新构建的环境跑起来。
Docker 边学边用
1、下载docker的应用软件,同时申请一个docker的账号。
下载个人免费版就好了,然后打开软件后我一脸懵,(全英文)(不是),参考了几个博客后还是没懂。
参考:
镜像、容器、仓库1
镜像、容器、仓库2-未写完
中文版docker入门教程
名词解释:
- 镜像(Image):镜像包含了容器运行时所需的程序、资源、配置等文件信息,是一个特殊的文件系统,但是它不包含任何的动态数据。镜像是分层存储的结构,分层存储的特征使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Dockerfile可用于构建镜像。 - 容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以看作是一个进程,它可以被创建、启动、停止、删除、暂停等。因为容器是通过镜像来创建的(实例化镜像),所以必须先有镜像才能创建容器,而生成的容器是一个独立于宿主机的隔离进程,并且有属于容器自己的网络和命名空间。
一个镜像可以拥有多个容器,正如它可以有多个实例化进程一样。 - 镜像仓库(Registry / Repository):存储镜像的地方,就像github,集中存储、分发镜像的服务,便于我们在不同的环境使用某一个镜像。一个Resistry也可以由很多只保存同一镜像的不同版本的小仓库组成。
2、尝试根据提示自己在本地开一个容器跑一跑
就在软件边上的containers,点进去就会提示你跑一下这个命令:docker run -d -p 80:80 docker/getting-started
然后我就试着运行了一下,这个命令就帮我创建了一个镜像还有它的容器。就可以在浏览器打开了
接下来找补地解释一下
docker run
命令用于启动容器,它可以通过镜像创建一个容器。docker/getting-started
启动的镜像名称(可以自己取)-d
:(detached)表示后台启动。即当前进程为守护进程,会一直处于运行状态。
-p 80:80
:主机80端口映射容器80端口(web请求时注意设置该端口的值为实际端口值)
以上,只要再学会多一些操作镜像、容器、仓库的命令就已经四舍五入我会了!(不是)。
比如
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
我们本地没有任何镜像,但是我们可以使用这个命令从Docker官方提供的仓库服务Docker Hub上拉取官方或第三方已经构建好的镜像。
要拉取镜像,需要指定Docker Registry的URL和端口号,默认是Docker Hub,另外还需要指定仓库名和标签,仓库名和标签唯一确定一个镜像,而标签是可能省略,如果省略,则默认使用latest作为标签名,而仓库名则由作者名和软件名组成。
如果我们想要拉取centos镜像,可以使用docker pull centos
- 查看本地镜像
Docker的镜像名由仓库名和标签组成,docker images
可用于查看本地所有的镜像,同时如果拉取到相同名称的镜像,之前的镜像名称会变成<none>
,我们称之为虚悬镜像,可以重新给它取名字,也可以把它删掉,具体的命令行参考这里。搜索虚悬就好了。 - 使用
docker commit conntaner_id [ID]
容器可以提交为镜像,不过这样没办法追溯镜像被新加的层次内容,因此更多使用DockerFile来定义新增的镜像。这样一来,我们不用把镜像分发给别人,而只是把Dockerfile和相应需要写入镜像的资料发给别人,别人也能自己构建镜像,安全透明。 - 容器的启动、停止、删除、导出、查看状态(stats)、明细(inspect)等命令。
3、进行实验,在本地跑一个已经npm run build打包好的项目。
如果想要跑我们的项目代码,根据上面查询的知识,我们晓得必须得有一个镜像把项目运行所需的资源、代码包装好,然后再根据镜像生成项目的容器,接下来运行容器。制作镜像需要借助 Dockerfile 文件,所以我们先要写一下Dockerfile。
什么是Dockerfile
参考1:Dockerfile
参考2(写得更通俗易懂):Dockerfile
** 推荐阅读:DockerFile详解 **如果有一天我们想要制作一个反复使用的镜像,每一次使用都要重新安装环境和配置很麻烦,但是使用Dockerfile就可以达到一次制作反复clone的效果了。只需要把步骤都写进一个文件里,然后让docker自己去实现就好了。
Dockerfile其中的每一条指令都会构建出一层镜像,因此每一条指令就是用于描述该镜像如何构建。并且docker的构建使用缓存机制,如果重复构建镜像,第一次构建的内容能被缓存下来,并被后续的构建使用,对每一条指令,docker都会检查有没有相应的缓存镜像与其对应,如果有,则为缓存命中,但是一旦没有命中,此后的所有命令将不再使用缓存,所以,在编写Dockerfile文件的时候,尽量将稳定的不会改变的命令放在前面,产生变化的命令放在后面,以更好的利用缓存。
常用命令 * FROM 指定基础镜像文件 * MAINTAINER 维护者的信息 * RUN 执行命令 * EXPOSE 对外暴露的端口 * ADD 复制文件到容器中,若是压缩文件会自动解压 * COPY 复制文件到容器中,若是压缩文件不会自动解压 * WORKDIR 改变工作目录(切换目录) * ENTRYPOINT 运行容器时执行的命令(default 自启动) CMD 在docker run 时运行,用于指定在容器启动时所要执行的命令 RUN 是在docker build时运行,用于指定镜像构建时所要执行的命令
DockerFile开头命令为 FROM,它指定了基础镜像,比如一开始我们选择了基础镜像为ubuntu
FROM ubuntu:18.04
,接下来就可以使用(RUN)环境的命令语言apt-get
进行安装其他的内部软件了,比如RUN apt-get install python3-pip -y
。
其实就好像虚拟机装了一个环境(From),然后在虚拟机的终端页面RUN安装依赖命令,指定工作目录(MKDIR),把配置(COPY)拷过去,或者设置ENV环境变量,最后切换工作目录(WORKDIR),就可以开始跑项目了(CMD)。
幸运的是我这里已经有写好了的dockerfile。
但是怎么能偷工减脸捏?如果想要从头编写一个dockerfile应该怎么写?
参考:以create-react-app为例部署docker项目
参考:保姆级的部署docker项目教程
参考:编写Dockerfile并运行(推荐阅读)
首先把dockerfile运行起来,把我们的镜像构建一下。步骤如下,命令在本地的终端内执行即可。
- 编写dockerfile文件。
- docker build 运行文件。(docker build 命令用于使用 Dockerfile 创建镜像。)
进入我们的dockerfile所在的工作目录,运行docker build -t <标签名,例:myProj/docker:test> .
最后有一个点非常重要不要漏了,这代表是基于当前目录下的dockerfile文件执行的镜像。
可以看到我们的命令行一步步执行。
- docker run 运行镜像。或者直接在docker的客户端界面中操作即可。
- docker push 仓库,将镜像上传到镜像库。
K8s使用
参考:
Kubernetes原理与架构初探
全称Kubernetes。是谷歌推出的一个容器集群管理系统,为什么简称是k8s呢,因为k和s之间有8个字母…
接下来我主要学习的是使用方面,因此本篇的目的主要是会使用阿里云的k8s服务。
在搜索这里找到K8S并且开通认证。
看一下学习文档先什么是阿里云Kubernetes监控