docker学习篇(二)---- 基础篇
引言
在之前的学习中,我知道了docker的三大组件分别是—-镜像,容器,仓库。了解了这三个组件也就初步理解了docker。所以我学习了这三个组件,并记录下来。
镜像
docker在运行一个容器时需要本地存在相对应的镜像,执行流程大致是这样的:
- 准备容器
- 查看容器所需要的镜像是否存在于本地
- 如果存在,运行容器
- 如果不存在,检索远程镜像仓库,找到并下载
- 运行容器
获取镜像
通过docker pull来从镜像仓库获取镜像:
如果官方仓库注册服务器下载速度太慢,我们可以从其他仓库下载,这个时候因为不是从默认的注册仓库下载,所以我们需要显式的声明下载仓库地址:
显示镜像
通过上面命令可以查看本地已经下载的镜像文件
从上面的信息中,我们可以获得:
- 来自那个仓库(REPOSITORY)
- 镜像标记(TAG)
- ID号唯一标识(IMAGE ID)
- 创建时间(CREATED)
- 镜像大小(SIZE)
TAG:用来标记来自同一仓库的不同镜像,比如 Ubuntu仓库中中有多个镜像,通过TAG来区分版本。如果不记得具体的版本了,默认用latest标记信息
修改镜像
使用下载的镜像启动容器
在容器中增加json和gem应用
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;
最后指定目标镜像的仓库名和 tag 信息。
创建成功后会返回这个镜像的 ID 信息。
我们可以使用docker images查看新创建的镜像。
Dockerfile
当在一个团队中分享新创建的镜像时,我们可以使用Dockerfile来解决这个团队分享问题。
Dockerfile包含一些怎样创建镜像的指令。
新建一个目录和一个Dockerfile:
通过#来进行注释
FROM指令告诉Docker使用哪个镜像来作为基础镜像
接着是维护者的信息
RUN开头的指令会在创建中运行。比如安装一个软件包
另外,ADD 命令是复制本地文件到镜像;EXPOSE 命令来向外部开放端口;CMD 命令来描述容器启动后运行的程序等。
编写完Dockerfile后通过docker build来创建生成镜像。
build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据Dockerfile 来进行。Docker指令被按条执行,每一步创建一个新的容器,在容器中执行指令并提交修改,当所有指令执行完成后,返回最终id。
我们可以通过docker tag来修改镜像的标签。通过docker push将创建的镜像上传到仓库中进行分享。
导出和导入镜像
将镜像导出到本地,可以使用docker save命令
使用docker rmi命令删除本地的镜像
注意:
- docker rm命令是用来删除容器的,两个删除命令的操作对象是不同的。
- 在删除一个镜像时首先要删除依赖于这个镜像的所有容器,否则可能会出现错误。
容器
容器是独立运行的一套或者一组应用以及他们的运行态环境。虚拟机可以理解为模拟运行的一整套操作系统(提供运行态环境和其他系统环境)和运行在上面的应用。所以容器相较于虚拟机来说,显得非常轻量级,启动速度也是以秒级计算的。
启动
容器启动有两种形式:
- 一种是基于镜像创建一个新的容器并启动
- 另一种是将在终止状态的容器重新启动
启动容器命令用docker run来实现,如下面的例子:
当在执行docker run来创建一个容器时,docker的流程是:
- 检查本地是否有指定的镜像,如果没有从共有仓库下载
- 利用指定的基础镜像创建一个容器
- 分配一个文件系统,并且在只读的镜像层外面挂载一层读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器
- 从地址池中配置一个IP地址给容器
- 执行用户指定的应用程序
- 关闭容器
那么怎么启动一个之前已经终止的容器呢?我们可以利用docker start命令来将一个终止的容器重新启动起来。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。在与容器交互的伪终端中我们可以通过ps或者top命令进行查看容器中进程的信息。
守护态运行
我们想要让一个容器在后台以守护态形式运行。可以在执行docker run命令时增加-d参数。
想要查看守护态容器在后台输出的信息,可是使用docker logs进行查看:
当加上-d运行容器时,容器以守护态形式进行在后台执行,但有时候我们想要进入到容器中进行工作,应该怎么实现呢??
1.我们可以使用docker自带的指令docker attach
2. nsenter命令
我们可以通过nsenter命令进入容器,而是用nsenter命令需要安装nsenter工具,安装步骤如下:
为了连接到容器,我们需要知道容器的第一个进程的PID,通过下面方法获得:
当我们需要停止一个正在执行的容器时,使用docker stop指令。
如果该容器中指定的应用终止时,容器也会自动终止。比如上面我们让容器运行一个伪终端与用户进行交互,当通过exit退出伪终端时,这个容器也自动终止了。
如果想让一个运行态的容器终止后重新启动,我们可以使用docker restart指令。
导出和导入
导出
docker中想要对容器进行备份导出也是非常简单的,可以通过docker export
导入
可以使用docker import指令将容器快照导入为镜像。
docker load是用来导入镜像存储文件到本地镜像库;docker import是导入一个容器快照到本地镜像库。区别在于容器快照文件将会丢弃所有历史记录和元数据信息(即容器当时的快照状态),而镜像文件将保存完整记录,体积更大。
删除容器
当我们想要删除一个容器时,可以使用docker rm指令来删除一个终止状态的容器。如果我们想要删除一个正在运行的状态,可以加上-f参数。
仓库
仓库就是存放镜像的地方。
目前 Docker 官方维护了一个公共仓库 Docker Hub (https://hub.docker.com/) ,其中已经包括了超过 15000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。
登录
通过docker login指令来输入用户名,密码和邮箱后完成注册和登录。用户的认证信息保存在本地的.dockercfg。
检索
我们想要查找官方仓库中有哪些我们需要的镜像,可以通过docker search指令实现,并通过docker pull下载到本地镜像仓库中。
以上~~