赞
踩
docker的出现,让应用环境的配置和发布测试变得非常轻松
它是用来解决什么样的问题
比如写了一个web应用并且本地调试没有任何问题,想要部署到远程的云服务器上,那么首先需要配置相同的软件, 比如数据库、web服务器、必要的插件库等等
而且还不能保证软件一定能够正常运行起来,因为不同的操作系统会有微小的区别,导致运行困难。
为了模拟完全相同的本地开发环境,想到使用虚拟机,但是虚拟机需要模拟硬件,运行整个操作系统不但体积臃肿、内存占用高、程序的性能也会受到影响
container/容器
doctor在概念上与虚拟机非常类似,但却轻量很多,他不会去模拟底层的硬件,会为每一个应用提供完全隔离的运行环境。可以在环境中配置不同的工具软件并且不同环境之间相互不影响,这个环境在docker中也被称作container容器
讲到这里
我们就不得不提到docker中的三个重要概念doctorfile、和
image/镜像
里面包含了你要部署的应用程序,以及他所关联的所有库软件。通过镜像
我们可以创建许多不同的container容器
这里的容器,就像是一台台运行起来的虚拟机,里面运行了你的应用程序。每个容器是独立运行的他们相互之间不影响
doctor file
就像是一个自动化脚本它主要被用来创建镜像。
我们就尝试用doctor来部署一个应用
首先我们在应用的根目录创建一个doctorfile文件
- FROM python:3.8-slim-buster
- WORKDIR /app
- COPY . .
- RUN pip3 install -r requirements.txt
- CMD ["python3", "app.py"]
第一行:FROM命令指定一个基础镜像,冒号后面这一串是版本号,同时也是一个标签。
第二行:WORKDIR指定了之后所有docker命令的工作路径,是这个命令之后的所有docker命令如果这个路径不存在docker会帮你自动创建
第三行:COPY <本地路径> <目标路径>;第一个参数代表本地文件,'.' 代表程序跟目录下的所有文件第二个参数代表doctor镜像中的路径,‘.’ 点代表当前的工作路径,也就是之前指定的app目录
第四行:RUN,允许我们在创建镜像时,运行任意的需要命令(创建镜像的时候使用)
第五行:CMD来指定当doctor容器运行起来以后要执行的命令(运行容器的时候使用的)
接下来我们可以使用doctor build
docker build -t my-finance .
这里的-t指定了我们镜像的名字,最后面的据点告诉docker应该在当前目录下寻找这个doctor file不能省略。
第一次调用doctor build会比较慢,因为doctor会下载必要的镜像文件然后一行行运行我们的指令,不过再次调用就会快很多。因为doctor会缓存之前的每一个操作,这个在doctor中也被称作分层。
有了镜像以后我们可以通过doctor run来启动一个容器
docker run -p 80:5000 -d my-finance
- 列举所有的容器:docker ps
- 停止容器:docker stop <容器id>
- 重启容器:docker restart <容器id>
- 删除容器:docker rm <容器id>
- 启动一个远程Shell:docker exec -it <容器id> /bin/bash
volumes/数据卷
它当做是一个在本地主机和不同容器中共享的文件夹
比如你在容器中修改了某一个volume的数据,它会同时反映在其他的容器上
我们可以通过doctor volume create来创建一个数据卷
docker volume create my-finance-data
随后在启动容器的时候,我们可以通过-v参数指定将这个数据卷挂在到容器的哪一个路径上
docker run -dp 80:5000 -v my-finance-data:/etc/finance my-finance
我们这里将my finance data挂在到了etc/finance这个路径下
向这个路径写入的任何数据都会被永久的保存在这个数据卷中
用一个容器来运行web应用,另一个容器来运行数据库系统。这样可以做到数据和应用逻辑的有效分离
比如当web程序宕机了,数据库依然在有效运转。这个时候我们只需要修复web容器即可
而dcoker compose刚好可以帮我们做到这一点
我们可以创建一个docker-componse.yml文件
- version: "3"
-
- services:
- web:
- build: .
- ports:
- - "80:5000"
- db:
- image: "mysql"
- environment:
- MYSQL_DATABASE: finance-db
- MYSQL_ROOT_PASSWORD: secret
- volumes:
- my-finance-data:
我们通过services来定义多个container
比如这里我们定义一个web容器,它里面运行了我们的web应用
然后再定一个DB容器,里面运行了my sql数据库系统
指定数据库的名字和连接密码
同时在DB容器中.通过volumes指定一个数据卷用来永久存放数据
使用darker compose up来运行所有的容器
- docker componse up -d
- docker componse down 删除所有容器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。