Back

Docker学习

Docker

Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

简单地说,就是用来创建容器的引擎.

Docker 架构

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统(rootfs)。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

    Docker客户端与服务器(C/S架构)

Docker 在运行时分为 Docker 引擎(服务端守护进程)客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具Docker 引擎 进行交互。

在Docker的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。 由于Docker使用一个统一文件系统,Docker进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的Docker镜像可用于创建Docker容器。 Docker镜像是由文件系统叠加而成,最底层是一个文件引导系统(bootfs)。Docker用户几乎永远不会与引导系统有交互。 Docker镜像是一个只读的文件,若要修改镜像内容只能重新制作或生成镜像。 在Docker镜像创建为Docker容器后,最底层的文件引导系统(bootfs)便会被卸载,此时的容器是可以进行读写操作的。

在利用Docker镜像创建容器时会在镜像的只读层上创建一层可写层作为最顶层。

每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像,下层镜像是上层镜像的父镜像。 一个没有任何父镜像的镜像,谓之基础镜像(Base Image)

图中的add emacs便是add Apache镜像的父镜像,而Debian没有任何父镜像,我们便认为Debian是基础镜像(Base Image)

(文件引导系统在这里不视作一层镜像)

在容器层中,用户看到的是一个叠加之后的文件系统。

文件操作 说明
添加文件 在容器中创建文件时,新文件被添加到容器层中。
读取文件 在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。
修改文件 在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
删除文件 在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中**「记录下此删除操作」**。(只是记录删除操作)

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

Docker使用

启动Dockersystemctl start docker 重启Dockersystemctl restart docker 开机启动Dockersystemctl enable docker

hello-world

拉取镜像docker pull 镜像仓库/镜像名称 eg:docker pull hello-world - 拉取hello-world镜像 示例命令省略了仓库地址,Docker便默认从官方仓库(registry.hub.docker.com)拉取镜像,实际命令等价于 docker pull registry.hub.docker.com/hello-world

查看本地镜像docker images

镜像的 ID 唯一标识了镜像

利用镜像创建Docker容器docker run 镜像名称

查看当前运行的所有容器docker ps -a

Docker镜像的使用

拉取镜像: docker pull 仓库名:TAG 例如拉取一个Ubuntu 18.04的镜像作为基础镜像:docker pull ubuntu:18.04

列出镜像: docker images

创建容器: docker run -ti idiswy/lnmp /bin/bash

也可以用docker images时的镜像ID代替仓库名:TAG的组合

我们和一个容器产生了交互,在Shell中输入exit即可停止该镜像回到原命令行。

docker run 常用参数

  • -d: 后台运行容器,并返回容器ID;
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • –name=“nginx-lb”: 为容器指定一个名称;
  • -e username=“ritchie”: 设置环境变量;
  • –net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

删除镜像: docker rmi 镜像名称/镜像ID

eg:删除刚刚拉取的hello-world

修改标签: docker tag 镜像ID 用户名/镜像名称:新标签

搜索镜像: 使用docker search命令来检索公开仓库中的镜像

例如docker search lamp

Docker镜像的创建

1.docker commit

先创建一个容器:docker run -ti idiswy/lnmp /bin/bash

在根目录加入一个flag

结束后输入exit 来退出容器,现在我们的容器已经被我们改变了

使用 docker commit 命令来提交更新后的副本: docker commit -m "Added flag" -a "ginger" b70f3162e24e test/flag 其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样,-a 可以指定更新的用户信息,之后是用来创建镜像的容器的ID,最后指定目标镜像的仓库名和 tag 信息。

利用这个新镜像来创建一个容器,ok

2.利用 Dockerfile 来创建镜像

之后再提

3.从本地文件系统导入镜像

docker import - ubuntu:14.04
docker save -o ubuntu_18.04.tar ubuntu:18.04

Docker容器的操作

启动容器我们共有两种方式:一种是基于镜像新建一个容器并启动,另外一种是将在中止状态(Exited)的容器重新启动

前者: docker start ID

后者: docker start ID命令来启动已中止的容器

相应的,我们也可以使用docker stop/kill ID命令来停止运行中的容器

同时需要注意的是,我们在容器终端中输入exit或Ctrl+D来退出终端时,容器也会自动中止。

除此之外还可以使用docker restart 容器ID命令来重启容器

docker logs ID命令来查看容器的输出信息

在后台运行容器后,我们需要对容器进行操作时,可以使用docker attach ID命令来对容器进行操作。

也可以使用docker exec -it ID 所执行命令来操作容器。

注意在使用docker exec命令后,退出终端时,容器依旧保持运行状态,而在docker attach命令打开终端退出后,容器便会中止。

使用docker rm ID命令来删除容器。

注意,在删除容器前必须停止容器,如果要删除一个运行中的容器,可以添加-f参数来关闭并删除容器。

Docker网络

可以通过docker network ls命令查看网络模式

Docker四种网络模式:

  • Bridge - 桥接网络模式
  • Host - 开放式网络模式
  • Container - 联合挂载式网络模式(Host网络模式的延伸)
  • None - 封闭式网络模式

端口映射

docker run -it -p 物理机端口:容器端口 镜像名称:标签信息 此时指定的容器端口便映射到了指定的物理机端口上。同时-p可以多次使用来绑定多个端口映射关系。

eg:

docker run -it -p 10001:80 idiswy/lnmp /bin/bash

使用docker port 容器ID 端口即可查看当前映射的端口配置。

  • 删除所有已经停止的容器:docker rm $(docker ps -a -q)

参考

Docker 架构及工作原理:https://www.cnblogs.com/mrhelloworld/p/docker2.html

菜鸟教程:https://www.runoob.com/docker

Docker学习笔记:https://www.cnblogs.com/yesec/p/15025511.html

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy
© Licensed Under CC BY-NC-SA 4.0