docker image 学习

78 阅读1分钟

前言

关于docker 镜像的一些常用操作,整理理解以及方便查询。


获取镜像

$ docker pull [IMAGE_NAME]:[TAG]

# 通过 镜像名:标签 指定镜像,如果不指定tag,默认下载latest标签
# eg: docker pull mysql:5.7
# 可以通过 docker pull --help 查看全部使用选项

查看镜像信息

$ docker image ls
# 列出已有镜像,不包括中间镜像

$ docker image ls -a
# 列出全部镜像

$ docker inspect [IMAGE_NAME|ID]
# 返回 JSON array格式信息,获取镜像的详细信息,其中,包括创建者,各层的数字摘要等

$ docker history [IMAGE_NAME|ID]
# 列出各个层的创建信息

搜索镜像

$ docker search [option] keyword
# eg: docker search mysql 查找mysql镜像
# eg: docker search --filter=is-offical=true mysql 查找官方提供的 mysql 镜像
# eg: docker search --filter=stars=100 mysql 查找Stars 数超过 100 的 mysql 镜像

创建及修改镜像

创建

  • 基于已有镜像创建
$ docker container commit
# 通过运行已有镜像,在container中作出修改,然后提交产生新的镜像。
# 这种方式创建可复现性较差,操作步骤不好回溯,不推荐。

eg:

$ docker run -it docker.io/ubuntu:latest /bin/bash
$ root@a0a0c8cfec3a:/# touch test.txt
$ root@a0a0c8cfec3a:/# exit
# 运行镜像,修改container

$ docker container commit -m "Added test.txt file" -a "Allen" a0a0c8cfec3a test:0.1
# 提交container,创建新image,该命令会返回新镜像ID信息
  • 基于Dockerfile创建

Dockerfile 是一个文本指令文件,它描述了是如何基于一个父镜像,来创建一个新镜像的过程。eg: 以 koa-demos 项目为例

  1. 下载源码:

    $ git clone https://github.com/ruanyf/koa-demos.git
    $ cd koa-demos
    
  2. 创建文本文件 Dockerfile

    FROM node:8.4
    COPY . /app
    WORKDIR /app
    RUN npm install --registry=https://registry.npm.taobao.org
    EXPOSE 3000
    
    # FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
    # COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
    # WORKDIR /app:指定接下来的工作路径为/app。
    # RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
    # EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
    
  3. 创建image文件

    $ docker image build -t koa-demo .
    # 或者
    $ docker image build -t koa-demo:0.0.1 .
    # -t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。
    # 点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。
    

    修改

  • 使用 tag 命令为镜像添加标签

    $ docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 
    # eg: docker tag mysql:5.7 mysql_me:5.7
    # 类似一个快捷方式
    

    删除镜像

    $ docker rmi [image]
    # 或
    $ docker image rm [image]
    # 限制:当通过该镜像创建的容器未被销毁时,镜像是无法被删除的。
    
    $ docker image prune
    
    # 清理掉使用 Docker 一段时间后,系统残存一些临时的、没有被使用的镜像文件
    

镜像导出和加载

导出

$ docker save [OPTIONS] IMAGE [IMAGE...]
# eg: docker save -o python_3.tar python:3 
# eg: docker save busybox > busybox.tar

加载

$ docker load [OPTIONS]
# eg: docker load -i python_3.tar
# eg: docker load < busybox.tar.gz

$ docker image import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
# docker import 是它的别名
# 从tarball中导入内容,创建一个文件系统镜像,对应docker export 导出的tar
# eg: cat exampleimage.tgz | docker import - exampleimagelocal:new
# eg: docker import /path/to/exampleimage.tgz
# eg: sudo tar -c . | docker import - exampleimagedir

Docker 上传镜像

# Docker Hub 账号,获取Docker ID和密码

# 创建docker 仓库

$ docker login
# 命令行登录

$ docker tag python:3 repository_demo/python:3
# 打一个新的标签,前缀与新创建的 Docker ID 、仓库名保持一致

$ docker push repository_demo/python:3
# 推送镜像到远端仓库

总结

Docker 命令都有一个 --help 选项可以查看额外操作功能,可以善加使用。

Dockerfile 是一个很好的设计。

Docker 镜像的管理类似git的工作方式。

参考链接: