您当前的位置: 首页 >  docker

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

构建Docker直觉

寒冰屋 发布时间:2020-03-06 21:04:58 ,浏览量:0

目录

介绍

工作坊阶段

1.检查您的Linux主机是否启动

2.客户端校准

通过避免代理问题来确保安全

3.了解你在哪里?您知道在哪里操作吗?您是在Docker容器,主机内还是在Docker客户端上?(梦中的梦者)

让我们回顾一下过程信号及其重要性。实验

在Docker客户端和Docker实例之间创建一些交互

导出镜像/容器 

介绍

这个简短的教程并不是要训练读者使用已知的Docker命令,而是要向读者灌输一种有意义的直觉,以解决已知的Docker错误观念。在处理Docker时,我们可能指的是Docker守护进程,但是当我们使用它时,实际上是在使用Docker客户端。但是,我已经看到很多用户不知道有两个参与方,一个是客户端(命令行代理REST json调用),另一个是服务器(docker守护程序)。双方最有可能位于同一台机器上的事实加剧了这种混乱,因此,两者之间没有物理隔离。

工作坊阶段
  1. 检查您的Linux主机是否启动
  2. 客户端校准
  3. 明白你在哪里吗?您知道在哪里工作吗?您是在Docker容器中还是主机中?(梦中的梦者)

图1

如果您使用的是之前的Hyper-V Windows计算机,请知道您需要通过VirtualBox映像启动Windows内核(Windows 2010之前的版本),否则,您可以依靠Hyper-V服务。Hyper-V服务将毫不费力地启动您的Linux映像。本教程基于virtual box及其随附的默认boot2docker发行版。记住,您的Docker守护进程已安装在该boot2docker Linux安装包中。

1.检查您的Linux主机是否启动

运行:

docker-machine ls
2.客户端校准

我更喜欢将此阶段称为客户端校准。为什么?嗯,您的Docker命令行客户端不知道指向哪个Docker守护程序。您知道必须与守护程序进行通信才能通过命令,对吗?这样做的方法是找到守护程序的连接坐标。您还可以与网络上其他计算机上的Docker守护程序进行通信。

运行:

docker-machine env

它将输出类似以下内容:

SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\myuser\.docker\machine\machines\
SET DOCKER_MACHINE_NAME=default
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM     @FOR /f "tokens=*" %i IN ('docker-machine env') DO @%i
通过避免代理问题来确保安全

如您所见,守护程序由IP地址192.168.99.100标识。可能发生的情况是,如果您在代理后面,则对守护程序的请求将到达该代理,但是该代理不知道您新发布的IP地址。该IP仅在您的计算机上本地创建。因此,在向位于您自己计算机上的主机发出请求时,您需要一种绕过代理的方法。

运行:

docker-machine env --no-proxy

输出:

SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\myuser\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
SET no_proxy=192.168.99.100, .eu.int
REM Run this command to configure your shell:
REM     @FOR /f "tokens=*" %i IN ('docker-machine env --no-proxy') DO @%i

要将您的Docker客户端指向您的Docker守护程序,请运行上一个清单的最后一行,但不要使用REM注释符号:

@FOR /f "tokens=*" %i IN ('docker-machine env --no-proxy') DO @%i

现在,您指向了正确的守护程序,让我们看看在Docker守护程序中实例化了哪些容器。被实例化并不一定意味着它们也在运行,它们很可能处于EXITED状态。请注意,Docker容器遵循状态生命周期。

运行:

docker ps -a

向您显示本地可用的镜像:

docker image ls

图2

3.了解你在哪里?您知道在哪里操作吗?您是在Docker容器,主机内还是在Docker客户端上?(梦中的梦者)

我已经注意到,对于Docker用户而言,很容易对其确切的角色、应该做的事情以及采取的行动感到困惑。

首先,让我们登录主机盒并四处窥探:

docker-machine ssh

您可能会问自己:如何在没有凭据的情况下优雅地登录到计算机。好吧,这项工作是代表您完成的,您拥有你的DOCKER_CERT_PATH下的私钥(执行时请参见上文docker-machine env)。

现在,您将能够在端口2376上以侦听状态看到Docker守护程序。

netstat -nat | grep LISTEN
让我们回顾一下过程信号及其重要性。实验

如果您不是精通Linux的用户,则可能不知道可以将三个信号Ctrl-C(SIGINT),Ctrl- \(SIGQUIT)和Ctrl-Z(SIGSTP)传递给Linux进程。现在,docker体系结构允许您在运行docker实例时访问此Linux功能。您可能偶然发现了已经很频繁的代码,-i和-t在运行docker run命令时进行了切换。他们的意思是什么。该-i开关意味着您可以访问远程docker进程的标准输入。但是,除非您有一个可用于客户端docker的控制台,否则您无法推送任何数据,而这正是-t发挥作用的地方。让我们尝试一下:

实验1:标准输入可用,但您的Docker实例却听不到任何内容

运行:

docker run -i tomcat:latest

当您的tomcat标准输出控制台开始泛洪时,请尝试启动键盘组合Ctrl-C。该过程已中断,但确实到达远程过程了吗?

运行:

docker ps -a

您将看到以下内容:

 

CONTAINER ID   IMAGE            COMMAND              CREATED        STATUS           
d154269f742a   tomcat:latest    "catalina.sh run"    1 minute ago   Up 1 minute

 

如您所见,docker窗实例未接收到该信号,但仍处于运行状态。

实验2:提供标准输入,信号确实进入了Docker实例

运行:

docker run -it tomcat:latest

当您的tomcat标准输出控制台开始如洪水时,请尝试启动键盘组合Ctrl-C。该过程已中断,但确实到达远程过程了吗?

运行:

docker ps -a

您将看到以下内容:

CONTAINER ID   IMAGE            COMMAND              CREATED        STATUS           
d154269f742a   tomcat:latest    "catalina.sh run"    1 minute ago   Exited

在这种情况下,docker实例确实收到了信号,随后被中断,并显示了退出状态。

这是信号决策树的分解图(图3)。

图3

如果您在后台启动实例,但仍想访问,则STDOUT可以使用:

docker logs -f instance-name

现在我们已经完成了信号概述,接下来让我们进入另一个主题,即镜像所经历的物理变化,即所谓的“分层”过程。

如何对您的容器和镜像进行更改。如果您想检查导致镜像进入最后保存状态的命令,请运行:

docker history image-id

要使历史列表更漂亮:

docker history --no-trunc image-id  | tac | tr -s ' ' | cut -d " " -f 5- | 
sed 's,^/bin/sh -c #(nop) ,,g' | sed 's,^/bin/sh -c,RUN,g' | sed 's, && ,\n  & ,g' | 
sed 's,\s*[0-9]*[\.]*[0-9]*[kMG]*B\s*$,,g' | head -n -1
在Docker客户端和Docker实例之间创建一些交互

现在,让我们展示一个涉及Docker客户端的命令。这是复制命令。您可以将文件从容器复制到本地客户端计算机:

docker cp [container]:/pathtofile localpathtofile

或相反亦然:

docker cp localpathflie [container]:/pathtofile

现在让我们提供一个在主机和守护程序之间桥接的命令示例。通常,我们想从docker守护程序中获得两件事:对新服务的通信访问,以及对文件系统的访问,对吗?

在此示例中,我们想为Tomcat实例装载一个卷并共享它。我们还希望访问docker实例端口,即常规的Tomcat端口8080。我们将在端口8888上创建一个相应的Linux主机端口。请记住,当我们充当docker客户端时,无法访问docker实例。我们只能访问Linux主机,这就是为什么我们将这两种服务提供给Linux主机的原因。

至于共享公共目录,请确保在Linux主机上创建一个名为- /home/hostVolume的目录。如果要启动VirtualBox boot2docker镜像,则还有一个额外的步骤,您还必须通过在以下位置添加条目来在Windows计算机上安装本地目录:

VirtualBox->Your boot2docker image->Settings->Shared Folders->Adds new shared folder

现在,将一些文件放入其中。运行以下命令,该命令将在端口之间进行桥接,并一次性共享文件目录:

docker run -it -d -v /home/hostVolume:/home/dockerVolume --publish 8888:8080 
                                                         --name tomcatInstance tomcat:latest

现在,让我们来看看共享文件目录。您将通过在shell中输入来使用docker实例:

docker exec -it tomcatInstance bash
cd /home/dockerVolume
导出镜像/容器 

当涉及到导出镜像的选项时,您有两个可用选项。小心,每个导出方案都有自己独特的导入方案。您不能将两者混在一起。

所以这两个是:

  • 要么导出镜像的整个版本控制历史记录,但最终将获得较重的镜像。最重要的是,您引用的是镜像而不是正在运行的容器:
docker save [image name] > /path to your tar/name.tar

要将其导入回来:

docker load /path to your tar/name.tar
  • 或通过展平其历史记录并缩小其尺寸来导出正在运行的容器:
docker export [container id] >  /path to your tar/name.tar

要将其导入回来:

cat  /path to your tar/name.tar | docker import - [name]

 

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0534s