Docker是可以将任何应用包装在Linux Contain中运行的工具,基于Docker的沙箱环境可以实现轻型隔离,多个容器之间不会相互影响,Docker可以实现自动化打包和部署任何应用,方便的创建一个轻量级私有Pass云,也困意用于搭建开发测试环境以及部署可扩展的Web应用。
docker结构
dockerFile:docker镜像通过该配置文件进行配置
仓库:用来存储docker镜像,已经弄好的镜像文件
镜像:一个可以运行的程序
容器:一个已经跑起来的实例
tar文件:一个镜像可以保存为tar文件

Docker和VM
VM是一个运行在宿主之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU,内存和硬盘资源。
Docker只包含应用程序以及依赖库,基于libContainer运行在宿主机上,并处于一个隔离的环境,使得Docker更加轻量高效,启动容器只需几秒之内完成,由于Docker轻量资源占用少,使得Docker可以轻易的应用到构建标准化的应用中,但是Docker目前还不够完善,比如隔离效果不如VM,共享主机操作系统的基础库,网络配置简单,主要以桥接的方式为主,查看日志也不方便
桥接:SOI模型中数据链路层的数据交换
Docker网络
Docker的网络功能相对简单,没有过多复杂的配置,Docker默认使用birdge桥接方式与容器通信,启动Docker后,宿主机上会产生Docker0这样一个虚拟网络接口, docker0不是一个普通的网络接口, 它是一个虚拟的以太网桥,可以为绑定到docker0上面的网络接口自动转发数据包,这样可以使容器与宿主机之间相互通信。每次Docker创建一个容器,会产生一对虚拟接口,在宿主机上执行ifconfig,会发现多了一个类似veth***这样的网络接口,它会绑定到docker0上,由于所有容器都绑定到docker0上,容器之间也就可以通信。
在宿主机上执行ifconfig,会看到docker0这个网络接口, 启动一个container,再次执行ifconfig, 会有一个类似veth**的interface,每个container的缺省路由是宿主机上docker0的ip,在container中执行netstat -r**可以看到如下图所示内容:

dokcer设置
systemctl enable docker.service //设置开机启动
systemctl disable docker.service //关闭开机启动
systemctl start docker //启动docker
systemctl daemon-reload //重新加载deamon.json配置文件
systemctl restart docker //重新启动
dokcer systemctl status docker //查看docker运行状态
启动docker
service docker start //docker启动
service docker stop //docker停止
service docker restart //docker重启
问题:docker start 启动不了 Failed to start Docker Application Container Engine
一般是 docker的 daemon.json 文件的问题改完后systemctl daemon-reload 在启动
docker命令补全
yum -y install bash-completion
source /usr/share/bash-completion /bash_completion
Docker使用
docker版本查看
docker version
查看当前系统信息
docker info
查看docker宿主机上的镜像 镜像保存在var/lib/docker目录下
docker image
查找镜像
docker search +名称

NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建
从docker hub上下载某个镜像
docker pull 名字:版本
这样就会把镜像下载到本地仓库
docker导入镜像
docker load -i + 镜像的tar包
docker查看镜像
docker images //查找某些
docker images | grep +镜像名
启动一个容器
//启动一个容器
docker run -i -t 名称 /bin/bash
//退出后立即删除该容器
docker run -i -t --rm ubuntu /bin/bash
//--name执行容器名称,否则会随机分配一个名称
docker run -t -i --name test_container 名称 /bin/bash
//端口映射
dokcer run -d -p 本地端口:容器端口 +容器名
docker run -d -P + 容器名 随机端口映射
docker run -i -t +容器 +交互命令
-i: 交互式操作。
-t: 终端
-d :让容器在后台运行
-p:指定端口
-P:将容器内部使用的网络端口随机映射到我们使用的主机上
docker run -d -P +容器 +
#例子
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-v 为挂载目录和被挂载目录
--restart 失败后重启
docker run --name mysql5.7.25 --restart=always -v /data/nfs/privtorrent/mysql:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=blockchain -d mysql:5.7.25
查看容器(可以看端口映射情况)
docker ps //只能看见启动的容器
docker ps -a //查看所有容器(启动和关闭的容器都能看见)
启动或者停止某个Container
docker start/stop + 容器id
docker进入容器(exit退出)
(不建议使用)
docker attach + 容器id
docker -it exec + 容器id +/bin/bash (或 sh 或bash)三选一·
将当前容器作为一个新的容器进行提交
docker commit -m =" " 容器id
停止正在运行的容器
docker stop docker stop $(docker ps -aq) //停止正在运行的所有容器
重新启动容器(不会改变容器id)
docker restart +容器id
删除已经停止的容器
dokcer rm + 容器id(前几位即可)
//删除停止运行的所有容器 -q 显示容器id
docker rm $(docker ps -aq)
//强制删除容器
docker rm -f + 容器id(前几位即可)
删除镜像
docker rmi + 镜像id
//强制删除容器
docker rmi -f + 镜像id
//强制删除镜像
docker rmi -f $(docker images|grep +指定哪些镜像)
查看运行容器的日志
docker logs + 容器名
//实时输出
docker logs -f+ 容器名
导出镜像
docker save + 容器id > 名称.tar
导出容器
docker exoprt + 运行容器id > 名称.tar
导入容器快照
cat docker/容器名.tar | docker import - +容器名:标签
docker import + 目录或者url
查看容器运行端口
docker port + 容器名/容器Id
改变容器名称及标签
docker tag 容器名:tag/容器id 容器名:tag
新建网络
docker network create -d bridge + 名称
docker network ls 查看网络情况
-d:参数指定 Docker 网络类型,有 bridge、overlay
登录自己的仓库
//登录
docker login
//登出
docker logout
构建自己私有仓库
https://www.cnblogs.com/edisonchou/p/docker_registry_repository_setup_introduction.html
#下载Registry镜像并启动
docker pull registry
(这个就相当于启动一个仓库,别人访问需要在daemon文件中配置即可拉取你的镜像
docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name xdp-registry registry
#在客户端查看镜像仓库中的所有镜像
curl http://your-server-ip:5000/v2/_catalog
/etc/docker/daemon.json加上下面这一句,这里的"your-server-ip"请换为你的服务器的外网IP地址:
{
"insecure-registries" : [ "your-server-ip:5000" ]
}
为要上传的镜像打Tag
docker push your-registry-server-ip:5000/your-image-name:tagname
下载镜像就很简单了,使用pull命令即可:
docker pull your-server-ip:5000/your-image-name:tagname
如果想要知道要下载的镜像都有哪些tag(或版本),可以通过下面这个api来获取:
curl http://your-server-ip:5000/v2/your-image-name/tags/list
docker通过DockerFile创建容器
docker build -f + 文件 -t + 打包的镜像名 .(表示当前目录)
docker 启动镜像
docker run -itd-p(端口映射) 主机端口:镜像内部端口 镜像名
docker 查看容器挂载目录
docker inspect +容器id 获取容器/镜像的元数据
docker inspect +容器ID|grep Mounts -A 20
docker复制文件
docker cp 容器Id:/etc/mysql/my.cnf(容器目录) .(当前目录)
docker下的文件夹信息(var/lib/docker)
---containers : 存放容器信息
---images :存放镜像的中间件信息大小以及依赖信息
---volumes :docker的挂载信息
---overlay2
--
--diff 存放docker容器内的文件信息
下面是存放在容器内部的信息

docker挂载问题
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused “process_linux.go:430: container init caused “write /proc/self/attr/keycreate: permission denied””: unknown.
修改文件/etc/selinux/config 将SELINUX属性改为disabled 重启即可
