docker中含有三个重要概念:

Dockerfile,Image镜像和Container容器

先尝试在vscode安装docker扩展

docker创建volume指向本地目录_Docker

首先打开你的项目,在你的应用根目录下创建一个Dockerfile文件。

docker创建volume指向本地目录_运维_02

docker创建volume指向本地目录_Docker_03

workdir指定了之后所有docker命令的工作路径(注意,是这个命令之后的所有Docker命令

docker创建volume指向本地目录_Docker_04

之后使用copy命令将所有的程序拷贝到Docker镜像中

docker创建volume指向本地目录_Docker_05

第一个参数代表本地路径,“.”代表程序根目录下的所有文件

第二个参数代表Docker镜像中的路径,按照教程这里“.”代表之前指定的app目录

docker创建volume指向本地目录_Docker_06

RUN允许我们在创建镜像时运行任意的shell命令。因为我们docker用的是linux镜像

docker创建volume指向本地目录_数据_07

docker创建volume指向本地目录_Docker_08

通过以上的所有命令,我们就可以完成一个Docker镜像的创建

在最后,我们会用到CMD来指定当Docker容器运行起来后要执行的命令

docker创建volume指向本地目录_docker_09

这里注意一件事,那就是区分RUN与CMD

RUN是创建镜像时使用的

而CMD时运行容器时候使用的

到这里,我们的自动化脚本Dockerfile就完成了。

接下来,使用docker build来创建一个镜像

docker创建volume指向本地目录_docker_10

-t 后面时我们创建镜像的名字

后面的“.”是告诉docker应该在当前目录下找这个Dockerfile文件

创建镜像成功后,我们可以通过docker run来启动一个容器

docker创建volume指向本地目录_运维_11

-p (--port)它会将容器上的某一个端口映射到你的本地主机上,这样才可以从主机上访问容器中的Web应用

前面的80是我们本地主机上的端口,5000是容器的端口

-d (--deteched)让容器在后台运行

最后,不出意外的话,在浏览器搜索localhost就可以访问了

docker创建volume指向本地目录_运维_12

另外,我们可以通过图形界面

docker创建volume指向本地目录_数据_13

可以看到你的容器

docker创建volume指向本地目录_docker_14

可以通过shell远程调试这个容器

docker创建volume指向本地目录_docker_15

这个是所对应的命令行指令

docker创建volume指向本地目录_运维_16

需要注意的是,如果删除容器。则之前所做的修改,新添加的数据会全部丢失。这就好比删除一个虚拟机,里面的数据会一同销毁一样。

docker创建volume指向本地目录_Docker_17

如果我们希望保留容器中的数据,可以使用docker提供的volume数据卷。可以把它当作是一个在本地主机和不同容器中共享的文件夹。

比如你在某个容器中修改了某一个volume的数据,它会同时放映在其他容器

docker创建volume指向本地目录_docker_18

我们可以通过docker volume create来创建一个数据卷

docker创建volume指向本地目录_数据_19

随后在启动容器的时候,可以通过-v参数指定,将这个数据卷挂载(mount)到容器中的哪一个路径上。从这里可以看到我们将my-finance-data挂载到了/etc/finance这个路径下。向这个路径写入的任何数据都会被永久保存在这个数据卷中

docker创建volume指向本地目录_Docker_20

在实际应用中,我们的应用程序可能会用到多个容器共同协作

例如,我们可以使用一个容器来运行web应用,另一个容器来运行数据库系统。这样可以做到数据和应用逻辑的有效分离。比如,当web程序宕机了,数据库依然在有效运转,这个时候我们只需要修复web容器即可,而docker compose刚好可以帮我们做到这一点。

docker创建volume指向本地目录_容器_21

我们可以创建一个docker—compose.yml文件

docker创建volume指向本地目录_容器_22

在这个文件下,我们通过services来定义多个container。比如这里定义一个web容器,它里面运行我们的web应用,然后再定义一个db容器,里面运行了mysql数据库系统

docker创建volume指向本地目录_docker_23

我们话可以通过volumes指定一个数据卷用来永久存放数据。

docker创建volume指向本地目录_运维_24

最后,我们使用docker compose up来运行所有的容器

这里的 -d (detach)同样代表在后台运行所有的容器

docker创建volume指向本地目录_docker_25

docker创建volume指向本地目录_容器_26

我们可以使用docker compose down来停止并删除!!!!!所有的容器

docker创建volume指向本地目录_运维_27

不过新创建的数据卷需要我们手动删除,除非使用docker compose --volumes

docker创建volume指向本地目录_数据_28

另外刚刚讲的所有操作也都可以在图形界面中完成

docker创建volume指向本地目录_Docker_29

此外,再提别的事,就是Kubernetes中的容器引擎(container engines)在处理一些高并发,是比docker的容器有优势的。

在上述的示例中,我们的应用、数据库容器都运行在同一个计算机中。随着应用规模的增大。一台计算机没有办法满足我们的需求 。

docker创建volume指向本地目录_docker_30

当我们想要使用一个集群的电脑来提供服务,并做到负载均衡、故障转移。此时Kubernetes的优势则起来了

docker创建volume指向本地目录_Docker_31

一句话讲,Kubernetes所做的就是将你的各个容器分发到一个集群(cluster)上运行,并进行全自动化管理,包括应用的部署和升级

docker创建volume指向本地目录_数据_32