diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_create_repo.md" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_create_repo.md"
new file mode 100644
index 0000000000000000000000000000000000000000..30a8d05cdae47fe2f2e9bf0e85271334f3e48054
--- /dev/null
+++ "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_create_repo.md"
@@ -0,0 +1,126 @@
+# Build docker(1): 创建仓库
+
+请在你自己的 [gitcode.net](https://gitcode.net) 上创建一个仓库,命名为`cloud_native_hello_py`,目录结构如下:
+
+```bash
+.
+├── .dockerignore
+├── .gitignore
+├── Dockerfile
+├── README.md
+└── src
+ ├── main.py
+ └── requirements.txt
+```
+
+其中 main.py 文件编写一个 flask 的服务代码:
+
+```bash
+# -*- 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 "
Hello World!
"
+
+
+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 包
+
+```bash
+Flask==2.0.3
+flask_cors==3.0.10
+gevent==21.1.2
+```
+
+其中 .gitignore 配置git仓库的忽略项目,而.dockerignore 则配置了构建 Docker 镜像时的忽略项
+
+```bash
+.git
+.vscode
+.idea
+.DS_Store
+__pycache__
+*.pyc
+*.pyo
+*.pyd
+.Python
+*.zip
+*.out
+env
+```
+
+最后,我们在 Dockerfile 里编写待构建的容器镜像的配置信息
+
+```bash
+# 该镜像从官方 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 命令将该项目代码提交到仓库。以下描述错误的是?
+
+## 答案
+
+Dockerfile 文件不能配置导出服务端口
+
+## 选项
+
+### A
+
+Dockerfile 可以指定构建的镜像运行后立刻执行的命令
+
+### B
+
+Dockerfile 里可以指定构建容器镜像时,从本地文件系统里拷贝哪些目录或者文件到镜像里对应的目录
+
+### C
+
+Dockerfile 是构建容器镜像的配置文件
diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image.jpg" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..f37bb935210a0bddc796dc056327c1ec18fa8ddf
Binary files /dev/null and "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image.jpg" differ
diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image.md" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image.md"
new file mode 100644
index 0000000000000000000000000000000000000000..538a1b2bfd8f7a0d067ecb1c883b4fbb1abb6809
--- /dev/null
+++ "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image.md"
@@ -0,0 +1,53 @@
+# Build docker(2): 构建容器并发布
+
+上一题准备了代码仓库,并且配置了对应的 Dockerfile, 现在使用 docker 命令来制作镜像:
+
+```bash
+docker image build -t cloud_native_hello_py:0.0.1 ./
+```
+
+构建如图所示:
+![](./build_image.jpg)
+
+构建镜像之后,可以将镜像发布到 DockerHub ,不过需要首先注册下账号
+
+1. 在 上注册自己的账号
+2. 使用命令 docker login 在本机登陆,输入自己的用户名和密码
+
+现在,可以使用命令 tag 来修改镜像的标签为`用户名/镜像名`格式:
+
+```bash
+docker tag cloud_native_hello_py:0.0.1 fanfeilong/cloud_native_hello_py
+```
+
+可以用`docker image ls`验证结果
+
+![](./build_image_tag.jpg)
+
+现在,可以使用镜像的 push 命令来发布
+
+```bash
+docker push fanfeilong/cloud_native_hello_py:latest
+```
+
+![](./build_image_push.jpg)
+
+以下描述错误的是?
+
+## 答案
+
+docker image build 构建的时候不需要指定 Dockerfile 所在目录
+
+## 选项
+
+### A
+
+推送镜像需要用 `docker tag` 命令给镜像打上符合规则的标签
+
+### B
+
+需要在 Docker Hub 上注册账号才能用以推送镜像
+
+### C
+
+可以将容器镜像发布到 Docker Registry,其中 Docker Hub是官方的Docker 仓库中心
diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image_push.jpg" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image_push.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..99de9c1ffc82b5e55847964a8d131dd9504523ca
Binary files /dev/null and "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image_push.jpg" differ
diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image_tag.jpg" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image_tag.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..dfb9c109285cb6e4cae4e792168dc35be3196ff9
Binary files /dev/null and "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/4.\344\275\277\347\224\250Dockerfile\345\210\266\344\275\234\351\225\234\345\203\217/build_image_tag.jpg" differ
diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/docker_pull.jpg" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/docker_pull.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..ba54d7775bf0cb392ec686ac7de7ff1de196648d
Binary files /dev/null and "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/docker_pull.jpg" differ
diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/pull_and_run.md" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/pull_and_run.md"
new file mode 100644
index 0000000000000000000000000000000000000000..5020d1403c711fe9845cfd9ec48578b3efff2535
--- /dev/null
+++ "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/pull_and_run.md"
@@ -0,0 +1,49 @@
+# Run docker: 拉取镜像并运行
+
+上一节创建了一个Python Flask 服务git仓库,然后为它配置了一个Dockerfile,最后构建了镜像并推送到Docker Hub。
+
+现在,可以从 Docker Hub 拉取该镜像并运行。
+
+首先,拉取镜像:
+
+```bash
+docker pull fanfeilong/cloud_native_hello_py
+```
+
+![](./docker_pull.jpg)
+
+其次,运行容器:
+
+```bash
+docker run -p 1024:1024 -it fanfeilong/cloud_native_hello_py
+```
+
+这个命令没有指定容器启动后运行的命令,因此容器启动后会执行镜像制作时Dockerfile里指定的CMD命令,可以看到容器启动后执行了Python程序,容器服务在1024端口监听HTTP请求,因为 docker run 配置了参数`-p 1024:1024`,这里把主机的1024端口映射到了容器里的1024端口。
+
+![](./run-with-port-map.jpg)
+
+现在,在浏览器里测试下请求:
+
+![](./test-request.jpg)
+
+请求成功,输出了"Hello World!",到这里你就成功学会了容器镜像制作、发布、拉取和运行一条龙服务。
+
+以下描述错误的是?
+
+## 答案
+
+容器的端口映射,主机端口和容器内映射端口必须一样
+
+## 选项
+
+### A
+
+容器的端口映射参数`-p`可以将主机端口转发给映射的容器内端口
+
+### B
+
+容器启动时如果没有指定执行的程序,就会执行在Dockerfile里使用CMD键配置的启动程序
+
+### C
+
+可以从 DockerHub拉取自己推送上去的镜像
diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/run-with-port-map.jpg" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/run-with-port-map.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..2eebaf52627de019ceaa191100489706aaf89a29
Binary files /dev/null and "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/run-with-port-map.jpg" differ
diff --git "a/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/test-request.jpg" "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/test-request.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..6d85bfd277af0b67685f48c116eb61864179b993
Binary files /dev/null and "b/data/1.\344\272\221\345\216\237\347\224\237\345\210\235\351\230\266/1.\345\256\271\345\231\250(docker)/5.\344\275\277\347\224\250docker\350\277\220\350\241\214\346\234\215\345\212\241/test-request.jpg" differ