1.构建 docker 镜像
先用 docker login 登录到 docker hub 上:
1.用 docker commit 命令来构建
docker ps -l // 列出最后一个创建的容器
docker commit 容器id 作者名/库名:标签名
docker images // 查看,已经有新的
docker inspect REPOSITORY // 查看镜像信息
2.通过 Dockerfile 构建
1.先创建一个 static_web 的目录来保存 Dockerfile, 这个目录就是我们的构建环境,
docker 则称此环境为上下文或者构建的上下文。Docker 会在构建镜像时将构建上下文和该
上下文的文件和目录上传到 Docker 守护进程。这样 Docker 守护进程就能直接访问用户想
在镜像中存储的任何代码,文件或者其他数据。
# Version : 0.0.1
FROM ubuntu:14.04
MAINTAINER Wei daodao "[email protected]"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80
Dockerfile 由一系列指令和参数构成。每条指令后面跟着一个参数。Dockerfile 中的指令按顺序
从上到下执行。
每条指令都会创建一个新的镜像层并对镜像进行提交。Docker 大体上按照如下流程执行 Dockerfile 中的指令:
1.Docker 从基础镜像运行一个容器
2.执行一条指令,对容器进行修改
3.执行类似 docker commit 的操作,提交一个新的镜像层
4.Docker 在基于公共提交的镜像运行一个新的容器
5.执行 Dockerfile 中的下一条指令,直到所有的指令执行完毕
如果用户的 Dockerfile 由于某些原因失败了,那么用户将得到一个可以使用的镜像。这对调试很有帮助:可以基于
该镜像运行一个具备交互式功能的容器,使用最后创建的镜像对为什么用户的指令会失败进行调试。
每个 Dockerfile 的第一条指令必须是 FROM. FROM 指令指定一个已经存在的镜像,后续的指令都是基于这个镜像进行,
这个镜像被称为基础镜像。
指定 MAINTAINER 指令,这条指令会告诉 Docker 该镜像的作者是谁,以及作者的email.
RUN 指令会在当前的镜像中运行指定的命令。每条 RUN 指令都会创建一个新的镜像层,如果指令成功,就会将此镜像层提交。
之后继续执行 Dockerfile 中的下一条指令。
默认情况下, RUN 指令会在 shell 里使用命令包装器 /bin/sh -c 来执行。如果是在一个不支持 shell 的平台上运行或者
不希望在 shell 中运行,也可以使用 exec 格式发 RUN 命令。如:
RUN ["apt-get", "install", "-y", "nginx"]
EXPOSE 命令告诉 docker 该容器内的应用程序将会使用容器的指定端口。这并不意味着可以自动访问任何容器运行中的服务的端口。
2.基于 Dockerfile 构建新镜像
docker build -t weidaodao/static_web .
-t 设置仓库和名称
如果在构建上下文的根目录存在 .dockerignore 命名的文件的话,那么该文件内容会被按行进行切割,每一行都是一条文件过滤匹配模式。
这非常像 .gitignore 文件,该文件用来设置哪些文件不会被当作构建上下文的一部分。
3.构建失败了怎么办
基于最后成功步骤创建新容器进行调试:
1.docker run -t -i 容器_id /bin/bash
2.运行失败的命令,进行调试
3.成功后,修改 Dockerfile 文件,再次构建
4.Dockerfile 和构建缓存
由于每一步的构建过程都会将结果提交为镜像,所以 Docker 的构建过程就显得非常聪明。它会将之前的镜像层当作缓存。
有时候不需要缓存:
docker build --no-cache
5.基于构建缓存的 Dockerfile 模板
FROM ubuntu:14.04
MAINTAINER Wei daodao "[email protected]"
ENV REFRESHED_AT 2014-07-01 # 设置环境变量, 用来表明该镜像模板最后的更新时间
RUN apt-get -qq update
有了这个模板,如果想刷新一个构建,只需要修改 ENV 指令中的日期。这使 docker 在命中 ENV 指令时开始重置这个缓存,
并运行后续指令而无需依赖该缓存。
docker history 镜像名 // 查看镜像如何构建的
构建镜像: