docker 学习(一)镜像和镜像的构建Dockerfile

docker学习

概述

  • 诞生时间:2013年
  • 编写语言:go
  • 目标:实现轻量级操作系统虚拟化解决方案。
  • 基础是Linux容器(LXC)等技术。
  • 与传统虚拟化的区别:
![Alt text](./1530091149104.png) ![Alt text](./1530091153149.png)

在任何地方开发、部署和运行任何应用

Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。

docker 组件

  • docker engine 基于虚拟化技术的轻量级并且功能强大的开源引擎管理工具。
  • docker hub 分享管理images尽享的SaaS服务

为什么选择docker

  • 快速交付应用程序
    • 部署快
    • 依赖少
    • 易迁移
    • 省资源
  • 快速构建轻松管理

镜像

镜像概述

  • docker 镜像又文件系统叠加而成,低端是一个引导文件系统bootfs,用户不会跟引导文件系统又交互,当容器启动后,就会被移到内存中,引导文件系统就会被卸载。
  • 第二层是rootfs,可以是操作系统。docker里rootfs永远是只读状态
  • 镜像存在只读层,不会改变
  • 父镜像:每个镜像都可能依赖有一个或多个下层组成的一个镜像,下层就是上层的父镜像
  • 基础镜像:没有父镜像的镜像就是基础景象
  • 镜像id:所有镜像都通过一个64位十六进制字符串内部是256bit的值来标识,为了简化使用,前12个字符组成短id。

获取镜像

docker pull命令从仓库获取镜像,默认仓库源是docker官方源,为了加快速度,可以使用其它源地址:

docker pull  http://localhost:5000/ubuntu:18.04

最常用的是更换docker默认源为国内源:
vim /etc/docker/daemon.json

{
      "registry-mirrors": [
              "https://registry.docker-cn.com"
                ]
}

重启docker即可使用

列出本地镜像

docker images

REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
192.168.100.52:5000/centos        latest              7a5530ef979d        5 days ago          4.75 GB
centos                            lnmp2               7a5530ef979d        5 days ago          4.75 GB
127.0.0.1:5000/centos             latest              7a5530ef979d        5 days ago          4.75 GB
192.168.100.52/centos             latest              7a5530ef979d        5 days ago          4.75 GB

id相同的镜像是同一个镜像
tag用来标记同意仓库的不同镜像
使用docker run 启动镜像的时候,如果不指定具体的tag。怎会启动最新latest

构建镜像

一般来说不是真正的创建新镜像,而是基于一个已有的基础镜像,如ubuntu,centos等构建新镜像而已。

1.可以从已有镜像上更新,也可以基于本地系统创建

修改已有镜像

先使用镜像启动容器,然后进入容器进行修改,修改完成后退出容器,用docke commit 命令进行提交更改后的容器副本,

提交

docker commit

选项:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

2.Dockerfile和docker build构建镜像:

  • Dockerfile使用的是DSL语法。docker build基于Dockerfile里面的指定进行构建镜像。
  • 创建一个空目录,并新建Dockerfile文件
    mkdir -p /home/docker-web && cd /home/docker-web && touch Dockerfile
    vim Dockerfile
#注释
FROM ubuntu:14.04 #指定一个基础镜像,FROM要大写
MAINTAINER #镜像作者以及联系方式
RUN #RUN命令会在当前镜像中运行指定命令。比如:
RUN yum -y install apache
默认情况下,RUN指令会在shell里使用命令包装器/bin/sh -c来执行,不支持shell用exec格式的RUN
RUN [ "yum","-y","install","apache"]
EXPOSE指定需要打开哪些端口

构建镜像
docker build -t="centos/apache:v1 ."
-t 选项为镜像指定仓库和镜像名字。
.指定在当前目录中指定Dockerfile
也可以指定一个git仓库源地址
构建每一步都会有id,如果构建出错,进入前一步骤的id进行调试,然后再次构建。
- Dockerfile和构建缓存
由于每步过程都会提交为镜像,最终镜像之前的镜像就可以看作是缓存,如果构建失败对某一步骤进行调试,前面几步没有改动,会在有修改的步骤开始进行构建。
不需要构建缓存时,用--no-cache参数
- 基于缓存构建Dockerfile模板
构建缓存的好处是,可以实现简单的Dockerfile模板,,比如在Dockerfile文件顶部增加包仓库或者更新包,尽可能命中缓存。
- ENV指令为环境变量,由于镜像的层次文件系统,环境变量在后续的层次中被引用。当容器启动后,在容器可以通过env命令查看环境变量。
ENV DIR=/usr/local/
WORKDIR $DIR
ENV创建的环境变量会持久的保存到从此镜像创建的任何容器中,也可所以使用docker run -e参数指定环境变量,只在启动时有效
- RUN命令是构建容器时所需要运行的命令
- CMD是在容器运行时,需要运行的命令,将要运行的命令放在一个数组结构中例如:CMD ["bin/bash","ls"], 如果不加数组结构,docker会在命令前加上/bin/sh -c
- 启动容器时docker run命令可以覆盖CMD
- Dockerfile中只能指定一个CMD命令。多个CMD只会执行最后一个
- ENTRYPOINT指令与CMD相似,区别:docker run会覆盖CMD命令,但是不能覆盖ENTRYPOINT命令。如需覆盖在启动时市容docker run --entrypoint
- WORKDIR指令从镜像创建容器时,在容器内设置一个工作目录,指定ENTRYPOINT和/或者CMD、RUN、COPY、ADD指令的工作目录,如果不存在,就会创建。可以多次设置。在启动容器时,用docker run -w参数进行覆盖。
- USER指令用来指定该镜像会议什么用户运行。启动时用docker run -u参数进行覆盖。默认为root。

USER user
USER user:group
USER uid:gid
USER uid:group
  • VOLUME指令基于镜像创建的容器添加卷,VOLUME ["/data/mysql","data"]
  • ADD指令将构建环境下的文件和目录复制到镜像中,ADD passwd /etc/passwd将本地构建目录下的passwd复制到镜像中/etc/passwd。可以是一个url,或者构建上下文文件或者目录,不能是构建目录意外的文件。docker通过末尾的/判断是目录还是文件。添加url示例:ADD http://www.baidu.com/123.zip /home/baidu.zip当ADD的文件是本地归档文件。会自动解包。ADD baidu.zip /home/会自动解包,如果存在目标文件或目录,不会被覆盖,自动解压支支持本地归档文件,不支持url。如果目标路径不存在则会自动创建
  • COPY指令与ADD类似,区别是COPY只是在构建上下文中复制本地文件,不会提取和解压,本地文件与Dockerdile同一路径。目标位置必须是是容器内的一个绝对路径。任何由该指令创建的文件uid和gid都是0
  • ONBUILD指令是Dockerfile文件中的触发器,并不会在基于此Dockerfile构建镜像中生效,当基于此父镜像构建子镜像时,才会触发生效。孙子镜像不能触发,onbuild不能执行FROM、MAINTAINER、和ONBUILD本身
  • EXPOSE指令是告诉docker该容器内部的应用程序会使用容器的指定端口,

posted @ 2018-07-04 15:40  李庆喜  阅读(511)  评论(0编辑  收藏  举报