Docker

1. 简介

Docker 官网

Docker

Docker 是一个 2013 年开源的应用容器引擎,基于 Go 语言。

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

容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能极低。

Docker 从 17.03 版本之后分为 CE(Community Edition 社区版)和 EE(Enterprise Edition 企业版),一般我们使用社区版即可。

1.1 优点

  • 避免开发和运维之间因为环境不同而导致的矛盾

    比如,开发的机器中明明能运行项目,在运维的机器却跑不起来了。

  • 避免集群环境下每台机器都部署相同的应用

    在各个机器都要重复地配置环境令人厌烦,Docker 能大大简化运维工作量

1.2 容器和虚拟机

Docker 是一种轻量虚拟化技术,比传统的虚拟机性能更好。

虚拟机与容器

解释

  • Infrastructure:基础设施,简单理解为真实电脑
  • Host Operating:System 宿主机操作系统,例如 Linux、Windows
  • Hypervisor:虚拟机,例如 VMware
  • Container Engine:容器引擎,这里指 Docker

这种架构优势在于,不需要为虚拟机操作系统提供硬件模拟,所有应用程序都作为 Docker 容器工作,性能更好。

特性 Docker 容器 虚拟机
操作系统 与宿主机共享操作系统 在宿主机的操作系统上运行的主机操作系统
存储大小 镜像小,便于存储和传输 镜像庞大
性能 几乎无额外性能损失 额外的 cpu、内存消耗
移植性 轻便、灵活 笨重、与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者

总结下来就是,Docker 轻量级、速度快、运行应用隔离、方便维护。

2. Docker 架构

Docker架构

  • Docker Client 客户端

    可以理解为命令行工具,用户通过客户端与 Docker 守护进程进行通信,并且展示返回结果。

  • Docker Host 宿主机

    就是安装了 Docker 程序,并运行了 Docker 守护进程的主机。

  • Images 镜像

    镜像就是一个只读的模板,它可以是一个可运行软件(tomcat、mysql)或者是一个系统(CentOS)。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

  • Container 容器,相当于 Docker Logo 中的鲸鱼上的集装箱

    容器是用镜像创建的运行实例,Docker 利用容器独立运行一个或一组应用,它可以被启动、开始、停止、删除。

    每个容器都是相互隔离、保证安全的平台。可以把容器看作是一个简易版的 Linux 环境(包括用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

    容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

  • Registry 仓库服务注册器

    仓库服务注册器(Registry)经常和仓库(Repository)混淆。

    实际上,仓库服务注册器上可以有多个仓库,每个仓库可以放多个镜像,每个镜像有不同的标签(类似版本号)。

    仓库分为公开仓库和私有仓库,最大的公开仓库是官方的 Docker Hub,国内也有如阿里云、网易云等。用户也可以在本地网络内创建一个私有仓库。

    当用户创建了自己的镜像之后就可以使用 push 命令将它上传仓库,这样下次在另外一台机器使用这个镜像的时候,只需要从仓库上 pull 下来即可。

3. 安装

Docker 提供了社区版(CE)和企业版(EE),一般使用社区版即可。

以 CentOS 7 为例,Docker 要求操作系统必须为 64 位,且 CentOS 内核版本为 3.1 及以上

查看系统内核版本信息可以通过 uname -r 获得。

安装文档(CentOS) ,选择 Install using the repository 方式安装即可。

安装完之后,配置镜像加速

4. 常用操作

官方文档

4.1 Docker 基本命令

  • 启动 Docker:systemctl start docker
  • 停止 Docker:systemctl stop docker
  • 重启 Docker:systemctl restart docker
  • 开机启动 Docker:systemctl enable docker
  • 查看 Docker 版本信息:docker version
  • 查看 Docker 概要信息:docker info
  • 查看 Docker 帮助文档:docker --help

4.1 镜像相关命令

  • 查看本地所有镜像:docker images

    • -a 显示所有镜像,包括中间层
    • -q 只显示镜像ID
  • 搜索镜像:docker search 镜像名,相当于在 Docker Hub 搜索
  • 拉取(下载)镜像:docker pull 镜像名,例如 docker pull mysql:5.7
  • 删除镜像:docker rmi 镜像ID或镜像名

    • -f 强制删除,例如 docker rmi -f fd484f19954f

4.2 容器相关命令

4.2.1 创建并启动容器

docker run 镜像ID或镜像名

  • --name 为容器指定一个名称
  • --interactive, -i 打开标准输出,以交互模式运行容器,通常 -it 结合使用
  • --tty, -t,为容器分配一个伪终端,通常 -it 结合使用
  • --detach, -d 后台运行容器
  • --publish, -p 指定端口映射,将宿主机端口映射到容器内的端口(通过宿主机的端口来访问容器中的端口)
  • --volume, -v 挂载主机目录到容器目录

例如,docker run --name my_tomcat -it -d -p 8888:8080 -v /home/www/webapps:/usr/local/tomcat/webapps tomcat

上面的命令的运行过程如下:

  1. 查看本机是否有 tomcat 镜像
  2. 如果有,则以该镜像为模板生成容器实例
  3. 如果没有,则从远程 Docker Hub 搜索该镜像
  4. 在 Docker Hub 找不到 tomcat 镜像,则给出提示
  5. 找到了则下载该镜像到本地,并生成容器实例
4.2.2 其他
  • docker attach 容器ID或容器名

    将本机的标准输入(键盘)、标准输出(屏幕)、错误输出(屏幕)附加到一个运行的容器,也就是说本机的输入直接输到容器中,容器的输出会直接显示在本机的屏幕上。如果容器内没有标准输出,那么 attach 操作之后会好像假死了一样。

  • docker exec 容器ID或容器名 执行命令

    在一个正在运行的容器中执行命令。一般配合 -i -t 使用,例如 docker exec -i -t ca454f19764t /bin/bash,此操作进入容器并在容器内打开终端。

  • 查看正在运行的容器:docker ps

    • -a 查看所有容器,无论是否运行中
    • -q 只查看容器ID
    • --last, -n 展示最近创建的 n 个容器,例如 docker ps -n 3
    • --filter, -f 过滤展示容器,例如 docker ps --filter status=running
  • 启动(停止状态的)容器:docker start 容器ID或容器名
  • 重启容器:docker restart 容器ID或容器名
  • 停止容器:docker stop 容器ID或容器名
  • 删除容器:docker rm 容器ID或容器名

    • -f 表示强制
  • 查看日志:docker logs 容器ID或容器名
  • 拷贝文件

    • 主机中的文件拷贝到容器中:docker cp 主机文件路径 容器ID或容器名:容器路径
    • 容器中的文件拷贝到主机中:docker cp 容器ID或容器名:容器路径 主机文件路径
  • 获取容器元信息:docker inspect 容器ID或容器名
  • 查看容器中运行的进程:docker top 容器ID或容器名
  • 将运行时的容器提交为镜像:docker commit 运行时的容器ID或容器名 新镜像名称

    • --author, -a 作者
    • --message, -m 提交信息 / 备注

5. 容器目录挂载

在创建容器的时候,将宿主机的目录与容器内的目录进行映射,就可以实现宿主机目录和容器目录的双向自动同步,通过 cp 的方式太麻烦了。

通过容器目录挂载,可以实现上传代码、修改配置、同步日志等需求。

可通过在执行 run 命令创建并运行容器时加上 -v 参数来实现,例如 docker run -v 宿主机目录1:容器目录1 -v 宿主机目录2:容器目录2 镜像ID或镜像名

注意:如果同步的是多级目录,可能会出现权限问题,这是因为 CentOS 7 中的安全模块把权限禁掉了,此时需要添加 --privileged=true 来解决。

5.1 具体例子:Docker 启动 tomcat,却无法访问

  1. 使用 run 命令创建并启动 tomcat
  2. 然后尝试使用浏览器查看项目运行情况,在地址栏输入,例如 192.168.124.130:8888
  3. 结果浏览器页面显示 404
  4. 使用 exec 命令进入容器,发现在 /urs/local/tomcat 目录内的 webapps 文件夹是空的,反而多出了一个 webapps.dist,里面包含的正是 webapps 文件夹本来应该有的文件
  5. 找到问题所在,此时就可以使用容器目录挂载来解决
  6. 先将容器内的 webapps 文件夹使用 cp 命令复制到宿主机
  7. 接着回到宿主机环境,删除刚刚运行的 tomcat 容器
  8. 重新创建并启动 tomcat 容器,使用 docker run --name 自定义容器名 -it -d -p 8888:8080 -v /宿主机目录/webapps:/usr/local/tomcat/webapps 即可

具体参考 centos7一步一步搭建docker tomcat 及重点讲解 - 一 定 会 去 旅 行 - 博客园

6. 推送镜像到 Docker Hub

  1. 注册 Docker Hub 账号
  2. 在命令行登录:docker login 账号
  3. 在命令行推送:docker push 镜像

7. 推送镜像到阿里云

很多时候,中小公司为了方便搭建私有仓库,会直接使用稳定的阿里云镜像仓库。

进入 镜像仓库,创建一个镜像仓库,点进去,内有详细操作指南。

备注:当然创建镜像仓库之前也可以先创建命名空间。


3santiago3
113 声望2 粉丝