官网:https://www.docker.com/javascript
相关资料:
一、Docker入门教程 http://dockone.io/article/111
二、Docker_百度百科 http://baike.baidu.com/view/11854949.htm
三、史上最全Docker资料集粹 http://special.csdncms.csdn.net/BeDocker/
四、Docker - 话题精华 - 知乎 http://www.zhihu.com/topic/19950993/top-answers
五、docker 简明教程 | 简果网 http://www.simapple.com/docker-tutorial
六、如何使用Dockerfile构建镜像 http://blog.csdn.net/qinyushuang/article/details/43342553
七、Dockerfile reference - Docker https://docs.docker.com/engine/reference/builder/php
Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,经过 uname -r 命令查看你当前的内核版本:css
Docker 支持如下的 Ubuntu 版本:html
当以普通用户身份去使用docker images
时,若是出现如下错误:java
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/images/json: dial unix /var/run/docker.sock: connect: permission denied
是由于权限问题:python
查看文档:
https://docs.docker.com/engine/installation/linux/centos/
http://docs.daocloud.io/faq/install-docker-daocloudmysql
查看版本:linux
docker version
启动docker服务:nginx
为了后面的须要,这里下载个ubuntu的镜像:git
这就下载了最新的ubuntu系统镜像到本地,接下来咱们能够从该镜像建立多个容器。具体命令含义下面会有说明。
Docker里比较重要的概念有注册服务器、仓库、镜像、容器。
仓库: 注册服务器是存放仓库的地方,其上每每存放着多个仓库。每一个仓库集中存放某一类镜像,每每包括多个镜像文件,经过不一样的标签(tag)来进行区分。例如存放Ubuntu操做系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.0四、12.04等不一样版本的镜像。
镜像: Docker镜像(Image)相似于虚拟机镜像,能够将它理解为一个面向Docker引擎的只读模板,包含了文件系统。例如:一个镜像能够只包含一个完整的Ubuntu操做系统环境,能够把它称为一个Ubuntu镜像。
容器: 容器是从镜像建立的应用运行实例,能够将其启动、开始、中止、删除,而这些容器都是相互隔离、互不可见的。能够从一个镜像建立无数个容器。平时咱们主要操做的就是容器。咱们也能够把容器打包成镜像以方便再次使用。镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层建立一个可写层,镜像自己将保持不变。
这部分将介绍docker的结构以及docker服务的管理。
docker是C/S架构,使用client与Server通讯。
支持三种链接方式:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
使用ps -ef | grep docker
查看docker进程。
管理docker服务:
docker守护进程的配置和操做模式:
#-d 之后台方式运行容器。docker -d [OPTIONS]
下面是容器建立时的一些配置,按需添加。初学者能够简单看看,之后须要再来查找。
运行相关:
服务器相关:
RemoteAPI相关:
--api-enable-cors=false
存储相关:
网络设置相关:
Ubuntu: /etc/default/docker
若是没有配置文件,能够直接编辑:
vim /lib/systemd/system/docker.service
里面的ExecStart就是启动配置,默认是:
ExecStart=/usr/bin/docker -H fd://
咱们能够加几个配置:
ExecStart=/usr/bin/docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1
而后重启:
经过ps -ef | grep docker
能够查看刚才添加的信息:
咱们能够从一台安装了docker的机器访问另外一台安装了docker的机器。通常状况下咱们使用当前机器的docker客户端访问当前机器的Server端。下面演示如何访问其余docker服务端。
第一台IP:192.168.12.3
第二台IP:192.168.12.4
使用第二台安装有docker的服务器作演示。为区分,设置label不一样。
修改守护进程(Server)默认的启动配置:
默认是:-H fd://
可修改成:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1
可设置多个链接方式。
第一台访问第二台机器的docker服务:
经过http链接Server:
curl http://192.168.12.4:2375/info
访问的是服务器192.168.12.4:2375的info接口,返回服务器相关信息。
经过docker客户端访问Server:
docker -H tcp://192.168.12.4:2375 info
若是是是第一台机器访问第一台机器Docker的服务端,则使用127.0.0.1:2375就好了。
和服务器端同样,客户端也支持三种链接方式,默认是 -H unix:///var/run/docker.sock
:
-H unix:///path/to/sock
tcp://host:port
fd://socketfd
docker客户端使用docker info
默认访问的是本地Server。能够修改环境变量DOCKER_HOST改变默认链接。命令行直接输入:
export DOCKER_HOST="tcp://127.0.0.1:2375"
127.0.0.1:237能够替换为实际的Server地址。
若是想恢复本地链接,将DOCKER_HOST置空便可:
export DOCKER_HOST=""
咱们能够从镜像中建立容器。
Docker run IMAGE [COMMOND] [ARG...] 在新的容器中执行命令
该命令每运行一次,就建立了一个新的容器。下面演示从下载好的ubuntu镜像中建立并运行一个新的容器:
-i 交互式界面,默认是false
-t 伪终端,默认false
--name 容器别名,默认随机命名
exit 退出交互式界面,容器中止运行
Crtl+P 或者Crtl+Q 退出交互式界面,容器在后台运行。(注意是大写P和Q)
查看容器:
示例:
容器操做:
删除容器时,容器必须是中止状态,不然会报错误。
咱们可使用守护式容器运行一个或者多个服务,例如运行lamp服务、redis服务、mysql服务等。
什么是守护式容器?
启动守护式容器:
docker run -d IMAGE [COMMOND] [ARG...]
-d 让容器在后台运行
后台运行任务:
返回了一个守护进程的惟一ID。
查看守护进程的运行状况:
docker logs [-f] [-t] [--tail] 容器名或id 查看容器内WEB应用程序日志
-f --follow=true|false,默认false,一直跟随log变化
-t --timestamps=true|false,默认false,加上时间戳
--tail="all",返回最新多少条日志
在运行的容器中启动新的进程:
docker exec [-d] [-i] [-t] 容器名 [COMMOND] [ARG...]
中止守护式进程:
-P --publish-all=true|false,默认false
-p --publish=[],自定义端口,将容器内部使用的网络端口映射到咱们使用的主机上。
docker port 容器id 查看到容器的端口映射
Nginx部署示例:
发现配置文件在/etc/nginx/conf.d下面:
conf.d/localhost.conf
新建个目录:
内容随便写。
使用Crtl+P(即Crtl+shift+p)退出容器,并后台运行。
查看:
正常的话会显示网页内容。
若是exit退出了容器,想开启nginx服务,还能够:
咱们可使用--link
使用另外一个容器的服务。
建立mysql_db 容器:
docker run --name mysql_db -e MYSQL_ROOT_PASSWORD=123456 -d mysql
建立一个应用,并使用刚才建立的mysql_db容器服务:
docker run --name some-wordpress --link mysql_db:mysql -p 8001:80 -d wordpress
docker search [-s] IMAGE
下载镜像名称其实由三部分组成:daocloud.io/library/ubuntu:16.04
其中其中daocloud.io是注册服务器地址,默认是registry.hub.docker.com;ubuntu是仓库名,16.04是标签名,默认是latest。
各个选项说明:
同一仓库源能够有多个 TAG,表明这个仓库源的不一样个版本,咱们使用 REPOSTITORY:TAG 来定义不一样的镜像。
选项:-f, --force
强制删除镜像--no-prune
不删除untagged parents
选项:-o, --output
写入到文件
选项:-i, --input
从压缩包载入镜像
当咱们从docker镜像仓库中下载的镜像不能知足咱们的需求时,咱们能够经过如下两种方式对镜像进行更改。
1.从已经建立的容器中更新镜像,而且提交这个镜像
2.使用 Dockerfile 指令来建立一个新的镜像
从容器生成镜像
假设有一容器2c74d574293f,可使用commit命令生成镜像:
docker commit -m "create images" -a "52fhy" 2c74d574293f 52fhy/test:v1
-m 加一些改动信息,-a 指定做者相关信息,2c74d这一串为旧容器id,再后面为新镜像的名字。
docker push [OPTIONS] NAME[:TAG|@DIGEST]
选项:--disable-content-trust=true
跳过镜像签名
仓库是集中存放镜像的地方。官方提供的公共仓库是https://hub.docker.com。不用注册便可使用里面的众多仓库资源,包含了经常使用的ubuntu、centos、php、nginx、mysql等仓库。
因为国外仓库访问比较慢,可使用国内的仓库,通常须要注册,使用docker pull的时候须要指明注册服务器地址。
示例:
docker pull registry.aliyuncs.com/acs-sample/mysql
其中registry.aliyuncs.com
是注册服务器地址,acs-sample/mysql
是仓库名,全部者是acs-sample
,没有指定镜像标签,则默认是latest
。
根据所存储的镜像公开分享与否,Docker仓库能够分为公开仓库(Public)和私有仓库(Private)两种形式。
详见:Docker私有仓库搭建
在使用容器的过程当中,咱们可能须要共享数据:
一、共享本地主机数据到容器;
二、共享容器数据到另外一个容器。
Docker里的数据卷及数据卷容器刚好知足了这个需求。
数据卷(Data Volumes)是一个可供容器使用的特殊目录,它提供了不少有用的特性:
数据卷相似于Linux的mount。实质是在当前机器映射了一个目录到容器内部。
建立或运行容器的时候,使用-v
建立一个数据卷,屡次使用-v
能够建立多个数据卷。
挂载的数据卷默认权限是读写rw
。
数据卷容器(Data Volume Dontainers)其实就是一个普通的容器,只是咱们专门用它提供数据卷供其它容器挂载使用。
建立数据库容器很简单,建立一个普通容器就好了:
docker run --name db1 -v /data ubuntu
其余容器使用该数据卷容器:
docker run -it --name test4 --volumes-from db1 ubuntu
使用--volumes-from
指定数据卷容器。多个--volumes-from
将挂载多个数据卷容器。
注意:使用--volumes-from
参数所挂载的数据卷容器自己并不须要保持运行状态。若是删除了挂载的容器,数据卷并不会被自动删除,若是要删除一个数据卷,必需使用docker rm -v
命令来指定同时删除管联的容器。
Dockerfile用来建立一个自定义的image,包含了用户指定的软件依赖等。Dockerfile文件能够用docker build命令生成一个新的镜像。
Dockerfile文件示例:
运行以下命令:
docker build -t nginx:v1 .
进行镜像构建。成功后,从生成的镜像运行容器:
docker run -d -p 8090:80 nginx:v1
(1)FROM(指定基础image)
构建指令,必须指定且须要在Dockerfile其余指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image能够是官方远程仓库中的,也能够位于本地仓库。镜像能够指定标签。格式:
FROM <image>:<tag>
(2)MAINTAINER(用来指定镜像建立者信息)
构建指令,用于将image的制做者相关的信息写入到image中。当咱们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
格式:
MAINTAINER <name>
(3)RUN
构建指令,RUN能够运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。RUN指令能够有多条,每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时,能够用\来换行。
该指令有两种格式:
(4)CMD(设置容器启动时执行的操做)
设置指令,用于容器启动时指定的操做。该操做能够是执行自定义脚本,也能够是执行系统命令。该指令只能在文件中存在一次,若是有多个,则只执行最后一条。
该指令有三种格式:
注意:
1) CMD运行在镜像构建以后,容器启动的时候;
2) CMD只执行最后一条
3) CMD能够被用户指定的命令覆盖
(5)ENTRYPOINT(设置容器启动时执行的操做)
设置指令,指定容器启动时执行的命令,能够屡次设置,可是只有最后一个有效。
两种格式:
该指令的使用分为两种状况,一种是独自使用,另外一种和CMD指令配合使用。
当独自使用时,若是你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效:
另外一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数:
注意:
1) 和CMD指令基本同样,可是不能被用户指定的命令所覆盖;
2) 能够和CMD组合使用,ENTRYPOINT提供不可变得命令,CMD提供缺省参数。
(6)USER(设置容器的用户)
设置指令,设置启动容器的用户,默认是root用户。
(7)EXPOSE(指定容器须要映射到宿主机器的端口)
设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。格式为:
EXPOSE <port> [<port> ...]
例如:
EXPOSE 80 443 11211
告诉Docker服务端容器暴露的端口号,供互联系统使用。在启动容器时须要经过-P,Docker主机会自动分配一个端口转发到指定的端口;使用-p,则能够具体指定哪一个本地端口映射过来。
(8)ENV(用于设置环境变量)
构建指令,在image中设置一个环境变量。格式:
ENV <key> <value>
设置了后,后续的RUN命令均可以使用,容器启动后,能够经过docker inspect
查看这个环境变量,也能够经过在docker run --env key=value
时设置或修改环境变量。
假如你安装了JAVA程序,须要设置JAVA_HOME
,那么能够在Dockerfile中这样写:
ENV JAVA_HOME /path/to/java/dirent
(9)ADD(从src复制文件到容器的dest路径)
构建指令,全部拷贝到容器中的文件和文件夹权限为0755,uid和gid为0。格式为:
ADD <src> <dest>
<src>
是相对被构建的源目录的相对路径,能够是文件或目录的路径,也能够是一个远程的文件url;<dest>
是容器中的绝对路径。
该命令将复制指定的<src>
到容器中的<dest>
。其中<src>
能够是Dockerfile所在目录的一个相对路径(文件或目录);也能够是一个URL;还能够是一个tar文件(自动解压为目录)。
若是是一个目录,那么会将该目录下的全部文件添加到容器中,不包括目录;若是文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);若是<src>
是文件且<dest>
中不使用斜杠结束,则会将<dest>
视为文件,<src>
的内容会写入<dest>
;若是<src>
是文件且<dest>
中使用斜杠结束,则会<src>
文件拷贝到<dest>
目录下。
(10)COPY
格式为
COPY <src> <dest>
复制本地主机的<src>
(为Dockerfile所在目录的相对路径,文件或目录)为容器中的<dest>
。目标路径不存在时,会自动建立。
当使用本地目录为源目录时,推荐使用COPY。
(11)VOLUME(指定挂载点))
设置指令,使容器中的一个目录具备持久化存储数据的功能,该目录能够被容器自己使用,也能够共享给其余容器使用。咱们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,全部的更改都会丢失。当容器中的应用有持久化数据的需求时能够在Dockerfile中使用该指令。格式:
VOLUME ["<mountpoint>"]
示例:
运行经过该Dockerfile生成image的容器,/tmp/data
目录中的数据在容器关闭后,里面的数据还存在。例如另外一个容器也有持久化数据的需求,且想使用上面容器共享的/tmp/data
目录,那么能够运行下面的命令启动一个容器:
docker run -t -i -rm -volumes-from container1 image2 bash
container1为第一个容器的ID,image2为第二个容器运行image的名字。
(12)WORKDIR(切换目录)
设置指令,能够屡次切换(至关于cd命令),对RUN,CMD,ENTRYPOINT生效。格式:
WORKDIR /path/to/workdir
示例:
(13)ONBUILD(在子镜像中执行)
ONBUILD <Dockerfile关键字>
ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
(14)ARG(指定构建过程当中使用的环境变量)
Compose是用于定义和运行复杂Docker应用的编排工具(旧版本叫Fig)。你能够在一个文件中定义一个多容器的应用,而后使用一条命令来启动你的应用,而后全部相关的操做都会被自动完成。
资料:
https://docs.docker.com/compose
https://github.com/docker/compose
查看版本号:
docker-compose.yml内容
启动应用:
docker-compose up
image:镜像的ID
build:直接从pwd的Dockerfile来build,而非经过image选项来pull
links:链接到那些容器。每一个占一行,格式为SERVICE[:ALIAS],例如 – db[:database]
external_links:链接到该compose.yaml文件以外的容器中,好比是提供共享或者通用服务的容器服务。格式同links
command:替换默认的command命令
ports: 导出端口。格式能够是:
expose:导出端口,但不映射到宿主机的端口上。它仅对links的容器开放。格式直接指定端口号便可。
volumes:加载路径做为卷,能够指定只读模式:
volumes_from:加载其余容器或者服务的全部卷
env_file:从一个文件中导入环境变量,文件的格式为RACK_ENV=development
extends:扩展另外一个服务,能够覆盖其中的一些选项。一个sample以下:
net:容器的网络模式,能够为"bridge", "none", "container:[name or id]", "host"中的一个。
dns:能够设置一个或多个自定义的DNS地址。
dns_search:能够设置一个或多个DNS的扫描域。
其余的working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares,和docker run命令是同样的,这些命令都是单行的命令。例如:
一、Transaction check error
运行命令:yum install libdevmapper* -y
二、http://blog.csdn.net/baidu_36342103/article/details/69357438