docker from指令的含义_一起学习docker04-docker镜像

本文详细介绍了Docker镜像的概念,以及如何下载和管理镜像。通过实例演示了使用`docker run`、`docker pull`、`docker inspect`等命令操作镜像,并展示了如何通过`docker create`和`docker commit`手工制作镜像。此外,还讲解了Dockerfile的`FROM`指令,强调了其作为Dockerfile首个非注释指令的重要性,以及如何利用Dockerfile自动化构建镜像。
摘要由CSDN通过智能技术生成

一起学习docker系列:

一起学docker-可视化管理01-Portainer

一起学docker-可视化管理02-Rancher

一起学习docker01-docker简介和安装

一起学习docker02-Registry私有仓库

一起学习docker03-harbor私有仓库搭建

一起学习docker04-docker镜像

一起学习docker05-docker容器

一起学docker06-docker网络

一、关于镜像

镜像是 Docker 的三大组件之一。

Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是Docker Hub 公共注册服务器中的仓库)。一般公司内部会搭建私有仓库,公司自己的镜像会放到私有仓库里。

二、下载镜像,了解基本信息

1、先找一个镜像下载下来(选择一个较小的,下载快)

docker search java

06ba174a59d7337d2a043f74f4098836.png

下载,并运行确认版本

docker run -it java java -version

也可以通过docker pull下载docker pull docker.io/hello-world 然后执行其他命令

4243bef5cdad0cd54bc33f1de767bfc8.png

查看系统

docker run -it java uname

d76e501ebe2d6eed7486d568a209c7d3.png

查看镜像ip

docker run java ip addr

aa7f59887bc26e19df85ed3565b38a36.png

查看环境变量

docker run java env

20d35ddf520c18b11bc0e923e748f0e4.png

以上了解镜像里面是什么。

以上了解了镜像内容后我们可以下载运行一个镜像,了解平时需要查看镜像的那些信息。

下载镜像

docker pull docker.io/hello-world

注意:仓库地址,docker.io,没有指明tag,默认就是latest.运行这个镜像

3265c2a1382504a0af21fbf8ccf18ac2.png

查看镜像

docker images 查看是否下载

820991953e55a58cd82e0c2c85dba0c9.png

运行镜像

docker run docker.io/hello-world

ae34e1b6e1a73d5458f1f0bcc5a32858.png

查看镜像信息(这里信息较多)

docker inspect docker.io/hello-world

4026ef14cb2138f4cda93f62bdef1f56.png

删除镜像

docker rmi docker.io/hello-world -f

2225abe4ee0680a952d4d53fc070bf9d.png

删除所有未打标签的镜像 docker rmi $(docker images -q -f dangling=true) 删除所有镜像 docker rmi $(docker images -q)

三、手工制作镜像

一般情况下,公司内部使用的镜像都是经过内部情况进行优化处理的,所有需要进行修改,然后传到私有仓库。

我们这里先通过刚刚下载的java镜像来做我们自己需要的镜像

docker create --name wolfjava -it java /bin/bash

# docker create --name wolfjava -it java /bin/bash

271e96acb33a0afdc4b4101e00aa1cb343bb959b844db2817584cd499016d523

启动

#docker start wolfjava

#docker ps

181b4bde75cef1685c3237775b45753e.png

进去查看一下

# docker exec -it 271e96acb33a /bin/bash

root@271e96acb33a:/#

我们这里创建一个wolf目录

03514c6b25ec5b77b7ea546774ce4e16.png

打开另一个窗口,执行commit操作。

# docker commit 271e96acb33a wolfjava-01

sha256:31bb307101b0ee3e52a239ec1ca80df3b9e147d69e9a3b4bb43e5c1256e9674a

通过docker images查看是否成功,通过下图发现已经成功。

1c93b93aa797ac6b767a4a7f98d2e0f6.png

我们在通过我们制作的镜像来启动,看看里面是否有我们创建的wolf目录

docker run -it wolfjava-01 ls 这里发现有wolf目录存在,说明我们成功了。

f551d74cd3c7440ecb9afe0e7c9367fb.png

我们昨天搭建了harbor,这里提交一下

docker tag 31bb307101b0 10.101.200.159/wolf/wolfjava-01

978c70ba6fa2dee678b2e5170f2f5e95.png

上传到仓库

docker push 10.101.200.159/wolf/wolfjava-01

46508585ed79ac9da10afacb5d067305.png

看到这里说明,没问题,我们登录网页查看一下

509c105ffea3cff8a5ff34a7b459cbff.png

这里发现很快就创建了一个新的容器这种做法的优点:最方便、最快速,学习制作镜像更易理解这种做法的缺点:不规范、无法自动化(完全手工)、不科学

四、dockerfile制作镜像

Dockerfile的官方手册如下

https://docs.docker.com/engine/reference/builder/

在Dockerfile中用到的命令有FROM

FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令。至于image则可以是任何合理存在的image镜像。 FROM 一定是首个非注释指令 Dockerfile. FROM 可以在一个 Dockerfile 中出现多次,以便于创建混合的images。 如果没有指定 tag ,latest 将会被指定为要使用的基础镜像版本。

MAINTAINER 这里是用于指定镜像制作者的信息RUN

RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。

层级 RUN 指令和生成提交是符合Docker核心理念的做法。它允许像版本控制那样,在任意一个点,对image 镜像进行定制化构建。

RUN 指令缓存不会在下个命令执行时自动失效。比如 RUN apt-get dist-upgrade -y 的缓存就可能被用于下一个指令. --no-cache 标志可以被用于强制取消缓存使用。

ENV ENV指令可以用于为docker容器设置环境变量

ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env =来修改环境变量。

USER USER 用来切换运行属主身份的。

Docker 默认是使用 root,但若不需要,建议切换使用者身份,毕竟 root 权限太大了,使用上有安全的风险。

WORKDIR WORKDIR 用来切换工作目录的。Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。

COPY COPY 将文件从路径 复制添加到容器内部路径 。 必须是相对于源文件夹的一个文件或目录,也可以是一个远程的url, 是目标容器中的绝对路径。 所有的新文件和文件夹都会创建UID 和 GID 。事实上如果 是一个远程文件URL,那么目标文件的权限将会是600。

ADD ADD 将文件从路径 复制添加到容器内部路径 。 必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url。 是目标容器中的绝对路径。 所有的新文件和文件夹都会创建UID 和 GID。事实上如果 是一个远程文件URL,那么目标文件的权限将会是600。

VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

EXPOSE EXPOSE 指令指定在docker允许时指定的端口进行转发。

CMD Dockerfile.中只能有一个CMD指令。 如果你指定了多个,那么最后个CMD指令是生效的。 CMD指令的主要作用是提供默认的执行容器。这些默认值可以包括可执行文件,也可以省略可执行文件。 当你使用shell或exec格式时, CMD 会自动执行这个命令。ONBUILD ONBUILD 的作用就是让指令延迟执行,延迟到下一个使用 FROM 的 Dockerfile 在建立 image 时执行,只限延迟一次。 ONBUILD 的使用情景是在建立镜像时取得最新的源码 (搭配 RUN) 与限定系统框架。

ARG ARG是Docker1.9 版本才新加入的指令。 ARG 定义的变量只在建立 image 时有效,建立完成后变量就失效消失LABEL 定义一个 image 标签 Owner,并赋值,其值为变量 Name 的值。(LABEL Owner=$Name )ENTRYPOINT 是指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。

我们来制作一个java镜像

#vi Dockerfile

FROM 10.101.200.159/wolf/wolfjava-01

MAINTAINER nimmis <1098331428@qq.com>

# disable interactive functions

ENV DEBIAN_FRONTEND noninteractive

# set default java environment variable

ADD hello.sh /bin/hello.sh

RUN /bin/hello.sh

开始执行制作

docker build -t 10.101.200.159/wolf/wolfjava-02 .

5fd824992c0562eddef0dc6d5acc9e2f.png

制作成功,我们看一下docker iamges

2662688125ffcb0d0200ee5503223485.png

上传到仓库

docker push 10.101.200.159/wolf/wolfjava-02

2121350a070883b6982e48d7bf68acf0.png
0a9052ec8fa33aa094f6e68dee4e637d.png

Dockerfile的命令,要多用,就熟悉了,后面我们会逐步使用,这里先熟悉一下制作过程。

五、导入备份生成镜像

我们这里随意导出一个(这里是到处一个容器快照)

docker export f393a847db63 >myimage.tar

809ee42d9d35f24e1d3ab92aab245502.png

我们导入,导入容器快照,生成镜像

docker import myimage.tar import-test/myimage:v1.0

623318570443c0234401cef0ee7cdca4.png

使用此外也可以使用url来 docker import

*注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值