docker_part1

创建一个目录  Dockerfile

cd Dockerfile

创建一个 Dockerfile 文件内容如下:


# 将官方 Python 运行时用作父镜像
FROM python:2.7-slim

# 将工作目录设置为 /app
WORKDIR /app

# 将当前目录内容复制到位于 /app 中的容器中
ADD . /app

# 安装 requirements.txt 中指定的任何所需软件包
RUN pip install -r requirements.txt

# 使端口 80 可供此容器外的环境使用
EXPOSE 80

# 定义环境变量
ENV NAME World

# 在容器启动时运行 app.py
CMD ["python", "app.py"]

其中牵涉两个文件
1,requirements.txt

Flask
Redis

2,app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "cannot connect to Redis, counter disabled"

html = "

Hello {name}!

" \
"Hostname: {hostname}
" \
"Visits: {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)

以下是 ls 应显示的内容:

$ ls
Dockerfile app.py requirements.txt

现在,运行构建命令。这将创建 Docker 镜像,我们将使用 -t 对其进行标记,以使其具有友好名称。

docker build -t friendlyhello .

您已构建的镜像在何处?它位于您的机器上的本地 Docker 镜像库中:

$ docker images

REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398

运行应用
运行应用,使用 -p 参数将机器的 4000 端口映射到容器暴露的 80 端口:

docker run -p 4000:80 friendlyhello

您将看到 Python 正在为应用提供服务(网址为 http://0.0.0.0:80)的通知。但是,该消息来自不知道您已将其 80 端口映射到 4000 端口的容器的内部,因此需要将正确 URL 更改为 http://localhost:4000。

在 Web 浏览器中访问该 http://localhost:4000,以查看网页上提供的显示内容,包括“Hello World”文本、容器 ID以及 Redis 错误消息。

注:此端口重映射 4000:80 用于说明您在 Dockerfile 中暴露的内容与使用 docker run -p 发布的内容之间的差异。在后续步骤中,我们只需将主机上的 80 端口映射到容器中的 80 端口并使用 http://localhost。
在终端上按 CTRL+C 退出。

现在,我们从后台在分离模式下运行应用。


docker run -d -p 4000:80 friendlyhello
您将获得应用的长容器 ID,然后将返回到终端。容器现在在后台运行。您还可以使用 docker ps 查看缩写容器 ID(这两种 ID 可以在运行命令时交换工作):

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago

您将看到 CONTAINER ID 与 http://localhost:4000 上的内容相匹配。

现在,使用 docker stop 及 CONTAINER ID 结束该进程,如下所示:

docker stop 1fa4ab2cf395

使用 Docker ID 登录
如果您没有 Docker 帐户,请在 cloud.docker.com 中进行注册。记录您的用户名。

登录本地机器上的 Docker 公用镜像库。我的username是persy

docker login

标记镜像
用于将本地镜像与镜像库中的镜像仓库相关联的表示法为 username/repository:tag。tag 是可选项,但建议使用它,因为这是镜像库用于为 Docker 镜像指定版本的机制。针对上下文为镜像库和 tag 指定有意义的名称,例如 get-started:part1.这会将镜像放入 get-started 镜像仓库并将其标记为 part1。

现在,将其合并到一起,以标记镜像。使用您的用户名、镜像仓库和标签名称运行 docker tag image,以便镜像将上传到所需目的地。此命令的语法为:


docker tag [image] [username]/[repository]:[tag]

例如:

docker tag friendlyhello persy/get-started:part1

运行 docker images 以查看新标记的镜像。(您还可以使用 docker image ls。)

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest d9e555c53008 3 minutes ago 195MB
john/get-started part1 d9e555c53008 3 minutes ago 195MB
python 2.7-slim 1c7128a655f6 5 days ago 183MB
...

发布镜像
将已标记的镜像上传到镜像仓库:

docker push username/repository:tag

完成后,将公开此上传的结果。如果登录 Docker Hub,可以使用其 pull 命令看到新的镜像。

从远程镜像仓库中拉取并运行镜像
从现在开始,您可以使用 docker run,并且可以使用以下命令在任何机器上运行您的应用:

docker run -p 4000:80 [username]/[repository]:[tag]

如果镜像在机器本地不可用,Docker 将从镜像仓库中拉取它。

$ docker run -p 4000:80 persy/get-started:part1
Unable to find image 'john/get-started:part1' locally
part1:Pulling from orangesnap/get-started
10a267c67f42:Already exists
f68a39a6a5e4:Already exists
9beaffc0cf19:Already exists
3c1fe835fb6b:Already exists
4c9f1fa8fcb8:Already exists
ee7d8f576a14:Already exists
fbccdcced46e:Already exists
Digest: sha256:0601c866aab2adcc6498200efd0f754037e909e5fd42069adeff72d1e2439068
Status: Downloaded newer image for john/get-started:part1
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

注:如果您未指定这些命令中的 :tag 部分,在进行构建和运行镜像时,将使用标签 :latest 。Docker 将使用在未指定标签的情况下运行的镜像的最新版本(可以不是最新镜像)。

无论 docker run 在何处执行,它将从 requirements.txt 拉取您的镜像及 Python 和所有依赖项,然后运行代码。所有内容都在一个小软件包中提供,并且主机只需安装 Docker 来运行它。

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注