docker的使用技巧
基本概念
镜像
镜像是容器的静态形式,它打包了应用程序的所有运行依赖项,方便保存和传输。使用容器技术运行镜像,就形成了动态的容器,由于镜像只读不可修改,所以应用程序的运行环境总是一致的。
容器
- 容器就是操作系统里一个特殊的“沙盒”环境,里面运行的进程只能看到受限的信息,与外部系统实现了隔离。
- 容器隔离的目的是为了系统安全,限制了进程能够访问的各种资源。
- 相比虚拟机技术,容器更加轻巧、更加高效,消耗的系统资源非常少,在云计算时代极具优势。
进入容器命令
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已经不再是一个单纯的镜像仓库了,更应该说是一个丰富而繁荣的容器社区。
如果想覆盖仓库中已有镜像,可以在本地重新构建镜像后,使用相同的标签推送镜像到仓库。
docker hub 账号在本地验证登录
1
docker login
将容器commit成镜像
docker tag
docker commit
1 | docker commit 277e80820516 hub-user/repo-name:tag |
docker push 镜像到 docker hub 仓库
docker push
/ [: ] 1
docker push hub-user/repo-name:tag
验证
命令验证:
1
docker inspect hub-user/repo-name:tag
线上仓库验证:登录docker hub,刷新仓库页,查看是否推送成功。
拉取镜像到本地
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
),这样服务器才能够获取本地的这些文件。
Dockerfile 编写规范
- 创建镜像需要编写Dockerfile,写清楚创建镜像的步骤,每个指令都会生成一个Layer。
- Dockerfile里,第一个指令必须是
FROM
,用来选择基础镜像,常用的有Alpine、Ubuntu等。其他常用的指令有:COPY
、RUN
、EXPOSE
,分别是拷贝文件,运行Shell命令,声明服务端口号。 docker build
需要用-f
来指定Dockerfile,如果不指定就使用当前目录下名字是“Dockerfile”的文件。docker build
需要指定“构建上下文”,其中的文件会打包上传到Docker daemon,所以尽量不要在“构建上下文”中存放多余的文件。- 创建镜像的时候应当尽量使用
-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的特性。