docker容器技术
docker三大概念
容器三大基本概念
镜像 image
容器 container
仓库 repository
docker整个生命周期就是这三个概念。
docker镜像
Docker镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。
镜像可以用来创建Docker容器。
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
image的分层存储
因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。
docker容器(container)
image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。 容器可以被创建、启动、停止、删除、暂停 Docker利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。 可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
docker仓库(repository)
仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。
当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。
注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
docker Registry
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服 务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务 供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并 拥有大量的高质量的官方镜像。
除此以外,还有 CoreOS 的 Quay.io,CoreOS 相 关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像 使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。
国内的一些云服务商提供了针 对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见 的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。
使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后 面的章节中会有进一步如何配置加速器的讲解。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓 库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。
docker安装
ce 社区版
ee 企业版
docker版本
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。
企业版包含了一些收费服务,个人开发者一般用不到。本文的介绍都针对社区版。
环境准备
docker最低支持centos7且在64位平台上,内核版本在3.10以上 [root@oldboy_python ~ 10:48:11]#uname -r 3.10.0-693.el7.x86_64
安装方式
1.卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 2.设置存储库 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 3.安装docker社区版 sudo yum install docker-ce 4.启动关闭docker systemctl start docker
下载docker镜像文件
1、配置docker加速器 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 这个命令是修改/etc/docker/daemon.json文件,写入一个json数据如下 [root@s20 ~]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}这里不能有逗号,否则docker起动不了 配置好了docker加速器,下载镜像就快很多了 改完需要重启docker,不然下载不了镜像文件systemctl restart docker 【有逗号下载时的报错信息】 Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. 2、下载centos的docker镜像 docker pull centos #是取dockerhub 下载cnetos镜像的
aliyun镜像加速
管理容器
容器管理的重要点!!!
docker 容器中必须有进程在后台运行,否则容器挂掉!!! docker 镜像每次运行 都会生成新的容器id记录 docker run centos 运行三次,出现三次容器新的记录
【启动容器】docker start 容器名/id
【停止容器】docker stop 容器名/id
【平滑启动】docker restart 容器名/id
【运行容器】:
交互式容器:docker run -it --name=c1 centos:7 /bin/bash 使用centos7镜像启动一个容器并进入容器内 容器名为c1
守护式容器:docker run -id --name=c2 centos:7 后台启动一个容器 不进入容器 【这种方式创建容器,退出容器后,容器不会关闭】
docker exec -it c2 /bin/bash 进入容器内 c2容器名
【进入容器空间内】: docker exec -it 运行着的容器id /bin/bash
【删除挂掉的容器】: docker rm 容器id #删除容器id记录 docker rm `docker ps -aq` #批量删除挂掉的容器 运行中的容器不能删除
【查看容器日志】: docker logs 容器id docker logs -f 容器id # 监测容器内的日志
【杀死容器进程】: docker kill 容器进程id
【查看容器进程】: docker ps #查看正在运行的容器进程 docker ps -a #显示所有运行过的容器进程(正在运行的,以及挂掉的容器进程) docker container ls -a #同上,旧的命令
【提交容器】:
# 自定义软件后,退出容器,提交这个容器,成为一个新的镜像
docker commit 容器id 新的镜像的名字
docker commit 5c2 s20/centos-vim
【查看容器信息】
dcoker inspect 容器名称
【在容器的后台运行一个进程,运行出活着的容器】: docker run -d centos /bin/sh -c "while true;do echo 'hello'; sleep 1;done" -d 就是daemonize 后台运行的意思 centos 指定哪个镜像 /bin/sh 指定linux的解释器 -c 指定一段shell代码 "while true;do echo 'hello'; sleep 1;done" #每秒打印一个
我们在输入容器id的时候只需要输入前三位即可
镜像管理
【搜索镜像】: docker search centos #去docker hub 搜索有关centos的镜像文件 【下载镜像】: docker pull centos # 下载docker镜像 centos docker pull hello-world # 获取一个hello-world镜像 docker pull ubuntu # 获取一个ubuntu镜像
docker pull redis:5.0 # 下载指定版本号的镜像文件
【查看本地镜像】: docker images #查看本地有哪些docker镜像 docker image ls #命令同上
docker images -q # 查看所有镜像id 【删除本地镜像】: docker rmi 镜像id/镜像名 #删除本地docker镜像 docker rmi -f 镜像id #强制删除镜像文件
docker rmi `docker images -q` # 删除所有镜像
【导出镜像】: # 导出这个镜像文件,指定导出的文件名和后缀 docker save 镜像名/id > /opt/centos-vim.tar.gz 【导入镜像】: docker load < /opt/centos-vim.tar.gz 【修改镜像名字】: docker tag 镜像id/镜像名 以dockerhub仓库id开头的/新的镜像名 docker tag 镜像id/镜像名 新镜像名字 # 给ef9这个容器起的镜像名字是henry/centos-vim docker tag ef9 henry/centos-vim
我们在输入镜像id的时候只需要输入前三位即可
自定义docker镜像
1.获取一个centos基础镜像,运行处容器后 docker run -it centos /bin/bash 2.进入容器空间内,默认没有python3 和其他软件 进入之后,安装一个vim yum install vim -y 3.自定义软件后,退出容器,提交这个容器,成为一个新的镜像 exit退出容器 docker 4.此时这个镜像文件,可以发送给其他同事了 docker commit 容器id 新的镜像的名字 docker commit 5c2 s20/centos-vim 此时的镜像文件是在docker容器内的,s20只是名字而已 5.查看提交的镜像文件 docker images 6.导出这个镜像文件,指定导出的文件名和后缀 docker save 镜像名/id > /opt/s20-centos-vim.tar.gz 7.在本地测试导入这个镜像 # 导入命令 docker load < /opt/s20-centos-vim.tar.gz 8.给导入的镜像,修改tag别名 docker tag 镜像id/镜像名 以dockerhub仓库id开头的/新的镜像名 docker tag 镜像id/镜像名 henry163/centos-vim docker tag 镜像id/镜像名 新镜像名字 9.执行这个docker镜像,运行容器后,查看是否携带了vim #语法 关键字 关键字 参数 镜像名 你要执行的命令 docker run -it henry163/centos-vim /bin/bash
数据卷
概念:
配置数据卷
配置数据卷 docker run -it --name=c1 -v /root/data:/opt/datda_contailner centos:7 /bin/bash 宿主机/root/data目录挂载到容器/opt/data_contailner 【宿主机和容器通信 文件共享】 一个容器同时挂载多个数据卷 docker run -it --name=a1 -v /root/data1:/opt/data1 -v /root/data2:/opt/data2 centos:7 /bin/bash 两个容器同时挂载同一个目录 实现两个容器的通信 docker run -it --name=c1 -v /root/data:/opt/data docker run -it --name=c2 -v /root/data:/opt/data 【两个数据卷中的文件共享】
数据卷容器:
c3也是个容器 c3挂载数据卷 c1,c2挂载c3 --->实现c1,c2,c3都挂载到同一个数据卷
配置数据卷容器
配置数据卷容器 1、docker run -it --name=c1 -v /volume centos:7 /bin/bash 使用-v参数 设置数据卷 /volume(容器目录) 如果不设置冒号左边的目录 docker会自动分配一个目录 2、doeker run -it --name=c2 --volumes-from c1 centos:7 /bin/bash 将c2挂载到c1容器 3、doeker run -it --name=c3 --volumes-from c1 centos:7 /bin/bash 将c3挂载到c1容器
将打包好的镜像上传dockerhub
1、查看当前镜像
docker images
红线框的是我们打包好的镜像
2、登陆dockerhub账户
docker login
登陆成功
3、更改镜像名称
想要将镜像上传到dockerhub 镜像的名称必须遵守命名规则(账户名/镜像名:版本号)
4、上传到dockerhub