🍅程序员小王的博客:程序员小王的博客
🍅 欢迎点赞 👍 收藏 ⭐留言 📝
🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕
🍅Docker博客参考资料:Docker官网,中文网,编程不良人等
一、什么是Docker
1、官方定义
-
官方文档地址:Developers - Docker 推荐
-
中文参考手册:https://docker_practice.gitee.io/zh-cn/ 中文
-
中文文档: 前言 - Docker — 从入门到实践
-
官网地址
-
Docker 的 标识解释
Docker官方吉祥物(鲸鱼),鲸鱼上面背着一个小箱子,箱子之间互不影响,独立运行
相当于docker容器里面有(mysql服务,redis服务等)
-
We help developers and development teams build and ship apps.
翻译: 我们帮助开发人员和开发团队构建和发布应用
-
We have a complete container solution for you - no matter who you are and where you are on your containerization journey.
翻译: 我们为你提供了一个完整的容器解决方案,不管你是谁,不管你在哪,你都可以开始容器的的旅程。
-
官方定义: docker是一个容器技术。docker引擎 容器(container) (软件 redis mysql tomcat rabbitmq ..) ----> 构建 发布应用?
-
通俗理解: docker是一个软件容器平台|引擎|技术 ,Docker (opens new window)是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
2、Docker的起源
(1)历史
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动开放容器联盟(OCI)。
(2)开源
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目 已经超过 5 万 7 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
(3)本质
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
3、Docker优势
-
环境一致、高效迁移 如: 我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、mysql等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序以及使用软件环境直接绑定在一起,无论在那个机器上保证了环境一致。
-
进程级隔离、容器独立 如: 服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
-
镜像机制、便于部署 公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给跑多少容器,极大地提高了部署效率。
4、Docker和虚拟机区别
-
需要明确一点,Docker容器不是虚拟机。
-
2014年,当我们第一次接触Docker的时候,把它比做一种轻量级的虚拟机。这样做无可厚非,因为Docker最初的成功秘诀,正是它比虚拟机更节省内存,启动更快。Docker不停地给大家宣传,”虚拟机需要数分钟启动,而Docker容器只需要50毫秒”。然而,Docker容器并非虚拟机,我们不妨来比较一下它们。
关于Docker与虚拟机的区别,我在网上找到的一张图,非常直观形象地展示出来,话不多说,直接上图。
-
虚拟机
-
Docker
比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重
。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。
区别 | 传统虚拟机 | Docker容器 |
---|---|---|
磁盘占用 | 几个GB到几十个GB左右 | 几十MB到几百MB左右 |
CPU内存占用 | 虚拟操作系统非常占用CPU和内存 | Docker引擎占用极低 |
启动速度 | (从开机到运行项目)几分钟 | (从开启容器到运行项目)几秒 |
安装管理 | 需要专门的运维技术 | 安装、管理方便 |
应用部署 | 每次部署都费时费力 | 从第二次部署开始轻松简捷 |
耦合性 | 多个应用服务安装到一起,容易互相影响 | 每个应用服务一个容器,达成隔离 |
系统依赖 | 无 | 需求相同或相似的内核,目前推荐是Linux |
二、Docker的安装
1、安装Docker(centos7.x)
- 卸载原始docker(\用于换行)
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
- 安装docker依赖
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
- 设置docker的yum源
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
- 安装最新版的docker
$ sudo yum install docker-ce docker-ce-cli containerd.io
- 指定版本安装docker
#遍历有哪些版本号 $ yum list docker-ce --showduplicates | sort -r # 安装指定版本号 $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io #这是我选择的版本号 $ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io
- 启动docker
$ sudo systemctl enable docker $ sudo systemctl start docker
-
关闭docker
$ sudo systemctl stop docker
-
测试docker安装
$ sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
这句话表明我们安装成功!
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
为了生成此消息,Docker采取了以下步骤:
1.Docker客户端联系了Docker守护程序。
2.Docker守护进程从Docker Hub中提取“hello-world”映像。
(amd64)
3.Docker守护进程从运行
产生您当前正在阅读的输出的可执行文件。
4.Docker守护程序将输出流式传输到Docker客户机,客户机发送输出
到你的终端。
-
创建docker组
sudo groupadd docker
-
将当前用户加入Docker组
usermod -aG docker $USER
-
查看docker引擎
docker info
docker version
2、bash安装(通用所有平台-Linux)
-
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过
--mirror
选项使用国内源进行安装:执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。
#1.Docker 官方为了简化安装流程,提供了一套便捷的安装脚本
$ curl -fsSL get.docker.com -o get-docker.sh
#2.通过--mirror 选项使用国内源安装脚本
$ sudo sh get-docker.sh --mirror Aliyun
-
启动安装
$ sudo systemctl enable docker
$ sudo systemctl start docker
-
创建docker用户组
$ sudo groupadd docker
-
将当前用户加入docker组
$ sudo usermod -aG docker $USER
-
测试docker安装是否正确
$ docker run hello-world
三、Docker 的核心架构
-
镜像:
一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等 -
容器:
镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写 -
远程仓库:
用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置(仓库Web界面,docker hub) -
本地仓库:用来存储使用过程中的相关镜像
-
dockerFile:
docker生成镜像配置文件,用来书写自定义镜像的一些配置 -
tar:
一个对镜像打包的文件,日后可以还原成镜像
四、阿里云配置镜像加速
1、Docker运行流程
2、Docekr配置阿里云镜像加速
(1)访问阿里云登录自己账号查看docker镜像加速服务
-
登录阿里云官方账号
-
控制台
-
搜索镜像加速服务
(2)阿里云提供镜像加速
sudo mkdir -p /etc/docker
-
写入如下配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"]
}
EOF
-
重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
-
检测配置
docker info
#查看是否有如下信息判断是否成功
..........
127.0.0.0/8
Registry Mirrors:
'https://lz2nib3q.mirror.aliyuncs.com/'
Live Restore Enabled: false
Product License: Community Engine
五、第一个Docker程序
1、docker中的三个概念
(1)仓库
-
远程仓库:docker公司在全世界范围内集中维护一个中心,用来集群管理docker中镜像===》搜索仓库docker hub
-
本地仓库:用来存储自己使用过的镜像,在中心仓库下载镜像到本地仓库 /var/lib/docker
(2)镜像image
-
定义:一个镜像就是一个软件mysql镜像
-
特点:镜像只能读,不能写
(3)容器 container
-
定义:镜像每运行一次,生成一个容器
-
特点:容器可读可写
2、docker 第一个应用程序
docker run hello-word
3、通过第一个程序,总结docker执行流程
#原文
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
#翻译版本
为了产生这个消息,Docker采取了以下步骤。
1. Docker客户端联系了Docker守护进程。
2. Docker守护进程从Docker Hub拉出 "hello-world "镜像。
(amd64)
3. Docker守护进程从该镜像中创建了一个新的容器,该容器运行的是
可执行文件,产生你目前正在阅读的输出。
4. Docker守护进程将该输出流向Docker客户端,后者将其发送到你的终端。
六、后续Docker相关博客内容
-
Docker基础篇(2022/3/29)
-
Docker常用命令总结及镜像原理(2022/3/29)
-
Docker安装mysql,Redis,nginx,tomcat,mongoDB,elasticSearch软件攻略(2022/3/30)
-
DockerFile相关命令及构建部署SpringBoot项目(2022/3/30)
-
Docker的网络配置和数据卷配置(2022/3/31)
-
Docker Compose文件的使用攻略(2022/4/1)
-
Docker可视化工具使用(2022/4/2)