Docker

Docker是可以将任何应用包装在Linux Contain中运行的工具,基于Docker的沙箱环境可以实现轻型隔离,多个容器之间不会相互影响,Docker可以实现自动化打包和部署任何应用,方便的创建一个轻量级私有Pass云,也困意用于搭建开发测试环境以及部署可扩展的Web应用。

docker结构

dockerFile:docker镜像通过该配置文件进行配置

仓库:用来存储docker镜像,已经弄好的镜像文件

镜像:一个可以运行的程序

容器:一个已经跑起来的实例

tar文件:一个镜像可以保存为tar文件

截图.png

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**可以看到如下图所示内容:

clipboard.png

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 +名称
A78E125B346.jpeg

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容器内的文件信息

下面是存放在容器内部的信息

clipboard.png

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 重启即可

clipboard.png
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容