该文章出自狂神说javaDocker教学
Docker为什么会出现
环境配置如此麻烦,换一台机器,就要重新来一次,费力费时
Docker镜像的设计,使得Docker得以打破过去【程序即应用】的观念。透过镜像(images)将作业系统核心除外
运作应用程式所需要的系统环境,由下而上打包
Docker历史
-Docker 公司位于旧金山,由法裔美籍开发者和企业家 Solumon Hykes 创立
-新旧LOGO

-Docker 公司起初是一家名为 dotCloud 的平台即服务提供商
-Go语言开发
-Docker技术出生时并没有多少人关注,2013年代码开源后每个月都会更新一个新版本,2014年4月Docker1.0发布
-[Docker官网](https://www.docker.com/)
-[Docker文档](https://docs.docker.com/)
Docker能做什么
-之前的VM(虚拟机)技术缺点
1、资源占用非常多
2、冗余步骤多
3、启动慢
容器化技术
**容器化技术不是模拟一个完整的操作系统**
面试题:Docker和虚拟机技术有什么不同
1、传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
2、容器内的应用直接运行在宿主机里,容器是没有自己的核心的,没有虚拟我们的硬件,所以就轻便了
3、每个容器是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响
4、传统模式需要一堆文档和安装程序,Docker直接打包镜像发布测试,一键运行
5、Docker使用之后我们部署应用就会像搭积木一样,项目直接打包成镜像
6、Docker在扩张服务器时也只需要将镜像运行在另外一台服务器即可
7、使用Docker可以使服务器环境和本地开发环境高度一致
8、Docker是更高效的资源利用,可以将服务器的性能压榨到极致
安装 Docker
我是使用的Xshell连接阿里云服务器,以CentOS7.8为例
// 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
// 安装新版本
yum install -y yum-utils
// 设置镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
// https://download.docker.com/linux/centos/docker-ce.repo 这个会下载很慢,需要更换成阿里云的Docker
// 更新yum软件包索引
yum makecache fast
//安装最新版的Docker ce是社区版本 ee是企业版
yum install docker-ce docker-ce-cli containerd.io
// 测试是否安装成功
// 启动Docker
systemctl start docker
// 查看Docker版本
docker version
// 测试Hello World
docker run hello-world
// 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
// 删除资源
rm -rf /var/lib/docker
/var/lib/docker是Docker的默认工作路径
Docker Run流程的原理
在这幅图中,我们可以看到,Docker 容器的生命周期里分为五种状态,其分别代表着:
Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态。
Running:容器正在运行,也就是容器中的应用正在运行。
Paused:容器已暂停,表示容器中的所有程序都处于暂停 ( 不是停止 ) 状态。
Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止。
Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除。
Docker 常用命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker --help # 帮助命令
镜像的基本命令
docker images # 查看本地主机上所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 2 months ago 13.3kB
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
-a, --all 列出所有的镜像
-q, --quiet 只显示镜像的ID
**docker search 搜索镜像**
docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10834 [OK]
docker search --help
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
只搜索STARS 大于3000的
docker search mysql -f=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10834 [OK]
mariadb MariaDB Server is a high performing open sou… 4085 [OK]
下载镜像 mysql
docker pull mysql
删除镜像
docker rmi
docker rmi -f 容器id 根据image id删除
docker rmi -f 容器id 容器id 容器id 删除多个容器
docker rmi -f $(docker images -aq) 删除所有容器
容器的基本命令
下载镜像 CentOS
docker pull centos
docker pull tomcat
启动容器 CentsOS
docker run -it centos /bin/bash
docker run --name tomcatstarttest -d -p 8080:8080 tomcat:latest
//--name是给容器起名字 -d 是代表后台运行 -d后面代表的是运行那个镜像,镜像的名字
docker ps 查看启动的容器
退出容器
exit 退出已启动的容器
ctrl+Q+P 退出不停止已启动的容器
查看历史启动过的容器
docker ps -a
删除容器
docker rm 容器ID 删除指定的容器ID(不能删除正在运行的容器,如果需要强制删除,rm -f)
docker rm -f 删除所有的容器
docker ps -a -q|xargs docker rm 删除所有的容器
启动和停止容器的操作
docker start 容器id 启动容器
docker restart 容器id 重启容器
docker stop 容器id 停止当前正在运行的容器
docker kill 容器id 强制退出
其他常用命令
docker logs -f -t -tail 查看容器日志
显示日志
-tf 显示日志
--tail 10 显示日志条数(最新的10条)
docker logs -tf --tail 10 容器id 查看容器最新的10条日志
查看容器中的进程信息
docker top 容器id
查看镜像的源数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it 容器id /bin/bash
进入容器正在执行的终端
docker attach 容器id
从容器里拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
Docker 安装并启动elasticsearch
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type.type=single-node" elasticsearch:7.6.2
这样的启动会对服务造成卡顿,占用很大的内容空间
建议在启动前设置ES的内存限制
例如 (测试)
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
查看内存使用命令
docker stats 容器ID(不带id会查到所有在运行中的容器的内存使用情况)
测试ES 9200
curl localhost:9200
镜像原理-联合文件系统
Docker镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS(联合文件系统)
Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层文件和目录。
镜像加载原理
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是联合文件系统(UnionFS)。
采用分层结构最大的一个好处就是共享资源,比如有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了
Docker镜像联合文件系统分层,Tomcat为例
原文作者理解
镜像原理-分层理解
查看容器的细节
docker image inspect redis:latest
特点:Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是我们常说的容器层,容器层之下的都叫做镜像层
Commit镜像
docker commit和git commit 原理类似
docker commit -m="提交描述信息" -a="作者" 容器id 目标镜像名:[TAG(版本号)]
实际测试
1、启动一个容器
docker run -it -p 8080:8080 tomcat // 只是启动tomcat
docker exec -it 容器id /bin/bash // -it交互模式 交互模式中需要给个路径
cd webapps
2、官方默认webapps下是没有文件的
3、自己拷贝文件到webapps下
cd .. // 回到tomcat目录
ap -r webapps.dist/* webapps // 拷贝webapps.dist里所有文件到 webapps中
4、开始commit到本地镜像里
docker commit -m="add webapps app" -a="feirou" d8eceb6175b6 tomcat02:1.0 // d8eceb6175b6 容器id