当前位置:   article > 正文

2.1、全网最详细Docker镜像教程(新手建议收藏)

docker镜像

目录

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"目录下,如下所示。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. [root@centos7-6 ~]# docker info | grep "Docker Root Dir"
  2. 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,如下所示。

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

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

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

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

  1. [root@centos7-6 ~]# systemctl daemon-reload
  2. [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的镜像,如下所示。

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

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

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

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

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

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

  1. [root@centos7-6 ~]# docker inspect 28308bbc7b60
  2. [
  3. {
  4. "Id": "sha256:28308bbc7b601d718e9adf53c5a5451a1cbeda4de7ff41e4e1eb5fc919330fbb",
  5. "RepoTags": [
  6. "flink:latest"
  7. ],
  8. "RepoDigests": [],
  9. "Parent": "",
  10. "Comment": "",
  11. "Created": "2021-12-22T13:12:50.744297261Z",
  12. "Container": "6b5ca7ce6b961689a59acc9baa8e6d42826ca8a39bbf226389ce49705150fe7b",
  13. "ContainerConfig": {
  14. "Hostname": "6b5ca7ce6b96",
  15. "Domainname": "",
  16. "User": "",
  17. "AttachStdin": false,
  18. "AttachStdout": false,
  19. "AttachStderr": false,
  20. "ExposedPorts": {
  21. "6123/tcp": {},
  22. "8081/tcp": {}
  23. },

(5)删除Flink镜像。

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

5、构建自己的镜像

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

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

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

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

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

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

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

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

(3)查看容器。

  1. [root@centos7-6 ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 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 网页。

  1. [root@centos7-6 ~]# docker exec -it 9e70d60470b3 /bin/bash
  2. root@9e70d60470b3:/usr/local/tomcat# mkdir webapps/mydemo
  3. 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”命令基于该容器生成镜像,并将镜像保存到本地。

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

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

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

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

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

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

  1. [root@centos7-6 ~]# docker login
  2. 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.
  3. Username: bdqnli
  4. Password:
  5. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  6. Configure a credential helper to remove this warning. See
  7. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  8. Login Succeeded

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

  1. [root@centos7-6 ~]# docker push test/my_tomcat2
  2. Using default tag: latest
  3. The push refers to repository [docker.io/test/my_tomcat2]
  4. 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的文件

  1. [root@centos7-6 ~]# mkdir /aa
  2. [root@centos7-6 ~]# touch /aa/Dockerfile
  3. [root@centos7-6 ~]# ls /aa/Dockerfile
  4. /aa/Dockerfile

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

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

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

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

  1. [root@centos7-6 aa]# docker build -t my_nginx .
  2. Sending build context to Docker daemon 2.048kB
  3. Step 1/2 : FROM nginx
  4. 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
  5. [root@centos7-6 aa]# docker build -t my_nginx .
  6. Sending build context to Docker daemon 2.048kB
  7. Step 1/2 : FROM nginx
  8. latest: Pulling from library/nginx
  9. 1f7ce2fa46ab: Pull complete
  10. 9b16c94bb686: Pull complete
  11. 9a59d19f9c5b: Pull complete
  12. 9ea27b074f71: Pull complete
  13. c6edf33e2524: Pull complete
  14. 84b1ff10387b: Pull complete
  15. 517357831967: Pull complete
  16. Digest: sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee
  17. Status: Downloaded newer image for nginx:latest
  18. ---> a6bd71f48f68
  19. Step 2/2 : RUN echo '<h1>This is nginx</h1>' > /usr/share/nginx/html/index.html
  20. ---> Running in b660f0bea8e6
  21. Removing intermediate container b660f0bea8e6
  22. ---> 0c38b6c36cee
  23. Successfully built 0c38b6c36cee
  24. Successfully tagged my_nginx:latest

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

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

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

  1. [root@centos7-6 ~]# docker run -d -p 6363:80 my_nginx
  2. e97bbb9ffa3b6091b3a7c6b340440ac4cf66f239b2c25d721ed813ec163e2285
  3. [root@centos7-6 ~]# docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 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,可以看到访问页面。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/537899
推荐阅读
相关标签
  

闽ICP备14008679号