赞
踩
目录
Docker的镜像是一个模板,或者说其是一个只读文件。在该模板中包含应用和应用运行 时所需要的依赖环境。Docker的镜像采用的是分层的文件系统,每一次对镜像的修改将 以“读写层”的形式增加到原来的只读文件的模板上。
图2-1展示了Docker镜像的分层结构。下面进行介绍。
Docker 默认的镜像存储路径是“/var/lib/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
在实际生产环境中,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
存储Docker 镜像的地方叫作镜像仓库。镜像仓库分为公有镜像仓库和私有镜像仓库。 下面通过实战来介绍如何使用Docker 公有镜像仓库。
Docker官方提供了一个公有镜像仓库Docker Hub。在通过Docker客户端操作 Docker 时,如果没有指定镜像仓库的地址,则默认使用该镜像仓库的地址。
公有镜像仓库地址:https://hub.docker.com (由于Docker官方的某些原因,目前网业不能访问,但是并不影响我们在客户端拉取镜像、上传镜像)。
下面通过具体步骤演示来介绍如何使用Docker Hub。
由于在国内访问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被设置成阿里云的镜像加速器地址。
之前我们已经使用了若干条 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
在前面的操作中,使用的镜像都是镜像仓库中已有的镜像,或者说是别人已经开发好的 镜像。那么,是否可以构建自己的镜像,并把镜像上传到镜像仓库中呢?答案当然是可以的。
要构建自己的镜像有两种方式:①使用“docker commit”命令;②使用Dockerfile 文件。
“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
最后由于博主在写这篇博客的时候网络环境不好,最终没有上传成功,当然啦,具体方法就是这样,感兴趣的小伙伴可以课后自己动手去试试,不懂的地方可以来问博主。
Docker 镜像是一个特殊的分层文件系统,包含应用和必要的依赖环境,但并不包含任 何的动态信息。构建一个镜像,实际上就是为镜像中的每一层创建相应的配置。因此,可以 把构建的命令语句、参数配置等信息都写入一个脚本中。这样,“docker commit”命令的 无法重复的问题、镜像“臃肿”的问题就都被解决了。这个脚本就是Dockerfile文件。
Dockerfile是一个文本文件,其包含了一条条的指令,每一条指令都用于构建镜像中的 一层。
Dockerfile 文件可以使用“docker build”命令进行编译。在编译过程中,每一条指令 的内容描述了该层应如何进行构建。当我们需要定制自己额外的需求时,只需要在 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,可以看到访问页面。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。