本文最先发表于本人博客: Docker 快速入门指引html
Docker是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎,基于Go语言并听从Apache2.0协议开源。mysql
开发者能够搭建他们的应用仅仅一次,就能保证让这个应用保持一致的跑在任何地方。运营人员能够将他们的服务器配置一遍,就能跑任何应用。git
Docker uses a client-server architecture. The Docker client talks to the Docker daemon, which does the heavy lifting of building, running, and distributing your Docker containers. Both the Docker client and the daemon can run on the same system, or you can connect a Docker client to a remote Docker daemon. The Docker client and daemon communicate via sockets or through a RESTful API.
传统虚拟机经过硬件虚拟化来创造一整个虚拟系统。每个虚拟机内的应用不只仅包含这个应用的一些类库代码,并且还包含一整个操做系统。web
Docker全部的容器分享一个操做系统,他们显然会比虚拟机更小一些,使得他们能够存在100多个虚拟的系统在一个主机上(而不像一个严格限制数量的虚拟机)。sql
安全隔离的执行环境,每一个运行的容器互不影响docker
Docker Client
是用户界面,它支持用户与Docker Daemon
之间通讯Docker Daemon
Docker最核心的后台进程,运行于主机上,处理服务请求Docker Index
是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份Docker Containers
负责应用程序的运行,包括操做系统、用户添加的文件以及元数据Docker Images
是一个只读模板,用来运行Docker容器DockerFile
是文件指令集,用来讲明如何自动建立Docker镜像#Ubuntu curl -sSL https://get.daocloud.io/docker | sh #CentOS curl -sSL https://get.daocloud.io/docker | sh sudo chkconfig docker on sudo systemctl start docker
仓库(Repository)是集中存放镜像文件的场所,仓库注册服务器(Registry)上每每存放着多个仓库,每一个仓库中又包含了多个镜像,每一个镜像有不一样的标签(tag),和仓库(Repository)严格来说不是同一个概念。
仓库分为公开仓库(Public)和私有仓库(Private),官方的 Docker Hub提供大量镜像提供下载,可是访问很是的慢,可使用国内的公开仓库 时速云 、网易云 、阿里云 、DaoCloud加速器等
用户也能够在本地网络内建立一个私有仓库,建立了本身的镜像以后就可使用 push
命令将它上传到公有或者私有仓库,其余机器上使用只须要从仓库上 pull
下来就能够了。shell
镜像就是一堆文件的集合,并非像VM那样的是一个操做系统。镜像能够简单到只有一个程序文件。若是你写一个helloworld 静态编译后放到一个空的Image中,那么整个image的大小,就是你编译后的二进制文件的大小。一个ubuntu:14.04的镜像,提供了一个基本的ubuntu:14.04的发行版,镜像是不包含操做系统Linux内核。
若是在Debian镜像中安装MySQL 5.6,就成了mysql:5.6镜像。底层一个Debian操做系统镜像,上面叠加一个 MySQL层,就完成了一个MySQL镜像的构建。
Dockerfile构建出Docker镜像,经过Docker镜像运行Docker容器。Docker镜像是Docker容器运行的基础,没有Docker镜像,就不可能有Docker容器,这也是Docker的设计原则之一。ubuntu
docker images
显示本地已有镜像docker info
显示docker系统信息docker commit -m -a
提交更新后的镜像docker build
经过Dockerfile来构建镜像docker import
本地导入镜像docker search
查找仓库中镜像docker push
将镜像推送到仓库docker pull
将仓库中镜像下载到本地docker save -o mysql_5.6.tar mysql:5.6
导出镜像到本地docker load < mysql_5.6.tar
载入镜像docker rmi
移除镜像docker attach
运行中容器的stdin,进行命令执行的动做docker history
显示镜像的历史Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式, 能够经过docker build命令从Dockerfile中构建镜像。安全
FROM
FROM <image>[:<tag>] 设置要制做的镜像基于哪一个镜像,FROM指令必须是整个Dockerfile的第一个指令,若是指定的镜像不存在默认会自动从Docker Hub上下载。
MAINTAINER
MAINTAINER <name> MAINTAINER指令容许你给将要制做的镜像设置做者信息
RUN
RUN <command> #将会调用/bin/sh -c <command> RUN ["executable", "param1", "param2"] #将会调用exec执行,以免有些时候shell方式执行时的传递参数问题,并且有些基础镜像可能不包含/bin/sh RUN指令会在一个新的容器中执行任何命令,而后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操做,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和能够基于镜像的任何一个历史点建立容器的好处,就像版本控制工具同样。
CMD
CMD ["executable", "param1", "param2"] #将会调用exec执行,首选方式 CMD ["param1", "param2"] #当使用ENTRYPOINT指令时,为该指令传递默认参数 CMD <command> [ <param1>|<param2> ] #将会调用/bin/sh -c执行 CMD指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,若是使用了多个CMD指令,则只有最后一个CMD指令有效。 当出现ENTRYPOINT指令时,CMD中定义的内容会做为ENTRYPOINT指令的默认参数,也就是说可使用CMD指令给ENTRYPOINT传递参数。 RUN和CMD都是执行命令,他们的差别在于RUN中定义的命令会在执行docker build命令建立镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用exec执行时,命令必须为绝对路径。
EXPOSE
EXPOSE <port> [ ...] EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在链接不一样的容器(使用–link参数)时使用这些信息。
ENV
ENV <key> <value> ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,若是须要在运行时更改这些环境变量能够在运行docker run时添加–env <key>=<value>参数来修改。 最好不要定义那些可能和系统预约义的环境变量冲突的名字,不然可能会产生意想不到的结果。
ADD
ADD <src> <dest> ADD指令用于从指定路径拷贝一个文件或目录到容器的指定路径中,<src>是一个文件或目录的路径,也能够是一个url,路径是相对于该Dockerfile文件所在位置的相对路径,<dest>是目标容器的一个绝对路径 例如/home/yooke/Docker/Dockerfile这个文件中定义的,那么ADD /data.txt /db/指令将会尝试拷贝文件从/home/yooke/Docker/data.txt到将要生成的容器的/db/data.txt,且文件或目录的属组和属主分别为uid和gid为0的用户和组,若是是经过url方式获取的文件,则权限是600。 注意: ①若是执行docker build – < somefile即经过标准输入来建立时,ADD指令只支持url方式,另外若是url须要认证,则能够经过RUN wget …或RUN curl …来完成,ADD指令不支持认证。 ②<src>路径必须与Dockerfile在同级目录或子目录中,例如不能使用ADD ../somepath,由于在执行docker build时首先作的就是把Dockerfile所在目录包含子目录发送给docker的守护进程。 ③若是<src>是一个url且<dest>不是以”/“结尾,则会下载文件并重命名为<dest>。 ④若是<src>是一个url且<dest>以“/”结尾,则会下载文件到<dest>/<filename>,url必须是一个正常的路径形式,“http://example.com”像这样的url是不能正常工做的。 ⑤若是<src>是一个本地的压缩包且<dest>是以“/”结尾的目录,则会调用“tar -x”命令解压缩,若是<dest>有同名文件则覆盖,但<src>是一个url时不会执行解压缩。
COPY
COPY <src> <dest> 用法与ADD相同,<src>不支持使用url
ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"] #将会调用exec执行,首选方式 ENTRYPOINT command param1 param2 #将会调用/bin/sh -c执行 ENTRYPOINT指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,若是使用了多个则只有最后一个指令有效。 ENTRYPOINT指令中指定的命令(exec执行的方式)能够经过docker run来传递参数,例如docker run <images> -l启动的容器将会把-l参数传递给ENTRYPOINT指令定义的命令并会覆盖CMD指令中定义的默认参数(若是有的话),但不会覆盖该指令定义的参数,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],当经过docker run <image>启动容器时该容器会运行ls -a /etc命令,当使用docker run <image> -l启动时该容器会运行ls -a -l命令,-l参数会覆盖CMD指令中定义的/etc参数。 当使用ENTRYPOINT指令时生成的镜像运行时只会执行该指令指定的命令。 当出现ENTRYPOINT指令时CMD指令只可能(当ENTRYPOINT指令使用exec方式执行时)被当作ENTRYPOINT指令的参数使用,其余状况则会被忽略。
VOLUME
VOLUME ["samepath"] VOLUME指令用来设置一个挂载点,能够用来让其余容器挂载以实现数据共享或对容器数据的备份、恢复或迁移。
USER
USER [username|uid] USER指令用于设置用户或uid来运行生成的镜像和执行RUN指令。
WORKDIR
WORKDIR /path/to/workdir WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工做目录(默认为/目录),该指令在Dockerfile文件中能够出现屡次,若是使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。
ONBUILD
ONBUILD [INSTRUCTION] ONBUILD指令用来设置一些触发的指令,用于在当该镜像被做为基础镜像来建立其余镜像时(也就是Dockerfile中的FROM为当前镜像时)执行一些操做,ONBUILD中定义的指令会在用于生成其余镜像的Dockerfile文件的FROM指令以后被执行,上述介绍的任何一个指令均可以用于ONBUILD指令,能够用来执行一些由于环境而变化的操做,使镜像更加通用。 注意: ①ONBUILD中定义的指令在当前镜像的build中不会被执行。 ②能够经过查看docker inspeat <image>命令执行结果的OnBuild键来查看某个镜像ONBUILD指令定义的内容。 ③ONBUILD中定义的指令会当作引用该镜像的Dockerfile文件的FROM指令的一部分来执行,执行顺序会按ONBUILD定义的前后顺序执行,若是ONBUILD中定义的任何一个指令运行失败,则会使FROM指令中断并致使整个build失败,当全部的ONBUILD中定义的指令成功完成后,会按正常顺序继续执行build。 ④ONBUILD中定义的指令不会继承到当前引用的镜像中,也就是当引用ONBUILD的镜像建立完成后将会清除全部引用的ONBUILD指令。 ⑤ONBUILD指令不容许嵌套,例如ONBUILD ONBUILD ADD . /data是不容许的。 ⑥ONBUILD指令不会执行其定义的FROM或MAINTAINER指令。
容器 = 镜像 + 可读层
Docker容器就像是一个文件夹,它包含了一个应用程序运行所须要的全部内容。每一个容器都是基于Docker镜像构建。咱们能够运行、开始、中止、迁移或者是删除Docker容器。每一个容器均是一个隔离的、安全的应用平台。Docker容器是Docker的运行组件。bash
docker run
新建并启动容器
-d
容器运行在后台,此时不能使用--rm
选项-i -t
和容器进行交互式操做--name
命名容器,没有该参数Docker deamon会生产UUID来标识--cidfile
将容器ID输入到指定文件中--add-host
添加一行到/etc/hosts--mac-address
设置MAC地址--dns
覆盖容器DNS设置--rm
退出容器时自动清除数据-m
调整容器的内存使用-c
调整容器的CPU优先级-e
设定环境变量--expose
运行时暴露端口,不建立和宿主机的映射-p
建立映射规则,将一个或者一组端口从容器里绑定到宿主机上,可屡次使用
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
-P
将Dockfile中暴露的端口映射动态映射到宿主机--link
容器互联 --link name:alias
-v
建立数据卷挂载到容器,一次run中可屡次使用可覆盖Dockfile参数
CMD
ENTRYPOINT
EXPOSE
ENV
VOLUME
USER
WORKDIR
docker stop
中止运行中容器docker stop $(docker ps -qa)
中止全部运行中的容器docker restart
重启容器docker ps -a
查看全部容器docker rm
移除处于终止状态的容器
docker rm $(docker ps -qa)
移除处于终止状态的容器docker logs
从容器中去日志docker diff
列出容器中被改变的文件或者目录docker top
显示运行容器的进程信息docker cp
从容器中拷贝文件或者目录到本地docker inspect
查看容器详细信息数据卷相似于 Linux 下对目录或文件进行 mount,本质是容器中一个特殊的文件或目录(挂载点)。在容器的建立过程当中,这个挂载点会被挂载一个宿主机上的指定的目录 (一个以volumeID为名称的目录 或者指定的宿主机目录)。它的设计用来持久化数据的,生命周期独立于容器。
docker run -i -t -v /data debian:jessie /bin/sh
docker run -i -t -v /var/www/:/data debian:jessie /bin/sh
docker run -i -t -v /var/www/:/data:ro debian:jessie /bin/sh
数据卷容器,用来提供数据卷供其它容器挂载的正常容器。
docker run -d -v /var/www/:/dbdata --name dbdata debian:jessie
docker run -d --volumes-from dbdata --name db1 debian:jessie
docker run -d --name db2 --volumes-from db1 debian:jessie
若是删除了挂载的容器,数据卷并不会被自动删除。若是要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v
命令来指定同时删除关联的容器。
tar
命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar
的文件。docker run --volumes-from dbdata -v $(pwd):/backup debian:jessie tar cvf /backup/backup.tar /dbdata
# 建立一个带有空数据卷的容器 docker run -v /dbdata --name dbdata2 debian:jessie /bin/bash # 建立另外一个容器,挂载 dbdata2 容器卷中的数据卷,并解压备份文件到挂载的容器卷中。 docker run --volumes-from dbdata2 -v $(pwd):/backup debian:jessie tar xvf /backup/backup.tar # 再启动一个容器挂载一样的容器卷来查看恢复的数据 docker run --volumes-from dbdata2 debian:jessie /bin/ls /dbdata
若是以为本篇文章对您十分有益,何不 打赏一下