<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>写给初学者的docker教程 on 重定向学院</title><link>https://itest2025.pages.dev/categories/%E5%86%99%E7%BB%99%E5%88%9D%E5%AD%A6%E8%80%85%E7%9A%84docker%E6%95%99%E7%A8%8B/</link><description>Recent content in 写给初学者的docker教程 on 重定向学院</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 17 Jun 2025 17:29:15 +0800</lastBuildDate><atom:link href="https://itest2025.pages.dev/categories/%E5%86%99%E7%BB%99%E5%88%9D%E5%AD%A6%E8%80%85%E7%9A%84docker%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>（一）Docker介绍</title><link>https://itest2025.pages.dev/tutorials/30-001-%E4%B8%80docker%E4%BB%8B%E7%BB%8D/</link><pubDate>Mon, 22 Jan 2018 14:55:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-001-%E4%B8%80docker%E4%BB%8B%E7%BB%8D/</guid><description>&lt;h4 id="什么就docker">什么就Docker?&lt;/h4>
&lt;hr>
&lt;p>Docker是一个开源项目， 诞生于2013年初，最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会，遵从了Apache 2.0协议，项目代码在&lt;a href="https://github.com/docker" target="_blank" rel="noopener noreffer ">GitHub&lt;/a> 上进行维护。&lt;/p>
&lt;p>Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器（LXC）等技术。在LXC的基础上Docker进行了进一步的封装，让用户不需要去关心容器的管理，使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。&lt;/p>
&lt;h4 id="为什么要使用docker">为什么要使用Docker?&lt;/h4>
&lt;hr>
&lt;p>Docker 相比传统虚拟机有诸多优势。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>启动速度更快：&lt;/strong> 秒级启动。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>快速的部署和交付：&lt;/strong> 开发者可以使用一个标准的镜像来构建一套开发容器，开发完成之后， 运维人员可以直接使用这个容器来部署代码。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>更高效的虚拟化：&lt;/strong> 它是内核级的虚拟化，因此可以实现更高的性能和效率。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>高效的迁移：&lt;/strong> Docker可以运行在不同的平台，用户可以轻松的将一个应用从一个平台迁移到另一个平台。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>节省开支：&lt;/strong> Docker容器除了运行其中应用外，基本不消耗额外的系统资源，一台设备可以运行上千个容器。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="docker基本概念">Docker基本概念&lt;/h4>
&lt;hr>
&lt;p>Docker包括三个基本概念&lt;/p>
&lt;ul>
&lt;li>镜像（Image）&lt;/li>
&lt;/ul>
&lt;p>Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像，用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。镜像可以用来创建Docker容器。&lt;/p>
&lt;ul>
&lt;li>容器（Container）&lt;/li>
&lt;/ul>
&lt;p>容器是从镜像创建的运行实例。它可以被启动、开始、停止、 删除。每个容器都是相互隔离的、保证安全的平台。&lt;/p>
&lt;ul>
&lt;li>仓库（Repository）&lt;/li>
&lt;/ul>
&lt;p>仓库是集中存放镜像文件的场所。仓库分为公开仓库（Public）和私有仓库（Private） 两种形式。&lt;/p>
&lt;p>最大的公开仓库是 &lt;a href="https://hub.docker.com" target="_blank" rel="noopener noreffer ">Docker	Hub&lt;/a>，存放了数量庞大的镜像供用户下载。 &lt;a href="https://www.docker-cn.com/registry-mirror" target="_blank" rel="noopener noreffer ">中国官方镜像加速&lt;/a>&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1606256485258-ae784908699f?w=300"
 data-srcset="https://images.unsplash.com/photo-1606256485258-ae784908699f?w=300, https://images.unsplash.com/photo-1606256485258-ae784908699f?w=300 1.5x, https://images.unsplash.com/photo-1606256485258-ae784908699f?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1606256485258-ae784908699f?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（二）Docker安装（Ubuntu）</title><link>https://itest2025.pages.dev/tutorials/30-002-%E4%BA%8Cdocker%E5%AE%89%E8%A3%85ubuntu/</link><pubDate>Mon, 22 Jan 2018 14:55:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-002-%E4%BA%8Cdocker%E5%AE%89%E8%A3%85ubuntu/</guid><description>&lt;p>官方文档：https://docs.docker.com/&lt;/p>
&lt;p>Docker 支持多平台的安装（Linux/Windows/OS X）。&lt;/p>
&lt;p>因为Docker原生支持Linux，所以，可以直接在Linux上运行，而且在Windows和 OS X 平台则需要借助轻量级的 Linux VM 运行。&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://img.testclass.net/docker-platform.png"
 data-srcset="http://img.testclass.net/docker-platform.png, http://img.testclass.net/docker-platform.png 1.5x, http://img.testclass.net/docker-platform.png 2x"
 data-sizes="auto"
 alt="http://img.testclass.net/docker-platform.png"
 title="http://img.testclass.net/docker-platform.png" />&lt;/p>
&lt;h3 id="ubuntu安装">Ubuntu安装&lt;/h3>
&lt;hr>
&lt;p>在Ubuntu上安装Docker的说明取决于您使用的是Docker企业版（Docker EE）还是Docker社区版（Docker CE）。&lt;/p>
&lt;p>参考文档：https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/&lt;/p>
&lt;h4 id="使用仓库进行安装">使用仓库进行安装&lt;/h4>
&lt;p>首次在新的主机上安装Docker CE之前，需要设置Docker仓库。 之后，你可以从存储库安装和更新Docker。&lt;/p>
&lt;h5 id="设置仓库">设置仓库&lt;/h5>
&lt;p>1、更新 &lt;code>apt&lt;/code> 包索引:&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo apt-get update
&lt;/code>&lt;/pre>&lt;p>2、安装软件包，使它允许&lt;code>apt&lt;/code>通过HTTPS使用仓库：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
&lt;/code>&lt;/pre>&lt;p>3、添加Docker的官方GPG密钥：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
&lt;/code>&lt;/pre>&lt;p>通过搜索密钥的最后8个字符，确认您现在已经拥有指纹 &lt;code>9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88&lt;/code> 的密钥。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo apt-key fingerprint 0EBFCD88

pub 4096R/0EBFCD88 2017-02-22
 密钥指纹 = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) &amp;lt;docker@docker.com&amp;gt;
sub 4096R/F273FCD8 2017-02-22
&lt;/code>&lt;/pre>&lt;p>4、使用以下命令来设置 &lt;strong>stable&lt;/strong> 的仓库。即使你想从 __edge __ 或 &lt;strong>test&lt;/strong> 仓库安装构建，也总是需要 &lt;strong>stable&lt;/strong> 的仓库。要添加 __edge __ 或 &lt;strong>test&lt;/strong> 仓库，请在下面的命令中在单词stable之后添加edge或test（或两者）。&lt;/p></description></item><item><title>（三）Docker 镜像</title><link>https://itest2025.pages.dev/tutorials/30-003-%E4%B8%89docker-%E9%95%9C%E5%83%8F/</link><pubDate>Mon, 22 Jan 2018 14:45:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-003-%E4%B8%89docker-%E9%95%9C%E5%83%8F/</guid><description>&lt;p>Docker 运行容器前需要本地存在对应的镜像，如果镜像不存在本地， Docker	会从镜像仓库下载（默认是Docker Hub公共注册服务器中的仓库）。&lt;/p>
&lt;p>Docker Hub:https://hub.docker.com
阿里云镜像：https://dev.aliyun.com/search.html
灵雀云：https://hub.alauda.cn/&lt;/p>
&lt;h4 id="镜像">镜像&lt;/h4>
&lt;hr>
&lt;h5 id="查看镜像">查看镜像&lt;/h5>
&lt;p>列出本地镜像：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest f2a91732366c 2 months ago
&lt;/code>&lt;/pre>&lt;p>在列出信息中，可以看到几个字段信息：&lt;/p>
&lt;ul>
&lt;li>来自于哪个仓库，比如	ubuntu&lt;/li>
&lt;li>镜像的标记，比如	14.04&lt;/li>
&lt;li>它的 	ID	号（唯一）&lt;/li>
&lt;li>创建时间&lt;/li>
&lt;li>镜像大小&lt;/li>
&lt;/ul>
&lt;h5 id="获取镜像">获取镜像&lt;/h5>
&lt;p>可以使用&lt;code>docker pull&lt;/code> 命令来从仓库获取所需要的镜像。搜索 “ubuntu” 镜像。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker pull ubuntu

Using default tag: latest
latest: Pulling from library/ubuntu
8f7c85c2269a: Pull complete
9e72e494a6dd: Pull complete
3009ec50c887: Pull complete
9d5ffccbec91: Pull complete
e872a2642ce1: Pull complete
Digest: sha256:d3fdf5b1f8e8a155c17d5786280af1f5a04c10e95145a515279cf17abdf0191f
Status: Downloaded newer image for ubuntu:latest
&lt;/code>&lt;/pre>&lt;p>该命令实际上相当于 &lt;code>$	docker pull registry.hub.docker.com/ubuntu&lt;/code> 命令，即从注册服务器&lt;code>registry.hub.docker.com&lt;/code>中的 &lt;code>ubuntu&lt;/code>仓库来下载的镜像。&lt;/p></description></item><item><title>（四）Docker 容器</title><link>https://itest2025.pages.dev/tutorials/30-004-%E5%9B%9Bdocker-%E5%AE%B9%E5%99%A8/</link><pubDate>Mon, 22 Jan 2018 14:42:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-004-%E5%9B%9Bdocker-%E5%AE%B9%E5%99%A8/</guid><description>&lt;p>简单的说，容器是独立运行的一个或一组应用，以及它们的运行态环境。 如果把镜像看成面向对象中的 &lt;strong>类&lt;/strong> 的话，那么容器就是 类 的实例化 &lt;strong>对象&lt;/strong>。&lt;/p>
&lt;h4 id="容器">容器&lt;/h4>
&lt;hr>
&lt;h5 id="启动容器">启动容器&lt;/h5>
&lt;p>启动容器有两种方式，一种是基于镜像新建一个容器并启动， 另外一个是将在终止状态（stopped）的容器重新启动。&lt;/p>
&lt;p>通过&lt;code>docker run&lt;/code> 命令来启动容器。&lt;/p>
&lt;p>查看运行帮助：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker run --help
&lt;/code>&lt;/pre>&lt;p>下面的命令输出一个	“Hello	World”，之后终止容器。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker run ubuntu /bin/echo &amp;#34;hello world&amp;#34;
hello world
&lt;/code>&lt;/pre>&lt;p>这跟在本地直接执行 &lt;code>/bin/echo	'hello	world'&lt;/code>几乎感觉不出任何区别。只不过，这里的输入是由通过 ubuntu 容器执行。&lt;/p>
&lt;p>下面进入到ubuntu容器中。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker run -t -i ubuntu /bin/bash
root@543a324ea841:/#
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>
&lt;p>-t	选项让Docker分配一个伪终端（pseudo-tty）并绑定到容器的标准输入上。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>-i	则让容器的标准输入保持打开。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>此时，你已经在ubuntu容器中了。这是一个独立的ubuntu 系统。通过 &lt;strong>root@543a324ea841&lt;/strong> 标识可以看出。&lt;/p>
&lt;p>当利用&lt;code>docker run&lt;/code>	来创建容器时，Docker在后台运行的标准操作包括：&lt;/p>
&lt;ul>
&lt;li>检查本地是否存在指定的镜像，不存在就从公有仓库下载&lt;/li>
&lt;li>利用镜像创建并启动一个容器&lt;/li>
&lt;li>分配一个文件系统，并在只读的镜像层外面挂载一层可读写层&lt;/li>
&lt;li>从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去&lt;/li>
&lt;li>从地址池配置一个IP地址给容器&lt;/li>
&lt;li>执行用户指定的应用程序&lt;/li>
&lt;li>执行完毕后容器被终止&lt;/li>
&lt;/ul>
&lt;p>退出容器，可以使用exit命令。&lt;/p>
&lt;pre tabindex="0">&lt;code>root@543a324ea841:/# exit 
exit
fnngj@ubuntu:~$
&lt;/code>&lt;/pre>&lt;h5 id="守护状态运行">守护状态运行&lt;/h5>
&lt;p>更多的时候，需要让	Docker容器在后台以守护态（Daemonized）形式运行。&lt;/p></description></item><item><title>（五）Docker 仓库</title><link>https://itest2025.pages.dev/tutorials/30-005-%E4%BA%94docker-%E4%BB%93%E5%BA%93/</link><pubDate>Mon, 22 Jan 2018 14:40:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-005-%E4%BA%94docker-%E4%BB%93%E5%BA%93/</guid><description>&lt;p>前面在下载镜像的适应已经用到了Docker仓库，如果是镜像的一个托管平吧。&lt;/p>
&lt;h4 id="仓库">仓库&lt;/h4>
&lt;hr>
&lt;p>一个容易混淆的概念是注册服务器（Registry）。 实际上注册服务器是管理仓库的具体服务器，每个服务器上可以有多个仓库，而每个仓库下面有多个镜像。从这方面来说， 仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 	&lt;code>registry.hub.docker.com/ubuntu&lt;/code>	来说，&lt;code>registry.hub.docker.com&lt;/code>是注册服务器地址，&lt;code>ubuntu&lt;/code>是仓库名。大部分时候，并不需要严格区分这两者的概念。&lt;/p>
&lt;h5 id="docker-hub">Docker Hub&lt;/h5>
&lt;p>目前Docker官方维护了一个公共仓库 Docker Hub：https://hub.docker.com&lt;/p>
&lt;p>我们可以在Docker Hub上完成注册。这样就可以使用Docker Hub 来托管我们的镜像了。&lt;/p>
&lt;p>通过&lt;code>docker	search&lt;/code>命令来查找官方仓库中的镜像，并利用&lt;code>docker pull&lt;/code> 命令来将它下载到本地。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker search ubuntu
&lt;/code>&lt;/pre>&lt;h4 id="使用国内镜像">使用国内镜像&lt;/h4>
&lt;p>参考地址：https://www.docker-cn.com/registry-mirror&lt;/p>
&lt;p>临时性的使用：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker pull registry.docker-cn.com/library/ubuntu:16.04
&lt;/code>&lt;/pre>&lt;p>永久性的使用：&lt;/p>
&lt;p>修改 /etc/docker/daemon.json文件（没有的话可以手动创建，需要通过&lt;code>root&lt;/code>用户操作）并添加上 registry-mirrors 键值。&lt;/p>
&lt;pre tabindex="0">&lt;code>{
 &amp;#34;registry-mirrors&amp;#34;: [&amp;#34;https://registry.docker-cn.com&amp;#34;]
}
&lt;/code>&lt;/pre>&lt;p>修改保存后重启Docker服务以使配置生效。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo service docker restart
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1705365212953-153ebe92cce3?w=300"
 data-srcset="https://images.unsplash.com/photo-1705365212953-153ebe92cce3?w=300, https://images.unsplash.com/photo-1705365212953-153ebe92cce3?w=300 1.5x, https://images.unsplash.com/photo-1705365212953-153ebe92cce3?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1705365212953-153ebe92cce3?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（六） 创建Nginx容器</title><link>https://itest2025.pages.dev/tutorials/30-006-%E5%85%AD-%E5%88%9B%E5%BB%BAnginx%E5%AE%B9%E5%99%A8/</link><pubDate>Mon, 22 Jan 2018 14:38:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-006-%E5%85%AD-%E5%88%9B%E5%BB%BAnginx%E5%AE%B9%E5%99%A8/</guid><description>&lt;h4 id="获取nginx镜像">获取Nginx镜像&lt;/h4>
&lt;hr>
&lt;p>最简单的方法就是通过 &lt;code>docker pull nginx&lt;/code> 命令来创建 Nginx容器。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker pull nginx
&lt;/code>&lt;/pre>&lt;p>或者：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker pull registry.docker-cn.com/library/nginx
&lt;/code>&lt;/pre>&lt;p>其中 &lt;code>registry.docker-cn.com&lt;/code> 为国内的官方镜像仓库，速度要好很多。&lt;/p>
&lt;h4 id="启动nginx容器">启动Nginx容器&lt;/h4>
&lt;hr>
&lt;p>查看镜像：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2a4cca5ac898 8 days ago 111MB
registry.docker-cn.com/library/nginx latest 3f8a4339aadd 4 weeks ago 108MB
hello-world latest f2a91732366c 2 months ago 1.85kB
&lt;/code>&lt;/pre>&lt;p>启动 ngnnx 容器&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker run --name some-nginx -d -p 8080:80 registry.docker-cn.com/library/nginx

b5bbf1dfe86a21d641a161c05598c0f4f4d4b32fc8d756b6fdf306295067625f
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>
&lt;p>-name 指定启动容器的名称为 some-nginx。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>-d 让Docker容器在后台以守护态（Daemonized）形式运行。&lt;/p></description></item><item><title>（七） 创建docker selenium容器</title><link>https://itest2025.pages.dev/tutorials/30-007-%E4%B8%83-%E5%88%9B%E5%BB%BAdocker-selenium%E5%AE%B9%E5%99%A8/</link><pubDate>Mon, 22 Jan 2018 14:36:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-007-%E4%B8%83-%E5%88%9B%E5%BB%BAdocker-selenium%E5%AE%B9%E5%99%A8/</guid><description>&lt;p>SeleniumHQ官方项目：https://github.com/seleniumHQ/docker-selenium
项目目前快速迭代中。&lt;/p>
&lt;h4 id="selenium">Selenium&lt;/h4>
&lt;hr>
&lt;p>这里主要针对的是 Selenium Grid，它用于分布式自动化测试，就是一套Selenium 代码可在不同的环境上运行。刚好，Docker可快速的创建各种环境。&lt;/p>
&lt;p>&lt;strong>Selenium Grid 有两个概念&lt;/strong>&lt;/p>
&lt;p>hub ：主节点，你可以看作 “北京总公司的测试经理”。&lt;/p>
&lt;p>node：分支节点，你可以看作 “北京总公司的测试小兵A” 和 “上海分公司的测试小兵B”，还有 “深圳分公司的测试小兵C” &amp;hellip;。&lt;/p>
&lt;p>也就是说在Selenium Grid中只能有一个主hub，但可以在本地或远程建立 N 多个分支node，测试脚本指向主hub，由主hub 分配给本地/远程node 运行测试用例。&lt;/p>
&lt;h4 id="docker-selenium-环境安装">docker selenium 环境安装&lt;/h4>
&lt;hr>
&lt;p>以Ubuntu为例，在Ubuntu下安装Docker，请参考：&lt;a href="https://itest2025.pages.dev/docker/02-install/" rel="">Docker安装（Ubuntu）&lt;/a>&lt;/p>
&lt;p>docker hub（仓库）：&lt;/p>
&lt;p>&lt;a href="https://hub.docker.com/r/selenium/hub/" target="_blank" rel="noopener noreffer ">https://hub.docker.com/r/selenium/hub/&lt;/a>&lt;/p>
&lt;p>1、下载主hub镜像（北京总公司的测试经理）&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker pull selenium/hub
&lt;/code>&lt;/pre>&lt;p>2、下载主node chrome 镜像（上海分公司的测试小兵B）&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker pull selenium/node-chrome
&lt;/code>&lt;/pre>&lt;p>3、查看镜像&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
selenium/node-chrome latest 1eba57bd3d79 12 days ago 823MB
selenium/hub latest d1437f7d9f87 12 days ago 285MB
&lt;/code>&lt;/pre>&lt;p>4、启动主hub容器&lt;/p></description></item><item><title>（八）Docker Dockerfile</title><link>https://itest2025.pages.dev/tutorials/30-008-%E5%85%ABdocker-dockerfile/</link><pubDate>Mon, 22 Jan 2018 14:32:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-008-%E5%85%ABdocker-dockerfile/</guid><description>&lt;p>虽然，前面已经会 使用 Nginx 和 docker selenium 来启动容器，但也仅仅是会使用，Dcoker 中还有许多概念和细节需要我们继续学习。&lt;/p>
&lt;h5 id="dockerfile-文件分析">Dockerfile 文件分析&lt;/h5>
&lt;hr>
&lt;p>Dockerfile	由一行行命令语句组成，并且支持以 &lt;code>#&lt;/code> 开头的注释行。&lt;/p>
&lt;p>一般的 Dockerfile	分为四部分：&lt;strong>基础镜像信息&lt;/strong>、 &lt;strong>维护者信息&lt;/strong>、 &lt;strong>镜像操作指令&lt;/strong> 和 &lt;strong>容器启动时执行指令&lt;/strong> 。&lt;/p>
&lt;p>以Selenium/Hub 的 &lt;a href="https://github.com/SeleniumHQ/docker-selenium/blob/master/Hub/Dockerfile" target="_blank" rel="noopener noreffer ">Dockerfile&lt;/a> 文件为例:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># NOTE: DO *NOT* EDIT THIS FILE. IT IS GENERATED.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># PLEASE UPDATE Dockerfile.txt INSTEAD OF THIS FILE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">FROM&lt;/span> &lt;span class="n">selenium&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nl">base&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mf">3.8.1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">erbium&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">LABEL&lt;/span> &lt;span class="n">authors&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">SeleniumHQ&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">USER&lt;/span> &lt;span class="n">seluser&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#========================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># Selenium Configuration
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#========================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">EXPOSE&lt;/span> &lt;span class="mi">4444&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># As integer, maps to &amp;#34;maxSession&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_MAX_SESSION&lt;/span> &lt;span class="mi">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># In milliseconds, maps to &amp;#34;newSessionWaitTimeout&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_NEW_SESSION_WAIT_TIMEOUT&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># As a boolean, maps to &amp;#34;throwOnCapabilityNotPresent&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_THROW_ON_CAPABILITY_NOT_PRESENT&lt;/span> &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># As an integer
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_JETTY_MAX_THREADS&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># In milliseconds, maps to &amp;#34;cleanUpCycle&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_CLEAN_UP_CYCLE&lt;/span> &lt;span class="mi">5000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># In seconds, maps to &amp;#34;browserTimeout&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_BROWSER_TIMEOUT&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># In seconds, maps to &amp;#34;timeout&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_TIMEOUT&lt;/span> &lt;span class="mi">30&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># Debug
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_DEBUG&lt;/span> &lt;span class="nb">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># As integer, maps to &amp;#34;port&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">ENV&lt;/span> &lt;span class="n">GRID_HUB_PORT&lt;/span> &lt;span class="mi">4444&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">COPY&lt;/span> &lt;span class="n">generate_config&lt;/span> \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">entry_point&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">sh&lt;/span> \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">/&lt;/span>&lt;span class="n">opt&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="o">/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># Running this command as sudo just to avoid the message:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># To run a command as administrator (user &amp;#34;root&amp;#34;), use &amp;#34;sudo &amp;lt;command&amp;gt;&amp;#34;. See &amp;#34;man sudo_root&amp;#34; for details.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"># When logging into the container
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="n">RUN&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">opt&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">generate_config&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">opt&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">selenium&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CMD&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s">&amp;#34;/opt/bin/entry_point.sh&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>FROM&lt;/li>
&lt;/ul>
&lt;p>Dockerfile 都必须以 &lt;code>FROM&lt;/code> 命令开始。 &lt;code>FROM&lt;/code>命令会指定镜像基于哪个基础镜像创建，接下来的命令也会基于这个基础镜像。&lt;/p></description></item><item><title>（九）创建 Docker 镜像</title><link>https://itest2025.pages.dev/tutorials/30-009-%E4%B9%9D%E5%88%9B%E5%BB%BA-docker-%E9%95%9C%E5%83%8F/</link><pubDate>Mon, 22 Jan 2018 14:30:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-009-%E4%B9%9D%E5%88%9B%E5%BB%BA-docker-%E9%95%9C%E5%83%8F/</guid><description>&lt;p>创建镜像有很多方法，用户可以从 Docker Hub 获取已有镜像并更新，也可以利用本地文件系统创建一个。&lt;/p>
&lt;h4 id="修改已有的镜像">修改已有的镜像&lt;/h4>
&lt;hr>
&lt;p>查看已有的镜像：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2a4cca5ac898 9 days ago 111MB
&lt;/code>&lt;/pre>&lt;p>下面进入到ubuntu容器中:&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker run -t -i ubuntu /bin/bash
root@543a324ea841:/#
&lt;/code>&lt;/pre>&lt;p>&lt;strong>注意：&lt;/strong> 记住容器的	ID，稍后还会用到。&lt;/p>
&lt;p>在容器中添加 添加 &lt;code>Python3&lt;/code> 开发环境。&lt;/p>
&lt;pre tabindex="0">&lt;code>root@543a324ea841:/# apt update // 更新软件源

root@543a324ea841:/# apt install python3 // 安装 python3

root@543a324ea841:/# exit // 退出 Ubuntu 容器
exit
&lt;/code>&lt;/pre>&lt;p>当结束后，我们使用	&lt;code>exit&lt;/code> 来退出，现在我们的容器已经被我们改变了，使用 &lt;code>docker	commit&lt;/code>	命令来提交更新后的副本。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker commit -m &amp;#34;Add python3&amp;#34; -a &amp;#34;Docker Newbee&amp;#34; 543a324ea841 ubuntu

sha256:7c0cf1cc5ef36a86252e94eea39c645f53be7dfda87bdcded6d2999917190ffd
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>
&lt;p>-m	来指定提交的说明信息，跟我们使用的版本控制工具一样；&lt;/p></description></item><item><title>（十）Docker Compose安装与创建Flask web应用</title><link>https://itest2025.pages.dev/tutorials/30-010-%E5%8D%81docker-compose%E5%AE%89%E8%A3%85%E4%B8%8E%E5%88%9B%E5%BB%BAflask-web%E5%BA%94%E7%94%A8/</link><pubDate>Mon, 22 Jan 2018 14:25:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-010-%E5%8D%81docker-compose%E5%AE%89%E8%A3%85%E4%B8%8E%E5%88%9B%E5%BB%BAflask-web%E5%BA%94%E7%94%A8/</guid><description>&lt;p>Docker Compose 是 Docker 官方编排（Orchestration）项目之一， 负责快速在集群中部署分布式应用。&lt;/p>
&lt;p>Dockerfile 可以让用户管理一个单独的应用容器；而	Compose	则允许用户在一个模板（YAML	格式）中定义一组相关联的应用容器（被称为一个 project，即项目），例如一个Web服务容器再加上后端的数据库服务容器等。&lt;/p>
&lt;h4 id="安装">安装&lt;/h4>
&lt;hr>
&lt;p>该项目由 Python 编写，实际上调用了 Docker 提供的	API	来实现。 通过&lt;code>pip&lt;/code>安装。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ python3 -m pip install docker-compose
&lt;/code>&lt;/pre>&lt;p>安装成功后，可以查看&lt;code>docker-compose&lt;/code>命令的用法。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ docker-compose
Define and run multi-container applications with Docker.

Usage:
 docker-compose [-f &amp;lt;arg&amp;gt;...] [options] [COMMAND] [ARGS...]
 docker-compose -h|--help

Options:
 -f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
 -p, --project-name NAME Specify an alternate project name (default: directory name)
 --verbose Show more output
 --no-ansi Do not print ANSI control characters
 -v, --version Print version and exit
 -H, --host HOST Daemon socket to connect to

 ……
&lt;/code>&lt;/pre>&lt;h4 id="创建-flask-应用">创建 Flask 应用&lt;/h4>
&lt;hr>
&lt;p>创建使用Flask web应用，并将数值记入Redis。&lt;/p></description></item><item><title>（十一）Docker Compose创建Wordpress应用</title><link>https://itest2025.pages.dev/tutorials/30-011-%E5%8D%81%E4%B8%80docker-compose%E5%88%9B%E5%BB%BAwordpress%E5%BA%94%E7%94%A8/</link><pubDate>Mon, 22 Jan 2018 14:22:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-011-%E5%8D%81%E4%B8%80docker-compose%E5%88%9B%E5%BB%BAwordpress%E5%BA%94%E7%94%A8/</guid><description>&lt;p>wordpress是最常见博客系统，一般部署需要LAMP/WAMP环境，这介绍通过Docker compose对它进行编排和部署。&lt;/p>
&lt;p>Docker Hub地址: &lt;a href="https://hub.docker.com/_/wordpress/" target="_blank" rel="noopener noreffer ">https://hub.docker.com/_/wordpress/&lt;/a>&lt;/p>
&lt;h4 id="wordpress-应用部署">wordpress 应用部署&lt;/h4>
&lt;hr>
&lt;h5 id="1-建立一个应用的目录">1、 建立一个应用的目录&lt;/h5>
&lt;pre tabindex="0">&lt;code>$ mkdir wordpress
$ cd wordpress
&lt;/code>&lt;/pre>&lt;h5 id="2创建-docker-composeyml">2、创建 docker-compose.yml&lt;/h5>
&lt;pre tabindex="0">&lt;code>version: &amp;#39;3.1&amp;#39;

services:

 wordpress:
 image: wordpress
 restart: always
 ports:
 - 8081:80
 environment:
 WORDPRESS_DB_PASSWORD: pw123

 mysql:
 image: mysql:5.7
 restart: always
 environment:
 MYSQL_ROOT_PASSWORD: pw123
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>images 镜像名&lt;/li>
&lt;li>restart 指定版本&lt;/li>
&lt;li>ports &lt;code>80&lt;/code>为镜像端口， 映射的&lt;code>8081&lt;/code>为主机端口。&lt;/li>
&lt;li>environment 环境配置，例，&lt;code>WORDPRESS_DB_PASSWORD&lt;/code> 为wordpress数据库密码。&lt;/li>
&lt;/ul>
&lt;h5 id="3启动应用">3、启动应用&lt;/h5>
&lt;p>&lt;code>docker-compose&lt;/code>执行编排脚本，分别制作和抓取web，redis镜像，启动容器。&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo docker-compose up

……

Creating wordpress_mysql_1 ... done
Creating wordpress_wordpress_1 ... done
&lt;/code>&lt;/pre>&lt;p>整个过程会比较漫长。。。&lt;/p>
&lt;h5 id="5访问应用">5、访问应用&lt;/h5>
&lt;p>打开浏览器方位: http://0.0.0.0:5081/&lt;/p>
&lt;p>进入wordpress安装配置界面：&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://img.testclass.net/docker_wordpress.png"
 data-srcset="http://img.testclass.net/docker_wordpress.png, http://img.testclass.net/docker_wordpress.png 1.5x, http://img.testclass.net/docker_wordpress.png 2x"
 data-sizes="auto"
 alt="http://img.testclass.net/docker_wordpress.png"
 title="http://img.testclass.net/docker_wordpress.png" />&lt;/p></description></item><item><title>（十二）Docker Machine介绍</title><link>https://itest2025.pages.dev/tutorials/30-012-%E5%8D%81%E4%BA%8Cdocker-machine%E4%BB%8B%E7%BB%8D/</link><pubDate>Mon, 22 Jan 2018 14:20:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-012-%E5%8D%81%E4%BA%8Cdocker-machine%E4%BB%8B%E7%BB%8D/</guid><description>&lt;p>官方文档：https://docs.docker.com/machine/overview/&lt;/p>
&lt;p>&lt;strong>可以使用Docker Machine做什么？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>在Mac或Windows上安装并运行Docker&lt;/li>
&lt;li>配置和管理多个远程Docker主机&lt;/li>
&lt;li>提供Swarm集群&lt;/li>
&lt;/ul>
&lt;h4 id="什么是docker-machine">什么是Docker Machine?&lt;/h4>
&lt;hr>
&lt;p>Docker Machine是一个工具，可以让你在虚拟主机上安装Docker Engine，并用docker-machine命令管理主机。你可以使用计算机在本地Mac或Windows计算机上，公司网络，数据中心或云提供商（如Azure，AWS或Digital Ocean）上创建Docker主机。&lt;/p>
&lt;p>使用docker-machine命令，你可以启动，检查，停止和重新启动托管主机，升级Docker客户端和守护进程，并配置Docker客户端与主机通信。&lt;/p>
&lt;p>将机器CLI指向正在运行的托管主机，并且可以直接在该主机上运行&lt;code>docker&lt;/code>命令。例如，运行&lt;code>docker-machine env default&lt;/code>指向一个名为&lt;code>default&lt;/code>的主机，按照屏幕上的说明完成env设置，然后运行&lt;code>docker ps&lt;/code>，&lt;code>docker run hello-world&lt;/code>等等。&lt;/p>
&lt;p>Machine是在Docker v1.12之前在Mac或Windows上运行Docker的唯一方法。从测试版和Docker v1.12开始，Docker for Mac和Docker for Windows作为本地应用程序提供，并且是更新桌面和笔记本电脑上更好的选择。我们鼓励你尝试这些新的应用程序。 Docker for Mac和Docker for Windows的安装程序包括Docker Machine和Docker Compose。&lt;/p>
&lt;p>如果你不确定从哪里开始，请参阅Docker入门，它将指导您完成Docker的简要端到端教程。&lt;/p>
&lt;h5 id="为什么要使用docker-machine">为什么要使用Docker Machine?&lt;/h5>
&lt;hr>
&lt;p>Docker Machine使你能够在各种类型的Linux上配置多个远程Docker主机。&lt;/p>
&lt;p>此外，Machine允许你在旧版Mac或Windows系统上运行Docker，如上一主题中所述。&lt;/p>
&lt;p>Docker Machine有这两个广泛的用例。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>你有一个较旧的桌面系统，并希望在Mac或Windows上运行Docker&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://img.testclass.net/docker_machine-mac-win.png"
 data-srcset="http://img.testclass.net/docker_machine-mac-win.png, http://img.testclass.net/docker_machine-mac-win.png 1.5x, http://img.testclass.net/docker_machine-mac-win.png 2x"
 data-sizes="auto"
 alt="http://img.testclass.net/docker_machine-mac-win.png"
 title="http://img.testclass.net/docker_machine-mac-win.png" />&lt;/p>
&lt;p>如果你主要工作不符合新版Docker for Mac和Docker for Windows应用程序要求的较旧的Mac或Windows笔记本电脑或台式机上，那么需要在本地运行Docker机器运行Docker Engine。使用Docker Toolbox安装程序在Mac或Windows上安装Docker Machine可以为本地虚拟机配置Docker Engine，使您能够连接它并运行&lt;code>docker&lt;/code>命令。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>我想在远程系统上配置Docker主机&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://img.testclass.net/docker_provision-use-case.png"
 data-srcset="http://img.testclass.net/docker_provision-use-case.png, http://img.testclass.net/docker_provision-use-case.png 1.5x, http://img.testclass.net/docker_provision-use-case.png 2x"
 data-sizes="auto"
 alt="http://img.testclass.net/docker_provision-use-case.png"
 title="http://img.testclass.net/docker_provision-use-case.png" />&lt;/p></description></item><item><title>（十三）Docker Machine安装</title><link>https://itest2025.pages.dev/tutorials/30-013-%E5%8D%81%E4%B8%89docker-machine%E5%AE%89%E8%A3%85/</link><pubDate>Mon, 22 Jan 2018 14:18:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-013-%E5%8D%81%E4%B8%89docker-machine%E5%AE%89%E8%A3%85/</guid><description>&lt;p>在macOS和Windows上，当你安装Docker for Mac，Docker for Windows或Docker Toolbox时，Machine将与其他Docker产品一起安装。&lt;/p>
&lt;p>如果你只需要Docker Machine，则可以按照下一节中的说明直接安装Machine二进制文件。 你可以在GitHub上的&lt;a href="https://github.com/docker/machine/releases/" target="_blank" rel="noopener noreffer ">docker/machine release&lt;/a> 页面上找到最新版本的二进制文件。&lt;/p>
&lt;h4 id="直接安装">直接安装&lt;/h4>
&lt;h5 id="1安装-docker">1、安装 Docker。&lt;/h5>
&lt;h5 id="2下载docker-machine二进制文件并将其解压到path">2、下载Docker Machine二进制文件并将其解压到PATH。&lt;/h5>
&lt;p>如果你是 &lt;strong>macOS&lt;/strong> 系统，运行:&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` &amp;gt;/usr/local/bin/docker-machine &amp;amp;&amp;amp; \
 chmod +x /usr/local/bin/docker-machine
&lt;/code>&lt;/pre>&lt;p>如果你是 &lt;strong>Linux&lt;/strong> 系统，运行:&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` &amp;gt;/tmp/docker-machine &amp;amp;&amp;amp; \
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
&lt;/code>&lt;/pre>&lt;p>如果你是 &lt;strong>Windows&lt;/strong> 系统，通过&lt;a href="https://gitforwindows.org/" target="_blank" rel="noopener noreffer ">Git BASH&lt;/a> 运行:&lt;/p>
&lt;pre tabindex="0">&lt;code>$ if [[ ! -d &amp;#34;$HOME/bin&amp;#34; ]]; then mkdir -p &amp;#34;$HOME/bin&amp;#34;; fi &amp;amp;&amp;amp; \
curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-Windows-x86_64.exe &amp;gt; &amp;#34;$HOME/bin/docker-machine.exe&amp;#34; &amp;amp;&amp;amp; \
chmod +x &amp;#34;$HOME/bin/docker-machine.exe&amp;#34;
&lt;/code>&lt;/pre>&lt;blockquote>
&lt;p>注意：只有当你使用像Git BASH这样的支持Linux命令（如chmod）的终端模拟器时，上面的命令才能在Windows上运行。&lt;/p></description></item><item><title>（十四）Docker Machine基本使用</title><link>https://itest2025.pages.dev/tutorials/30-014-%E5%8D%81%E5%9B%9Bdocker-machine%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</link><pubDate>Mon, 22 Jan 2018 14:18:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/30-014-%E5%8D%81%E5%9B%9Bdocker-machine%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</guid><description>&lt;p>这一小节演示Machine的基本使用。&lt;/p>
&lt;p>以 &lt;strong>macOS&lt;/strong> 系统为例：&lt;/p>
&lt;h5 id="创建一个machine">创建一个machine&lt;/h5>
&lt;p>指令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">docker&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span> &lt;span class="n">create&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">driver&lt;/span> &lt;span class="n">virtualbox&lt;/span> &lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Creating&lt;/span> &lt;span class="n">CA&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">Users&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fnngj&lt;/span>&lt;span class="o">/.&lt;/span>&lt;span class="n">docker&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">certs&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">ca&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Creating&lt;/span> &lt;span class="n">client&lt;/span> &lt;span class="n">certificate&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">Users&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fnngj&lt;/span>&lt;span class="o">/.&lt;/span>&lt;span class="n">docker&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">certs&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">cert&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Running&lt;/span> &lt;span class="n">pre&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">create&lt;/span> &lt;span class="n">checks&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Creating&lt;/span> &lt;span class="n">machine&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">Copying&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">Users&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fnngj&lt;/span>&lt;span class="o">/.&lt;/span>&lt;span class="n">docker&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">cache&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">boot2docker&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iso&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">Users&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fnngj&lt;/span>&lt;span class="o">/.&lt;/span>&lt;span class="n">docker&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">machines&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">boot2docker&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iso&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">Creating&lt;/span> &lt;span class="n">VirtualBox&lt;/span> &lt;span class="n">VM&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">Creating&lt;/span> &lt;span class="n">SSH&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">Starting&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">VM&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">Check&lt;/span> &lt;span class="n">network&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">re&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">create&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">needed&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">Found&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="n">new&lt;/span> &lt;span class="n">host&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">only&lt;/span> &lt;span class="n">adapter&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vboxnet0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">Waiting&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">an&lt;/span> &lt;span class="n">IP&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Waiting&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">machine&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">be&lt;/span> &lt;span class="n">running&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">this&lt;/span> &lt;span class="n">may&lt;/span> &lt;span class="n">take&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="n">few&lt;/span> &lt;span class="n">minutes&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Detecting&lt;/span> &lt;span class="n">operating&lt;/span> &lt;span class="n">system&lt;/span> &lt;span class="n">of&lt;/span> &lt;span class="n">created&lt;/span> &lt;span class="n">instance&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Waiting&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">SSH&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">be&lt;/span> &lt;span class="n">available&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Detecting&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">provisioner&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Provisioning&lt;/span> &lt;span class="k">with&lt;/span> &lt;span class="n">boot2docker&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Copying&lt;/span> &lt;span class="n">certs&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">local&lt;/span> &lt;span class="n">machine&lt;/span> &lt;span class="n">directory&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Copying&lt;/span> &lt;span class="n">certs&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">remote&lt;/span> &lt;span class="n">machine&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Setting&lt;/span> &lt;span class="n">Docker&lt;/span> &lt;span class="n">configuration&lt;/span> &lt;span class="n">on&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">remote&lt;/span> &lt;span class="n">daemon&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Checking&lt;/span> &lt;span class="n">connection&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">Docker&lt;/span>&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Docker&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="n">up&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">running&lt;/span>&lt;span class="err">!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">To&lt;/span> &lt;span class="n">see&lt;/span> &lt;span class="n">how&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">connect&lt;/span> &lt;span class="n">your&lt;/span> &lt;span class="n">Docker&lt;/span> &lt;span class="n">Client&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">Docker&lt;/span> &lt;span class="n">Engine&lt;/span> &lt;span class="n">running&lt;/span> &lt;span class="n">on&lt;/span> &lt;span class="n">this&lt;/span> &lt;span class="n">virtual&lt;/span> &lt;span class="n">machine&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">run&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">docker&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span> &lt;span class="n">env&lt;/span> &lt;span class="n">my&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">machine&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="查看machine列表">查看machine列表&lt;/h4>
&lt;p>指令：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
my-machine - virtualbox Running tcp://192.168.99.100:2376 v18.01.0-ce 
&lt;/code>&lt;/pre>&lt;p>可以看到我们刚创建的“my-machine”已出现在 machine 的列表当中。&lt;/p>
&lt;h4 id="查看-machine-的环境变量的配置信息">查看 machine 的环境变量的配置信息。&lt;/h4>
&lt;p>指令：&lt;/p>
&lt;pre tabindex="0">&lt;code>$ docker-machine env my-machine

export DOCKER_TLS_VERIFY=&amp;#34;1&amp;#34;
export DOCKER_HOST=&amp;#34;tcp://192.168.99.100:2376&amp;#34;
export DOCKER_CERT_PATH=&amp;#34;/Users/fnngj/.docker/machine/machines/my-machine&amp;#34;
export DOCKER_MACHINE_NAME=&amp;#34;my-machine&amp;#34;
# Run this command to configure your shell:
# eval $(docker-machine env my-machine)
&lt;/code>&lt;/pre>&lt;h4 id="连接到machine的shell">连接到machine的shell。&lt;/h4>
&lt;p>指令：&lt;/p></description></item></channel></rss>