容器镜像制作、发布、拉取和运行
创建仓库
请在你自己的 gitcode.net 上创建一个仓库,命名为cloud_native_hello_py,目录结构如下:
.
├── .dockerignore
├── .gitignore
├── Dockerfile
├── README.md
└── src
├── main.py
└── requirements.txt
其中 main.py 文件编写一个 flask 的服务代码:
# -*- coding: UTF-8 -*-
import sys
from flask import Flask
from flask_cors import CORS
from gevent import pywsgi, monkey
monkey.patch_all()
app = Flask(
__name__,
static_folder='web',
static_url_path=''
)
def after_request(resp):
resp.headers['Access-Control-Allow-Origin'] = '*'
return resp
app.after_request(after_request)
app.config['JSON_AS_ASCII'] = False
CORS(app, supports_credentials=True)
@app.route('/', methods=['GET'])
def home():
return "<p>Hello World!</p>"
if __name__ == '__main__':
host = '0.0.0.0'
port = 1024
print('@启动服务...')
print("@本地调试:http://{}:{}".format(host, port))
if len(sys.argv) > 1 and sys.argv[1] == 'debug':
app.run(host=host, port=port)
else:
server = pywsgi.WSGIServer((host, port), app)
server.serve_forever()
其中 requirements.txt 指定了依赖的 Python 包
Flask==2.0.3
flask_cors==3.0.10
gevent==21.1.2
其中 .gitignore 配置git仓库的忽略项目,而.dockerignore 则配置了构建 Docker 镜像时的忽略项
.git
.vscode
.idea
.DS_Store
__pycache__
*.pyc
*.pyo
*.pyd
.Python
*.zip
*.out
env
最后,我们在 Dockerfile 里编写待构建的容器镜像的配置信息
# 该镜像从官方 python:3.8 镜像继承
FROM python:3.8
# 创建 App 目录
WORKDIR /app
# 拷贝 Python 依赖配置文件
COPY src/requirements.txt ./
# 安装 Python 依赖包
RUN pip install -r requirements.txt
# 拷贝 App Python 源码到目标目录
COPY src /app
# 导出服务端口
EXPOSE 1024
# 容器启动后立刻启动 Python 服务
CMD [ "python", "main.py" ]
使用 git 命令将该项目代码提交到仓库。以下描述错误的是?
答案是:B
依据
# 导出服务端口
EXPOSE 1024
A正确,依据
# 容器启动后立刻启动 Python 服务
CMD [ "python", "main.py" ]
C正确,依据
最后,我们在 Dockerfile 里编写待构建的容器镜像的配置信息
D正确,依据
# 拷贝 Python 依赖配置文件
COPY src/requirements.txt ./
构建容器并发布
上一题准备了代码仓库,并且配置了对应的 Dockerfile, 现在使用 docker 命令来制作镜像:
docker image build -t cloud_native_hello_py:0.0.1 ./
构建如图所示:
构建镜像之后,可以将镜像发布到 DockerHub ,不过需要首先注册下账号
在 https://hub.docker.com 上注册自己的账号
使用命令 docker login 在本机登陆,输入自己的用户名和密码
现在,可以使用命令 tag 来修改镜像的标签为用户名/镜像名格式:
docker tag cloud_native_hello_py:0.0.1 fanfeilong/cloud_native_hello_py
可以用docker image ls验证结果
现在,可以使用镜像的 push 命令来发布
docker push fanfeilong/cloud_native_hello_py:latest
以下描述错误的是?
答案是:B
docker image build 构建的时候需要指定 Dockerfile 所在目录,图中所示是进入到Dockerfile所在目录下才构建的,如果没有事先进入到Dockerfile所在目录就构建的话,命令中肯定要指定 Dockerfile 所在目录
AC正确,依据
构建镜像之后,可以将镜像发布到 DockerHub ,不过需要首先注册下账号
D正确,在推送前,必须给镜像打标签,否则推送失败,其实打标签就是定义一个版本标识
拉取镜像并运行
上一节创建了一个Python Flask 服务git仓库,然后为它配置了一个Dockerfile,最后构建了镜像并推送到Docker Hub。
现在,可以从 Docker Hub 拉取该镜像并运行。
首先,拉取镜像:
docker pull fanfeilong/cloud_native_hello_py
其次,运行容器:
docker run -p 1024:1024 -it fanfeilong/cloud_native_hello_py
这个命令没有指定容器启动后运行的命令,因此容器启动后会执行镜像制作时Dockerfile里指定的CMD命令,可以看到容器启动后执行了Python程序,容器服务在1024端口监听HTTP请求,因为 docker run 配置了参数-p 1024:1024,这里把主机的1024端口映射到了容器里的1024端口。
![](https://img-blog.csdnimg.cn/5c6f591bbfa04de68db1df22da27921e.png)
现在,在浏览器里测试下请求:
请求成功,输出了"Hello World!",到这里你就成功学会了容器镜像制作、发布、拉取和运行一条龙服务。
以下描述错误的是?
答案是:A
主机端口和容器内映射端口可以不一样,也可以不一样,该题目出题老师只不过指定的端口一样而已,只不过要注意端口不要被占用
B正确,依据
其次,运行容器:
docker run -p 1024:1024 -it fanfeilong/cloud_native_hello_py
C正确,fanfeilong/cloud_native_hello_py 该镜像就是出题老师自己创建的,第二道题目中就能看出
现在,可以使用命令 tag 来修改镜像的标签为用户名/镜像名格式:
docker tag cloud_native_hello_py:0.0.1 fanfeilong/cloud_native_hello_py
D正确,依据
docker run -p 1024:1024 -it fanfeilong/cloud_native_hello_py
这个命令没有指定容器启动后运行的命令,因此容器启动后会执行镜像制作时Dockerfile里指定的CMD命令,可以看到容器启动后执行了Python程序