docker安装与学习

安装Docker

系统环境:macOS Catalina 10.15.7

通过brew安装docker

brew install --cask --appdir=/Applications docker

直接brew install docker装上的好像不是,好像是当成了formula了。如下图

brew cask install docker直接提示命令不对,好像brew cask的安装不是这个命令格式(brew cask install xxx)了

安装好后运行上图中的命令:

docker run -d -p 80:80 docker/getting-started

学习Docker

下面对下面这个命令进行解析:

docker run ubuntu:15.10 /bin/echo "Hello world"
  • docker: Docker 的二进制执行文件。

  • run: 与前面的 docker 组合来运行一个容器。

  • ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

  • /bin/echo "Hello world": 在启动的容器里执行的命令

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

教学操作:

命令行运行:

docker run -d -p 80:80 docker/getting-started

然后 

本地发现没有这个image,就去download了。

可以使用 docker images查看所有镜像

发现已经下载好了docker/getting-started

然后创建一个项目,我这里是用官网的app示例。(应该是一个node.js项目)

项目中本身是没有Dockerfile的,然后我这边是想创建一个,部署好这个项目的新image。于是要新建Dockerfile文件

然后使用docker build命令

docker build -t getting-started .

 该命令使用Dockerfile来构建新的容器映像。

如果只是创建了Dockerfile但是没有编辑的话,运行命令之后会报错:

编辑好Dockerfile之后运行,结果如下:

该过程下载了许多“layers”。这是因为我们指示构建者要从node:12-alpine镜像开始。但是,由于我们的计算机上没有该image,因此需要下载该image。

下载映像后,我们将其复制到应用程序中并用于yarn安装应用程序的依赖项。该CMD指令指定从该映像启动容器时要运行的默认命令。 最后,该-t参数是为了标记了该image。可以简单地将其视为最终image易于理解的名称(不知道image是不是也有个image id?反正container是有id的)。由于我们将图像命名为getting-started,因此在运行容器时可以引用该image。最后的' . '是docker build命令告诉Docker,Dockerfile的所在目录。

Dockerfile不是配置文件,他就是一个执行顺序,使用docker build的时候,会一行一行的执行Dockerfile的,这一点从上图紫色字的过程也可以看出来。

使用命令:

bytedance$ docker run -dp 3000:3000 getting-started

我们以-d“分离”模式(在后台)基于getting-started运行新容器(注意不是docker/getting-started),并在主机的端口3000和容器的端口3000之间创建一个映射。如果没有端口映射,我们将无法访问application。

这行命令返回新建的container的id。

映射之后我们就可以输入http://localhost:3000,来访问当前application了。

docker ps可以得到当前容器。

此时的docker是长这个样子的:

  

分别进入这两个容器可以发现

docker run是创建一个新容器并启动

docker run背后的工作:

Docker在后台运行的标准操作包括:

检查本地是否存在指定的镜像,不存在就从公有仓库下载启动;
利用镜像创建并启动一个容器;
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层;
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
从地址池配置一个ip地址给容器;
执行用户指定的启动命令;
执行完毕后容器被终止。
 

看下面这个例子:

其中,-i选项告诉Docker保持标准输入输出流对容器开放,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。

将启动命令设置为“启动一直运行的子进程”,也就是 /bin/bash

执行完这条命令后,创建并启动容器之后,执行/bin/bash,会启动一个子进程,此时父进程(也就是容器的主进程sh)会进入sleep状态,由于sleep状态不是终止状态,所以容器会继续运行。

为什么在容器中输入exit或者执行ctrl D后,容器将会终止呢,这是因为exit会退出(结束)当前进程,也就是/bin/bash,由于子进程结束,sh主进程恢复到运行态,然而由于没有命令需要继续执行,所以sh主进程结,因此容器终止。

另外一点:

启动容器之后,我们进入容器内部并在终端进行与容器交互。我们可以根据左侧的命令提示符判断自己是否在容器内部。例如上面的例子,当左侧的命令提示符为root@localhost或者电脑主机名(见下图的补充)时,表示我们在容器外部,而命令提示符为:root@3918f5e29f5b/时,表示我们在容器内部,且容器的ID是3918f5e29f5b。我们可以通过exit退出当前的容器。

 

使用docker start命令,使用容器名或者容器id启动一个已经终止的容器。

使用docker stop命令,用来终止一个正在运行的容器。

查看容器信息

Docker中有这样一条命令docker ps,可以查看容器的信息,包括容器ID,基础镜像,启动命令,创建时间,当前状态,端口号,容器名字。

如果执行docker ps,将会显示所有运行中的容器

如果docker ps –a命令,可以查看Docker环境中所有的容器,包括已经停止的容器

其他内容:

后续我们又用brew来配了一下docker内部命令的自动补全:

注意因为我们的brew是装在当前用户下的而不是root下的,所以导致当时bash_completion.d也建在了usr/local下?(我也不确定是不是这个原因,但确实下面这个命令不能用)

不能用下面这个命令:(因为没有这个目录/etc/bash_completion.d/)

sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

运行会报错:

而应该用下面这种命令:

sudo curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose -o /usr/local/etc/bash_completion.d/docker-compose

就可以成功了

其实也就是可执行文件的目录让他在/usr/local/etc下

/usr/local/etc/bash_completion.d/

进入bash_completion目录看一下:

这应该是brew搞的吧?每一个从brew中下载后的,他都会加到这里面来?不然怎么没有git命令。

但是docker,brew,ssh啥的都在里面。这其中的每一个应该都是一个.sh文件?(要知道每一个.sh文件,在终端直接输入他的路径,都是可以直接运行的,比如

当然,.sh文件中第一行要加上

#!/bin/bash

参考链接:

https://blog.csdn.net/wenyichuan/article/details/106944276

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集群、分布式、负载均衡区别与联系

1、Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群) 集群是一个统称,他分为好几种,如:高性能科学群集、负载均衡群集、高可用性群集等。 科学群集 、高性能集群(High performance clus…

Mac下使用brew的常用步骤

以docker为例: 第一步: 先 brew search 软件名 然后发现在Formulae和Casks中都有docker包。 第二步: 分别查看info brew info dockerbrew info homebrew/cask/docker 从详情中可以看出,cask下的才是Docker Desktop for Mac&a…

End User 访问SharePoint URL获取数据流程

当一个User用一个独立的URL请求一个Page页的时候,Client端要创建一个Http请求数据包。然后,Client通过解析DNS去获取HostName来确定IP地址:比如Intranet.contoso.com 客户端在数据包的HostHeader Field添加HostName —>客户端然后通过默…

【MOSS】快速调试Sharepoint站点

1、打开网站根目录下的web.config 1.将<SafeMode ... CallStack"false" ...... AllowPageLevelTrace"false">中的CallStack和AllowPageLevelTrace的属性设置为“true”。 2、 将<customErrors mode"On" />的mode改为"Off&quo…

【机器学习】 - keras中的模型可视化plot_model模块(含依赖包pydot和graphviz的详细安装过程与注意事项)

运行环境&#xff1a; win10 anaconda3-spyder python3.7.4 tensorflow2.0.0 首先需要安装两个包pydot和graphviz&#xff0c;不然会报错&#xff1a; Failed to import pydot. You must install pydot and graphviz for pydotprint to work. 然后去anaconda prompt 里去…

Sharepoint域账户,运行Power Shell报错

以其他域账户登陆Sharepoint 2013 服务器&#xff0c;并以管理员权限运行SharePoint 2013 Management Shell时&#xff0c;出现如下错误&#xff1a; The local farm is not accessible. Cmdlets with FeatureDependencyId are not registered. 同时&#xff0c;所有SharePoin…

【Linux学习】常用指令-sortunique

假设当前文件叫file.txt sort将文件的每一行作为一个单位&#xff0c;相互比较&#xff0c;比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序输出。 sort的-u选项 它的作用很简单&#xff0c;就是在输出行中去除重复行。 sort的-r选项…

【Linux学习】强大的文本分析工具AWK

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 调用AWK&#xff1a; 1.命令行方式&#xff08;常用&#xff09; awk [-F field-separator] commands input-file(s) 其中&#xff0c;comman…

【Knockout】二、监控属性Observables

MVVM和viewModel Knockout是建立在以下三大核心功能之上的&#xff1a; 监控属性和依赖跟踪&#xff08;Observables and dependency tracking&#xff09;声明式绑定&#xff08;Declarative bindings&#xff09;模板&#xff08;Templating&#xff09; 首先让我们先来了解…

【C++学习】对私有构造析构函数的思考:new一个类对象vs直接创建类对象

前置知识&#xff1a; new的类对象需要手动delete。且使用堆空间。且只能用指针接收。 直接创建的类对象创建在栈中&#xff08;或说堆栈&#xff09;。不需要手动delete&#xff0c;随着生存周期的结束&#xff08;如所在的函数return了&#xff09;而释放&#xff0c;和堆栈…

applyBinding Observables

一般的数据绑定有三种:One-Time&#xff0c;One-Way&#xff0c;Two-way。 One-Time绑定模式的意思即为从viewModel绑定至UI这一层只进行一次绑定&#xff0c;程序不会继续追踪数据的在两者中任何一方的变化&#xff0c;这种绑定方式很使用于报表数据&#xff0c;数据仅仅会加…

【git学习】统计git项目某user的代码量

查看自己的代码量&#xff1a;&#xff08;直接awk编程&#xff09; git log --author"username" --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, …

一步步编写操作系统 79 在c代码中内联汇编

基本内联汇编是最简单的内联形式&#xff0c;其格式为&#xff1a; asm [volatile] (“assembly code”) 各关键字之间可以用空格或制表符分隔也可以紧凑挨在一起不分隔&#xff0c;各部分意义如下&#xff1a; 关键字asm用于声明内联汇编表达式&#xff0c;这是内联汇编固定…

LeetCode 237. 删除链表中的节点(思维)

请编写一个函数&#xff0c;用于 删除单链表中某个特定节点 。在设计函数时需要注意&#xff0c;你无法访问链表的头节点 head &#xff0c;只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点 不是末尾节点 。 https://leetcode-cn.com/problems/delete-node-in-a-…

一步步编写操作系统80 扩展内联汇编1

由于基本内联汇编功能太薄弱了&#xff0c;所以才对它进行了扩展以使其功能强大。不过&#xff0c;易用性往往与功能强弱是成正比的&#xff0c;如您所料&#xff0c;扩展内联汇编确实有点难&#xff0c;但在求知欲的驱使下&#xff0c;就让咱们痛并快乐着吧。 gcc本身是个c编…

LeetCode 397. 整数替换

题目大意&#xff1a; 给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果 n 是偶数&#xff0c;则用 n / 2替换 n 。 如果 n 是奇数&#xff0c;则可以用 n 1或n - 1替换 n 。 n 变为 1 所需的最小替换次数是多少&#xff1f; 链接&#xff1a;https://leet…

一步步编写操作系统81 att内嵌汇编语法

内联汇编的格式也变得让人生畏了&#xff0c;感觉既不像C语言&#xff0c;也不像汇编语言&#xff0c;似乎是一种中间产物&#xff0c;不信您看&#xff1a; asm [volatile] (“assembly code” : output : input : clobber/modify) 和前面的基本内联汇编相比&#xff0c;扩展…

LeetCode 375. 猜数字大小 II

题目大意&#xff1a; https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字&#xff0c;就会 赢得游戏 。 如果你…

【转】2.3SharePoint服务器端对象模型 之 访问网站和列表数据(Part 3)

&#xff08;三&#xff09;视图 与传统意义上的数据视图类似&#xff0c;SharePoint中的列表视图指定了列表中数据的筛选条件、排序条件、分组条件、显示栏/字段、显示条目数、显示样式等内容。在SharePoint中&#xff0c;使用SPView表示列表视图&#xff0c;使用SPViewColle…

LeetCode 598. 范围求和 II

https://leetcode-cn.com/problems/range-addition-ii 题目大意 给定一个初始元素全部为 0&#xff0c;大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。 操作用二维数组表示&#xff0c;其中的每个操作用一个含有两个正整数 a 和 b 的数组表示&#xff0c;含义是将所有符…