Docker简介
Docker的思想是来自于集装箱,隔离是docker的核心思想;它可以通过隔离机制,将服务器利用到极致;docker是基于Go语言开发的且也是一种虚拟化技术。
二者的区别
传统虚拟机:它是一整套硬件,运行的是一个完整的操作系统,然后在这个系统上运行和安装软件;故资源占用多、冗余步骤多、启动慢;
docker:容器内的应用都是直接运行在宿主机的内核之上,它是没有自己的内核的,也没有虚拟硬件,所以更加轻便;在docker中每个容器都是隔离的,都有属于自己的文件系统,他们之间互不影响。
Docker安装
官网:https://docs.docker.com/get-docker/
基本组成
images(镜像):它就好像是一个模板,可以通过这个模板来创建容器服务;通过这个镜像可以创建许多新容器;
container(容器):docker利用容器技术独立运行一个或一组应用,通过镜像来创建(启动,停止,删除);
repository(仓库):存放镜像的地方(国外:docker hub 国内:阿里云)
Docker常用命令
帮助启动类命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像
systemctl start docker #启动docker
systemctl stop docker #停止docker
systemctl restart docker #重启docker
systemctl enable docker #开机自启动docker
docker --help #帮助总体文档
镜像命令
docker images #查看本地主机上的镜像
-a #列出所有的镜像
-q #只显示镜像的id
docker search #搜索镜像
--limit 5 mysql #列出在仓库中使用最多的5个MySQL的镜像
docker rmi 镜像id #删除镜像
-f 镜像id #强制删除指定的镜像
-f 镜像id 镜像id #强制删除多个镜像
docker rmi -f $(docker images -aq) #强制删除所有镜像
docker systemctl df #查看镜像/容器/数据卷所占的空间
Docker虚悬镜像是什么?
虚悬镜像一般是指 仓库名和标签都是<none>的镜像,俗称为虚悬镜像;
容器命令
docker run 【可选参数】 images #新建容器并启动
--name=”容器名字“ #自定义容器名字,容易区分
-d #使用后台方式运行
-it #使用交互方式进行运行
-p #映射指定的端口;例如 -p 8080:8080
-P #随机指定映射端口
docker ps #列出所有在运行的容器
-a #列出当前正在运行和历史运行过的容器
-q #只显示容器的编号
-l #显示最近创建的容器
docker rm -f 容器id #删除停止运行的容器
容器id 容器id #删除多个指定的容器
docker rm -f ¥(docker ps -aq) #删除全部容器
docker kill 容器id #杀死容器
docker run -it redis #前台交互式启动
docker run -d redis #后台守护式启动
docker logs 容器id #查看日志
docker logs -f -t --tail 容器编号 #查看日志
-tf #显示日志
-- tail number #显示日志条数
docker top 容器id #查看容器中进程信息
dokcer inspect 容器id #查看镜像的元数据
进入当前正在运行的容器
docker exec -it 容器id bin/bash #以交互方式进入容器内
docker atlach 容器id #进入当前运行的容器
区别:1、进入容器后开启一个新的终端,可以在里面进行操作,用exit退出,并不会停止容器;
2、进入容器正在执行的终端,不会启动新的进程,用exit退出,导致停止容器;
从容器内拷贝东西到主机
docker cp 容器id:容器内路径 目的主机路径
以tar包的方式导入和导出容器
docker export 容器id > 导出名称.tar #export导出容器的内容作为一个tar归档文件
cat nginx.tar | docker import - mynginx/nginx:8.1.0 #import从tar包中的内容创建为一个镜像
Docker镜像
镜像:它是一种轻量级,可执行的独立软件包,它包含运行某个软件所需的全部内容,我们把应用程序
和配置依赖打包好形成一个可交付的运行环境(包括源代码、运行时需要的库,环境配置和配置文件等),这个打包好的运行环境就是images镜像文件;
UnionFS(联合文件系统):它是一个分层,轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下;
commit命令
docker commit -m=“添加信息说明” -a=“作者” 容器id 要创建的目标镜像名:【标签名】
本地镜像发布到阿里云的基本过程
docker容器数据卷
当使用-v挂载卷的时候,在后面加入--privileged=true(放开权限);卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能绕过联合文件系统提供一些用于持续存储和共享数据的特性;
卷设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除挂载的数据卷;
docker -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (在容器内加入限制 在容器内只能读取 不能写入)
卷的继承和共享
容器2继承容器1 的卷规则
docker run -it --privileged=true --volumes-from 准备继承的容器名字或id --name=“容器2的名字” 镜像id
Docker网络
docker network ls #查看docker网络模式命令
docker network --help #查看docker网络模式下的帮助命令
能干嘛
进行容器间的互联和通行以及端口的映射;容器IP变动时可以通过服务名直接进行网络通信而不受到影响;
docker网络模式
bridge为每一个容器分配,设置IP等,并将容器连接到一个docker0虚拟网桥,默认为该模式;
docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络,docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信;
host容器将不会虚拟出自己的网卡,配置自己的IP,而是使用宿主机的IP和端口;
容器将不会获得一个独立的network命名空间,而是和宿主机共用一个network命名空间,容器将不会虚拟出自己的网卡,而是和使用宿主机的IP和端口;
docker启动时总是会遇到的警告
docker启动时指定--network=host或-net=host,还指定了-p映射端口,那这个时候就会有警告,并且通过-p设置的参数不会起到任何作用,端口号会以主机端口号为主,重复时则递增;
例如:docker run -d -p 8081:8080 --name=myjava --network=host java 警告
docker run -d --name=myjava --network=host java 正确
container新建的容器和已经存在的一个容器共享一个网络IP配置而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是用指定的容器共享IP,端口范围等;同样,两个容器除了网络方面,其他的如文件系统,进程列表还是隔离的;
docker run -it --name=alpine1 alpine /bin/sh #启动alpine1
docker run -it --network=container:alpine1 --name=alpine2 alpine /bin/sh 启动alpine2并将其网络配置连接到alpine1
自定义网络
1、自定义桥接网络,自定义桥接网络默认使用的是桥接网络bridge;2、新建一个自定义桥接网络(docker network create 新建网络名)3、新建容器加入上一步新建的自定义网络(docker run -d -p 8081:8080 --network 新建网络名 --name=tomcat81 tomcat; docker run -d -p 8082:8080 --network 新建网络名 --name=tomcat82 tomcat; )4、互相ping服务名进行测试;