目录
介绍
工作坊阶段
1.检查您的Linux主机是否启动
2.客户端校准
通过避免代理问题来确保安全
3.了解你在哪里?您知道在哪里操作吗?您是在Docker容器,主机内还是在Docker客户端上?(梦中的梦者)
让我们回顾一下过程信号及其重要性。实验
在Docker客户端和Docker实例之间创建一些交互
导出镜像/容器
介绍这个简短的教程并不是要训练读者使用已知的Docker命令,而是要向读者灌输一种有意义的直觉,以解决已知的Docker错误观念。在处理Docker时,我们可能指的是Docker守护进程,但是当我们使用它时,实际上是在使用Docker客户端。但是,我已经看到很多用户不知道有两个参与方,一个是客户端(命令行代理REST json调用),另一个是服务器(docker守护程序)。双方最有可能位于同一台机器上的事实加剧了这种混乱,因此,两者之间没有物理隔离。
工作坊阶段- 检查您的Linux主机是否启动
- 客户端校准
- 明白你在哪里吗?您知道在哪里工作吗?您是在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]