图文详细教程
1 Docker原理
-
对 Docker 最简单并且带有一定错误的认知就是 “Docker 是一种性能非常好的虚拟机”。
- 正如上面所说,这是有一定错误的说法。Docker 相比于传统虚拟机的技术来说先进了不少,
- 具体表现在 Docker 不是在宿主机上虚拟出一套硬件(VMare VBox虚拟机都是需要虚拟硬件,需要占用内存和硬盘)后再虚拟出一个操作系统,
- 而是让 Docker 容器里面的进程直接运行在宿主机上(Docker 会做文件、网络等的隔离),
- 这样一来 Docker 会 “体积更轻、跑的更快、同宿主机下可创建的个数更多”。
-
Docker 中有三个核心概念:Image、Container、Repository。
-
Image 镜像:
- 有领“好人卡”倾向的广大程序猿一定对 镜像 的概念不会陌生。
- 但和 windows 的那种 iso 镜像相比,Docker 中的镜像是分层的,可复用的,
- 而非简单的一堆文件迭在一起(类似于一个压缩包的源码和一个 git 仓库的区别)。
-
Container 容器:
- 容器的存在离不开镜像的支持,他是镜像运行时的一个载体(类似于实例和类的关系)。
- 依托 Docker 的虚拟化技术,给容器创建了独立的端口、进程、文件等“空间”,
- Container 就是一个与宿机隔离 “容器”。容器可宿主机之间可以进行 port、volumes、network 等的通信。
- 容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
- 数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
-
Repository 仓库:
- Docker 的仓库和 git 的仓库比较相似,拥有仓库名、tag。
- 在本地构建完镜像之后,即可通过仓库进行镜像的分发。
- 常用的 Docker hub 有 https://hub.docker.com/ 、 https://cr.console.aliyun.com/ 等。
- 以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。
- 我们可以通过 ubuntu:16.04,或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。
- 仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。
-
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,
-
镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
2 Docker安装
-
Ubuntu虚拟机中安装docker:docker-ce docker-ce-cli docker-compose
-
docker全部安装完成后,镜像源修改中国的加速源地址,终端执行命令创建 sudo vi /etc/docker/daemon.json 文件,在其中输入如下内容。
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
- 然后输入:符号,输入wq保存退出
-
Ubuntu安装使用Docker注意:
- Docker安装完成后,如果不修改源,网速不好,有时候启动或者执行命令会出现失败或者超时提示
- 安装博文中提到卸载后重新安装,后面发现是网速问题,只需要新建daemon.json文件,添加中国源即可
- 注意,有些命令需要使用sudo docker xxx xxx … 执行,直接docker执行会报错
- 也可以将终端使用 su 回车 输入超级用户密码 回车 进入超级用户 显示符号位#
-
Docker拖取镜像速度慢的终极解决办法:
- 上面daemon.json虽然添加了官方的加速源地址,电信速度还可以(有时也很慢),但是移动速度很慢,有时候超时或者失败
- 推荐使用阿里云镜像,具体方法参考博文,docker下载镜像使用阿里云加速器:
- 具体步骤:
- 1.注册阿里云账号,搜索容器镜像服务,然后进入
- 2.镜像仓库里面新建一个镜像仓库
- 3.左侧菜单栏有个镜像加速器,点开
- 4.复制里面加速器地址,到daemon.json文件替换https://registry.docker-cn.com,保存退出
- 5.依次执行命令:
- sudo systemctl daemon-reload 重载daemon.json配置文件
- sudo systemctl restart docker 重启docker服务
- 此时下载速度已经可以达到你的宽带速度正常值,可以删除一个镜像,然后重新下载对比速度。
-
Docker安装注意事项:
- Docker桌面版,WIN10系统只能专业版和企业版可以安装
- 家庭版安装比较麻烦,需要视同toolbox工具或者修改注册表伪装为专业版骗过软件安装时候的检测
- Docker安装在WIN10下面需要开启HyperV虚拟功能,该功能开启后会导致VMware和VirtualBox出错
- 鉴于以上原因,不推荐在WIN10安装Docker,建议Ubuntu虚拟机服务器中安装
- Win10安装可以具体参考我的QQ浏览器收藏夹中,python相关软件安装/docker安装,里面有家庭版和专业版安装收藏
3 镜像(Image)
3.1 获取镜像
-
Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像。
-
从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
- docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
-
具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。
-
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
-
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。
-
对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
-
比如:
- docker pull ubuntu:18.04
- 上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像,省略了官方用户名 library
- 而镜像名称是 ubuntu:18.04 实际将会获取官方镜像 library/ubuntu 仓库源中获取标签为 18.04 的镜像
- docker pull httpd 不指定版本,默认获取latest
- docker pull tikazyq/crawlab:latest
- 从DockerHub官方中的tikazyq用户获取crawlab镜像,版本为最新的latest
- docker pull registry.cn-hangzhou.aliyuncs.com/crawlab-team/crawlab:latest
- 镜像地址:registry.cn-hangzhou.aliyuncs.com
- 仓库名:用户名/软件名
- 用户名:crawlab-team
- 软件名:crawlab
- 标签:latest
- 从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。
- 下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。
- 并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。
- docker pull ubuntu:18.04
-
镜像获取完成后,执行 docker images 即可看到本地所有的镜像
-
-
运行一个简单的容器,以ubuntu:18.04为基础镜像
- docker run -it --rm ubuntu:18.04 /bin/bash
- docker run 就是运行容器的命令,具体格式我们会在 容器 一节进行详细讲解,我们这里简要的说明一下上面用到的参数。
- 参数 -it 实际是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
- 参数 --rm 这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。
- 我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
- 参数 ubuntu:18.04 这是指用 ubuntu:18.04 镜像为基础来启动容器。
- 参数 /bin/bash 放在镜像名后的是 命令,这里我们希望有个交互式 Shell 终端,因此用的是 bash
- 改命令执行以后,就启动了一个ubuntu系统下的shell终端,然后我们可以终端操作
- cat /etc/os-release 查看当前容器镜像系统版本信息,cat命令就是打开查看文件信息
- ls 查看当前根目录下有哪些文件夹及文件
- 最后我们通过 exit 命令退出了这个容器
3.2 查找拖取镜像
- 查找镜像
- Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/ 直接访问网速不好
- docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务
- 比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
- docker search httpd
- 拖去镜像(参考上面3.1)
- docker pull httpd