容器深入浅出学习--Docker镜像构建

一.docker镜像使用

运行docker容器时,使用的镜像如果在本地不存在,docker会自动从docker镜像仓库中下载,默认是从docker hub公共镜像源下载
在这里,我们需要了解:管理和使用本地的docker镜像,创建镜像
列出本地镜像列表:docker images

[root@k8s-01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE k8s.gcr.io/kube-proxy v1.13.1 fdb321fd30a0 6 days ago 80.2MB k8s.gcr.io/kube-apiserver v1.13.1 40a63db91ef8 6 days ago 181MB k8s.gcr.io/kube-controller-manager v1.13.1 26e6f1db2a52 6 days ago 146MB k8s.gcr.io/kube-scheduler v1.13.1 ab81d7360408 6 days ago 79.6MB k8s.gcr.io/coredns 1.2.6 f59dcacceff4 6 weeks ago 40MB quay.io/external_storage/cephfs-provisioner latest 8d09a3e96942 2 months ago 401MB k8s.gcr.io/etcd 3.2.24 3cab8e1b9802 3 months ago 220MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 11 months ago 44.6MB k8s.gcr.io/pause 3.1 da86e6ba6ca1 12 months ago 742kB ubuntu 15.10 9b9cb95443b5 2 years ago 137MB training/webapp latest 6fae60ef3446 3 years ago 349MB

参数说明:

REPOSITORY:表示镜像的仓库员

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像的创建时间

SIZE:镜像大小
同一个仓库源可以有多个TAG,表示这个仓库源的多个不同版本。我们使用REPOSITORY:TAG来定义不同的镜像
我们在使用docker镜像的时候,如果不指定一个镜像的版本标签,docker默认使用laster镜像

二.创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行修改:

从已经创建的容器中更新镜像,并且提交这个镜像

使用dockerfile指令来创建一个新的镜像

2.1 更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器

[root@k8s-01 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cb2ea5793288 training/webapp "python app.py" About an hour ago Up About an hour 0.0.0.0:32768->5000/tcp laughing_engelbart [root@k8s-01 ~]# docker exec -it cb2ea5793288 /bin/bash root@cb2ea5793288:/opt/webapp# touch yushengyin.txt root@cb2ea5793288:/opt/webapp# cat yushengyin.txt TEST CHUANGJIAN JINGXIANG

我们进入容器中创建了一个yushengyin.txt的文件,并写入了一行文本,下面我们通过docker commit来提交容器副本

[root@k8s-01 ~]# docker commit -m "add yushengyin.txt" -a "yuhaohao" cb2ea5793288 modify/webapp:v2 sha256:64647147dc09efb200997c2544ecaf22581fb392536512075d3e8ef36937740b

提交修改的参数说明:

-m:提交的描述信息

-a:指定提交的镜像作者

cb2ea5793288:容器的ID

modify/webapp:v2:指定要创建的目标镜像名和TAG

下面我们通过docker images查看我们更新的镜像modify/webapp:v2

[root@k8s-01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE modify/webapp v2 64647147dc09 5 seconds ago 349MB training/webapp latest 6fae60ef3446 3 years ago 349MB

使用新更新的镜像启动一个容器:

[root@k8s-01 ~]# docker run -i -t modify/webapp:v2 /bin/bash root@16d6341b43c5:/opt/webapp# ls Procfile app.py requirements.txt tests.py yushengyin.txt

可以看出新更新的镜像包含我们修改的内容

2.2 Dockerfile介绍

我们使用docker build,从零开始来构建一个新的镜像。构建镜像之前,我们需要创建一个Dockfile文件,需要包含一组指令来告诉docker如何构建我们的镜像:
docker有10几条命令可用于构建镜像,下面简要介绍这些命令
ADD:ADD命令有两个参数,源和目标,它的基本作用是从源系统的文件系统上复制文件到目前容器的文件系统。如果源是一个URL,那么该URL的内容将被下载并复制到容器中。
如:

Usage: ADD [source directory or URL] [destination directory] ADD /my_app_folder /my_app_folder

CMD:和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的时候执行的,而是在用镜像构建容器后被调用
如:

Usage 1: CMD application "argument", "argument", .. CMD "echo" "Hello docker!"

ENTRYPOINT:配置容器启动后执行的命令,并且不可以被docker run提供的参数覆盖,每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除"application"而仅仅保留参数。参数将传递给ENTRYPOINT命令。

# Usage: ENTRYPOINT application "argument", "argument", .. # Remember: arguments are optional. They can be provided by CMD # or during the creation of a container. ENTRYPOINT echo # Usage example with CMD: # Arguments set with CMD can be overridden during *run* CMD "Hello docker!" ENTRYPOINT echo

ENV:ENV命令用于设置环境变量,这些变量以"key=value"的形式存在,并可以在容器内被脚本或者程序调用。这个机制在给容器中运行应用带来了极大的方便。

# Usage: ENV key value ENV SERVER_WORKS 4

EXPOSE:EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互

# Usage: EXPOSE [port] EXPOSE 8080

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggdjf.html