什么是Docker镜像
Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。
- 一个镜像可以包含一个基本的操作系统环境,里面仅安装了 Apache 应用程序(或 用户需要的其他软件) 可以把它称为一个 Apache 镜像。
- 镜像是创建 Docker 容器的基础。
- 通过版本管理和增量的文件系统, Docker 提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。
获取镜像
其中, NAME 是镜像仓库名称(用来区分镜像), TAG 是镜像的标签(往往用来表示版本信息) 。 通常情况下, 描述 一 个镜像需要包括 “ 名称+标签 “ 信息。
例如, 获取一个 Ubuntu 18.04 系统的基础镜像可以使用如下的命令:
[root@openEuler-node1 ~]# docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
7c457f213c76: Pull complete
Digest: sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98
Status: Downloaded newer image for ubuntu:18.04
如果没有写 “名称+标签“ 信息中的标签,会默认添加一个latest标签,表示这个仓库中最新的镜像
[root@openEuler-node1 ~]# docker pull ubuntu
Using default tag: latest #自动添加的一个标签,获取最新的版本
latest: Pulling from library/ubuntu
bccd10f490ab: Pull complete
Digest: sha256:77906da86b60585ce12215807090eb327e7386c8fafb5402369e421f44eff17e
Status: Downloaded newer image for ubuntu:latest
[root@openEuler-node1 ~]# docker pull hub.c.163.com/public/centos:6.5
6.5: Pulling from public/centos
96057de2d572: Pull complete
a3ed95caeb02: Pull complete
8a1dcc3f76c2: Pull complete
8fe56c90e86a: Pull complete
43fc3558431f: Pull complete
5881bc109689: Pull complete
Digest: sha256:92fd18cda0cbf63bb4b5ffd0c073a9d689d5b202e3b491cbc74488fff1c37d11
Status: Downloaded newer image for hub.c.163.com/public/centos:6.5
查看镜像
images命令列出镜像
使用docker images或docker image ls 命令可以列出本地主机上已有镜像的基本信息。
- REPOSITORY:来自于哪个仓库
- TAG:镜像的标签信息
- IMAGE ID:镜像的ID(唯一标识镜像)
images子命令主要支持如下选项:
docker tag ubuntu:latest myubuntu:latest
使用inspect命令查看详细信息
[root@openEuler-node1 ~]# docker inspect ubuntu:18.04
[root@openEuler-node1 ~]# docker inspect -f {{".Architecture"}} ubuntu:18.04
amd64
搜索镜像
[root@openEuler-node1 ~]# docker search busybox
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 3223 [OK]
radial/busyboxplus Full-chain, Internet enabled, busybox made f… 56 [OK]
yauritux/busybox-curl Busybox with CURL 25
arm32v7/busybox Busybox base image. 10
arm64v8/busybox Busybox base image. 8
odise/busybox-curl 4 [OK]
s390x/busybox Busybox base image. 3
.....
删除和清理镜像
删除就rm -f参数是强制删除,可以基于ID或者标签删除
docker rmi busybox:latest
- -a, -all: 删除所有无用镜像, 不光是临时镜像;
- -filter filter: 只清理符合给定过滤器的镜像;
- -f, -force: 强制删除镜像, 而不进行提示确认。
创建镜像
1基于已有容器创建
该方法主要是使用 docker [container] commit 命令
演示:
[root@openEuler-node1 ~]# docker run -it ubuntu:18.04 bash
root@35b863d7caf6:/# touch test
root@35b863d7caf6:/# exit
此时容器与原镜像就不一致了,可以用commit来提交一个新的镜像
[root@openEuler-node1 ~]# docker commit -m "Add a new file" -a "FYS" 35b863d7caf6 test:0.1
sha256:e2c7a68ee5c90d3ae55b095ca7dc8ee4a9ca1a54e9722d6ef4b98c68d1c5e4cf
[root@openEuler-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 e2c7a68ee5c9 23 seconds ago 63.2MB
2基于本地模板导入
[root@openEuler-node1 ~]# cat ubuntu-18.04-x86_64-minimal.tar.gz I docker import - ubuntu:lB.04
3基于Dockefile创建
[root@openEuler-node1 ~]# vim dockerfile
FROM debian:stretch-slim
LABEL version="1.0" maintainer "docker user <docker user@github>"
RUN apt-get update && \apt-get install-y python3 && \ apt-get clean && \rm rf /var/lib/apt/lists/*
[root@openEuler-node1 ~]# docker build -t python:3 .
FROM: 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER: 镜像维护者的姓名和邮箱地址
RUN: 容器构建时需要运行的命令,如果在容器运行时需要运行其他命令,使用run指定
EXPOSE: 容器对外暴露的端口,mysql:3306、redis:6379
WORKDIR:创建容器后,进入容器使用pwd指令落脚点的目录,没有指定就是/,如centos是/,redis是/data
ENV: 用来构建镜像的过程中设置环境变量,"ENV 键 值"。 相当于成员变量
如:ENV MY_PATH /usr/mytest 这个环境变量可以在后续的任何RUN指令中使用;也可以在其它指令中直接使用这些环境变量,
ADD: 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包。 ADD = COPY+解压缩
COPY: 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
VOLUME: 容器数据卷,用来数据保存和持久化工作
CMD: 指定一个容器启动时需要运行的命令。DockerFile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
也就是人工添加或文件中指定的CMD参数会把DockerFile里面的参数覆盖,只会有最后一个生效。.其中 使用 -f 命令可以指定dockerfile的路径。
存出和载入镜像
1存出镜像
[root@openEuler-node1 ~]# docker save -o ubuntu_18.04.tar ubuntu:18.04
[root@openEuler-node1 ~]# ll
总用量 64012
-rw-------. 1 root root 974 2月 19 16:15 anaconda-ks.cfg
-rw-r--r-- 1 root root 205 3月 11 16:47 dockerfile
-rw------- 1 root root 65539072 3月 11 16:54 ubuntu_18.04.tar
2载入镜像
[root@openEuler-node1 ~]# docker load < ubuntu_18.04.tar
[root@openEuler-node1 ~]# docker load -i ubuntu_18.04.tar
上传镜像
[root@openEuler-node1 ~]# docker push user/test:latest