2.1、全网最详细Docker镜像教程(新手建议收藏)
Docker镜像精讲与实战
目录
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,可以看到访问页面。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)