docker中含有三个重要概念:
Dockerfile,Image镜像和Container容器
先尝试在vscode安装docker扩展
首先打开你的项目,在你的应用根目录下创建一个Dockerfile文件。
workdir指定了之后所有docker命令的工作路径(注意,是这个命令之后的所有Docker命令)
之后使用copy命令将所有的程序拷贝到Docker镜像中
第一个参数代表本地路径,“.”代表程序根目录下的所有文件
第二个参数代表Docker镜像中的路径,按照教程这里“.”代表之前指定的app目录
RUN允许我们在创建镜像时运行任意的shell命令。因为我们docker用的是linux镜像
通过以上的所有命令,我们就可以完成一个Docker镜像的创建
在最后,我们会用到CMD来指定当Docker容器运行起来后要执行的命令
这里注意一件事,那就是区分RUN与CMD
RUN是创建镜像时使用的
而CMD时运行容器时候使用的
到这里,我们的自动化脚本Dockerfile就完成了。
接下来,使用docker build来创建一个镜像
-t 后面时我们创建镜像的名字
后面的“.”是告诉docker应该在当前目录下找这个Dockerfile文件
创建镜像成功后,我们可以通过docker run来启动一个容器
-p (--port)它会将容器上的某一个端口映射到你的本地主机上,这样才可以从主机上访问容器中的Web应用
前面的80是我们本地主机上的端口,5000是容器的端口
-d (--deteched)让容器在后台运行
最后,不出意外的话,在浏览器搜索localhost就可以访问了
另外,我们可以通过图形界面
可以看到你的容器
可以通过shell远程调试这个容器
这个是所对应的命令行指令
需要注意的是,如果删除容器。则之前所做的修改,新添加的数据会全部丢失。这就好比删除一个虚拟机,里面的数据会一同销毁一样。
如果我们希望保留容器中的数据,可以使用docker提供的volume数据卷。可以把它当作是一个在本地主机和不同容器中共享的文件夹。
比如你在某个容器中修改了某一个volume的数据,它会同时放映在其他容器
我们可以通过docker volume create来创建一个数据卷
随后在启动容器的时候,可以通过-v参数指定,将这个数据卷挂载(mount)到容器中的哪一个路径上。从这里可以看到我们将my-finance-data挂载到了/etc/finance这个路径下。向这个路径写入的任何数据都会被永久保存在这个数据卷中
在实际应用中,我们的应用程序可能会用到多个容器共同协作
例如,我们可以使用一个容器来运行web应用,另一个容器来运行数据库系统。这样可以做到数据和应用逻辑的有效分离。比如,当web程序宕机了,数据库依然在有效运转,这个时候我们只需要修复web容器即可,而docker compose刚好可以帮我们做到这一点。
我们可以创建一个docker—compose.yml文件
在这个文件下,我们通过services来定义多个container。比如这里定义一个web容器,它里面运行我们的web应用,然后再定义一个db容器,里面运行了mysql数据库系统
我们话可以通过volumes指定一个数据卷用来永久存放数据。
最后,我们使用docker compose up来运行所有的容器
这里的 -d (detach)同样代表在后台运行所有的容器
我们可以使用docker compose down来停止并删除!!!!!所有的容器
不过新创建的数据卷需要我们手动删除,除非使用docker compose --volumes
另外刚刚讲的所有操作也都可以在图形界面中完成
此外,再提别的事,就是Kubernetes中的容器引擎(container engines)在处理一些高并发,是比docker的容器有优势的。
在上述的示例中,我们的应用、数据库容器都运行在同一个计算机中。随着应用规模的增大。一台计算机没有办法满足我们的需求 。
当我们想要使用一个集群的电脑来提供服务,并做到负载均衡、故障转移。此时Kubernetes的优势则起来了
一句话讲,Kubernetes所做的就是将你的各个容器分发到一个集群(cluster)上运行,并进行全自动化管理,包括应用的部署和升级