什 么 是 容 器?  

容器只是实现隔离的一种方法。与虚拟机不同,它们不是通过模拟硬件来实现隔离,而是通过使用现有的Linux内核功能来实现隔离。

在典型的Unix/Linux操作系统中,所有进程都共享相同的用户空间,但是随着Linux 2.6+中新功能的引入,您可以创建一个进程,该进程具有自己特定的一组隔离上下文的进程,如文件树、线程等。这些功能与其他内核技术结合在一起是容器的神奇之处!

◆ ◆ ◆  ◆ ◆

在本文中,我将介绍基本的Docker命令和概念。读完后,您将能够采用一些Docker功能来加速和简化您的日常工作流程。

安装Docker

在OS X/Windows中,使用安装向导安装Docker是一项简单的任务。您可以在Docker社区页面上找到操作系统的安装程序。在Linux上,Docker通常在分发包管理器中可用。

在Fedora中安装Docker :

sudo dnf install docker

要开始这个过程:

sudo systemctl start docker

要使Docker进程启动和启动时间:

sudo systemctl enable docker

在使用Systemd的其他Linux发行版中,这些步骤应该类似。

入门

Hello  World

完成安装后,我们应该尝试一个Hello World!

#sudo is only for Linux
sudo docker run --name hello -it busybox echo "Hello World!" # Hello World!

只有在运行某些Linux发行版时才需要使用sudo,但请记住,Docker需要管理员权限创建容器。在OSX和Windows编写本文时,本文使用了一些基于Linux的虚拟机,因此Docker命令可以在这些系统中没有特权用户的情况下运行。

如何运行

sudo docker run <options> <image> <command to run inside the container>

run选项创建并运行一个容器,其中一个属性是docker将容器的生命绑定到正在运行的进程(在本例中是linux命令echo),这意味着当进程完成时,容器将终止。

  • name:我们设置容器的名称,如果您不选择任何内容,Docker将随机选择一个。

  • it:这意味着交互,它将我们的终端连接到容器虚拟tty的输出,允许与正在运行的进程交互。

  • busybox:这是创建容器的基本映像,将其视为zip文件,其中包含运行所需应用程序所需的文件和文件夹。在Docker Hub中有一个完整的社区基础图像,我使用BusyBox,因为它非常轻,只有715 kb的压缩空间。

  • echo:正如我们前面提到的,echo是我们试图执行的命令,它包含在busybox映像中。

如果要检查busybox中可用的命令,请执行以下操作:

sudo docker run -it busybox ls /bin/

列出镜像

当您第一次执行docker命令时,您可以使用以下命令检查本地镜像:

sudo docker images

在守护进程模式下运行

在某些情况下,我们不希望直接与某些应用程序(如服务器)交互,在这种情况下,我们希望生成进程并返回我们的终端继续执行一些工作,Docker为我们提供了一种在守护进程模式下执行进程的方法像这样的-d参数:

sudo  docker  run  - d  - name  snooze  busybox  sleep  15

此过程将在后台运行15秒,然后退出。

列出后台运行容器

容器在后台运行后,您可以使用ps检查其状态:

sudo  docker  ps

杀死运行容器

停止容器很简单:

sudo docker stop [name of your container]
#example
sudo docker stop snooze

此命令将停止正在运行的容器,但Docker服务将保留您创建的容器,包括其关联的命令缓存在磁盘中。如果需要重新启动,只需执行:

sudo docker start snooze

如果想要更改配置并重新使用容器名称,则需要停止并删除容器,假设我们要更改休眠容器,使其休眠10秒而不是15秒:

# stop & clean
sudo docker stop snooze
sudo docker rm snooze
# re-create
sudo docker run -d --name snooze busybox sleep 10

安装

-v参数将使我们能够挂载/从一个文件夹映射主机(我们的电脑)到容器内的文件夹中。

我们来创建一个文件:

echo 'Hello World' > hello

现在我们要使用busybox中提供的隔离文本编辑器打开文件:

# Opening the file with our contained VIM
sudo docker run -it busybox vi hello

没有任何反应,这是因为我们调用的vi进程是隔离的,无法访问包含区域之外的文件。要解决这个问题,我们需要挂载文件夹,以便我们的编辑器能够找到该文件。

#the :z in /app:z -> is for SELinux, non-Linux can ignore this.
sudo docker run -it -v "$(pwd)":/app:z busybox vi app/text

这会将实际文件夹$(pwd)装入容器中的文件夹/应用程序。如果文件夹中不存在,那么将创建它,然后使用vi并传递挂载文件夹vi app/hello的文件位置。

一些观察结果:

  • 该v将覆盖容器中以前的任何文件夹。如果存在,它将替换为提供的文件夹。

  • 这个命令实际上是挂载文件夹,所以一旦容器被杀死,容器对这个文件夹所做的每一个更改都将被持久化,如果您希望数据库在容器生命周期之外持久化其数据,这是一个好主意。

  • 容器将可以访问您的系统资源(共享文件夹),因此请小心。

联网

-p允许我们公开一个隔离端口并将其传递给特定的主机端口。

为了说明网络如何与容器一起工作,首先让我们开始编写一个简单的Javascript脚本来启动服务器。我们将在本地机器上执行此操作,所以让我们编写一些代码。

require('http')   .createServer((req, res) => { res.end('Hello World!') }).listen(8080)

我们将调用这个文件index.js,它基本上创建了一个在端口8080中等待连接的服务器。当有人连接时,它会发送一个Hello World!

下一步是在容器中运行脚本。我们可以通过编写以下命令来完成此操作:

sudo  docker  run  - it  - v  “$(pwd)”:/ app:z  - name  myserver  mhart / alpine - node  node  app / index。JS

这里的新东西是mhart / alpine-node的基本镜像,它将拉出一个Node.JS容器,然后将像我们之前那样使用-v挂载文件夹,然后执行隔离节点app / index.js进程。

让我们看看我们的服务器是否正常工作:

sudo docker exec -it myserver wget -qO- localhost:8080
# Hello World%

这个命令测试我们的服务器在容器中工作,我们应该返回hello world%。现在,让我们尝试从主机连接,打开一个新终端,然后写:Hello World%

curl http://localhost:8080
#curl: (7) Failed to connect to localhost port 8080: Connection refused

我们无法连接,因为容器网络是孤立的; 我们需要拉取之前的端口:

# stopping our container
sudo docker stop myserver
sudo docker rm myserver
sudo docker run -it -v "$(pwd)":/app:z -p 8080:8080 --name myserver   mhart/alpine-node node app/index.js

现在尝试在浏览器中打开http:// locahost:8080,你应该看到一个  hello world!

恭喜!你已经编写了一个很好的NodeJS应用程序。最大的优势之一是您可以在不安装NodeJS的情况下执行此操作,并且可以使用此功能来安装其他类型的软件,如数据库,其他微服务等。

一些快速提示

在我的日常工作中,我总是需要与MongoDB和Redis集成,但是安装它们通常是一个痛苦的过程,我通过在.zshrc中创建一些bash脚本来解决这个问题。

function new_mongo { docker run -d --name mongodb -p  27017:27017 mongo
}
# the : here means image tag, usually if the image is done correctly
# like in this case tag version match the Redis version
function new_redis {    docker run -d  --name redis  -p 6379:6379 redis:3.2
}
function stop_mongo {   docker stop mongodb docker rm mongodb
}
function stop_redis {   docker stop redis   docker rm redis
}

 

new_mongo # it will spin up a new mongodb instance.
new_redis # it will spin up a new redis instance.
# to stop this containers
stop_mongo
stop_redis

现在,您将能够按需配置部署本地MongoDB或Redis实例,并且一个优点(至少在我看来)是这些实例中的数据是短暂的,这意味着当您终止容器时它将重置数据库也是如此,释放占用的空间。

linux安全性

如果您在Fedora中使用-v参数执行挂载文件夹,可能会收到此错误:

sudo docker run -it -v "$(pwd)":/app busybox ls app/text
#ls: can't open '.': Permission denied

这是因为SELinux默认策略将保护主机中的任何读/写,以防攻击者离开容器,SELinux将通过在内核级强制执行安全规则来阻止您。

要在SELinux感知机器中安装文件夹,您需要传递z参数,这将更改SELinux上下文并允许容器执行安装。

# "$(pwd)" will get the actual directory, is equivalent to do pwd
docker run -it -v "$(pwd)":/app:z busybox /bin/sh

另一种方法(但不建议这样做)是暂时禁用此保护:

su -c "setenforce 0"

完成后,您可以通过以下操作启用它:

su  - c  “setenforce 1”

喜欢记得来一个

长按二维码 ▲

订阅「架构师小秘圈」公众号

如有启发,帮我点个在看,谢谢↓

详细!快速入门指南!Docker!相关推荐

  1. micro-app-vue2 vue3 超详细快速入门指南 学习记录

    micro-app-vue 快速入门指南 简介 micro-app是京东零售推出的一款微前端框架,它基于类WebComponent进行渲染,从组件化的思维实现微前端,旨在降低上手难度.提升工作效率.它 ...

  2. BERT模型超酷炫,上手又太难?请查收这份BERT快速入门指南!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自 | GitHub    作者 | Jay Alammar 转自 | 机器之心 如 ...

  3. BERT模型超酷炫,上手又太难?请查收这份BERT快速入门指南

    2019-12-31 10:50:59 选自GitHub 作者:Jay Alammar 参与:王子嘉.Geek AI 如果你是一名自然语言处理从业者,那你一定听说过最近大火的 BERT 模型.本文是一 ...

  4. 2017 Vue.js 2快速入门指南

    注意,据部分读者反映本文水多,怕湿身者勿进.后续推荐详解 Vue & Vuex 实践 2017 Vue.js 2快速入门指南翻译自Vue.js 2 Quickstart Tutorial 20 ...

  5. Spark快速入门指南 – Spark安装与基础使用

    本文转载自Spark快速入门指南 – Spark安装与基础使用 Apache Spark 是一个新兴的大数据处理通用引擎,提供了分布式的内存抽象.Spark 正如其名,最大的特点就是快(Lightni ...

  6. Valgrind快速入门指南

    Valgrind快速入门指南 介绍 Valgrind工具套件提供了许多调试和分析工具,可帮助您更快更准确地完成程序.这些工具中最受欢迎的名为Memcheck.它可以检测C和C ++程序中常见的许多与内 ...

  7. MinIO客户端快速入门指南

    MinIO客户端快速入门指南 MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案.它支持文件系统和兼容Amazon S3的云存储服 ...

  8. Quartz.NET快速入门指南

    最近,在工作中遇到了 Quartz.net 这个组件,为了更好的理解项目代码的来龙去脉,于是决定好好的研究一下这个东西.确实是好东西,既然是好东西,我就拿出来分享一下.万丈高楼平地起,我们也从入门开始 ...

  9. 2引擎帮助文档_ANSA快速入门指南中文帮助文档浅析(上)

    作者 | 团长 仿真秀科普作者 首发 | 仿真秀公众号(ID:fangzhenxiu2018) 导读:本文是ANSA入门系列第一篇(后续将会在仿真秀官网或APP同步发布).本系列致力于提供ANSA软件 ...

  10. DragonBones快速入门指南

    DragonBones快速入门指南 黄竣 (@fans8) DragonBones快速入门指南采用知识共享协议3.0版本. 目录 DragonBones是什么? 功能特色 下载与安装设置 教程源码下载 ...

最新文章

  1. 登录mysql出现/var/lib/mysql/mysql.sock不存在
  2. [2016-04-19 15:46:03 - IceHoloReader1.0] Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER [20
  3. 手动写个类似的Spring MVC框架试试
  4. 机器学习笔记 invariance data augmentation
  5. linux初始化内存盘卡住,Linux系统内存磁盘初始化技术详细解析
  6. [翻译]More C++ Idioms - 类成员检测器
  7. C++ 数据指针(-)
  8. python LIST学习
  9. pythonplot画多图间隔,matplotlib实现一页多图
  10. Array, Vec 与 Slice
  11. 2003服务器系统pe,SERVER 2003 PE(移动存储PE系统)v16.68免费版
  12. video视频,audio音频基础学习
  13. Linux学习(完整)
  14. 冯仑《企业领导最容易犯的十大错误》
  15. 多校2.1012La Vie en rose
  16. 鸡兔同笼python程序怎么写_关于鸡的歇后语
  17. log+android+bp,第二章:Android.bp语法
  18. linux 刷流量ip,程序员同事问shell脚本刷流量,不讨巧帮他填了一个巨坑
  19. 简述覆盖表(Covering Arrays)
  20. c语言error 1075,fatal error C1075

热门文章

  1. 点分治问题 ----------- HDU4812 D Tree [点分治 + 乘法逆元]
  2. 贪心 ---- C. Anu Has a Function位运算+贪心证明
  3. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解
  4. 130.被围绕的区域
  5. python迭代器和生成器_python中迭代器和生成器。
  6. 为甚serve 修改dev不能跑_初探逆向将电缆调制解调器改装为SDR
  7. linux 脚本停止自身,Linux系统定时任务时shell脚本停止执行如何解决?
  8. Java正则入门(1)——去除字符串头尾空格
  9. 蓝云公布2019云生态战略,如何解决企业上云关键问题?
  10. Centos7-Mysql 5.6 多主一从 解决方案详细配置