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. 如果没有起来的测试步骤 |