SHO酱的Blog

SHO酱的Blog

Docker 学习笔记

2018-07-09

Docker Logo

什么是 Docker

关于 Docker 请详情查看《什么是 Docker》,这里详细介绍了 Docker 的前世今生,以及容器与传统虚拟机之间相比的不同和优势。

下面摘抄一段容器与传统虚拟机差异的描述:

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

Docker 中的概念

Docker 包括三个基本概念

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。

理解了这三个概念,就理解了 Docker 的整个生命周期。

安装 Docker

树莓派

基本操作安装《树莓派卡片电脑安装 Docker CE》文章中操作,但在进行到这一段出现了问题,

sudo add-apt-repository "deb [arch=armhf] https://mirrors.ustc.edu.cn/docker-ce/linux/raspbian $(lsb_release -cs) stable"

错误信息:

Error: could not find a distribution template for Raspbian/stretch

最终通过编辑sudo vi /etc/apt/sources.list解决,在文件中添加如下内容:

deb https://download.docker.com/linux/raspbian stretch stable

镜像加速器

在开始操作之前,这里啰嗦几句。由于各个方面的原因,从国内方法 Docker Hub 的速度着实让人捉急;这里我们先添加一下国内的镜像加速服务器信息,这样会使之后的操作快那么一丢丢( 其实也很有限 :-( )。
详情看这里:《镜像加速器》

Docker 官方提供的中国 registry mirror https://registry.docker-cn.com
七牛云加速器 https://reg-mirror.qiniu.com/

$ sudo vi /etc/default/docker

在文件中加上这一行

DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

修改完毕后保存,重新启动服务。

$ sudo service docker restart

操作

镜像(Image)

获取镜像

$ docker pull --help

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)

下面的命令是获取一个Ubuntu镜像,版本为16.04。

docker pull ubuntu:16.04

查看镜像

上面安装的镜像,在哪里能看到呢?通过如下命令。

$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               0d6bd8934d0f        4 weeks ago         91.1MB

在列表中可以看到所有顶级镜像信息,信息包括:仓库名、标签、镜像ID、镜像创建时间、镜像大小。

删除本地镜像

docker image rm <镜像ID>

容器(Container)

创建并启动

  • docker run nginx这条命令似乎没有什么问题?的确,没有问题。可是做的是什么呢?

  • docker run nginx ls只使用一次的容器,之后再启动也是什么都不会发生。

  • docker run -dit nginx使用守护进程方式创建并运行容器,之后可以通过命令进入正在运行的容器。还是有个个问题,就是nginx运行起来以后,端口没有对外(宿主机)绑定。
    选项说明:
    -d容器启动后会进入后台;
    -t让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
    -i让容器的标准输入保持打开。

  • docker run -p 8080:80 -dit nginx使用守护进程方式创建并运行容器,并将容器的80端口绑定到宿主机的8080端口上,这下就可以访问http://localhost来访问了。

列表

如果上面4条命令都执行了,那已经创建了4个容易了,怎么查看呢?

  • docker container ls只看到了两个容器,说好的4个呢?

  • docker container ls -a加个-a选项,这下看到创建的所有容器了。

记好列表中CONTAINER ID的后面有大用。

停止

docker container stop [CONTAINER ID]容器ID用上了,启动时加了-d的容器会在后台一直运行着,通过stop命令停止正在运行的容器。

再启动

docker container start [CONTAINER ID]容器ID又用上了,启动时加了-d的容器停止后,通过start命令再次启动容器。

删除

docker container rm [CONTAINER ID]容器ID又双用上了,已经停止的容器以后也不想用了,使用rm命令把它删掉。

进入容器

docker exec -it [CONTAINER ID] bash容器ID又双叒用上了,正在后台运行的容器,通过exec进入,之后就可以像使用原生系统命令行一样操作容器内容了。
只用-i参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
-i -t参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。

导出/导入

  • docker export [CONTAINER ID] > imp_test.tar容器ID又双叒叕用上了,将指定的容器导出容器快照到 tar 文件。

  • cat imp_test.tar | docker import - test/nginx:v1.0将指定的容器快照文件导入为镜像。

更新容器参数

  • 将正在运行的容器设为自启动

docker update --restart=always <CONTAINER ID>
  • 将正在运行的容器取消自启动

docker update --restart=no <CONTAINER ID>
  • restart 相关参数说明

--restart参数=
    no
        默认策略,在容器退出时不重启容器
    on-failure
        在容器非正常退出时(退出状态非0),才会重启容器
    on-failure:3
        在容器非正常退出时重启容器,最多重启3次
    always
        在容器退出时总是重启容器
# 开机自启
    unless-stopped
        在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
# 一般推荐使用always参数
    --restart=always

仓库(Repository)

参考