Docker

86 阅读3分钟

初识 Docker

项目部署的问题

大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:

  • 依赖关系复杂,容易出现兼容性问题。
  • 开发、测试、生产环境有差异。

Docker

Docker 如何解决依赖的兼容问题的?

  • 将应用的 Libs (函数库)、 Deps (依赖)、配置与应用一起打包。
  • 将每个应用放到一个隔离容器去运行,避免互相干扰。

不同环境的操作系统不同, Docker 如何解决?

  • 内核与硬件交互,提供操作硬件的指令系统应用封装内核指令为函数,便于程序员调用用户程序基于系统函数库实现功能。

Docker 如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docker 允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像。
  • Docker 应用运行在容器中,使用沙箱机制,相互隔离。

镜像和容器

镜像( Image ): Docker 将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器( Container ):镜像中的应用程序运行后形成的进程就是容器,只是 Docker 会给容器做隔离,对外不可见。

Docker 基本操作

镜像相关命令

  • 镜像名称一般分两部分组成: [repository]:[tag] 。
  • 在没有指定 tag 时,默认是 latest ,代表最新版本的镜像。

image.png

image.png

镜像搜索: 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;

容器相关命令

image.png

创建运行一个 Nginx 容器
docker run --name containerName -p 80:80 -d nginx

命令解读:

  • docker run :创建并运行一个容器。
  • --name : 给容器起一个名字,比如叫做 mn
  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口。
  • -d :后台运行容器。
  • nginx :镜像名称,例如 nginx。

查看容器日志的命令:

  • docker logs
  • 添加 -f 参数可以持续查看日志

查看容器状态:

  • docker ps

数据卷

容器与数据耦合的问题

image.png

数据卷( volume )是一个虚拟目录,指向宿主机文件系统中的某个目录。

image.png

数据卷操作的基本语法:

  • 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

image.png

已经知道 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 来管理目录,但是目录较深,不好找。
  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看。