初识 Docker
项目部署的问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
- 依赖关系复杂,容易出现兼容性问题。
- 开发、测试、生产环境有差异。
Docker
Docker 如何解决依赖的兼容问题的?
- 将应用的 Libs (函数库)、 Deps (依赖)、配置与应用一起打包。
- 将每个应用放到一个隔离容器去运行,避免互相干扰。
不同环境的操作系统不同, Docker 如何解决?
- 内核与硬件交互,提供操作硬件的指令系统应用封装内核指令为函数,便于程序员调用用户程序基于系统函数库实现功能。
Docker 如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
- Docker 允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像。
- Docker 应用运行在容器中,使用沙箱机制,相互隔离。
镜像和容器
镜像( Image ): Docker 将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器( Container ):镜像中的应用程序运行后形成的进程就是容器,只是 Docker 会给容器做隔离,对外不可见。
Docker 基本操作
镜像相关命令
- 镜像名称一般分两部分组成: [repository]:[tag] 。
- 在没有指定 tag 时,默认是 latest ,代表最新版本的镜像。
镜像搜索: docker search name;
官方镜像搜索:docker search --filter "is-official=true" name;
镜像查看:docker images; docker image name:版本号;
镜像下载:docker pull name:版本号;
镜像删除:docker rmi name:版本号; docker rmi -f name:版本号;
镜像保存备份:docker save name; - docker save names -O 命名压缩文件名;(多个名字空格隔开)
- 将本地的一个或多个镜像打包保存成本地tar文件
镜像备份导入:docker load -i name;
镜像重命名:docker tag IMAGE ID name;
容器相关命令
创建运行一个 Nginx 容器
docker run --name containerName -p 80:80 -d nginx
命令解读:
- docker run :创建并运行一个容器。
- --name : 给容器起一个名字,比如叫做 mn
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口。
- -d :后台运行容器。
- nginx :镜像名称,例如 nginx。
查看容器日志的命令:
docker logs- 添加 -f 参数可以持续查看日志
查看容器状态:
docker ps
数据卷
容器与数据耦合的问题
数据卷( volume )是一个虚拟目录,指向宿主机文件系统中的某个目录。
数据卷操作的基本语法:
- create 创建一个 volume
- inspect 显示一个或多个 volume 的信息
- ls 列出所有的 volume
- prune 删除未使用的 volume
- rm 删除一个或多个指定的 volume
通过 -v 参数来挂载一个数据卷到某个容器目录
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
已经知道 nginx 的 html 目录所在位置 /usr/share/nginx/html ,我们需要把这个目录挂载到 html 这个数据卷上,方便操作其中的内容。
查看 html 数据卷的位置。
docker volume inspect html
进入该目录
cd /var/lib/docker/volumes/html/_data
修改文件
vi index.html
mac下docker实际是在vm里又加了一层,因此需要进入vm 才能进行操作。
docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
将宿主机目录直接挂载到容器
- docker run 的命令中通过 -v 参数挂载文件或目录
- -v volume 名称 : 容器内目录
- -v 宿主机文件 : 容器内文件
- -v 宿主机目录 : 容器内目录
数据卷挂载与目录直接挂载的
- 数据卷挂载耦合度低,由 docker 来管理目录,但是目录较深,不好找。
- 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看。