Docker入门学习笔记

学习笔记网址推送: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中被称为分层),则会相对较快。

docker build -t my-finance .

9. 有了镜像后,则可通过docker run来启动一个容器,需要注意的是-p参数,它会将容器中的一个端口映射到本地主机上,这样才可以通过主机访问容器中的Web应用(或其他),前面的80是我们本地主机的端口,而后面的5000则是容器上的端口,不可搞反;而-d(--detached)参数则是让容器在后台运行的操作,这样容器的输出就不会直接显示在控制台;

docker run -p 80:5000 -d my-finance

10.完成上述操作后,则可在服务端的主机上运行本机的程序应用。 

可通过docker desttop图形化界面可以看到应用在后台的全部输出,这对于调试十分方便,同时我们还可以看到当前容器的各种信息,该处的containers中显示了我们创建的所有容器,可以选择停止,重启,删除他们,也可通过shell进行控制。

操作命令:

列举所有容器: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这个路径下,向该路径写入的任何数据都会被永久保存在这个数据卷中。

docker volume create my-finance-data
docker run -dp 80:5000 -v my-finance-data:/etc/finance my-finance

 

前文的案例只是涉及单个容器,而在实际运行中,则可以使用多个容器相互运行,并行操作,如可以将一个容器运行web应用,另一个容器进行数据库系统的运行,这样可以做到数据和应用逻辑的有效分离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/161920.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《轻购优品》新零售玩法:消费积分认购+众筹新玩法

《轻购优品》新零售玩法&#xff1a;消费积分认购众筹新玩法 引言&#xff1a;2023年开年已来&#xff0c;政府的工作报告提出“把恢复和扩大消费摆在优先位置”&#xff0c;并且把2023年定位为“消费提振年”&#xff0c;以“全年乐享全年盛惠”为主题多地政府共同发力&#x…

mmdet 3.x 打印各类指标

和mmdet2.x中的修改地方不一样&#xff0c;在mmdet/evaluation/metrics/coco_metric.py中第72行将classwise设为True就可以打印各类指标了 但是在test的时候一直都是什么指标都不打印&#xff0c;不管是上面总的指标还是下面的各类指标&#xff0c;暂时不知道怎么处理 找到原因…

【一周安全资讯1118】北京高院发布《侵犯公民个人信息犯罪审判白皮书》;工银金融勒索案的事件响应服务商MoxFive是谁?

要闻速览 1、工信部等四部门部署开展智能网联汽车准入和上路通行试点工作 2、北京高院发布《侵犯公民个人信息犯罪审判白皮书》 3、丰田公司确认遭遇美杜莎勒索软件攻击 4、家中设备把数据信息泄露到国外&#xff0c;浙江一男子被罚5000元 5、工银金融勒索案的事件响应服务商M…

合成事件在san.js中的应用

一、 什么是合成事件 DOM3 Event 新增了合成事件(CompositionEvent ), 用于处理通常使用 IME 输入时的复杂输入序列。 二、合成事件常见事件 compositionstart&#xff1a;文本合成系统如 IME&#xff08;即输入法编辑器&#xff09;开始新的输入合成时会触发 compositionst…

如何实现用户未登录不可访问系统

在开发web系统时&#xff0c;如果用户不登录&#xff0c;发现用户也可以直接正常访问系统&#xff0c;这种设计本身并不合理&#xff0c;那么我们希望看到的效果是&#xff0c;只有用户登录成功之后才可以正常访问系统&#xff0c;如果没有登录则拒绝访问。那么我们可以使用过滤…

迪杰斯特拉算法(C++)

目录 介绍&#xff1a; 代码&#xff1a; 结果&#xff1a; 介绍&#xff1a; 迪杰斯特拉算法&#xff08;Dijkstras algorithm&#xff09;是一种用于计算加权图的单点最短路径的算法。它是由荷兰计算机科学家Edsger W. Dijkstra在1956年发明的。 该算法的思路是&#xf…

算法通关村——不简单的字符串转换问题

字符串转化整数(atoi) 1、题目描述 LeetCode8. 请你来实现一个myAtoi(String s)函数&#xff0c;使其能将字符串转换成一个32位有符号整数&#xff08;类似C/C 中的atoi函数&#xff09;。 函数myAtoi(String s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格。检…

Vue3 toRef函数和toRefs函数

当我们在setup 中的以读取对象属性单独交出去时&#xff0c;我们会发现这样会丢失响应式&#xff1a; setup() {let person reactive({name: "张三",age: 18,job: {type: "前端",salary:10}})return {name: person.name,age: person.age,type: person.jo…

OpenAI发布会中不起眼的重大更新

上周&#xff0c;OpenAI的历史首届开发者大会上&#xff0c;OpenAI的首席执行官山姆奥特曼展示了一系列产品更新&#xff0c;包含了众多重磅功能&#xff0c;就算单独拿出来都能让科技圈震一震&#xff0c;一下能发布这么多也真是家底厚。 果不其然&#xff0c;接下来的一周&am…

轻量服务器和云服务器的区别,轻量应用服务器和云服务器区别对比

在云计算时代&#xff0c;服务器作为互联网应用的基础设施&#xff0c;扮演着重要的角色。对于个人用户、个人开发者、学生用户和个人站长来说&#xff0c;选择一款适合自己的服务器是一个关键的决策。本文将介绍轻量服务器和标准云服务器的优点和应用场景&#xff0c;帮助读者…

内存模型以及如何判定对象已死问题

1.展示堆内存溢出 设置堆的内存大小为10M&#xff0c;最大的堆内存为10M&#xff0c;这两个参数最好一致&#xff0c;即便最大内存设置为1G&#xff0c;很有可能也分配不到1G。 -Xmx10M -Xms10M 一直往list放东西 public class T1 {public static void main(String[] args) …

基于 gin + websocket 即时通讯项目 (一、项目初始化)

基于 gin websocket 即时通讯项目 1、安装环境与初始化 搜索各种包官网 https://pkg.go.dev/ 1.1 安装 grom go get -u gorm.io/grom 1.2 安装 MySQL 驱动 go get -u gorm.io/driver/sqlite go get -u gorm.io/driver/mysql 1.3 安装 gin go get -u github.com/gin-gonic/gi…

Matlab绘制双坐标轴图示例函数yyaxis

一、前言 出于一些需求&#xff0c;我们需要将两个不同属性的参量绘制在同一张图上&#xff0c;但是两个参量属性不同&#xff0c;即单位不同&#xff0c;纵坐标值分布范围不同&#xff0c;此刻&#xff0c;我们只需要将一个参量的值在y轴左侧展示&#xff0c;另一个参量的值在…

buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮

buildAdmin 的表头上添加一些按钮&#xff0c;并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮&#xff0c;仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 &#xff0c; 添加&#xff0c; 编辑&…

一文搞懂设计模式之代理模式

大家好&#xff0c;我是晴天&#xff0c;本周我们又见面了。本周有点发烧感冒&#xff0c;更文有点慢了&#xff0c;请大家见谅。言归正传&#xff0c;本周我们继续一起学习一文搞懂设计模式系列文章之代理模式。 什么是代理模式 我们先来看看 GoF 对代理模式的定义&#xff1…

异步任务线程池——最优雅的方式创建异步任务

对于刚刚从校园出来的菜鸡选手很容易写出自以为没问题的屎山代码&#xff0c;可是当上线后就会立即暴露出问题&#xff0c;这说到底还是基础不够扎实&#xff01;只会背八股文&#xff0c;却不理解&#xff0c;面试头头是道&#xff0c;一旦落地就啥也不是。此处&#xff0c;抛…

搭建mysql主从错误集合

1 mysqld --verbose --help --log-bin-index/tmp/tmp.Frnt2oibYI mysqld: Cant read dir of /etc/mysql/conf.d/ my.cnf是在/etc/mysql/conf.d/文件夹下&#xff0c;所以挂载的时候不要写/etc/mysql 2 COLLATION utf8_unicode_ci is not valid for CHARACTER SET latin1 配…

Linux系统编程学习 NO.9——git、gdb

前言 本篇文章简单介绍了Linux操作系统中两个实用的开发工具git版本控制器和gdb调试器。 git 什么是git&#xff1f; git是一款开源的分布式版本控制软件。它不仅具有网络功能&#xff0c;还是服务端与客户端一体的软件。它可以高效的处理程序项目中的版本管理。它是Linux内…

Flink(七)【输出算子(Sink)】

前言 今天是我写博客的第 200 篇&#xff0c;恍惚间两年过去了&#xff0c;现在已经是大三的学长了。仍然记得两年前第一次写博客的时候&#xff0c;当时学的应该是 Java 语言&#xff0c;菜的一批&#xff0c;写了就删&#xff0c;怕被人看到丢脸。当时就想着自己一年之后&…

WeTab--颜值与实力并存的浏览器插件

一.前言 现在的浏览器花花绿绿&#xff0c;有大量的广告与信息&#xff0c;令人目不暇接。有没有一款好用的浏览器插件可以解决这个问题呢&#xff1f;我愿称WeTab为版本答案。 WeTab的界面&#xff1a; 干净又整洁。最最关键的是还有智能AI供你服务。 这个WeTabAI就像chatgp…