Docker是什么
Docker是一种容器技术,通过Docker你可以做到:
- 更快速的交付和部署
- 更高效的虚拟化
- 更轻松的迁移和扩展
- 更简单的管理(类似git)
下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker的3个重要的概念
Docker 包括三个基本概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
镜像是分层存储的
类似Git,一个文件对此修改,之后的修改是对上次修改的补丁,一层层的覆盖。
镜像也一样,它不像ISO那样的打包文件,由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
注意:容器中的数据非持久的,容器的生命周期结束了, 容器中的文件也就没有了,所以容器运行时,不应当往容器本身的存储层(文件系统)中写数据,而是应当用数据卷(Volume)。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失。
仓库
用于集中的存储、分发镜像。
公开服务:Docker官方的镜像存储服务器,一般比较慢,但可以使用国内的加速器。
私有的服务:Docker Registry可以自己搭建, Docker 官方也提供了搭建Docker Registry的官方镜像
下图是Docker 的总结图
Docker的安装
Mac下安装Docker:
https://download.docker.com/mac/stable/Docker.dmg
或者https://download.docker.com/mac/stable/Docker.dmg
或者https://docs.docker.com/docker-for-mac/
和一般的应用安装应用一样,安装完后如下:
设置加速:
https://ftheyftp.mirror.aliyuncs.com
在Centos6.5中。只需要修改 /etc/sysconfig/docker文件,加上下面这句
other_args=--registry-mirror=https://0yrztjfu.mirror.aliyuncs.com并重启docker就好了
Docker的基本操作
对镜像
镜像的搜索:
代码语言:txt复制docker search Name
镜像的获取:
代码语言:txt复制docker pull Name:Tag
镜像的查看:
代码语言:txt复制docker images
镜像的标签:
一个镜像可以定义多个标签
代码语言:txt复制docker tag REPOSITORY:TAG MY_REPOSITORY:TAG;
镜像的删除:
删除可以是REPOSITORY:TAG, 也可以是镜像的ID
按tag删除时,一个镜像还有其他标签是,这个镜像不会完全删除,直到这个是最后的标签。
代码语言:txt复制docker rmi CONTAINERID
docker rmi NAME:TAG
删除全部镜像
代码语言:txt复制docker rmi $(docker images -q)
Docker 的导出:
代码语言:txt复制docker save -o ~/Documents/99temp/onlyoffice_doc_server.tar onlyoffice:0.1
Docker的载入:
代码语言:txt复制docker load < onlyoffice_doc_server.tar
Docker保存镜像:
代码语言:txt复制docker commit -m 'add chinese fonts' -a 'demo' 629c927b43b3 onlyoffice:0.1
对容器
查看容器:
代码语言:txt复制docker ps
docker create # 创建容器,但不运行
docker run 创建容器,并且运行
典型的命名:
代码语言:txt复制docker run -i -t -d -p 8080:80 -h onlyofficeweb --name onlyoffice --restart=always onlyoffice/documentserver
#-it 参数保存标准输入打开,并分配一个伪终端
#--restart=always 异常情况下总是重新启,包括:不可知的错误(内存溢出等)、docker服务启动时
进入容器:
代码语言:txt复制docker attach ContainerID/ContainerNamedocker exec -it ContainerID bash
#-it 是必选的
容器的启动、停止:
代码语言:txt复制docker start CONTAINER
docker stop CONTAINER
删除容器:
代码语言:txt复制docker rm CONTAINER
删除全部容器
代码语言:txt复制docker rm $(docker ps -aq)
-a:列出全部容器包括没有运行的;-q:列出容器的id
重命名
代码语言:txt复制docker rename CONTAINER NEWNAME
输出容器的特定信息
代码语言:txt复制docker inspect -f "{{ .Mounts }}” web1
docker inspect -f '{{ (index .Mounts 0).Source }}' containerid
数据卷
创建并启动一个nginx, 新建数据卷/web
代码语言:txt复制docker run -it -d -P --name web -h web1 -v /web nginx
bind 绑定一个本地目录为容器的数据卷:
代码语言:txt复制docker run -it -d -P --name -h web1 web -v /Users/demo/Documents/workspace/docker/volumes/web1:/web nginx
数据共享: #web2 会共享web1中所用的数据卷
代码语言:txt复制docker run -it -d -P -h demoweb2 --name web2 --volumes-from web1 nginx
端口
-P 随机分配端口映射(49000 ~ 49900)
-p 8000:80 本机的8000端口映射到容器的80端口
代码语言:txt复制docker run -it -d -P --name web -h web1 -v /web nginx
docker run -it -d -p8000:80 --name web -h web1 -v /web nginx
容器互联
代码语言:txt复制docker run -it -d -P -h web1 --name web --link db:db nginx