Docker--个人笔记
Docker
什么是Docker? 一处构建,处处运行
概述: 是一套完整的一套容器管理系统
提供了一组命令,让用户更加方便的直接使用容器技术,而不需要过多关心底层内核技术.
一款产品从开发到上线,操作系统,到运行环境,再到应用配置,作为运维跟开发之间的协作我们需要关心很多东西,这也是很多互网联公司都不的面对的问题,特别是各个版本的迭代之后,不同版本环境的兼容,对运维人员都是考验.
Docker之所以发展这么迅速,也是因为它对此提供了一个标准化的解决方案.
环境配置如此麻烦,换一台机器,就要重来一次,费时耗力,很多人想到,能不能从根本上解决问题,软件可以带环境安装,也就是说,安装的时候,把原始环境一模一样复制过来,开发人员利用docker可以消除协作编码时,”在我的机器上可以正常工作”的问题.
镜像
镜像即对当前正常运行环境封装打包,除了代码以外,还有运行文档,运行环境,配置环境,运行依赖包,操作系统发行版,内核等,保证迁移能够正常运行.
Docker镜像的设计,使得docker打破过去程序即应用的观念,通过镜像(images)将作业系统核心除外,运作应用程序所需要的系统环境,由下而上打包,达到应用程序跨平台间无缝接轨运作.
什么是容器?
容器技术的核心有以下几个内核技术组成:
-Cgroups(资源管理)
限制进程使用多少资源
-NameSpace–进程隔离
六大空间:
用户
命名空间(主机名)
文件系统(filesystem)
进程
信号向量
网络()
-Selinux安全
设置相关的权限,对文件,目录等.
直接使用真机操作系统,所有资源都是直接使用真机的,不用装系统,容器没有独立操作系统
优点:快速,高效
相比于传统的虚拟化技术,容器更加简洁高效
传统虚拟机需要给每个VM安装操作系统
容器使用的共享公共库和程序
缺点: 不能跨平台
容器的隔离性没有虚拟化强
公用linux内核,安全性先天缺陷
Selinux难以驾驭
监控容器和容器排错是挑战
由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速.
Docker三大核心
镜像
容器基于镜像启动
镜像只读
镜像是启动容器的核心
镜像采用分层设计
使用快照的COW技术,确保底层数据不丢失.也可以理解为后端盘,后端盘只读,前端盘读写.
基于后端盘可以创建无数个前端盘
镜像下载: https://hub.docker.com
-docker search 镜像名称 //查找镜像 -docker pull 镜像名称 //下载镜像
查看命令:
]#docker images //查看镜像 ]#docker ps //查看容器信息(正在运行的容器)
镜像的备份与恢复
]#docker images //查看镜像 REPOSITORY + TAG IMAGE ID 名称 标签 唯一值
]#docker save 目标(名称:标签) -o tar包名称(一般名称.tar) ]#docker load -i tar包名称 //tar包恢复
启动镜像
]#docker run -it docker.io/centos:latest /bin/bash I交互式t 镜像 名称+标签 启动命令不写使用默认启动命令 -run = create + start 当标签仅为 latest 时,可以省略
镜像常用命令
]#docker search nginx //搜索镜像 ]#docker pull docker.io/pebbletech/nginx-proxy //下载镜像 ]#docker images //查看镜像列表 ]#docker history 镜像名 //查看镜像制作历史 ]#docker inspect 镜像名 //查看镜像底层信息,查看镜像详细信息 ]#docker pull 镜像名 //下载镜像 ]#docker push 镜像名 //上传镜像 ]#docker save 目标(名称:标签) -o tar包名称(一般名称.tar) //镜像备份 ]#docker load -i 镜像备份名.tar //使用tar包导入镜像 ]#docker run -it docker.io/centos:latest /bin/bash //启动镜像 ]#docker ps //查看容器信息 ]#docker rmi docker.io/busybox:latest //删除本地镜像,如果启动了容器,先删除容器 ]#docker rmi $(docker images -f “dangling=true” -q) //删除空悬镜像,名称和标签为none ]#docker tag docker.io/ubuntu:latest ubuntu:xx //复制一份链接并且重命名镜像名与标签 ]#docker rmi ubuntu:xx / docker.io/ubuntu:latest //删除镜像,并不会删除复制的镜像
]#docker info //查看dock所有信息
]#doker search -s 30 tomcat [–no trunc] //查找使用超过30的镜像,或显示完整的ID
]#docker logs -t(显示时间) -f(持续不间断,实时显示) 容器ID //持续不间断的查看容器日志
]#docker cp 容器ID:路径 宿主机路径 //拷贝容器数据到宿主机
容器常用命令
]#docker run -it docker.io/centos:latest /bin/bash //当标签唯一,可以不写,默认启动命令 ]#docker run -itd docker.io/centos:latest /bin/bash //使用镜像启动容器,放入后台运行 ]#docker ps //查看正在运行容器列表 ]#docker ps -a //查看所有容器列表 ]#docker ps -aq //仅显示容器id ]#docker start/stop/restart 5804a9953983 //开启/关闭/重启容器 ]#docker attach 5804a9953983 //进入容器,exit退出会关闭容器 ]#docker exec -it 5804a9953983 启动命令 //进入容器,exit不会关闭容器,id可以缩写,当唯一时. ]#docker inspect 5543 //查看容器底层信息(详细信息) ]#docker top 554 //查看容器进程列表信息 ]#docker rm 554 //删除指定容器,容器正在运行不能被删除. ]#docker rm $(docker stop be) //先停止运行的容器,再删除容器 ]# docker rm $(docker ps -aq) //删除所有的容器,将后面命令的结果交给前面执行 ]#docker rm $(docker stop $(docker ps -aq)) //先列出,在停止,再删除 快捷键 ctrl + p + q //退出容器,返回真机,并不会停止运行中的容器
]# docker stop $(docker ps -q)
自定义镜像(将容器打包为镜像)
使用镜像启动容器,在该容器基础上修改,将修改后的容器另存为一个新镜像. 使用命令打包镜像 ]#docker run -it docker.io/centos:latest //利用镜像运行容器实例 ]#docker commit 3586bf56457b docker.io/myos:latest //将id号为…的容器封装为镜像
利用脚本打包镜像(Dockerfile)
使用镜像发布ssh服务:
]#mkdir /root/abc/ ]#cd /root/abc/
]#vim Dockerfile FROM docker.io/myos:latest ADD local.repo /etc/yum.repos.d/local.repo //ADD加载文件内容到容器文件 必须与Dockerfile在同一个目录下 RUN yum -y install openssh-server-7.4p1-16.el7.x86_64 initscripts RUN指定后面的命令在容器内运行 RUN sshd-keygen RUN echo “123456” | passwd --stdin root EXPOSE 22 //指定端口 CMD ["/usr/sbin/sshd","-D"] //指定镜像启动命令,用 , 表示空格 WORKDIR /var/www/html/ //当使用WORKDIR设置了工作目录,则下面所有的操作都在该目录下执行
比如: RUN touch f1
RUN cd /tmp/
RUN touch f2 //当RUN后面使用cd,则文件f1,f2都在/root/下,cd无效
执行脚本,打包镜像 -t tag的意思
]#docker build -t centos:latest /root/abc/
固定模式 打标签 名称 标签 Dockerfile所在目录
自定义私有镜像仓库
-yum -y install docker-distribution
服务名: docker-distribution 端口: 5000
仓库配置文件及数据存储路径
-/etc/docker-distribution/registry/config.yml //仓库配置文件
-/var/lib/registry //数据存储路径
Docker主机指定仓库地址
-vim /etc/sysconfig/docker -ADD_REGISTRY=’–add-registry 192.168.1.30:5000’ //指定仓库地址 -INSECURE_REGISTRY=’–insecure-registry 192.168.1.30:5000’ //加密
验证:
在docker1上传镜像到镜像仓库,Docker2主机利用仓库镜像直接启动容器.
[docker1 ~]# docker push 192.168.1.30:5000/myos:httpd //上传镜像到仓库 ]# curl http://192.168.1.30:5000/v2/_catalog //查看仓库镜像列表 ]# curl http://192.168.1.30:5000/v2/myos/tags/list //查看指定镜像有哪些标签 [docker2 ~]#docker run -itd 192.168.1.30:5000/myos:httpd //从仓库中的镜像启动容器
持久化存储
-docker容器不保存任何数据
重要的数据请使用外部卷存储
容器可以挂载真实机目录或共享存储为卷
将真实机目录挂载到容器中提供持久化存储
–目录不存在就自动创建
–目录存在就直接覆盖掉
共享存储
1.使用NFS共享存储技术共享文件目录给docker机,目录权限为rw
2.客户端挂载共享,并将共享目录映射到容器中.
]#docker run -v /data:/data -it docker.io/centos bash //使用 -v选项映射磁盘到容器中
真实机目录,容器目录
网络
]#docker network create --subnet=10.10.10.0/24 docker1 //创建docker1交换机 ]#docker run -it myos:latest //启动与docker0 连接的容器 ]#docker run -it --network=docker1 myos:latest //启动与docker1 连接的容器
日志查看
docker container logs ${container name}
额外知识
]#/usr/lib/systemd/system/.service //查看服务启动命令 -yum search ssh //列出哪些包提供ssh服务 -rpm -ql 软件名 //列出该软件都安装了哪些目录 -yum provides 文件 //查看该文件由哪个包产生 -/usr/lib/systemd/system/.service //查看启动命令 Created symlink from /etc/systemd/system/multi-user.target.wants/docker-distribution.service to /usr/lib/systemd/system/docker-distribution.service.