Docker基础学习笔记2

使用 Dockerfile定义容器

Dockerfile定义容器内环境中发生的事情。对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界,并具体说明要“复制”到哪些文件那个环境。但是,在执行此操作之后,您可以预期Dockerfile在此处定义的应用程序的构建 在其运行的任何位置都完全相同。

Dockerfile

在本地计算机上创建一个空目录。cd目录,创建一个名为Dockerfile的文件,将以下内容复制并粘贴到该文件中,然后保存。记下解释新Dockerfile中每个语句的注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

dockerfile关键字

应用程序本身

再创建两个文件,requirements.txt然后app.py将它们放在同一个文件夹中Dockerfile。这完成了我们的应用程序,您可以看到它非常简单。当上述Dockerfile被内置到的图像,app.py并且 requirements.txt是因为存在DockerfileCOPY命令,并从输出app.py是通过HTTP得益于访问EXPOSE 命令。

requirements.txt 存放依赖性软包

1
2
Flask
Redis

构建应用程序

我们准备构建应用程序。确保您仍处于新目录的顶层。这是ls应该显示的内容:

1
2
$ ls
Dockerfile app.py requirements.txt

现在运行build命令。这将创建一个Docker镜像,我们将使用该--tag选项命名。使用-t,如果你想用较短的选项。

1
docker build --tag=friendlyhello .

你的建筑镜像在哪里?它位于您机器的本地Docker镜像注册表中:

1
2
3
4
$ docker image ls

REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398

注意标签是如何默认的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:port

DNS设置

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
docker run -p 4000:80 friendlyhello

您应该看到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
2
3
$ curl http://localhost:4000

<h3>Hello World!</h3><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>

现在让我们在后台以分离模式运行应用程序:

1
docker run -d -p 4000:80 friendlyhello

您获得应用程序的长容器ID,然后被踢回终端。您的容器正在后台运行。您还可以看到缩写的容器ID docker container ls(并且在运行命令时两者都可以互换):

1
2
3
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago

请注意CONTAINER ID匹配的内容http://localhost:4000

现在docker container stop用来结束这个过程,使用CONTAINER ID如下:

1
docker container stop 1fa4ab2cf395

分享你的镜像

为了演示我们刚刚创建的内容的可移植性,让我们上传我们构建的图像并在其他地方运行它。毕竟,当您想要将容器部署到生产环境时,您需要知道如何推送到注册表。

注册表是存储库的集合,存储库是图像的集合 - 类似于GitHub存储库,除了代码已经构建。注册表上的帐户可以创建许多存储库。该dockerCLI使用泊坞窗的公共注册表默认情况下。

回顾和备忘单(可选)

以下是此页面中基本Docker命令的列表,以及一些相关的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# Create image using this directory's Dockerfile
# 使用此目录的Dockerfile创建映像
docker build -t friendlyhello .

# Run "friendlyhello" mapping port 4000 to 80
# 运行“friendlyhello”映射端口4000到80
docker run -p 4000:80 friendlyhello

# Same thing, but in detached mode
# 运行,但处于分离模式
docker run -d -p 4000:80 friendlyhello

# List all running containers
# 列出所有正在运行的容器
docker container ls

# List all containers, even those not running
# 列出所有容器,甚至是那些未运行的容器
docker container ls -a

# Gracefully stop the specified container
# 优雅地停止指定的容器
docker container stop <hash>

# Force shutdown of the specified container
# 强制关闭指定的容器
docker container kill <hash>

# Remove specified container from this machine
# 从此计算机中删除指定的容器
docker container rm <hash>

# Remove all containers
# 删除所有容器
docker container rm $(docker container ls -a -q)

# List all images on this machine
# 列出本机上的所有镜像
docker image ls -a

# Remove specified image from this machine
# 从本机删除指定的图像
docker image rm <image id>

# Remove all images from this machine
# 从本机删除所有图像
docker image rm $(docker image ls -a -q)

# Log in this CLI session using your Docker credentials
# 使用Docker凭据登录此CLI会话
docker login

# Tag <image> for upload to registry
# 标记<image>以上传到注册表
docker tag <image> username/repository:tag

# Upload tagged image to registry
# 将标记图像上载到注册表
docker push username/repository:tag

# Run image from a registry
# 从注册表运行镜像
docker run username/repository:tag

Docker基础学习笔记2
http://www.keker.top/2019/09/13/tools/docker/Docker基础学习笔记2/
作者
Keker
发布于
2019年9月13日
许可协议