目录

1、什么是Docker的镜像

2、Dokcer镜像存储路径

2.1、使用Docker 默认的镜像存储路径

2.2、自定义Docker的镜像存储路径

3、使用Docker的公有镜像仓库

3.1、配置和使用阿里云 Docker镜像加速仓库

4、使用命令行工具管理Docker的镜像

5、构建自己的镜像

5.1、使用“docker commit”命令构建镜像

5.2、使用Dockerfile 文件构建镜像

5.2.1、什么是 Dockerfile?

5.2.2、构建Dockerfile


1、什么是Docker的镜像

    Docker的镜像是一个模板,或者说其是一个只读文件。在该模板中包含应用和应用运行 时所需要的依赖环境。Docker的镜像采用的是分层的文件系统,每一次对镜像的修改将 以“读写层”的形式增加到原来的只读文件的模板上。 

    图2-1展示了Docker镜像的分层结构。下面进行介绍。

  • 内核(bootfs):用来加载 Linux的内核以启动Linux环境。Docker 的用户不会 与这一层直接打交道。
  • 根镜像:可以将其理解成操作系统,图2-1中的根镜像使用的是 CentOS。
  • 在根镜像之上就是叠加的每一层应用,图2-1中的MySQL、Tomcat 等。 另外,在物理存储上,镜像的本质其实是磁盘上一系列文件的集合,如图2-2所示。

2、Dokcer镜像存储路径

    Docker 默认的镜像存储路径是“/var/lib/docker",也可以自定义其他路径。 

2.1、使用Docker 默认的镜像存储路径

(1)通过执行以下语句可以得知Docker镜像的存储路径,可以看出在默认情况下,Docker将 拉取的镜像存储在“/var/lib/docker"目录下,如下所示。

[root@centos7-6 ~]# docker info | grep "Docker Root Dir"
 Docker Root Dir: /var/lib/docker

(2)这里我拉取一个Nginx镜像作为演示,如下所示。

[root@centos7-6 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
1f7ce2fa46ab: Pull complete 
9b16c94bb686: Pull complete 
9a59d19f9c5b: Pull complete 
9ea27b074f71: Pull complete 
c6edf33e2524: Pull complete 
84b1ff10387b: Pull complete 
517357831967: Pull complete 
Digest: sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

(3)查看镜像,这里可以看到镜像ID为a6bd71f48f68

[root@centos7-6 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    a6bd71f48f68   18 hours ago   187MB

(4)使用Find命令查询镜像文件,可以看到刚刚拉取的镜像默认保存在/var/lib/docker/目录下。

[root@centos7-6 ~]# find /var/lib/docker/ -name a6bd71f48f68* 
/var/lib/docker/image/overlay2/imagedb/content/sha256/a6bd71f48f6839d9faae1f29d3babef831e76bc213107682c5cc80f0cbb30866
2.2、自定义Docker的镜像存储路径

    在实际生产环境中,Docker默认的镜像存储路径往往不能满足磁盘空间大小的要求。 可以根据以下步骤来修改这个存储路径。

(1)创建新的镜像存储路径“/data/docker”,该路径用于保存 Docker的镜像文件。

[root@centos7-6 ~]# mkdir -pv /data/docker
mkdir: 已创建目录 "/data"
mkdir: 已创建目录 "/data/docker"

(2)创建Docker守护进程的配置文件。

[root@centos7-6 ~]# touch /etc/docker/daemon.json

(3)在“daemon.json”文件中输入以下内容。

[root@centos7-6 ~]# vim /etc/docker/daemon.json 
{
 "graph": "/data/docker"
}

(4)重新加载Docker的服务,并重启Docker。

[root@centos7-6 ~]# systemctl daemon-reload 
[root@centos7-6 ~]# systemctl restart docker.service 

(5)重新查看Docker的镜像存储路径,会发现路径变成了“/data/docker”

[root@centos7-6 ~]# docker info | grep "Docker Root Dir"
 Docker Root Dir: /data/docker

3、使用Docker的公有镜像仓库

    存储Docker 镜像的地方叫作镜像仓库。镜像仓库分为公有镜像仓库和私有镜像仓库。 下面通过实战来介绍如何使用Docker 公有镜像仓库。

    Docker官方提供了一个公有镜像仓库Docker Hub。在通过Docker客户端操作 Docker 时,如果没有指定镜像仓库的地址,则默认使用该镜像仓库的地址。

    公有镜像仓库地址:https://hub.docker.com (由于Docker官方的某些原因,目前网业不能访问,但是并不影响我们在客户端拉取镜像、上传镜像)。

    下面通过具体步骤演示来介绍如何使用Docker Hub。

3.1、配置和使用阿里云 Docker镜像加速仓库

    由于在国内访问Docker Hub 是非常缓慢的。为了提高效率,可以在Docker 引擎中配置国内的镜像加速器。Docker可以配置的国内镜像加速器有很多,比如阿里云、 网易蜂巢DaoCloud、Docker 中国区官方镜像加速器。

    下面以阿里云的镜像加速器进行演示。

(1)首先确定默认的镜像仓库地址,可以看到默认使用的是官方的Docker Hub,如下所示。

[root@centos7-6 ~]# docker info | grep Registry
 Registry: https://index.docker.io/v1/

(2)访问阿里云的容器镜像服务网站。找到容器镜像服务-选择镜像工具-镜像加速器,可以看到加速器地址。

(3)然后配置镜像加速器。

(4)重新加载Docker的服务,并重启Docker。

[root@centos7-6 ~]# systemctl daemon-reload 
[root@centos7-6 ~]# systemctl restart docker.service 

(5)使用“docker info”命令确认加速器配置是否成功,如下所示,从中可以看 出,参数 Registry Mirrors被设置成阿里云的镜像加速器地址。

4、使用命令行工具管理Docker的镜像

    之前我们已经使用了若干条 Docker 命令来操作 Docker 的镜像。下图展示了与镜像相关的—些操作命令。

命令说明
docker search [IMAGE NAME]在拉取镜像之前,可以通过该命令搜索符合的镜像
docker images列出本机上的所有镜像。该命令行还可以使用通配符,以找到符合条 件的一系列镜像
docker inspect [IMAGE NAME][CONTAINER ID]通过“docker images”命令只能查看镜像的基本信息,而通 过“docker inspect“命令则可以查看镜像或者容器的详细信息
docker pull [IMAGE NAME]将镜像拉到本地。镜像名必须包含命名空间和仓库名。如果在一个仓 库中存在多个镜像,则必须指定 TAG,即指定版本的信息,否则使用 默认的TAG“latest"
docker push [IMAGE NAME]docker push [IMAGE NAME]
docker push [IMAGE NAME]将不需要的镜像删除。与移除容器的命令rm相比,删除镜像的命令 多了一个i,i即image 的意思。在删除镜像时,需要注意两点:①如 果要删除多个镜像,则需要使用空格将它们隔开;②可以使用参数-f 强制删除镜像

    下面演示这些命令的使用方法。

    下面演示这些命令的使用方法 。

(1)在镜像仓库中搜索Flink的镜像,如下所示。

[root@centos7-6 ~]# docker search flink
NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
flink                                   Apache Flink® is a powerful open-source dist…   405       [OK]       
apache/flink                                                                            14                   
apache/flink-kubernetes-operator        Apache Flink Kubernetes Operator                9                    
melentye/flink                          Yet another Docker image for Apache Flink.      4                    [OK]
amd64/flink                             Apache Flink® is a powerful open-source dist…   3                    
apache/flink-statefun                                                                   3                    
bitnami/flink                           Bitnami container image for Apache Flink        2                    

(2)将 Flink镜像拉取到本地。

[root@centos7-6 ~]# docker pull flink

(3)查看本地的镜像信息,并使用通配符查看所有以“f”开头的镜像。

[root@centos7-6 ~]# docker images f*
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
flink        latest    28308bbc7b60   23 months ago   658MB

(4)使用“docker inspect”命令查看Flink镜像的详细信息。

[root@centos7-6 ~]# docker inspect 28308bbc7b60
[
    {
        "Id": "sha256:28308bbc7b601d718e9adf53c5a5451a1cbeda4de7ff41e4e1eb5fc919330fbb",
        "RepoTags": [
            "flink:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "",
        "Created": "2021-12-22T13:12:50.744297261Z",
        "Container": "6b5ca7ce6b961689a59acc9baa8e6d42826ca8a39bbf226389ce49705150fe7b",
        "ContainerConfig": {
            "Hostname": "6b5ca7ce6b96",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6123/tcp": {},
                "8081/tcp": {}
            },

(5)删除Flink镜像。

[root@centos7-6 ~]# docker rmi -f 28308bbc7b60
Untagged: flink:latest
Deleted: sha256:28308bbc7b601d718e9adf53c5a5451a1cbeda4de7ff41e4e1eb5fc919330fbb
Deleted: sha256:77cffbfd8693c3964faf8d14e3a5c82be3681ba6dcab6385f2a503a17415f1d5
Deleted: sha256:362243e967c2f7b3c97946558aacbc6e58b5455b3ea03979245b3a2e15adf1ec

5、构建自己的镜像

    在前面的操作中,使用的镜像都是镜像仓库中已有的镜像,或者说是别人已经开发好的 镜像。那么,是否可以构建自己的镜像,并把镜像上传到镜像仓库中呢?答案当然是可以的。

    要构建自己的镜像有两种方式:①使用“docker commit”命令;②使用Dockerfile 文件。

5.1、使用“docker commit”命令构建镜像

    “docker commit”命令基于一个容器来创建镜像,首先我们生成一个tomcat的容器。

(1)使用docker pull拉取tomcat的镜像,这里我已经拉取好了,如下所示。

[root@centos7-6 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
tomcat       latest    fb5657adc892   23 months ago   680MB

(2)使用docker run创建容器。

[root@centos7-6 ~]# docker run -d --name my_tomcat -p 8080:8080 tomcat
9e70d60470b3437d29d4e93afbb310fa5f922cd7f23c498f0c4685689efc1fa2

(3)查看容器。

[root@centos7-6 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                                       NAMES
9e70d60470b3   tomcat    "catalina.sh run"   4 seconds ago   Up 3 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   my_tomcat

(4)通过浏览器访问“http://192.168.8.105:8080”会返回404错误,这是因为在Tomcat 中没有部署任何应用。

(5)确定 Tomcat 容器ID,进入容器内部署一个简单的HTML 网页。

[root@centos7-6 ~]# docker exec -it 9e70d60470b3 /bin/bash
root@9e70d60470b3:/usr/local/tomcat# mkdir webapps/mydemo
root@9e70d60470b3:/usr/local/tomcat# echo "<h1>This is Tomcat</h1>" > webapps/mydemo/index.html

(6)在浏览器中访问“http://192.168.23.206:8080/mydemo/index.html”,可以成功看到index.html。

(7)使用“docker commit”命令基于该容器生成镜像,并将镜像保存到本地。

[root@centos7-6 ~]# docker commit 9e70d60470b3 my_tomcat
sha256:529278a9c4428cfc516d5e864b5cd80992381d9ceb23250201bb9731a2244ae9

(8)查看本地的镜像文件,可以看到,刚才基于容器9e70d60470b3生成了一个名为my_tomcat的镜像。

[root@centos7-6 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
my_tomcat    latest    529278a9c442   6 seconds ago   680MB
tomcat       latest    fb5657adc892   23 months ago   680MB

(9)如果想将生成镜像上传到镜像库中,则需要在镜像名称前加上仓库的路径信息

[root@centos7-6 ~]# docker commit 9e70d60470b3 test/my_tomcat2
sha256:ca0341a39afc281762fc81f5ea3f644c3e59203e8dc31bd4fc3d5e22f28ccd7f
[root@centos7-6 test]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
test/my_tomcat2   latest    ca0341a39afc   20 seconds ago   680MB
my_tomcat         latest    529278a9c442   7 minutes ago    680MB
tomcat            latest    fb5657adc892   23 months ago    680MB

(10)登录Docker Hub,输入注册的用户名和密码

[root@centos7-6 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: bdqnli
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

(11)将镜像上传保存到镜像仓库中,默认保存到 Docker Hub 中

[root@centos7-6 ~]# docker push test/my_tomcat2
Using default tag: latest
The push refers to repository [docker.io/test/my_tomcat2]
Get "https://registry-1.docker.io/v2/": dial tcp [2600:1f18:2148:bc00:41e1:f57f:e2e2:5e54]:443: connect: network is unreachable

    最后由于博主在写这篇博客的时候网络环境不好,最终没有上传成功,当然啦,具体方法就是这样,感兴趣的小伙伴可以课后自己动手去试试,不懂的地方可以来问博主。

5.2、使用Dockerfile 文件构建镜像

    Docker 镜像是一个特殊的分层文件系统,包含应用和必要的依赖环境,但并不包含任 何的动态信息。构建一个镜像,实际上就是为镜像中的每一层创建相应的配置。因此,可以 把构建的命令语句、参数配置等信息都写入一个脚本中。这样,“docker commit”命令的 无法重复的问题、镜像“臃肿”的问题就都被解决了。这个脚本就是Dockerfile文件。

5.2.1、什么是 Dockerfile?

    Dockerfile是一个文本文件,其包含了一条条的指令,每一条指令都用于构建镜像中的 一层。

    Dockerfile 文件可以使用“docker build”命令进行编译。在编译过程中,每一条指令 的内容描述了该层应如何进行构建。当我们需要定制自己额外的需求时,只需要在 Dockerfile文件的基础上添加或者修改指令,重新生成新的镜像即可。

    下面就让我们一起动手来试试吧

5.2.2、构建Dockerfile

    此案例通过一个简单的示例来演示如何使用 Dockerfile文件。在这个示例中,将基于 Nginx的镜像来构建一个新的镜像,并在该镜像中部署一个简单的Web网页。

(1)创建一个aa的目录,然后在里面创建一个Dockerfile的文件

[root@centos7-6 ~]# mkdir /aa
[root@centos7-6 ~]# touch /aa/Dockerfile
[root@centos7-6 ~]# ls /aa/Dockerfile 
/aa/Dockerfile

(2)在Dockerfile文件写入以下内容

[root@centos7-6 ~]# vim /aa/Dockerfile 
FROM nginx
RUN echo '<h1>This is nginx</h1>' > /usr/share/nginx/html/index.html

    当然啦,可能有的小伙伴会看不懂这里面的内容,但是没关系,博主下节课会跟大家精讲Dockerfile

(4)在Dockerfile文件所在的目录下执行“docker buld”命令构建镜像。构建的过 程如图下所示。

[root@centos7-6 aa]# docker build -t my_nginx .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 202.96.128.86:53: read udp 192.168.23.206:57131->202.96.128.86:53: i/o timeout
[root@centos7-6 aa]# docker build -t my_nginx .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
latest: Pulling from library/nginx
1f7ce2fa46ab: Pull complete 
9b16c94bb686: Pull complete 
9a59d19f9c5b: Pull complete 
9ea27b074f71: Pull complete 
c6edf33e2524: Pull complete 
84b1ff10387b: Pull complete 
517357831967: Pull complete 
Digest: sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee
Status: Downloaded newer image for nginx:latest
 ---> a6bd71f48f68
Step 2/2 : RUN echo '<h1>This is nginx</h1>' > /usr/share/nginx/html/index.html
 ---> Running in b660f0bea8e6
Removing intermediate container b660f0bea8e6
 ---> 0c38b6c36cee
Successfully built 0c38b6c36cee
Successfully tagged my_nginx:latest

(5)查看新生成的镜像。

[root@centos7-6 aa]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my_nginx          latest    0c38b6c36cee   37 seconds ago   187MB

(6)使用新生成的镜像创建容器。

[root@centos7-6 ~]# docker run -d -p 6363:80 my_nginx
e97bbb9ffa3b6091b3a7c6b340440ac4cf66f239b2c25d721ed813ec163e2285
[root@centos7-6 ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                       NAMES
e97bbb9ffa3b   my_nginx   "/docker-entrypoint.…"   4 seconds ago    Up 2 seconds    0.0.0.0:6666->80/tcp, :::6363->80/tcp       competent_engelbart

(7)在浏览器中访问http://192.168.23.206:6666,可以看到访问页面。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐