学习Docker

Docker自开源以来受到了各大公司的广泛关注,或许现在互联网公司的运维体系不承载在Docker之上都不好意思说自己是互联网公司。

原理

对Docker最简单并且带有一定错误的认知就是“Docker是一种性能非常好的虚拟机”。
正如上面所说,这是有一定错误的说法。Docker相比于传统虚拟机的技术来说先进了不少,具体表现在Docker不是在宿主机上虚拟出一套硬件后再虚拟出一个操作系统,而是让Docker容器里面的进程直接运行在宿主机上(Docker会做文件、网络等的隔离),这样一来Docker会“体积更轻、跑的更快、同宿主机下可创建的个数更多”。
Docker中有三个核心概念:Image、Container、Repository

  • Image:Docker中的镜像是分层的,可复用的,而非简单的一堆文件迭在一起(类似于一个压缩包的源码和一个git仓库的区别)。
  • Container:容器的存在离不开镜像的支持,他是镜像运行时的一个载体(类似于实例与类的关系)。依托Docker的虚拟化技术,给容器创建了独立的端口、进程、文件等“空间,Containner就是一个与宿机隔离“容器”。容器可宿主机之间可以进行port、volumer、network等的通信。
  • Repository:Docker的仓库和git仓库比较相似

安装

Win10

  • 计算机BIOS开机虚拟化支持(VT-x/AMD-V)
  • 启用Hyper-V
  • 安装docker for Windows

https://www.docker.com下载Docker Desktop

Linux

1
2
3
$ curl -fsSL get.docker.com -o get-docker.sh
$ sh get-docker.sh
$ sudo systemctl start docker

需要开启sudo,验证安装

1
$ sudo docker version

Image vs container 镜像与容器

image

  • docker image是一个只读文件
  • 这个文件包含文件系统,源码,库文件,依赖,工具等一些运行application所需要的文件
  • docker image具有分层的概念

Container容器

  • 一个运行中的docker image
  • 实质是复制image最上层加上一层read-write(称之为container layer容器层)
  • 基于同一个image可以创建多个container

docker image获取

  • 自己制作
  • 从registry拉取,比如docker hub

docker命令

1
2
3
4
5
6
7
8
9
10
11
12
docker container ls
docker container run nginx
docker container ps
docker ls
docker ps -a
docker container logs 容器ID
docker container logs -f 容器ID
docker container run -it ubuntu sh
docker exec -it 容器ID sh
docker container run -it busybox sh
#显示docker运行容器程序所使用的进程
docker container top 容器ID

如何批量的停止所有的容器

停止多个容器可以通过命令docker container stop 容器id1 容器id2....来完成,前提是需要知道容器的ID,如果几十个ID要一个一个写,如何简便操作呢

  • 批量获取容器ID,可以通过命令docker container ps -qa来完成
  • 把上面获取的参数传递给docker container stop命令
1
docker container stop $(docker container ps -qa)

镜像的获取

  • 从registry拉取
    • public 公有
    • private 私有(内部搭建)
  • 从Dockerfile构建
  • 文件导入(离线)