Docker
1. 简介
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 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
上面的命令的运行过程如下:
- 查看本机是否有 tomcat 镜像
- 如果有,则以该镜像为模板生成容器实例
- 如果没有,则从远程 Docker Hub 搜索该镜像
- 在 Docker Hub 找不到 tomcat 镜像,则给出提示
- 找到了则下载该镜像到本地,并生成容器实例
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,却无法访问
- 使用 run 命令创建并启动 tomcat
- 然后尝试使用浏览器查看项目运行情况,在地址栏输入,例如 192.168.124.130:8888
- 结果浏览器页面显示 404
- 使用 exec 命令进入容器,发现在 /urs/local/tomcat 目录内的 webapps 文件夹是空的,反而多出了一个 webapps.dist,里面包含的正是 webapps 文件夹本来应该有的文件
- 找到问题所在,此时就可以使用容器目录挂载来解决
- 先将容器内的 webapps 文件夹使用 cp 命令复制到宿主机
- 接着回到宿主机环境,删除刚刚运行的 tomcat 容器
- 重新创建并启动 tomcat 容器,使用 docker run --name 自定义容器名 -it -d -p 8888:8080 -v /宿主机目录/webapps:/usr/local/tomcat/webapps 即可
具体参考 centos7一步一步搭建docker tomcat 及重点讲解 - 一 定 会 去 旅 行 - 博客园
6. 推送镜像到 Docker Hub
- 注册 Docker Hub 账号
- 在命令行登录:docker login 账号
- 在命令行推送:docker push 镜像
7. 推送镜像到阿里云
很多时候,中小公司为了方便搭建私有仓库,会直接使用稳定的阿里云镜像仓库。
进入 镜像仓库,创建一个镜像仓库,点进去,内有详细操作指南。
备注:当然创建镜像仓库之前也可以先创建命名空间。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。