Docker

Docker

  • Docker学习记录

    概念

  • 镜像

    • 分层储存
    • 就像可执行文件
  • 容器
    • 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中 的实例一样
    • 类似镜像的分层储存,每一个容器运行时,是以镜像为 基础层,在其上创建一个为当前容器运行时读写而准备的存储层(容器存储层

使用镜像

获取镜像

  • 命令格式:docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
    • Docker Registry地址:地址的格式一般是 <域名/IP>[:端口号] 。默认地址是Docker Hub。
    • 仓库名:如之前所说,这里的仓库名是两段式名称,既 <用户名>/<软件名> 。对于 Docker Hub,如果不给出用户名,则默认为library ,也就是官方镜像。

运行

ubuntu:14.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ docker run -it --rm ubuntu:14.04 bash
root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.5 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
root@e7009c6ce357:/# exit
exit
$
  • -i :交互式操作, -t: 终端
  • –rm :这个参数是说容器退出后随之将其删除
  • ubuntu:14.04 :这是指用 ubuntu:14.04 镜像为基础来启动容器。
  • bash放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。

列出镜像

镜像体积

虚悬镜像(dangling image)

1
2
3
4
5
$ docker images -f dangling=true
REPOSITORY TAG IMAGE ID CREA
TED SIZE
<none> <none> 00285df0df87 5 da
ys ago 342 MB
  • 虚悬镜像已经失去了存在的价值,是可以随意删除

  • $ docker rmi $(docker images -q -f dangling=true)

中间层镜像

  • $ docker images -a
  • 无需删除

列出部分镜像

  • 根据仓库名列出镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ docker images ubuntu
    REPOSITORY TAG IMAGE ID CREA
    TED SIZE
    ubuntu 16.04 f753707788c5 4 we
    eks ago 127 MB
    ubuntu latest f753707788c5 4 we
    eks ago 127 MB
    ubuntu 14.04 1e0c3dd64ccd 4 we
    eks ago 188 MB
  • 列出特定的某个镜像

    1
    2
    3
    4
    5
    $ docker images ubuntu:16.04
    REPOSITORY TAG IMAGE ID CREA
    TED SIZE
    ubuntu 16.04 f753707788c5 4 we
    eks ago 127 MB
  • 利用 –filter ,查找 在 mongo:3.2 之后建立的镜像

    1
    2
    3
    4
    5
    6
    7
    $ docker images -f since=mongo:3.2
    REPOSITORY TAG IMAGE ID CREA
    TED SIZE
    redis latest 5f515359c7f8 5 da
    ys ago 183 MB
    nginx latest 05a60462f8ba 5 da
    ys ago 181 MB
  • 某个位置之前的镜像,只需要把 since 换成 before

以特定格式显示

  • -q 参数:把虚悬镜像的 ID 列出来

  • –filter 配合 -q 产生出指定范围的 ID 列表

  • 列出镜像结果,并且只包含镜像ID和仓库名(用到了 Go 的模板语法)

    1
    2
    3
    4
    5
    6
    7
    8
    $ docker images --format "{{.ID}}: {{.Repository}}"
    5f515359c7f8: redis
    05a60462f8ba: nginx
    fe9198c04d62: mongo
    00285df0df87: <none>
    f753707788c5: ubuntu
    f753707788c5: ubuntu
    1e0c3dd64ccd: ubuntu
  • 以表格等距显示,并且有标题行,和默认一样,自己定义列(用到了 Go 的模板语法)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag
    }}"
    IMAGE ID REPOSITORY TAG
    5f515359c7f8 redis latest
    05a60462f8ba nginx latest
    fe9198c04d62 mongo 3.2
    00285df0df87 <none> <none>
    f753707788c5 ubuntu 16.04
    f753707788c5 ubuntu latest
    1e0c3dd64ccd ubuntu 14.04

使用 Dockerfile 定制镜像

在一个空白目录中,建立一个文本文件,并命名为 Dockerfile :

1
2
3
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

其内容为:

1
2
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

FROM 指定基础镜像

RUN 执行命令

  • Dockerfile 中每一个指令都会建立一层

    Dockerfile 正确的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/r
edis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-component
s=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps

构建镜像

在 Dockerfile 文件所在目录执行:

1
2
3
4
5
6
7
8
9
10
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
---> e43d811ce2f4
Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/h
tml/index.html
---> Running in 9cdc27646c7b
---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
  • . 指的是上下文(context)

其它 docker build 的用法

直接用 Git repo 进行构建

1
2
3
4
5
6
7
8
$ docker build https://github.com/twang2218/gitlab-ce-zh.git#:8.
14
docker build https://github.com/twang2218/gitlab-ce-zh.git\#:8.14
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM gitlab/gitlab-ce:8.14.0-ce.0
8.14.0-ce.0: Pulling from gitlab/gitlab-ce
aed15891ba52: Already exists
773ae8583d14: Already exists

用给定的 tar 压缩包构建

1
$ docker build http://server/context.tar.gz

从标准输入中读取 Dockerfile 进行构建

1
2
3
docker build - < Dockerfile
或者
cat Dockerfile | docker build -
  • 这种形式由于直接从标准输入中读取 Dockerfile 的内容,它没有上下文,因此不可以像其他方法那样可以将本地文件 COPY 进镜像之类的事情。

从标准输入中读取上下文压缩包进行构建

1
$ docker build - < context.tar.gz

Dockerfile 指令详解

COPY 复制文件

格式:

  • COPY <源路径>… <目标路径>
  • COPY [“<源路径1>”,… “<目标路径>”]

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像
内的 <目标路径> 位置。

COPY package.json /usr/src/app/

<源路径> 可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的
filepath.Match 规则

1
2
COPY hom* /mydir/
COPY hom?.txt /mydir/

<目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工
作目录可以用 WORKDIR 指令来指定)。目标路径不需要事先创建,如果目录不存
在会在复制文件前先行创建缺失目录。

此外,还需要注意一点,使用 COPY 指令,源文件的各种元数据都会保留。比如
读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建
相关文件都在使用 Git 进行管理的时候。

ADD 更高级的复制文件

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些
功能。

  • 比如 <源路径> 可以是一个 URL ,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600 ,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层 RUN 指令进行解压缩。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下载,处理权限、解压缩、然后清理无用文件更合理。因此,这个功能其实并不实用,而且不推荐使用。
  • 如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip , bzip2 以及
    xz 的情况下, ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
  • ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变
    得比较缓慢。

因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD 。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. Docker
    1. 1.1. 概念
    2. 1.2. 使用镜像
      1. 1.2.1. 获取镜像
      2. 1.2.2. 运行
      3. 1.2.3. 列出镜像
        1. 1.2.3.1. 镜像体积
        2. 1.2.3.2. 虚悬镜像(dangling image)
        3. 1.2.3.3. 中间层镜像
        4. 1.2.3.4. 列出部分镜像
        5. 1.2.3.5. 以特定格式显示
    3. 1.3. 使用 Dockerfile 定制镜像
      1. 1.3.1. FROM 指定基础镜像
      2. 1.3.2. RUN 执行命令
      3. 1.3.3. 构建镜像
      4. 1.3.4. 其它 docker build 的用法
        1. 1.3.4.1. 直接用 Git repo 进行构建
        2. 1.3.4.2. 用给定的 tar 压缩包构建
        3. 1.3.4.3. 从标准输入中读取 Dockerfile 进行构建
        4. 1.3.4.4. 从标准输入中读取上下文压缩包进行构建
    4. 1.4. Dockerfile 指令详解
      1. 1.4.1. COPY 复制文件
      2. 1.4.2. ADD 更高级的复制文件
载入天数...载入时分秒...