应用场景
后端系统会部署很多服务,包括我们自己开发的服务,还有 mysql、redis 等中间件的服务,部署它们需要一系列依赖的安装、环境变量的设置等等。
如果你要部署多台机器的话,同样的操作要重复多次,万一哪一步漏掉了,服务就跑不起来了。就很麻烦。
而 Docker 就能完美解决这个问题:
它把应用所有文件封装成一个镜像,镜像跑起来作为容器,它可以在一台机器上跑多个容器,每个容器都有独立的操作系统环境,比如文件系统、网络端口等,在容器内跑各种服务。
这样整个环境都保存在这个镜像里,部署多个实例只要通过这个镜像跑多个容器就行。
什么是docker
传统虚拟机需要在上面安装一个完整的操作系统,右边图每个虚拟机都有一个OS操作系统。
Docker 推出了容器的概念,每个容器不需要安装完整的操作系统,里面的进程直接运行在 Docker 创造的宿主内核中。
优点1:更少的资源占用,启动更快
可以这么理解,右边的图是虚拟机,它需要虚拟硬件(CPU,内存等),一台电脑顶多安装几个虚拟机。但是,docker 可以运行几十个容器,因为它不需要虚拟硬件。
优点2:统一的运行环境
docker 因为它运行在自身的 Host Operating System 中,和操作系统无关,所以它可以部署到任何环境、机器和操作系统中。
优点3:微服务架构,docker 天生适配微服务架构
安装docker
本地电脑可以直接安装docker的客户端,不过这都需要翻墙才行,现在docker对大陆进行了屏蔽。
如果是服务器的话,可以参考这篇文章进行安装。
手工部署Docker [support.huaweicloud.com/bestpractic…]
docker 一般需要设置国内镜像源,否则安装太慢了。
服务器进行设置国内镜像源,也可以参考上面的文章。
设置成功之后,执行docker info:
体验 docker
Docker 提供了 Docker Hub 镜像仓库,可以把本地镜像 push 到仓库或者从仓库 pull 镜像到本地。
- client:docker 客户端,可以是用docker desktop,也可以是命令行工具;
- docker_host:docker运行程序,一般是后台运行daemon;
- registry:docker镜像仓库。
下面运行一个nginx镜像感受下,我们先用命令行的方式运行。
在命令行用 docker search、docker pull 搜索和拉取镜像:
pull 下来之后启动
docker run -p 8000:80 --name container-name -d image-name
// 简化: 不写--name container-name 会创建一个随机的名称, 一般使用这种简写的形式
docker run -p 8000:80 -d nginx
-
-d 后台运行
-
-p 端口映射 8000 为主机的端口,80 为镜像中的端口
-
--name 自定义容器名称
-
image-name 镜像名称,假如本地没有下载,会先自动 pull 一次镜像
启动之后,就可以访问了:
容器内跑的 nginx 服务是在 80 端口,你要把宿主机的某个端口(8000)映射到容器的 80 端口才可以访问。
接下来是数据卷 volume,这个是把宿主机某个目录挂到容器内。
因为容器是镜像跑起来的,下次再用这个镜像跑的还是同样的容器,那你在容器内保存的数据就会消失。
所以我们都是把某个宿主机目录,挂载到容器内的某个保存数据的目录,这样数据是保存在宿主机的,下次再用镜像跑一个新容器,只要把这个目录挂载上去就行。
挂载本地的 /tmp/aaa 到容器内的 /usr/share/nginx/html 目录。
这里的 /tmp/aaa 可以换成宿主机的任何目录,如果是 windows 系统,那就是类似 D://tmp/aaa 这种。
我们在 /tmp/aaa 目录下添加一个 index.html,那么这个文件就会出现在容器中。
浏览器访问 http://localhost:8000 就可以访问到。
这就是 volume 挂载的作用。
如果你挂载某些目录报错,是因为 docker desktop 挂载的目录是需要配置的,在 Settings > Resources > File Sharing 里加一下就行:
至于挂载到的目录,在镜像搜索结果页有写:
通过命令行 docker run 来跑镜像, -v 是指定挂载的数据卷,后面的 :ro 代表 readonly,也就是容器内这个目录只读,:rw 表示容器内可以读写这个目录。
docker run 会返回一个容器的 hash:
就是这里的 id:
这个界面可以用 docker ps 来获取。
它是显示容器列表的,默认是运行中的。
想显示全部的,可以加个 -a。
除了 container 列表,image 镜像列表也可以通过 docker images 命令获取。
我们在容器的 terminal 里执行命令,对应的是 docker exec 命令:
-i 是 terminal 交互的方式运行
-t 是 tty 终端类型
然后指定容器 id 和 shell 类型,就可以交互的方式在容器内执行命令了。