一直以来都听说docker功能十分强大,最近闲来无事终于稍微研究了一下,确实是一个强大的工具。昨晚利用docker部署了一个webdav服务器,几分钟就弄好了,如果使用传统方法我可能甚至会搞一晚上,还容易把系统搞的一地鸡毛。利用docker可以做到开箱即用,非常方便。

docker架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。

容器与镜像的关系类似于面向对象编程中的对象与类。

docker 面向对象
容器 对象
镜像

以下是docker for Windows的大致结构图,对用户来说我们只需要管最上面的image和container两层即可。

在Windows上安装docker

关于在Windows上安装docker的具体过程官方已经给出详细过程,本文就不再赘述,这里主要补充一些我在安装过程中遇到的问题。docker的安装详细步骤参见docker官网(可能需要注册docker账户来查看)

  • docker需要hyper-v服务
    和在Linux上能直接运行Linux的docker容器不同,如果在Windows上要运行Linux容器就需要使用虚拟机来提供一个Linux的内核环境。Windows的docker使用的是Windows专业版自带的hyper-v虚拟机(貌似家庭版可以强行打开hyper-v)。所以安装docker以前需要打开Windows的hyper-v功能,若还需要Windows的docker容器就还需要打开Windows的Container功能,这些功能都可以在控制面板->程序和功能->启用或关闭Windows功能中找到。安装过程中可能需要重新启动计算机。

  • hypervisor冲突问题
    在目前的计算机上一般只能存在一个hypervisor,所以使用hyper-v之前需要卸载VMware的全部服务(貌似有强行让docker运行在VMware上的方法),个人认为hyper-v还挺好用的,还可以和Windows自带的应用程序防护,内核防护等功能配合使用,为系统提供额外的安全防护功能。

hyper-v是典型的type1型虚拟机

  • 建议在官网安装新版docker
    最开始随便找了一个版本的docker安装上,但是重启电脑之后所有已经建立好的容器都无法打开,原因未知,重新安装最新版docker之后问题解决。

获取镜像

关于镜像的获取可以访问docker hub的官方网站,这里不仅有镜像的下载方法,也有容器的简单使用说明。

上图是webdav镜像的主页.

以下是docker和镜像管理相关的命令

操作 命令 示例 备注
搜索镜像 docker search [搜索的镜像] docker search webdav
拉取镜像 docker pull [镜像名称]:[版本号] docker pull idelsink/webdav 若不指定版本号就自动获取最新的版本
查看本地镜像 docker images
删除本地仓库 docker rmi [镜像名称] docker rmi ubuntu 可以同时删除多个镜像
登录到docker hub docker login 开启两步验证后需要输入设置的token而不是密码

创建和运行容器

获取镜像之后就可以利用镜像运行容器了,运行容器相关的命令如下

操作 命令 参数 示例 解释
创建容器 [1] docker create [参数] [要使用的镜像] [要运行的指令] [要执行的命令的附加参数] docker create ubuntu bash
创建并运行容器 docker run [参数] [要使用的镜像] [要运行的指令] [要执行的命令的附加参数] docker run ubuntu bash 新建并运行Ubuntu镜像的容器,启动时执行bash命令
-it docker run -it ubuntu bash 运行交互式的容器,相当于前台启动这个容器里的bash终端 [2]
-d docker run -d idelsink/webdav 后台启动容器,容器启动后直接在后台运行,不占用前台终端,并返回容器的ID
-p [容器中的端口]:[本机的端口] docker run -d -p 80:80 idelsink/webdav 将容器中的80端口映射到本机的80端口,这样就能访问容器中的80端口了。
-v [本机地址]:[容器内的地址] docker run -v C:\Users:/mnt/C -d -p 80:80 idelsink/webdav 将本机的文件路径挂载到容器内指定的位置,这里是将C:\Users挂载到/mnt/C位置下 [3] [4]
-w [容器内的地址] docker run -w /home -it ubuntu bash 指定容器的工作路径,相当于启动容器时所在的文件位置
–name docker run -v :/webdav -p 80:80 –name=webdav -d idelsink/webdav 指定容器的名称,这里是指定容器名称为webdav

注意事项

  • 容器在创建之后就无法修改挂载地址和端口号等,所以创建的时候一定要仔细考虑

  • 事实上 -it是-i 和-t两个命令,分别是 在新容器内指定一个伪终端或终端 和 允许你对容器内的标准输入 (STDIN) 进行交互,通常连在一起使用。

  • 需要注意的是-v需要紧跟在docker run后面,否则会挂载不上

  • 使用挂载前需要在docker setting中打开文件共享功能

使用容器

操作 命令 参数 示例 解释
执行命令 docker exec [参数] [容器名称] [命令] [要执行的命令的附加参数] docker exec blog hexo g 在blog容器中执行hexo g命令
-it docker exec -it blog bash 运行交互式的容器
-d docker exec -d blog hexo s 后台运行容器
-e 附加环境参数

管理容器

操作 命令 参数 示例 解释
启动容器 docker start [容器名称] docker start blog 启动blog容器
停止容器 docker stop [容器名称] docker stop blog
强行停止容器 docker kill [容器名称] docker kill blog
重启容器 docker restart [容器名称] docker restart blog
删除容器 docker rm [容器名称] docker rm ubuntu
查看正在运行的容器 docker ps
-a 查看最近运行过还没有删除的容器(包括正在运行的容器)
容器改名 docker rename [旧名称] [新名称] docker rename nostalgic_feynman blog

在也可以使用最新版docker自带的dashboard来图形化的控制docker,但这个其实不是很好用。

其它docker命令可参阅这里或者docker官网网站

在WSL中使用使用docker

目前wsl中无法运行docker engine(据说也可以运行,没研究),所以在wsl中运行docker实际上是利用wsl远程连接到本机的docker上来运行的,和直接在power shell中运行没有区别。

  • 首先需要在docker setting中打开此选项

  • 其次在wsl中安装docker

    1
    apt-get install docker.io
  • 最后配置wsl的环境
    将此命令加入到用户的环境变量中

    1
    export DOCKER_HOST=tcp://127.0.0.1:2375

    到这里应该就能在wsl中使用docker了

AWSLWSL2中使用docker

最新版docker已经支持在 AWSL(Advanced Windows Subsystem for Linux) WSL2(Windows Subsystem for Linux 2)中使用docker,目前这是一个实验性功能,需要在Windows 10 build 19018以上系统中才能使用。目前系统条件所限暂时没有研究,awsl就完事了。


EOF