学习笔记网址推送:wDocker 10分钟快速入门_哔哩哔哩_bilibili
docker是用来解决什么问题的?
例如当你在本地主机写了个web应用,而你打算将该应用发送给其他客户端进行案例测试和运行,若是传统做法,就比较复杂:
1.第一种方法是在等待端需要配置相同软件,数据库、Web服务器等,还不一定能使案例运行起来。
2.第二种方法是模拟完全相同的本地开发环境,使用虚拟机,可虚拟机的运行会在每一次不同案例的传送选择新的虚拟机类型和硬件选择,体积臃肿,性能也会受到一定的影响。
3.第三种方法就是docker的使用。
docker在概念上与虚拟机非常类似,但是却轻量很多,docker不会去模拟底层的硬件,而是为每一个应用提供完全隔离的运行环境,而该种环境在docker种也被称为container/容器,并且docker在使用中是完全可以做到跨系统的。
docker内有三大重要概念:1.Dockerfile;2.Image/镜像;3.Container/容器。
Image镜像可以等同于虚拟机的快照(Snapshot),内部包含了所需部署的应用程序及相关联的所有库,通过镜像可以创建许多个不同类型的Container容器,这里的容器可以理解为多台运行起来的虚拟机,每个容器是独立运行的,而各个容器中则包含了所运行的程序。
Dockerfile则类似于一个自动化脚本,可以看作是一个引导文件,其功能类似于在虚拟机中安装和创建软件和前置设置,而在docker中则是通过该脚本自动化完成了。
Docker的安装和使用
windos和mac用户可在官网直接下载一个Docker Desktop的应用,或者winows10以上还可以使用WSL2(windows下的linux子系统)来运行docker;
而在linux系统中则可直接使用包管理工具进行安装;
若使用的是vscode,可以使用安装docker的扩展。
Docker应用部署
1.首先在需要配置部署的根目录下创建一个Dockerfile文件;
2.在Dockerfile文件的第一行需要使用FROM命令指定一个基础镜像(base image),这里使用FROM可极大简便程序运行的前奏,可在docker hub中找到各种不同类型的操作系统,不同的操作系统提供不同的包管理(这里的操作系统指的只是内核以上的系统应用,实际系统仍然是docker下面的linux内核),3.8是版本,slim-buster是一个标签(Tag);
FROM python:3.8-slim-buster
3.第二行通过WOEKDIR指定了之后所有Docker命令的工作路径(working directory);
WOEKDIR /app
4.第三行通过COPY命令将所有程序拷贝到Docker镜像中,COPY <本地路径><目标路径>,第一个参数代表本地文件,"."代表程序根目录下的所有文件,第二个参数代表Docker镜像中的路径,"."表示当前的工作路径,也就是之前指定的app目录;
COPY ..
5.第四行通过RUN,创建镜像时可运行任意的shell命令(echo pwd rm这些指令都是合法的)。
RUN pip3 install -r requirements.txt
6.通过上述所有命令,即可完成一个Docker镜像的创建。
7.在镜像创建完成后,会使用到CMD来指定当Dcoker容器运行起来以后要执行的命令(容器≠镜像),和之前RUN命令不一样,RUN是创建docker时使用的,而CMD时当你在运行容器时才可以使用的操作,CMD ["可执行文件","参数1","参数2"]。
8.接下来可以在TERMINAL中通过docker build来创建一个镜像, 方法中的-t制定了我们镜像的名字(-t: tag/标签),最后面的"."则是告诉docker应该在当前目录下寻找这个Dockerfile,不可省略。第一次调用docker build会比较慢,docker会先下载必要的镜像文件,然后逐行运行我们的指令,后续由于会保留缓存,保留每一个操作(该操作也在docker中被称为分层),则会相对较快。
bash
docker build -t my-finance .
- 有了镜像后,则可通过docker run来启动一个容器,需要注意的是-p参数,它会将容器中的一个端口映射到本地主机上,这样才可以通过主机访问容器中的Web应用(或其他),前面的80是我们本地主机的端口,而后面的5000则是容器上的端口,不可搞反;而-d(--detached)参数则是让容器在后台运行的操作,这样容器的输出就不会直接显示在控制台;
bash
docker run -p 80:5000 -d my-finance
10.完成上述操作后,则可在服务端的主机上运行本机的程序应用。
可通过docker desttop图形化界面可以看到应用在后台的全部输出,这对于调试十分方便,同时我们还可以看到当前容器的各种信息,该处的containers中显示了我们创建的所有容器,可以选择停止,重启,删除他们,也可通过shell进行控制。
操作命令:
bash
列举所有容器:docker ps
停止容器:docker stop <容器 ID>
重启容器:docker restart <容器 ID>
删除容器:docker rm <容器 ID>
启动一个远程Shell:docker exec -it <容器 ID> /bin/bash
需要注意的是,当删除一个容器时,所有数据会同时消失,不过可以使用docker提供的Volume(数据卷)进行数据保存,可以当作是本地主机和不同容器中共享的文件夹,当你在某一个容器中修改了Volume的数据,它会同时反映在其他的容器上,可通过docker volume create来创建一个数据卷。随后在启动容器时通过-v进行参数指定,将这个数据卷挂载到容器的某一个路径上,如案例所示,当前数据卷my-finance-data挂载到了/etc/finance这个路径下,向该路径写入的任何数据都会被永久保存在这个数据卷中。
bash
docker volume create my-finance-data
bash
docker run -dp 80:5000 -v my-finance-data:/etc/finance my-finance
前文的案例只是涉及单个容器,而在实际运行中,则可以使用多个容器相互运行,并行操作,如可以将一个容器运行web应用,另一个容器进行数据库系统的运行,这样可以做到数据和应用逻辑的有效分离。
docker compose
创建docker-compose.yml文件进行配置,分别定义web容器和数据库db容器;
同时还可以通过volumes指定数据卷用来永久存放数据
定义完成后,在终端使用docker compose up -d进行运行所有容器。
与之相对应的,可以使用docker compose down来停止并删除所有的容器