IT程序员客栈

菜鸟系列docker——docker镜像上(3)

1. 镜像image

镜像和容器的关系就和安装包和程序的关系一样,有了镜像才可以启动容器,容器是镜像的一个运行实例。

1.1 镜像的结构

通过第二节仓库,可能很多看官已经查看到镜像是分层的,接下来将对镜像进行详细介绍。首先,通过一个我们最熟悉对hello-world开始入门。此处涉及很多关于镜像对命令。

  • 通过docker pull一个镜像
[centos@jiliguo ~]$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
Status: Downloaded newer image for hello-world:latest
  • 通过docker images查看镜像
[centos@jiliguo ~]$ docker images hello-world
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        3 months ago        1.84kB
  • 通过docker run运行镜像
[centos@jiliguo ~]$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

那么这个镜像包含写什么呢?我们查看一下构建该镜像对dockerfile文件
https://hub.docker.com/
查找hello-world镜像
在Supported tags and respective Dockerfile links选择一个查看即可

FROM scratch
COPY hello /
CMD ["/hello"]

这个文件就三行,其含义是 from一个基础镜像,拷贝hello文件,容器启动时执行hello文件。这里基础镜像是scratch,其含义是从0开始对,没有依赖其他镜像。
我们看看nginx这个镜像对dockerfile。

FROM debian:stretch-slim

LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"

ENV NGINX_VERSION 1.14.2-1~stretch
ENV NJS_VERSION   1.14.2.0.2.6-1~stretch
# run后面太长了,省略下
RUN ....
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
	&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80

STOPSIGNAL SIGTERM

CMD ["nginx", "-g", "daemon off;"]

通过nginx可以看出,它是依赖于debian镜像对基础上创建的。

接下来将通过nginx的dockerfile文件详细介绍docker镜像的结构
dockerfile文件里,每一个命令都可以看成一层,第一层 from,第二层label,第三层env,第四层也是env。这样描述可能不是很清晰,接下来我们通过nginx的dockerfile构建一个镜像。让各位更加直观的感受下docker镜像分层。
-----一个尴尬的分割线,还是毕竟长----- 看一部分哈

[centos@jiliguo docker]$ docker build -t mynginx:v1.0 .
Sending build context to Docker daemon  6.144kB
Step 1/9 : FROM debian:stretch-slim
stretch-slim: Pulling from library/debian
27833a3ba0a5: Already exists 
Digest: sha256:bade11bf1835c9f09b011b5b1cf9f7428328416410b238d2f937966ea820be74
Status: Downloaded newer image for debian:stretch-slim
 ---> c08899734c03
Step 2/9 : LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"
 ---> Running in d01ec5c5a51c
Removing intermediate container d01ec5c5a51c
 ---> 2c123195c3f6
Step 3/9 : ENV NGINX_VERSION 1.14.2-1~stretch
 ---> Running in 0adfc50e4af7
Removing intermediate container 0adfc50e4af7
 ---> 088f48b30338
Step 4/9 : ENV NJS_VERSION   1.14.2.0.2.6-1~stretch
 ---> Running in 6f1ed07ec93b
Removing intermediate container 6f1ed07ec93b

再次确认了每行都是一层了吧。

1.2 分层结构

其实分层有个很大的优势,因为他将一个镜像分层了,则层之间是可以资源复用的,怎么说呢。如果我们需要对nginx再封装多个服务,则这多个服务对nginx层是可以复用的,这样的话就只需要保留一个nginx镜像。

note:即使复用了一些层,但是各个容器是相互隔离的,并不会因为某个容器修改了一个文件,另一个容器相对的文件也被修改了。

在容器启动的后,容器整个架构就在最上层存在一个容器层,下面都是镜像层,只有容器层是可写的。所有对容器修改等操作都发生再容器层。

image

1.3 镜像相关命令

  1. docker images 查看镜像
  2. docker pull 获取镜像
  3. docker push 上传镜像
  4. docker build 构建镜像
  5. docker search 查找镜像
  6. docker tag 给镜像打标签
  7. docker rmi 删除镜像
  8. docker save/load 保存/加载镜像
  9. docker commit 构建镜像
有兴趣的关注IT程序员客栈哦

posted @ 2019-04-20 16:58  IT程序员客栈  阅读(275)  评论(0编辑  收藏  举报
IT程序员客栈