基本概念

镜像

镜像是容器的静态形式,它打包了应用程序的所有运行依赖项,方便保存和传输。使用容器技术运行镜像,就形成了动态的容器,由于镜像只读不可修改,所以应用程序的运行环境总是一致的。

容器

  1. 容器就是操作系统里一个特殊的“沙盒”环境,里面运行的进程只能看到受限的信息,与外部系统实现了隔离。
  2. 容器隔离的目的是为了系统安全,限制了进程能够访问的各种资源。
  3. 相比虚拟机技术,容器更加轻巧、更加高效,消耗的系统资源非常少,在云计算时代极具优势。

进入容器命令

1
docker exec -it 062 sh

Docker Desktop

Docker Desktop 是容器化应用开发与部署的一体化工具,支持在本地环境创建、管理和运行Docker容器。

很多人以为,只要换了新电脑或者格式化电脑后,在docker desktop拉取的镜像、容器都会消失,现在我就来介绍一下将 Docker Desktop 的容器打包成镜像,上传到 docker hub 的方法,以后就可以像代码一样管理维护自己的docker镜像。

Docker Hub

在使用 docker pull 获取镜像的时候,我们并没有明确地指定镜像仓库。在这种情况下,Docker就会使用一个默认的镜像仓库,也就是大名鼎鼎的“Docker Hub”。

docker hub地址:hub.docker.com

Docker Hub里面不仅有Docker自己打包的镜像,而且还对公众免费开放,任何人都可以上传自己的作品。经过这8年的发展,Docker Hub已经不再是一个单纯的镜像仓库了,更应该说是一个丰富而繁荣的容器社区。

如果想覆盖仓库中已有镜像,可以在本地重新构建镜像后,使用相同的标签推送镜像到仓库。

  1. docker hub 账号在本地验证登录

    1
    docker login
  2. 将容器commit成镜像

docker tag /[:]

docker commit /[:]

1
docker commit 277e80820516 hub-user/repo-name:tag
  1. docker push 镜像到 docker hub 仓库

    docker push /[:]

    1
    docker push hub-user/repo-name:tag
  2. 验证

    命令验证:

    1
    docker inspect hub-user/repo-name:tag

    线上仓库验证:登录docker hub,刷新仓库页,查看是否推送成功。

  3. 拉取镜像到本地

    1
    docker pull hub-user/repo-name:tag

Dockerfile

镜像就是一个打包文件,里面包含了应用程序还有它运行所依赖的环境,例如文件系统、环境变量、配置参数等等。

环境变量、配置参数这些东西还是比较简单的,随便用一个manifest清单就可以管理,真正麻烦的是文件系统。为了保证容器运行环境的一致性,镜像必须把应用程序所在操作系统的根目录,也就是rootfs,都包含进来。

由此引出容器镜像的一个重大创新点:分层,术语叫“Layer”。就是把重复的部分抽取出来,只存放一份Ubuntu根目录文件,然后让这一千个镜像以某种方式共享这部分数据。

Dockerfile非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个Layer,而Docker顺序执行这个文件里的所有步骤,最后就会创建出一个新的镜像出来。

创建镜像命令:

1
docker build -f Dockerfile.busybox .

docker build 是怎么工作的

命令行“docker”是一个简单的客户端,真正的镜像构建工作是由服务器端的“Docker daemon”来完成的,所以“docker”客户端就只能把“构建上下文”目录打包上传(显示信息 Sending build context to Docker daemon ),这样服务器才能够获取本地的这些文件。

image-20250709160506558

Dockerfile 编写规范

  1. 创建镜像需要编写Dockerfile,写清楚创建镜像的步骤,每个指令都会生成一个Layer。
  2. Dockerfile里,第一个指令必须是 FROM,用来选择基础镜像,常用的有Alpine、Ubuntu等。其他常用的指令有:COPYRUNEXPOSE,分别是拷贝文件,运行Shell命令,声明服务端口号。
  3. docker build 需要用 -f 来指定Dockerfile,如果不指定就使用当前目录下名字是“Dockerfile”的文件。
  4. docker build 需要指定“构建上下文”,其中的文件会打包上传到Docker daemon,所以尽量不要在“构建上下文”中存放多余的文件。
  5. 创建镜像的时候应当尽量使用 -t 参数,为镜像起一个有意义的名字,方便管理。

Docker-compose

在Docker把容器技术大众化之后,Docker周边涌现出了数不胜数的扩展、增强产品,其中有一个名字叫“Fig”的小项目格外令人瞩目。

Fig为Docker引入了“容器编排”的概念,使用YAML来定义容器的启动参数、先后顺序和依赖关系,让用户不再有Docker冗长命令行的烦恼,第一次见识到了“声明式”的威力。因此,docker-compose自身的定位是管理和运行多个Docker容器的工具。

docker-compose里管理容器的核心概念是“service”。注意,它与Kubernetes里的 Service 虽然名字很像,但却是完全不同的东西。docker-compose里的“service”就是一个容器化的应用程序,通常是一个后台服务,用YAML定义这些容器的参数和相互之间的关系。

如果硬要和Kubernetes对比的话,和“service”最像的API对象应该算是Pod里的container了,同样是管理容器运行,但docker-compose的“service”又融合了一些Service、Deployment的特性。