Docker基础学习笔记2
使用 Dockerfile
定义容器
Dockerfile
定义容器内环境中发生的事情。对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界,并具体说明要“复制”到哪些文件那个环境。但是,在执行此操作之后,您可以预期Dockerfile
在此处定义的应用程序的构建 在其运行的任何位置都完全相同。
Dockerfile
在本地计算机上创建一个空目录。cd
目录,创建一个名为Dockerfile
的文件,将以下内容复制并粘贴到该文件中,然后保存。记下解释新Dockerfile中每个语句的注释。
1 |
|
应用程序本身
再创建两个文件,requirements.txt
然后app.py
将它们放在同一个文件夹中Dockerfile
。这完成了我们的应用程序,您可以看到它非常简单。当上述Dockerfile
被内置到的图像,app.py
并且 requirements.txt
是因为存在Dockerfile
的COPY
命令,并从输出app.py
是通过HTTP得益于访问EXPOSE
命令。
requirements.txt
存放依赖性软包
1 |
|
构建应用程序
我们准备构建应用程序。确保您仍处于新目录的顶层。这是ls
应该显示的内容:
1 |
|
现在运行build命令。这将创建一个Docker镜像,我们将使用该--tag
选项命名。使用-t
,如果你想用较短的选项。
1 |
|
你的建筑镜像在哪里?它位于您机器的本地Docker镜像注册表中:
1 |
|
注意标签是如何默认的latest
。标签选项的完整语法类似于--tag=friendlyhello:v0.0.1
。
Linux用户的故障排除
代理服务器设置
代理服务器可以在Web应用程序启动并运行后阻止其连接。如果您位于代理服务器后面,请
RUN pip
在Dockerfile中添加以下行,使用该ENV
命令指定代理服务器的主机和端口:
1
2
3
# Set proxy server, replace host:port with values for your servers
ENV http_proxy host:port
ENV https_proxy host:portDNS设置
DNS配置错误可能会产生问题
pip
。您需要设置自己的DNS服务器地址才能pip
正常工作。您可能想要更改Docker守护程序的DNS设置。您可以/etc/docker/daemon.json
使用dns
密钥编辑(或创建)配置文件,如下所示:
1
2
3
{
"dns": ["your_dns_address", "8.8.8.8"]
}在上面的示例中,列表的第一个元素是DNS服务器的地址。第二项是Google的DNS,可在第一项无法使用时使用。
在继续之前,请保存
daemon.json
并重新启动docker服务。
1
sudo service docker restart
修复后,重试运行该
build
命令。MTU设置
如果默认网桥上的MTU(默认值为1500)大于主机外部网络的MTU,则
pip
失败。通过/etc/docker/daemon.json
使用mtu
密钥编辑(或创建)配置文件来设置docker bridge网络的MTU以匹配主机的MTU ,如下所示:
1
2
3
{
"mtu": 1450
}在继续之前,请保存
daemon.json
并重新启动docker服务。
1
sudo systemctl restart docker
重新运行该
build
命令。
运行应用程序
运行应用程序,使用以下方法将计算机的端口4000映射到容器的已发布端口80 -p
:
1 |
|
您应该看到Python正在为您的应用提供服务的消息http://0.0.0.0:80
。但是该消息来自容器内部,它不知道您将该容器的端口80映射到4000,从而生成正确的URL http://localhost:4000
。
注意:如果您在Windows 7上使用Docker Toolbox,请使用Docker Machine IP而不是
localhost
。例如,http://192.168.99.100:4000 /。要查找IP地址,请使用该命令docker-machine ip
。
您还可以curl
在shell中使用该命令来查看相同的内容。
1 |
|
现在让我们在后台以分离模式运行应用程序:
1 |
|
您获得应用程序的长容器ID,然后被踢回终端。您的容器正在后台运行。您还可以看到缩写的容器ID docker container ls
(并且在运行命令时两者都可以互换):
1 |
|
请注意CONTAINER ID
匹配的内容http://localhost:4000
。
现在docker container stop
用来结束这个过程,使用CONTAINER ID
如下:
1 |
|
分享你的镜像
为了演示我们刚刚创建的内容的可移植性,让我们上传我们构建的图像并在其他地方运行它。毕竟,当您想要将容器部署到生产环境时,您需要知道如何推送到注册表。
注册表是存储库的集合,存储库是图像的集合 - 类似于GitHub存储库,除了代码已经构建。注册表上的帐户可以创建许多存储库。该docker
CLI使用泊坞窗的公共注册表默认情况下。
回顾和备忘单(可选)
以下是此页面中基本Docker命令的列表,以及一些相关的命令。
1 |
|