Docker自2013年发布至今, 一直广受瞩目,被认为可能会改变软件行业。
但是,许多人并不清楚Docker到底是什么,要解决什么问题,好处又在哪里?本文简单介绍一下,希望对大家有帮助。
为什么要使用docker
想必大家都听过这样一句话:“它在我的机器可以跑了”(It works on my machine)。
软件开发面临的最大的麻烦之一,就是环境配置。为了确保软件在不同设备上能够正常运行,必须保证操作系统的设置和各种库和组件的安装,只有它们都正确了,软件才能成功跑起来。
既然环境配置如此麻烦,那能不能从根本上解决问题,即将原始环境一模一样的复制过去呢?
其中一种解决方案就是使用虚拟机(virtual machine)。它可以让我们在一种操作系统里面运行另一种操作系统,比如通过VMware软件在Windows系统里面安装Linux系统,两个系统独立运行,互不影响。虽然虚拟机可以将完整的环境复制过去,但是因为它是一个操作系统,也存在一些问题:
- 资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。- 冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。- 启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
由于虚拟机存在上述缺点,Linux发展出了另一种虚拟化技术,Linux容器。
Linux容器不是一个操作系统,而是对进程进行隔离。由于容器是进程级别的,所以相对虚拟机来说,有很多优势:
- 启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。- 资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。- 体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
Docker 是什么
Docker 属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就再不用担心环境问题啦。
Docker | VMware | |
---|---|---|
虚拟化 | 轻量级虚拟化(只虚拟出来容器所需要的资源,软件层面) | 完全虚拟化(虚拟化硬件) |
启动速度 | 秒级 | 分钟级 |
运行性能** | 接近原生 | 5%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统 |
Docker的架构
docker使用客户端-服务器架构。 Docker客户端(client) 与 守护进程(Docker daemon)进行对话,该守护进程 完成了构建、运行和分发 Docker 容器的繁重工作。
Docker的用途
Docker 的主要用途,目前有三大类。
- 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
- 提供弹性的云服务。因为docker容器可以随开随关,很是和动态扩容和缩容。
- 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
Docker的安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition 缩写为CE)和 企业版(Enterprise Edition 缩写为EE)。
Docker CE的安装请参考官方文档
Centos 安装 Docker 示例
Docker需要用户具有sudo权限,非root用户为了避免每次命令都输入
sudo
,可以把用户加入 Docker 用户组(官方文档)
-
卸载之前的Docker
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
使用rpm存储库安装
在新主机上首次安装Docker引擎之前,您需要设置Docker存储库。之后,您可以安装和更新存储库中的Docker。
-
安装yum-utils
yum install -y yum-utils
-
配置阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新rpm库中的软件包
yum update
-
安装最新docker
列出docker源
yum list docker-ce --showduplicates | sort -r
安装最新版
docker-ce是 Docker Engine 的社区版、docker-ce-cli是Docker Engine的命令行界面(启动、删除等命令)、
containerd.io是 Docker 引擎的核心组件、docker-compose-plugin是 Docker Compose 的插件。
docker-buildx-plugin (多平台构建、多层构建等等,可选)
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
检查docker版本号
docker -v
-
启动docker
systemctl start docker // 配置系统启动后自动运行 systemctl enable docker
Docker 常用命令
- 查询Docker Hub上的镜像
docker search 镜像名称
- 拉取镜像
docker pull 镜像名称 # 指定版本 docker pull 镜像名称:版本号
- 查询已下载镜像
docker image ls
- 删除镜像
docker image rm 镜像id # 或者 docker rmi 镜像名称:版本号
- 创建并运行docker容器(如果本地镜像不存在,自动从hub搜索镜像并下载)
docker run -it --name xxx(自定义容器名称) -d 镜像名称 # 参数解释 也可通过docker run -it 交互式终端 --name 容器唯一名称 -p 映射端口 格式:linux的访问端口:容器内的运行程序端口 如(3320:3306) --privileged 开放权限 (默认值true) --network 自定义网络 --ip 自定义ip -v 挂载卷(Volume)或主机目录到容器中 格式:主机目录:容器目录 或 volume_name:容器目录 -e 设置容器中运行程序的环境参数 如:MYSQL_ROOT_PASSWORD=123 -d 后台运行容器并打印容器ID
- docker日志查询
docker logs 容器名称
- 查询正在运行的docker容器
docker ps #查询所有容器 docker ps -a
- 查看容器的内部状况
docker inspect 容器名称 # 将输出重定向使用 >> docker inspect 容器名称 >> /var/xx.txt # 将输出内容进行过滤, 使用管道 docker inspect 容器名称 | grep 查询字段
- 进入容器
# 常用方式 docker exec -it 容器名称 bash -it 交互式终端 bash 指定shell为bash
- 退出容器
exit
- 容器关闭与重启
# 停止容器 docker stop 容器名称 # 重启容器 docker restart 容器名称 # 运行容器 docker start 容器名称
容器启动时会根据启动的先后顺序自动生成ip地址。当然,也可以在启动时,为容器分配固定的ip地址。
- 删除容器
docker rm 容器名称/容器id(前四位)
Docker 容器配置
配置本地镜像
从网络获取docker镜像太慢,设置阿里云的镜像库。
-
修改
/etc/*docker*/*daemon*.json
文件,配置阿里云镜像库。{ "registry-mirrors":["https://ung2thfc.mirror.aliyuncs.com"] }
-
重启docker
systemctl restart docker
设置docker的静态ip
docker容器的ip地址在每次启动后启动顺序设置ip地址,为解决ip地址变动的问题,我们有必要设置docker内部ip地址固定。
- 创建自定义网络(network)
docker network create --driver bridge --subnet=自定义网络ip/16 --gateway=网关值 自定义网络名称
- 查看网络
docker network ls
感谢大家读到这里,后续还会有其他相关文章,欢迎继续阅读。
文章参考:https://ruanyifeng.com/blog/2018/02/docker-tutorial.html