介绍
docker是容器技术,在容器技术没有出现之前,我们都是使用虚拟机技术
虚拟机:虚拟化技术,在Windows中安装一个VM,通过这个软件可以虚拟出一台或者多台电脑,笨重
docker:也是一种虚拟化技术
vm:Linux centos原生镜像(一个电脑),隔离,需要开启多个虚拟机,几个G大小,启动需要几分钟
docker:隔离,镜像(最核心的环境4M大小)小巧,运行镜像就可以了,几M、KB 秒级启动
1、先删除之前安装的docker版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、需要的安装包(基本环境)
yum install -y yum-utils
3、设置阿里镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、更新yum软件包索引
yum makecache fast
5、安装最新docker
yum install docker-ce docker-ce-cli containerd.io
6、启动docker
systemctl start docker
#查询版本
docker version
7、运行helloworld查看
docker run hello-world
8、查看一下下载的helloworld镜像
9、设置国内镜像源,
创建 /etc/docker/daemon.json文件
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
systemctl restart docker.service
国内加速地址有:
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn
底层原理
docker是怎么工作的
Docker是一个Client - Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker为什么比VM快?
1、Docker有着比虚拟机更少的抽象层.
2、docker利用的是宿主机的内核,vm需要是Guest Os.
所以说,新建一个容器的时候,docker不需要想虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest O5,分钟级别的,而docker是利用宿主机的操作系统吗,省略了这个复杂的过程,秒级!
常用命令
镜像命令
docker images 查看所有本地的主机上的镜像
# docker images
解释标签:
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a,--all 列出所有镜像
-q, --quiet 只显示镜像的ID
docker search 搜索镜像
可选项
-f, --filter filter
docker search mysql -f=stars=3000 #根据收藏数来搜索
docker pull 下载镜像
docker rmi 删除镜像
docker rmi -f 容器ID #删除指定ID的镜像
docker rmi -f 容器ID 容器ID 容器ID #删除多个容器ID
docker rmi -f $(docker images -aq) #删除所有的镜像
容器命令
说明:有了镜像才可以创建容器,下载一个centos镜像测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" 容器名字 Tomcat1 Tomcat2,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定容器端口
# 测试,启动并进入容器
[root@localhost /]#docker run -it centos /bin/bash
[root@e4edddd54575 /]# ls #查看容器内的centos,基础版本,很多命令不完善
#从容器中退出
[root@e4edddd54575 /]# exit
列出所有运行的容器
#docker ps 命令
空 #列出当前正在运行的容器
-a #列出当前正在运行容器+历史运行过的容器
-n=? #显示最近创建的容器,例如 -n=1,最新创建的容器
-q #只显示容器的编号
退出容器
exit #直接停止容器并退出
Ctrl+P+Q #容器不停止退出
删除容器
docker rm 容器id #删除指定的容器
docker rm -f $(docker ps -aq) #删除所有的容器
启动和停止容器
docker start 容器ID #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
其他常用命令
后台启动容器
# docker run -d 镜像名
[root@localhost /]# docker run -d centos
#问题docker ps,发现centos停止了
#常见的坑,docker日容器使用后运行,就必须要一个前台进程,docker发现没有应用,就会自动停止
显示日志
docker logs -tf --tail 容器id
-tf #显示日志
--tail num #要显示日志条数
[root@localhost /]# docker logs -tf --tail 10 dedfd8878
查看容器中进程信息
#命令 docker top 容器id
[root@localhost /]# docker top dce898989
查看镜像元数据
#命令
docker inspect 容器id
[root@localhost /]# docker inspect dce343434
进入当前正在运行的容器
#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
#命令1
docker exec -it 容器id bashShell
#测试
[root@localhost /]# docker exec -it dce787878 /bin/bash
#命令2
docker attach 容器id
#测试
[root@localhost /]# docker attach dce343434
docker exec #进入容器后开启一个新的终端,可以在里面操作
docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
[root@localhost /]# docker cp b4343343:/home/test.java /home
练习
docker 安装Nginx
1、搜索镜像 search 建议大家去dockerhub搜索,可以看到帮助文档
2、下载镜像 pull
3、运行测试
#查看本地镜像
[root@localhost wyh]#docker images
#运行Nginx
[root@localhost wyh]# docker run -d --name nginx01 -p 3344:80 nginx
[root@localhost wyh]# docker ps
#测试
[root@localhost wyh]# curl localhost:3344
#进入容器
[root@localhost wyh]# docker exec -it nginx01 /bin/bash
#查看配置文件
root@343434323:/#whereis nginx
问题:每次改动Nginx配置文件,都需要进入容器内部,我们可以在容器外部提供一个映射路径,达到容器修改文件名,容器内部就可以自动修改,-v 数据卷!
安装Tomcat
docker pull tomcat
docker run -d -p 3355:8080 --name tomcat01 tomcat
#测试访问没有问题
#进入容器
docker exec -it tomcat01 /bin/bash
#发现问题,1、Linux命令少了,2、没有webapps,阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除,保证最小可运行的环境
部署es+kibana
#es 暴露的端口很多
#es 十分的耗内存
#es 的数据一般需要放置到安全目录,挂载
#启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#查看CPU状态
docker stats
#增加内存限制,修改配置文件 -e 环境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
将镜像发布到dockerhub上
1、登录docker
2、发布
镜像原理和联合文件系统
镜像是什么
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基本运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
docker镜像加载原理
UnionFS(联合文件系统)
Union文件系统(UnionFs)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,同时可以将不同目录挂在到同一个虚拟文件系统下,UnionFS文件系统是docker镜像的基础,镜像可以通过分层进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终文件系统会包含所有底层的文件和目录
docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,BootLoader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。.这一层与我们典型的Linux/Unix系统是一 样的 ,包含boot加载器和内核。当boo加载完成
之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs.
rootfs (root file system) . 在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是
各种不同的操作系统发行版,比如Ubuntu , Centos等等。
特点:
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是我们说的容器层,容器之下的叫镜像层。
commit镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
测试
启动Tomcat
默认的Tomcat webapps下没有文件。拷贝基本文件进去