Docker:官网文档 Get Started 笔记

本文是 Docker 官网文档中 Get Started 的阅读笔记。官方文档地址 https://docs.docker.com/get-started/

1 概览

根据使用的操作系统安装 docker 服务,我这里用的是 CentOS 7,官方安装文档十分详尽,用 yum 命令即可简单安装成功,然后用 systemctl start docker 启动 docker 服务。

然后使用 docker run 启动 hello world 容器。

docker 中两个重要的基础概念:容器 和 镜像。

容器 container :是一个运行在宿主机中的一个沙盒进程,且此进程和其他进行相互隔离。这种隔离是利用了内核的 namespaces 和 cgroups。通过内核的 namespaces 和 cgroups 进行隔离的技术在 Linux 上很早就有了,但 docker 使这种技术和功能更加易用。

镜像 image:当容器运行时,它使用的是隔离的文件系统(filesystem),这种自定义的文件系统正是由镜像提供的。镜像中包含了容器运行时所需要的依赖、配置、脚本、二进制文件等等。

镜像和容器关系类似于 Java 中的类和实例的关系。一个类可以创建多个实例,同样,基于一个镜像,也可以运行多个容器。

2 简单项目

官方提供了一个简单的 nodejs 项目,此项目是一个简单的 web 项目,按照传统的部署方式可以先在服务器上安装 nodejs 环境,然后运行项目即可。

如何通过容器化方式运行呢?

首先编写 Dockerfile 文件,Dockerfile 是用来描述镜像的构建方式的文件。编写完成后才用 docker build 命令创建镜像,然后用 docker run 命令基于镜像运行容器。

3 更新项目

当修改了 web 项目中的源码后,需要重新使用 docker build 创建新的镜像,然后用 docker run 基于新的镜像运行容器。这样服务就更新了。

4 共享镜像

当一个镜像构建完成后,如何分发出去?当然是放在中央仓库中。这里可以类比 maven,当用户要添加 jar 包,只需要知道 jar 包的坐标,然后从 maven 中央仓库中下载。

docker 也是类似的原理,docker 有一个名为 docker hub 的中央仓库,其中包含了各种镜像,用户只需要只要镜像的名称,然后用 docker pull 命令,就可以从中央仓库 docker hub下载镜像。

推送自己的镜像到 docker hub 步骤如下:

  1. 注册 docker hub 的账号
  2. 在 docker hub 创建一个空的目录,目录名即为镜像名。
  3. 在本地通过 docker login 命令进行登录
  4. 将在本地构建好的镜像通过 docker push 推送到刚才在 docker hub 创建的目录中。

如果在其他机器上要用刚才的镜像,直接通过 docke pull 命令下载镜像。

5 容器运行时产生的数据

容器是允许在宿主机中的沙盒进程,每个容器都有自己的 scratch space(划痕空间?)存储数据,一旦容器停止运行,scratch space 也无法查看了。

这里引入另一个重要概念:卷。

卷:volumes 可以在容器的文件系统与宿主机建立联系。当某个目录被容器挂载(mounted)后,此目录下任何变化也可以在宿主机上看到。

 通过 docker volume create 命令创建一个命名卷(named volumes),命名卷是由 docker 服务管理的,会自动挂载宿主机上的目录。

在启动容器时,加上 -v 参数,就可以保存容器的数据到命名卷中。命令如下:

docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

其中 -v 就是 volume 的首字母,todo-db 是刚创建的命名卷名称,后面 /etc/todos 是容器在 scratch space 中产生数据的目录。

如何查看命名卷中实际挂载的目录?使用命令 docker volume inspect 命令,返回结果中 Mountpoint 为命名容器挂载的宿主机的目录。

6 绑定挂载

绑定挂载是直译,也可以翻译为动态挂载,官方称为 bind mounts。这也是与卷(volume)相关的一种技术。前面说到要保存容器中产生的数据分两步:

  1. 使用 docker volume create 命令创建一个卷
  2. 在启动容器时通过 -v 参数将卷和容器 scratch space 中某个目录建立联系

这里创建卷称为命令卷(named vloumes),与命名卷相对的另一种技术是就是绑定挂载(bind mounts),二者相同点都是用来保存容器中产生的数据。

使用命令 docker run -v /home:/app getted-started 可以启动命令,其中 /home 是宿主机中目录,而 /app 是容器中的目录,也就是直接通过  -v 参数就可以将宿主机目录和容器中目录建立联系,任何发生在容器 /app 中的目录都会反应在宿主机 /home 目录中。这样通过 -v 参数将宿主机和容器中目录建立关系的技术就称为绑定挂载。

7 多个容器之间通信

容器直接如何进行通信?通过 networking (网络)。这里的 networking 是指 docker 进行网络管理的一种技术。

networking 使用步骤如下:

  1. 通过 docker network create todo-app 命令创建网络,其中 todo-app 是网络名
  2. 运行一个 mysql 容器,并将其和网络建立联系(attach it to the network),其命令如下 docker run --network todo-app --network-alias mysql mysql:5.7
  3. 然后运行其他容器并和 mysql 容器建立通信,其命令如下 docker run --network todo-app e MYSQL_HOST=mysql node:12-alpine

如上面步骤所示,网络 todo-app 在 mysql 和 node 两个容器之间建立了通信。

8 容器编排

容器编排(docker compose)是一个用来定义和共享多个容器的工具。有些类似 linux 系统中的 sh 脚本,将多个命令放在一个文件中,就成了 sh 脚本。docker compose 也是类似的原理。

将创建卷和网络、启动容器的命令写在一个 yaml 文件中,然后通过 docker-compose up -d 命令就可以启动定义在 yaml 文件中的所有命令。

通过 docker-compose down 可以关闭所以启动的容器。

注意 docker-compose 需要另外安装。

 9 镜像优化

通过 docker scan 命令可以扫描镜像的安全漏洞。

镜像是是分层的,通过 docker image history 查询镜像分层情况。

以上是 docker 官方文档的 get started 章节中 9 块内容阅读笔记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值