Docker 入门实战二(镜像与Dockerfile)

版权声明:本文为博主(wisdom-chen)的原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38423105/article/details/85462808

什么是镜像?

  • 镜像是用于创建容器的只读模板

  • 镜像是通过Docker build命令创建

  • 镜像由镜像层构成

  • 镜像存储于Docker Registry

镜像命令

1 docker images :列出本地镜像

 docker images [OPTIONS] [REPOSITORY[:TAG]]
  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
  • --digests :显示镜像的摘要信息;
  • -f :显示满足条件的镜像;
  • --format :指定返回值的模板文件;
  • --no-trunc :显示完整的镜像信息;
  • -q :只显示镜像ID。

Repository仓库名,tag 标签,image id 镜像id ,created 创建时间 ,size 大小

2 docker search : 从Docker Hub查找镜像

docker search [OPTIONS] TERM
  • --automated :只列出 automated build类型的镜像;
  • --no-trunc :显示完整的镜像描述;
  • -s :列出收藏数不小于指定值的镜像。

name 镜像名,description 描述,starts 关注OFFICIAL 官方认证

下载镜像的时候注意是否为官方,看关注数量

3 docker pull : 从镜像仓库中拉取或者更新指定镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  •  -a :拉取所有 tagged 镜像
  • --disable-content-trust :忽略镜像的校验,默认开启

如果后面不写版本号,默认是latest (最新的)

4 docker rmi : 删除本地一个或多个镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]
  • -f :强制删除;
  • --no-prune :不移除该镜像的过程镜像,默认移除

看报错就知道,该镜像被容器所引用无法删除,必须强制删除

5 docker login/logout : 登录、登出docker仓库

docker login [OPTIONS] [SERVER]
docker logout [OPTIONS] [SERVER]
  • -u :登陆的用户名
  • -p:登录的密码
登录
$ docker login -u 用户名 -p 密码
登出
$ docker logout

6 docker tag : 标记本地镜像,将其归入某一仓库

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
实例
[root@localhost demo]# docker tag wget:0.1 xiekcdocker/wget:0.1

7 docker push :将镜像上传至仓库 

docker push [OPTIONS] NAME[:TAG]
  • --disable-content-trust :忽略镜像的校验,默认开启 
[root@localhost demo]# docker push wget:0.1
The push refers to repository [docker.io/library/wget]
61bd8543f10b: Preparing
071d8bd76517: Preparing
denied: requested access to the resource is denied
[root@localhost demo]# docker push xiekcdocker/wget:0.1
The push refers to repository [docker.io/xiekcdocker/wget]
An image does not exist locally with the tag: xiekcdocker/wget
[root@localhost demo]# docker tag wget:0.1 xiekcdocker/wget:0.1
[root@localhost demo]# docker push xiekcdocker/wget:0.1
The push refers to repository [docker.io/xiekcdocker/wget]
61bd8543f10b: Pushed
071d8bd76517: Pushed
0.1: digest: sha256:b3de14f7e54e6a732c3e02b2c0f8d9606be0c0b99e8b34d365c71d444eb862ff size: 741

去hub.docker上看下仓库,成功!

先创建一个简单的Dockerfile 

vi Dockerfile
插入以下代码
FROM centos
LABEL maintainer "wget-test0.1"
RUN yum install -y wget
打包镜像
[root@localhost demo]# docker build -t wget:0.1 .
[root@localhost demo]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wget                0.1                 ecae4808d003        2 minutes ago       272MB

一个简单的centos镜像就创建完毕。上面的5-7可以通过这个测试。

什么是Dockerfile?

  • Dockerfile 是 Docker 的 RPM Spec文件

  • Dockerfile 是一个包含用户创建Docker镜像所有指令的文本文件

  • Dockerfile 中的指令指定在创建Docker 镜像时做什么操作

  • Docker 读取Dockerfile中指令创建Docker镜像

  • 每个指令将创建新的Docker镜像层

下面我来介绍dockerfile的各个参数的作用以及用法

DockerFile文件

  • Dockerfile必须以FROM 开头,指定baseimage

  • 语法

    • FROM <images> [AS <name>]

    • FROM <image> [:<tag>] [AS <name>

WORKDIR指令

  • WORKDIR指令设置RUN,CMD,ENTRYPOINT,COPY和ADD的工作目录

  • 语法

    • WORKDIR /path/to/directory

  • 默认WORKDIR是根目录/,任何通过WORKDIR指令设置的WORKDIR都相对于根目录/

  • 在同一Dockerfile中可设置多个WORKDIR指令,如果设置WORKDIR为绝对路径,后续WORKDIR指令设置的相对路径被附加到初始绝对路径

COPY和ADD指令

  • COPY和ADD指令实现从主机到容器的文件传输功能

  • COPY支持简单 的文件服务

  • ADD除了COPY支持的功能外还支持其他功能如:tar包,自动解压,远程url等

  • 语法

    • ADD <source><destination>

    • COPY <source><destination>

    • ADD -–chown=<user>:<group><source><destination>

    • COPY -–chown=<user>:<group><source><destination>

使用注意点:

  • 如果destination不存在,则自动创建

  • 所有新创建的文件或者文件夹UID和GID为0,即root用户,通过–chown选项修改

  • 如果destination 末以/结尾,则认为destination为文件,source内容将写入文件

  • 如果source包含通配符,则destination必须为目录,且以/结尾,否则build失败

  • source 必须在build上下文存在,不能build上下文之外

  • 针对ADD指令

    • 如果source是url,而destination不是目录不以/结尾,则从url下载的文件写入destination;

    • 如果destination是目录且以/结尾,则URL对应的文件被下载到destination所在目录,如<destination>/<filename>;

    • 如果source是本地tar包,tar包被自动解压为目录,而远程tar包暂时不支持

RUN指令

  • 语法

    • RUN <command>

    • RUN [“executable”,“parameter 1”,“parameter 2”]

  • RUN指令在容器的可写入层被执行命令,并commit容器为新的镜像

  • 上一步RUN指令生成的镜像被接下来RUN使用,每次RUN指令生成一个新的镜像

  • Dockerfile中最好用链式输入命令以减少创建镜像层数量 command && command

CMD/ENTRYPOINT指令

  • 如何指定启动容器时执行什么命令

  • 语法

    • CMD [“executable”,“param1”,“param2”](exec形式)

    • CMD[“param1”,“param2”](作为ENTRYPOINT的默认参数)

    • CMD command param1 param2(shell 形式)

    • ENTRYPOINT [“executable”,“param1”,“param2”] (exec形式 )

    • ENTRYPOINT command param1 param2 (shell 形式)

  • 如果在Dockerfile中不指定CMD/ENTRYPOINT指令,Docker将使用基础镜像提供的默认命令

  • CMD/ENTRYPOINT指令在创建Docker镜像时不执行,只有在容器启东时才执行

  • 既可以使用exec形式也可以shell形式指定要执行的指令

  No ENTRYPOINT ENTRYPOINT exec_entry p1_entry ENTRYPOINT [“exec_entry”,“p1_entry”]
No CMD error,not allowed /bin/sh -c exec_entry p1_entry exec_entry p1_entry
CMD[“exec_cmd”,“p1_cmd”] exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry exec_cmd p1_cmd
CMD[“p1_cmd”,“p2_cmd”] p1_cmd p2_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry p1_cmd p2_cmd
CMD exec_cmd p1_cmd /bin/sh -c exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
  • ENTRYPOINT 指令最好以exec形式执行,如果以shell形式则一些参数不能正确传入或不能正常工作

  • shell形式整个命令作为参数传入,可执行子命令,管道等

  • exec形式不会调用shell命令,这意味着shell的一些特性如变量替换,管道等不能正常工作

  • shell形式下将以/bin/sh -c 调用可执行程序,这意味着可执行程序没有PID与之对应,将不能接受unix信号

VOLUME指令

  • VOLUME指令在Docker主机上创建目录并挂载到容器中,通常在Docker的根目录

  • 语法

    • VOLUME <dir>

EXPOSE指令

  • EXPOSE指令告知Docker容器将监听在指定的端口

  • 语法

    • EXPOSE <port> [<port>/<protocol>…]


下一篇介绍docker容器的操作命令和实战

猜你喜欢

转载自blog.csdn.net/qq_38423105/article/details/85462808
今日推荐