docker
- 官方文档地址: www.docker.com/get-started (推荐)
- 中文参考手册: docker_practice.gitee.io/zh-cn/ (中文gitee)
docker简介
1. 什么是docker?
官网定义:
-
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
容器技术 => 帮助我们更好构建和发布应用 => (容器) 水杯 书包 => 容器内部装东西
application (javaweb) ---> mysql redis mq ... 自己在自己机器安装服务
application (javaweb) ---> Docker容器 mysql容器 redis容器 ...
早期docker定义:运行你的应用不需要你的环境
容器里装的是什么?
一个一个的软件服务。
2. 为什么是Docker
- 当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况 ===>
环境一致、高效迁移- 如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。
Docker就很好解决了环境隔高的问题,别人程序不会影响到自己的程序进程级隔离、容器独立- 镜像机制,便于部署
Docker优势
- 环境一致、高效迁移
如: 我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、mysql等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。
Docker则将程序以及使用软件环境直接绑定在一起,无论在哪个机器上保证了环境一致。 - 进程级隔离、容器独立
如: 服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。
Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。 - 镜像机制、便于部署
公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。
在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻,用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给跑多少容器,极大地提高了部署效率。
3. Doker和虚拟机对比
- 对于docker 官方logo解读
a. docker 官方吉祥物 鲸鱼 -->代表Docker运行引擎
b. 在鲸鱼身上背着一个个小箱子 箱子之间互不影响 独立运行 -->容器(软件服务) mysql服务 redis服务
- Docker引整和传统虚拟机对比
比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。
Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。
另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存 -> 虚拟物理内存 -> 真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存 -> 真正物理内存。
4. docker起源
- Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
- Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目 已经超过 5 万 7 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
- Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
docker引擎安装
引擎就是软件
Docker:加速容器应用程序开发
\
官网安装步骤:
Install Docker Engine on CentOS | Docker Docs
安装docker (centos7.x)
跟linux发行版本无关
- 卸载原始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
- 指定版本安装doker
$ 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
- 启动dokcer
$ sudo systemctl enable docker
$ sudo systemctl start docker
- 关闭docker
$ sudo systemctl stop docker
- 测试docker安装
$ sudo docker run hello-world
bash安装(通用所有平台-Linux)
- 在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的
安装脚本,CentOs 系统上可以使用这套脚本安装,另外可以通过--mirror选项使用国内源进行安装:
执行这个命令后,脚本就会自动的将一切准备工作做了,并且把 Docker 的稳定(stable) 版本安装在系统中。
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
sudo代表以管理员方式执行
a) 执行下载doker引擎的脚本文件(拉取脚本,不是安装)
下载doker引擎
curl -fsSL get.docker.com -o get-docker.sh
b) 执行脚本,通过脚本下载 设置阿里云镜像下载加速
sudo sh get-docker.sh --mirror Aliyun
c) 启动docker
systemctl enable docker #将docker加入开机自启动列表
systemctl start docker #启动docker服务 (restart重启)status状态 stop停止
d) 推荐将当前用户加入Docker组
-
创建docker组
groupadd docker -
将当前用户加入docker
sudo usermod -aG docker $USER修改过程中自动创建docker groupadd docker -
查看docker引擎
docker info
docker version
docker引擎本身只是个服务,这个服务一直运行,日后docker服务里面运行的是一个个容器。
如何让docker服务中运行容器?
要通过客户端向docker引擎发命令。
docker分为客户端和服务端,要在客户端中写命令去操作服务端。
客户端写命令去操作服务端,CS模型
docker info: docker的详细信息
docker核心架构
- 镜像 Image
一个镜像代表一个应用环境, 他是一个只读的文件, 如 mysql镜像, tomcat镜像, nginx镜像等 - 容器 Container
镜像每次运行之后就是产生一个容器, 就是正在运行的镜像,特点就是可读可写 - 仓库
用来存放镜像的位置, 类似于maven仓库, 也是镜像下载和上传的位置 - 本地仓库
用来存储在使用doker过程中的相关镜像 - dockerFile
docker生成镜像配置文件, 用来书写自定义镜像的一些配置 - tar
一个对镜像打包的文件, 日后可以还原成镜像
docker配置阿里云镜像加速
docker 运行流程
远程仓库非常慢,建议设置阿里云镜像加速
- 登录到阿里云官方网站
- 控制台
- 搜索镜像加速服务
- 阿里云提供镜像加速
访问阿里云登录自己账号查看docker镜像加速服务
每个人的镜像加速都不一样,可以自己去aliyun注册哦
`mkdir -p /etc/docker`
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uy35zvn6.mirror.aliyuncs.com"]
}
EOF
//重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
- 验证docker的镜像加速是否生效
docker info:
测试速度
docker第一个程序
docker中三个重要概念
-
仓库
a. 远程仓库: docker公司在世界范围内维护一个中心,用来集中管理docker中镜像 ====> 搜索仓库docker hub
b. 本地仓库: 用来存储自己使用过镜像,在中心仓库下载镜像存储到本地 /var/lib/docker -
镜像 image
定义:一个镜像就是一个软件 mysql镜像 jdk镜像 redis镜像
特点:镜像是只读,不能进行写操作
mysql镜像 就是Linux精简操作系统 + mysql
tomcat镜像 就是Linux精简操作系统 + tomcat
- 容器 container
定义:镜像每运行一次就会生成一个容器,一个容器代表一个正在运行软件服务
特点:容器可读可写
docker入门应用
docker run hello-world
run的是镜像,从而形成容器
docker执行流程
常用命令
辅助命令
docker version 用来查看docker客户端引擎和server端引擎版本信息
docker info 用来查看docker引擎详细信息
docker --help 用来帮助信息
images镜像命令
- 查看当前本地仓库中存在哪些镜像
docker image ls 或者 docker images
镜像 --> 名称: tag (tomcat: 8.0) --> 镜像id
- 下载一个镜像 docker pull 镜像名称
获取最新版本:docker pull redis --> docker pull redis: latest(最新版本)
获取指定版本:docker pull tomcat: 9.0
- 搜索镜像 docker search 镜像名称
docker search 镜像名称,只能看镜像是否存在,看不到版本
- 删除镜像 docker image rm 镜像名 (name:tag) | 镜像id
正常删除: docker image rm 镜像名 (name:tag) | 镜像id(要求:必须是没有运行过的镜像)
强制删除: docker image rm -f 镜像名 (name:tag) | 镜像id
批量删除镜像: docker image rm -f $(docker images tomcat -q)
正常删除:
docker image rm 镜像名 (name:tag) | 镜像id
强制删除:在删除镜像的同时把容器也删了
docker image rm -f 镜像名 (name:tag) | 镜像id
容器是基于image(镜像)的
组合命令: 强制删除tomcat的镜像Id
docker image rm -f $(docker images tomcat -q)
条件查询:
docker images tomcat
只列出镜像Id:
docker images -p
Contrainer 容器命令
操作容器命令格式: docker 命令 [选型]
运行容器
运行一个容器 docker run 镜像名|镜像id
docker run 镜像名 -------------------------- 镜像名新建并启动容器
--name -------------------------- 别名为容器起一个名字
-d -------------------------- 启动守护式容器(在后台启动容器)
-p -------------------------- 映射端口号:原始端口号 (指定端口号启动)
例:docker run -it --name myTomcat -p 8888:8080 tomcat
docker run -d --name myTomcat -p tomcat
docker run -d -p 宿主机端口:容器端口 --name tomcat01 tomcat:8.0
-d: 后台运行
docker run tomcat:8.0|(imageId)
简单运行tomcat镜像 (这种方式直接运行容器,容器内无法访问)
docker run运行,容器跑在自己的操作系统中,外界访问不到。所以一定要让容器的端口与宿主机的端口进行映射
外部访问不到tomcat,检查防火墙
systemctl status firewalld
运行tomcat容器,同时设置容器与宿主机端口的映射关系 -p
报错的话开启防火墙哦
docker在启动服务时,它会把8080端口利用防火墙加到防火墙的开放列表中,不需要关闭网络防火墙服务
两个容器端口都是8080但是互不影响,因为是操作系统的隔离
查看运行的容器
docker ps --------------------------列出所有正在运行的容器
-a -------------------------- 正在运行的和历史运行过的容器
-q -------------------------- 静默模式,只显示容器编号
docker ps 列出所有正在运行的容器
docker ps -a 查看所有容器(包括停止的容器)
docker ps -aq 查看所有的容器id
docker ps -q 查看正在运行容器id
停止|关闭|重启容器
docker start 容器名字或者容器id --------------- 开启容器
docker restart 容器名或者容器id --------------- 重启容器
docker stop 容器名或者容器id ------------------ 正常停止容器运行
docker kill 容器名或者容器id ------------------ 立即停止容器运行
删除容器
docker rm 容器id|容器名 ----------------- 删除已经停止容器
docker rm -f 容器id|容器名 ----------------- 强制删除(即使正在运行的容器也能删除掉)
docker rm -f $(docker ps -aq) -------------------------- 删除所有容器
查看容器内进程
docker top 容器id或者容器名 ------------------ 查看容器内的进程
查看查看容器内部细节
docker inspect 容器id或者容器名 ------------------ 查看容器内部细节
查看容器的运行日志
docker logs [OPTIONS] 容器id或容器名 ------------------ 查看容器日志
-t ------------------ 加入时间戳
-f ------------------ 跟随最新的日志打印
--tail 数字 ------------------ 显示最后多少条
docker logs -f 容器id|name 实时监控容器内服务的日志
进入容器内部
docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令
-i ------------------ 以交互模式运行容器,通常与-t一起使用
-t ------------------ 分配一个伪终端 shell窗口 bash
docker exec -it(交互模式)容器id|name
交互模式:操作一开始是在宿主机操作系统,交互后会把终端切换到容器里面
bash: 已交互的模式进入容器的bash窗口
退出容器:exit
容器和宿主机之间复制文件
docker cp 文件|目录 容器id:容器路径 ----------------- 将宿主机复制到容器内部
docker cp 容器id:容器内资源路径 宿主机目录路径 ----------------- 将容器内资源拷贝到主机上
从容器内拷贝文件到宿主机
从容器拷贝目录到宿主机
从宿主机拷贝到容器内
docker cp /root/readme.txt tomcat01:/usr/local/tomcat
如何部署一个web项目 war项目
- 先把war包传入linux
- 通过docker cp命令将test.war复制到tomcat的webapps目录中
- 使用ip端口进行测试访问即可
docker cp /root/test.war tomcat01:/usr/local/tomcat/webapps
数据卷(volum)实现与宿主机共享目录
数据卷 Data volume
作用:用来实现容器中数据和宿主机中数据进行映射的(同步的)
数据卷使用必须在容器首次启动时设置
docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名
使用:
- 使用绝对路径设置数据卷
docker run -v 宿主机绝对路径:容器内路径:ro(radeonly)
注意:这种方式会将容器路径的原始内容完全清空,始终以宿主机路径为主
ro:read only如果在设置数据卷时指定ro,代表日后容器内路径是只读的
如:docker run -d -p 8081:8080 --name tomcat01 -v /root/apps:/usr/local/tomcat/webapps tomcat:8.0:ro
宿主机: /root/apps
docker run -d -p 8081:8080 --name tomcat01 -v /root/apps:/usr/local/tomcat/webapps tomcat:8.0
- 使用别名方式设置数据卷
docker run -v aa:/usr/local/tomcat/webapps
aa是什么
a.aa代表docker数据卷中别名 注意:这个别名如果存在docker直接使用,aa不存在自动创建
b. 使用别名方式保留容器路径原始内容,前提别名对应路径不能存在内容
注意:docker根据别名创建目录默认在 /var/lib/docker/volums/
打包镜像
docker save 镜像名 -o 名称.tar
载入镜像
docker load -i 名称.tar
容器打包成新的镜像
docker commit -m "描述信息" -a "作者信息" (容器id或者名称)打包的镜像名称:标签
docker镜像原理
镜像是什么?
镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。
为什么一个镜像会那么大?
解释:容器独立操作系统(精简linux操作系统 + 软件服务)===> 镜像运行 ===> 镜像(操作系统 + 软件服务)
镜像就是花卷
- UnionFS(联合文件系统):
Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。
原理: 就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 。
Docker镜像原理
docker的镜像实际是由一层一层的文件系统组成。
- bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
- rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
- 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
为什么docker镜像要采用这种分层结构呢?
最大的一个好处就是资源共享
- 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。
参考
编程不良人1.Docker Hub的使用与镜像加速器的配置_hub.docker.dom-CSDN博客
2.编程不良人.docker