Docker介绍
1.什么是Docker
Docker是一个开源的应用容器引擎,它是一个是基于Go语言开发的开源项目。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的Linux机器上,也可以实现虚拟化。Docker容器完全使用沙箱机制,相互之间不会有任何接口,这保证了容器之间的安全性。
文档地址https://docs.docker.com/get-docker/ Docker镜像仓库地址
https://hub.docker.com/
2.Docker为什么出现
在我的电脑上能够运行,在别人电脑无法运行;版本更新导致服务不可用。并且环境配置十分麻烦,每一个机器都要部署环境,费时费力。
Docker给以上问题提出了解决方案。Docker的思想来自于集装箱。隔离:Docker核心思想-打包装箱,每个箱子是相互隔离的。
3.Docker与虚拟机的区别
传统虚拟机,虚拟出一套硬件。运行一个完整的操作系统,然后在这个系统上安装和运行程序,这是资源密集型的。由于产生的磁盘镜像和应用程序的操作系统设置相互交叉,所以导致虚拟机对系统的依赖性很强,一旦系统出现问题,虚拟机依赖的文件以及安全补丁等都可能会出现文件丢失的情况。
而Docker容器内的应用直接运行在宿主机的内核中,容器是没有自己的内核的,多个容器可以共享单个内核,并且创建Docker容器的镜像所需要的配置并不依赖于宿主机系统。每个容器间是相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。
4.Docker特点
1.应用更快速的交付和部署
打包镜像发布测试,一键运行
2.更便捷的升级和扩缩容
使用Docker之后,我们部署应用就和搭积木一样,项目打包为一个镜像,水平扩展服务器A -> 服务器B
3.更简单的系统运
在容器化之后,我们的开发,测试环境都是高度一致的
4.更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例。服务器的性能可以被压榨到极致。
5. Docker镜像加速原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统称为UnionFS
UnionFS联合文件系统
Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker命令
1.帮助命令
# 显示docker的版本信息
[root@iZbp19644h35s5z1dntm5eZ ~]# docker version
# 显示docker的系统信息,包括镜像和容器的数量
[root@iZbp19644h35s5z1dntm5eZ ~]# docker info
# 查看所有帮助命令
[root@iZbp19644h35s5z1dntm5eZ ~]# docker --help# 查看帮助命令 docker COMMAND --help
[root@iZbp19644h35s5z1dntm5eZ ~]# docker start --help
2.镜像命令
docker images:查看索引本地的主机上的镜像
docker search:搜索镜像
--filter:过滤器
docker search --filter=SRARS=1000 centos:查询收藏数大于1000的centos的镜像
docker pull:拉取镜像
docker pull 镜像名 不加tag(版本号),即拉取docker仓库中该镜像的最新版本latest
docker pull 镜像名:tag 加tag则是拉取指定版本。
docker下载镜像使用分层下载, docker image的核心,联合文件系统。
docker rmi:删除镜像
# 删除指定的镜像
docker rmi -f 镜像id
# 删除多个镜像
docker rmi -f 镜像id 镜像id 镜像id
# 删除全部镜像
docker rmi -f $(docker images -aq)
3.容器命令
docker run 新建容器并启动
docker ps时,发现容器停止了,因为docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
mysql、Nginx等会与客户端代连接,所以会有一个前台进程,不会自动退出
docker run [可选参数] image
docker run -d -p 8855:80 --name nginx001 nginx:后台启动nginx,向外映射端口为8855,重命名为nginx001
--name="name" 容器名称:用来区分容器
-d 后台方式运行:相当于nohup
-it 使用交互式运行:进入容器查看内容
-p 指定容器的端口(四种方式)小写字母p
-p:ip:主机端口:容器端口
-p:主机端口:容器端口(常用)
-p:容器端口
容器端口
-P 随机指定端口(大写字母P)
docker ps 列出所有运行的容器
docker ps
-a 列出当前正在运行的容器+历史运行过的容器
-n=? 显示最近创建的容器(可以指定显示几条 -n=1)
-q 只显示容器的编号
退出容器
exit 容器直接停止,并退出
Ctrl +P + Q 容器不停止,退出
查看镜像的元数据
docker inspect 容器id
进入当前正在运行的容器
通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
#方式一:docker exec -it 容器id /bin/bash
#方式二:docker attach 容器id
两种方式的区别
docker exec #进入容器后开启一个新的终端,可以在里面操作
docker attach #进入容器正在执行的终端,不会启动新的进程
其他命令
docker strart 容器id:启动容器
docker restart 容器id:重启停止的容器
docker ps:列出当前正在运行的容器
docker ps -a:查看索引容器,包括未运行
docker stop 容器id或name:停止容器
docker kill 容器id:强制停止当前容器
docker exec -it 容器id/name /bin/bash:进入容器
exit:退出容器
docker rm 容器id或name:删除已停止的容器
docker rm -f 容器id:删除正在运行的容器
docker exec -it 容器ID sh:进入容器
docker container logs 容器id:查看容器日志
docker top 容器id:查看容器里的进程
4. 文件数据卷
docker是将应用和环境打包成一个镜像。如果数据都在容器中,那么我们将容器删除,数据就会丢失,因此需要数据可以持久化。
容器之间有一个数据共享的技术,Docker容器中产生的数据,同步到本地。这就是卷技术,即目录额挂载,将我们容器内的目录,挂载到Linux主机上面。
1. 使用命令来挂载:-v
安装mysql
docker run -d -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 \
-v /home/mysql/logs:/logs \
-v /home/mysql/conf:/etc/mysql/conf.d \
-v /home/mysql/data:/var/lib/mysql \
mysql:8.0