Dockerfile
Dockerfile 是一个文本文件,记录了镜像构建的所有步骤。
构建镜像
由于官方提供的centos镜像有很多基础命令没有安装,所有我们自己来构建一个基础base
生产环境也可参照这种分层目录
1  | [root@linux-node1 opt]# mkdir -p /opt/Game/{system,app,runtime}  | 
- 使用Dockerfile 创建自定义基础环境镜像
 
1  | [root@linux-node1 centos]# vim Dockerfile  | 
- docker build 构建镜像
 
1  | [root@linux-node1 centos]# docker build -t game/centos:7 .  | 
- 镜像生成分析:
 
1  | [root@linux-node1 centos]# docker build -t game/centos:7 .  | 
1  | 1. 运行 docker build 命令,-t 将新镜像命名为 game/centos:7,  | 
查看镜像分层结构
- docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程,每一层由上至下排列
 - game/centos:7 镜像 是经过一层层形成的,他的最初层就是centos:7
 - 注: 表示无法获取 IMAGE ID,通常从 Docker Hub 下载的镜像会有这个问题。
 
1  | [root@linux-node1 centos]# docker history game/centos:7  | 
Dockerfile 常用指令
1  | FROM # 指定基础镜像FROM centos  | 
运行更多的指令
1  | [root@linux-node1 test]# vim Dockerfile  | 
1  | # 构建前确保 build context 中存在需要的文件。  | 
1  | # 构建镜像  | 
1  | # 运行容器,验证镜像内容:  | 
镜像命名的最佳实践
- 如何在多个 Docker Host 上使用镜像?
 
1  | 1. 用相同的 Dockerfile 在其他 host 构建镜像。  | 
为镜像命名
- REPOSITORY
 - TAG
 - 实际上一个特定镜像的名字由两部分组成:repository 和 tag , [image name] = [repository]:[tag]
 - 如果执行 docker build 时没有指定 tag,会使用默认值 latest
 - tag 常用于描述镜像的版本信息,可以是任意字符串
 - latest 其实并没有什么特殊的含义。当没指明镜像 tag 时,Docker 会使用默认值 latest,仅此而已。
- 虽然 Docker Hub 上很多 repository 将 latest 作为最新稳定版本的别名,但这只是一种约定,而不是强制规定。
 - 所以我们在使用镜像时最好还是避免使用 latest,明确指定某个 tag,比如 httpd:2.3,ubuntu:xenial。
 
 
1  | [root@linux-node1 test]# docker images  | 
多个 tag 可能对应的是同一个镜像
- 多个 tag 可能对应的是同一个镜像
 - 假设我们现在发布了一个镜像 myimage,版本为 v1.9.1。那么我们可以给镜像打上四个 tag:1.9.1、1.9、1 和 latest。
 

1  | # 通过 docker tag 命令方便地给镜像打 tag  | 
- 过了一段时间,我们发布了 v1.9.2。这时可以打上 1.9.2 的 tag,并将 1.9、1 和 latest 从 v1.9.1 移到 v1.9.2。
 
1  | docker tag myimage-v1.9.2 myimage:1  | 
- 这种 tag 方案使镜像的版本很直观,用户在选择非常灵活:
 
1  | myimage:1 始终指向 1 这个分支中最新的镜像。  | 
Dockerfile 的生产实践
使用 game/centos:7 镜像为base镜像 搭建 python 运行环境镜像
1  | [root@linux-node1 runtime]# mkdir -p /opt/Game/runtime/python-ssh  | 
1  | # python + ssh  | 
1  | # 构建  | 
在本地测试 python
1  | # 测试程序 flask  | 

添加python 服务的依赖文件
1  | # python pip 将会去安装包  | 
supervisor 管理进程文件
1  | 注意:  | 
shop-api 的Dockerfile
1  | 1. 添加启动用户  | 
1  | [root@linux-node1 shop-api]# vim Dockerfile  | 
1  | [root@linux-node1 shop-api]# docker build -t game/shop-api .  | 
1  | [root@linux-node1 shop-api]# docker run -d -p 80:5000 -p 8022:22 --name myshop-ssh game/shop-api  | 
需要理解
1  | 1. 如果没有起来的测试步骤  | 
