Dokcer 学习笔记(三)- 构建自定义镜像

本贴最后更新于 1808 天前,其中的信息可能已经时过境迁

镜像定义

Docker 镜像是由文件系统叠加而成,最底端是一个文件引导系统,即 bootfs。除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。例图如下。

2.构建镜像

构建镜像主要有两种方法:

  • 使用 docker commit 命令
  • 使用 docker build 和 Dockerfile 命令

推荐使用 Dockerfile 构建镜像,因为 Dockerfile 更加灵活、强大。

1.使用 Docker 的 commit 命令创建镜像

Docker 的 comiit 命令有点类似于 SVN、Git,先创建一个 容器,然后对容器进行修改,然后提交成为一个新镜像。

首先,基于 Ubuntu 容器创建一个新镜像。

docker run -it centos:7 /bin/bash

在/home 路径下创建 xw 文件夹:mkdir /home/xw

安装 ifconfig 命令

yum -y install net-tools

提交

docker commit -a

使用 docker images 命令可以看到我们新构建的镜像。

启动新构建的镜像,看下我们创建的目录是否存在。

镜像文件存在,说明构建的镜像是 OK 的。

3.使用 Dockerfile 构建镜像

Dockerfile 使用 DSL 语法编写构建镜像的命令,使用 docker build 命令构建镜像。

首先,先了解一下相关命令。

  • MAINTAINER 注明作者
  • COPY 复制文件进入镜像(只能用相对路径,不能用绝对路径)
  • ENV 设置环境变量
  • EXPOSE 暴露容器端口
  • RUN 在构建镜像的时候执行,作用于镜像层面
  • CMD 在容器启动的时候执行,作用于容器层,dockerfile 里有多条时只允许执行最后一条。(需要运行的命令在数组里面,如果不使用数组指定 CMD 命令,这时 Docker 会在命令前面加上/bin/sh -c,可能会导致不可预计的错误,所以 Docker 推荐一般使用数组形式执行命令)
  • ENTRYPOINT 在容器启动的时候执行,作用于容器层,dockerfile 里有多条时只允许执行最后一条
  • ADD 复制文件进入镜像(假如文件是.tar.gz 文件会解压)
  • WORKDIR 指定工作目录,假如路径不存在会创建路径

我们创建一个最简单的 Dockerfile,内容如下

from centos:7
run cd /home
run mkdir xw
run echo

使用 docker -build 命令构建。

docker build -t  mycentos7:1 .

-t 指定 tag,如果我们没有指定 tag,默认使用 latest 标签。打包完成后使用 docker images 命令查看我们构建的镜像。

由于 Dockerfile 每一个步骤的执行结果都会提交成镜像,它会将之前构建的镜像作为缓存,大大加快构建的速度,如果不需要缓存,可以添加 --no-cache 命令

docker build --no-cache -t mycentos:2 .

3.镜像推送到 Docker Hub

首先注册一个 docker Hub 账号。使用 docker login 命令,登录

开始推送

docker push mycentos7

镜像名称不符合规范,重命名

docker tag cea9577866a5 docker.io/2457081614/mycentos7

重新推送。

docker push docker.io/2457081614/mycentos7

推送成功。

加油,共勉。

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 926 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...