├── README.md ├── article └── baseimage.md ├── command ├── cli_1.md ├── cli_2.md ├── cli_3.md └── cli_4.md ├── contributing ├── devenv.md └── dockercon.md ├── example ├── cfengine.md ├── couchdb.md ├── helloword.md ├── mongodb.md ├── node.md ├── postgresql.md ├── python.md ├── redis.md ├── riak.md ├── sshd.md └── supervisor.md ├── install ├── binaries.md ├── docker-arch.md ├── docker-fedora.md ├── docker-redhat.md ├── docker-windows.md ├── docker.md ├── macos.md └── upgrading.md ├── introduction └── introduction.md ├── me └── docker-netapp.md └── use ├── Basic.md ├── buildimage.md ├── puppet.md └── shareimage.md /README.md: -------------------------------------------------------------------------------- 1 | #Docker教程中文版本 2 | 3 | ##介绍 4 | 5 | 1. [Docker介绍](https://github.com/widuu/docker_course/blob/master/introduction、introduction.md) 6 | 7 | ##安装 8 | 9 | 1. [Docker-ubuntu安装教程](https://github.com/widuu/docker_course/blob/master/install/docker.md) 10 | 11 | 1. [Docker-redhat(centos)安装教程](https://github.com/widuu/docker_course/blob/master/install/docker-redhat.md) 12 | 13 | 1. [Docker-fedora安装教程](https://github.com/widuu/docker_course/blob/master/install/docker-fedora.md) 14 | 15 | 1. [Docker-Arch Linux安装教程](https://github.com/widuu/docker_course/blob/master/install/docker-arch.md) 16 | 17 | 1. [Docker-macos安装教程](https://github.com/widuu/docker_course/blob/master/install/macos.md) 18 | 19 | 1. [二进制安装教程](https://github.com/widuu/docker_course/blob/master/install/binaries.md) 20 | 21 | 1. [升级Docker](https://github.com/widuu/docker_course/blob/master/install/upgrading.md) 22 | 23 | ##使用 24 | 25 | 1. [学习基础命令](https://github.com/widuu/docker_course/blob/master/use/Basic.md) 26 | 27 | 1. [创建镜像(引用Dockerfile)](https://github.com/widuu/docker_course/blob/master/use/buildimage.md) 28 | 29 | 1. [分享镜像](https://github.com/widuu/docker_course/blob/master/use/shareimage.md) 30 | 31 | 1. [使用puppet](https://github.com/widuu/docker_course/blob/master/puppet.md) 32 | 33 | ##例子 34 | 35 | 1. [hello word](https://github.com/widuu/docker_course/blob/master/example/helloword.md) 36 | 37 | 1. [python web 应用](https://github.com/widuu/docker_course/blob/master/example/python.md) 38 | 39 | 1. [node.js web 应用](https://github.com/widuu/docker_course/blob/master/example/node.md) 40 | 41 | 1. [redis服务](https://github.com/widuu/docker_course/blob/master/example/redis.md) 42 | 43 | 1. [SSH服务进程](https://github.com/widuu/docker_course/blob/master/example/sshd.md) 44 | 45 | 1. [CouchDB服务](https://github.com/widuu/docker_course/blob/master/example/couchdb.md) 46 | 47 | 1. [PostgreSQL服务](https://github.com/widuu/docker_course/blob/master/example/postgresql.md) 48 | 49 | 1. [创建一个mongodb镜像](https://github.com/widuu/docker_course/blob/master/example/mongodb.md) 50 | 51 | 1. [Riak服务](https://github.com/widuu/docker_course/blob/master/example/riak.md) 52 | 53 | 1. [Docker使用Supervisor](https://github.com/widuu/docker_course/blob/master/example/supervisor.md) 54 | 55 | 1. [CFEngine管理Docker进程](https://github.com/widuu/docker_course/blob/master/example/cfengine.md) 56 | 57 | ##命令 58 | 59 | 1. [命令讲解(1)](https://github.com/widuu/docker_course/blob/master/command/cli_1.md) 60 | 61 | 1. [命令讲解(2)](https://github.com/widuu/docker_course/blob/master/command/cli_2.md) 62 | 63 | 1. [命令讲解(3)](https://github.com/widuu/docker_course/blob/master/command/cli_3.md) 64 | 65 | 1. [命令讲解(4)](https://github.com/widuu/docker_course/blob/master/command/cli_4.md) 66 | 67 | ##贡献 68 | 69 | 1. [贡献docker](https://github.com/widuu/docker_course/blob/master/contributing/dockercon.md) 70 | 71 | 1. [设置开发环境](https://github.com/widuu/docker_course/blob/master/contributing/devenv.md) 72 | 73 | ##非官方例子 74 | 75 | 1. [docker运行.net应用](https://github.com/widuu/docker_course/blob/master/me/docker-netapp.md) 76 | 77 | ##文章 78 | 79 | 1. [创建基础镜像](https://github.com/widuu/docker_course/blob/master/article/baseimage.md) 80 | 81 | ##术语 82 | 83 | 84 | 85 | ##通过捐款支持 86 | 87 | 捐款地址:[https://me.alipay.com/widuu](https://me.alipay.com/widuu) 88 | 89 | --- 90 | 91 | ####本文由widuu提供中文翻译,中文翻译官方网站[http://www.widuu.com](http://www.widuu.com)! 92 | 93 | --- 94 | 95 | ##授权许可 96 | 97 | 除特别声明外,本书中的内容使用[CC BY-SA 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/)(创作共用 署名-相同方式共享3.0许可协议)授权 。 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /article/baseimage.md: -------------------------------------------------------------------------------- 1 | #创建一个基础镜像 2 | 3 | 你是否想要创建你自己的基础镜像?好极了! 4 | 5 | 具体过程就要依赖你想要的linux发行版包。我们有下面一下例子,也鼓励一些人提交新的贡献 6 | 7 | ##开始 8 | 9 | 一般情况下,你要开始运行分配你想要一个工作的机器打包为基础镜像,虽然Debian的debootstrap不是必须的一些功能。但是你可以使用它来构建Ubuntu镜像 10 | 11 | 下边是一个简单的例子,来创建一个Ubuntu基础镜像 12 | 13 | $ sudo debootstrap raring raring > /dev/null 14 | $ sudo tar -C raring -c . | sudo docker import - raring 15 | a29c15f1bf7a 16 | $ sudo docker run raring cat /etc/lsb-release 17 | DISTRIB_ID=Ubuntu 18 | DISTRIB_RELEASE=13.04 19 | DISTRIB_CODENAME=raring 20 | DISTRIB_DESCRIPTION="Ubuntu 13.04" 21 | 22 | 这里有一些脚本例子来创建基础镜像 23 | 24 | - [BusyBox](https://github.com/dotcloud/docker/blob/master/contrib/mkimage-busybox.sh) 25 | 26 | - [CentOS / Scientific Linux CERN (SLC)](https://github.com/dotcloud/docker/blob/master/contrib/mkimage-rinse.sh) 27 | 28 | - [Debian / Ubuntu](https://github.com/dotcloud/docker/blob/master/contrib/mkimage-debootstrap.sh) 29 | 30 | -------------------------------------------------------------------------------- /command/cli_1.md: -------------------------------------------------------------------------------- 1 | #Docker命令行帮助 2 | 3 | >列出可用的命令,或者运行不带参数的docker或者执行docker帮助 4 | 5 | sudo docker 6 | 7 | useage of docker 8 | 9 | -D 默认false 允许调试模式(debug mode) 10 | 11 | -H 默认是 unix:///var/run/docker.sock tcp://[host[:port]]来绑定 或者 unix://[/path/to/socket]来使用(二进制文件的时候),当主机ip host=[0.0.0.0],(端口)port=[4243] 或者 path=[/var/run/docker.sock]是缺省值,做为默认值来使用 12 | 13 | -api-enable-cors 默认flase 允许CORS header 远程api 14 | 15 | -b 默认是空,附加在已存在的网桥上,如果是用'none'参数,就禁用了容器的网络 16 | 17 | -bip 默认是空,使用提供的CIDR(Classless Inter-Domain Routing-无类型域间选路)标记地址动态创建网桥(dcoker0),和-b参数冲突 18 | 19 | -d 默认false 允许进程模式(daemon mode) 20 | 21 | -dns 默认是空,使docker使用指定的DNS服务器 22 | 23 | -g 默认是"/var/lib/docker":作为docker使用的根路径 24 | 25 | -icc 默认true,允许inter-container来通信 26 | 27 | -ip 默认"0.0.0.0" :绑定容器端口的默认Ip地址 28 | 29 | -iptables 默认true 禁用docker添加iptables规则 30 | 31 | -mtu 默认1500 : 设置容器网络传输的最大单元(mtu) 32 | 33 | -p 默认是/var/run/docker.pid 进程pid使用的文件路径 34 | 35 | -r 默认是true 重启之前运行的容器 36 | 37 | -s 默认是空 ,这个是docker运行是使用一个指定的存储驱动器 38 | 39 | -v 默认false 打印版本信息和退出 40 | 41 | 42 | ![](http://yun.widuu.com/docker/docker-docker.png) 43 | 44 | 45 | >当你的进程使用-d标识的时候,docker使用一个持久的进程来管理容器,docker使用相同的进程和客户端. 46 | 47 | >docker使用 -d -s 来映射存储程序,从而迫使docker运用映射的存储器来存储驱动程序. 48 | 49 | >docker使用 -d -dns 8.8.8.8,来设置所有的docker容器的DNS服务器. 50 | 51 | >docker使用 -d -D参数,来让进程输出debug信息 52 | 53 | >docker客户端,也可以使用DOCKER_HOST的环境变量参数来改变docker -H的参数设置 54 | 55 | docker -H tcp://0.0.0.0:4243 ps 56 | # or 57 | export DOCKER_HOST="tcp://0.0.0.0:4243" 58 | docker ps 59 | # both are equal 60 | 61 | ####attach 62 | 63 | usage : docker attach CONTAINER 64 | 65 | attach 来运行一个容器 66 | 67 | -nostdin 默认参数false 不要附加stdin(输入) 68 | -sig-proxy 默认true Proxify所有接收信号流程(即使在non-tty模式) 69 | 70 | 71 | >你可以把docker从容器中分离出来运行,然后用CTRl -c来退出或者CTRL -\来获得一个异常堆栈的docker退出,当这个容器退出过程会将退出代码返回给客户端 72 | 73 | >使用docker stop来停止一个容器 74 | 75 | >使用docker kill来杀死一个容器 76 | 77 | 78 | #####attach examples 79 | 80 | ID=$(sudo docker run -d ubuntu /usr/bin/top -b) 81 | sudo docker attach $ID 82 | 83 | ![](http://yun.widuu.com/docker/attach.png) 84 | 85 | 86 | 本文由widuu贡献翻译,转载请注明来自[http://www.widuu.com](http://www.widuu.com)~ -------------------------------------------------------------------------------- /command/cli_2.md: -------------------------------------------------------------------------------- 1 | #Docker命令行帮助(2) 2 | 3 | ---------- 4 | 5 | ##build 6 | 7 | Usage: docker build [OPTIONS] PATH | URL | - 8 | 通过指定文件代码来创建一个新的容器 9 | 10 | -t="": 库的名称和可选标记容器创建成功时候产生例如(ubuntu:widuu) 11 | 12 | -q=false: 抑制生成过程中的输出 13 | 14 | -no-cache: 构建镜像时不适用缓存 15 | 16 | -rm: 成功构建后去除中间容器 17 | 18 | 这个文件路径或者url被称为构建的环境,在生成过程中可以参考这些文件的环境,举个例子,使用ADD命令!当一个Dockerfile被给定位URL,则没有环境被设定,当一个git仓库被设置为URL时,这个仓库就被做为环境! 19 | 20 | >参见 21 | >Build Images (Dockerfile Reference)[###] 22 | 23 | ##Examples: 24 | 25 | >非官方备注,前提是你的目录下有Dockerfile文件,我提供一下我写的测试文件 26 | 27 | # VERSION 0.0.1 28 | # 默认ubuntu server长期支持版本,当前是12.10 29 | FROM ubuntu 30 | # 签名啦 31 | MAINTAINER widuu "admin@widuu.com" 32 | 33 | # 更新源,安装ssh server 34 | RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list 35 | RUN apt-get update 36 | RUN apt-get install -y openssh-server 37 | RUN mkdir -p /var/run/sshd 38 | 39 | # 设置root ssh远程登录密码为123456 40 | RUN echo "root:dgj99349" | chpasswd 41 | 42 | # 容器需要开放SSH 22端口 43 | EXPOSE 22 44 | 45 | 46 | # SSH终端服务器作为后台运行 47 | ENTRYPOINT /usr/sbin/sshd -D 48 | 49 | >开始官方列子 50 | 51 | sudo docker build . 52 | 53 | ![docker build](http://yun.widuu.com/docker/build.png) 54 | 55 | 这个例子指定的Dockerfile文件路径在.所以本地目录中所有文件信息被推送到docker进程中去,docker进程会找到指定路径中的文件中的环境信息来构建,请记住后台程序会执行在远程机器上,不需要解析Dockerfile在客户端发生什么(你在哪里运行docker build).这就意味着文件中的所有信息都会被发送,不仅仅是前边Dockerfile列出的ADD 56 | 57 | 环境从本地机器中传输到Docker进程中,这就是你从客户端看到“Uploading context”的信息。 58 | 59 | sudo docker build -t vieux/apache:2.0 . 60 | 61 | 这个构建像以前的例子,但是他给镜像添加了tag,这个仓库的名字将会是vieux/apache,tag名称是2.0 62 | 63 | sudo docker build - < Dockerfile 64 | 65 | 这个从输入段读取Dockerfile没有环境,由于缺少环境,本地的所有环境不会发送到docker进程中去,由于没有本地的环境,Dockerfile 中的ADD只能从远程URl中获取 66 | 67 | sudo docker build github.com/creack/docker-firefox 68 | 69 | 这个将会从你的github的仓库中获取,并且使用获取的仓库作为环境,Dockerfile在存储在跟作用Dockerfile,请注意,您可以指定一个任意的git存储库使用 git:// 模式 70 | 71 | ##commit 72 | 73 | Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 74 | 75 | 通过容器的改变来创建一个新的镜像 76 | 77 | -m="": 提交信息 78 | 79 | -author="": 提交作者信息 (eg. "John Hannibal Smith " 80 | 81 | -run="": 配置应用镜像是执行 `docker run`. 82 | (ex: -run='{"Cmd": ["cat", "/world"], "PortSpecs": ["22"]}') 83 | 84 | ##提交一个中断的容器 85 | 86 | $ sudo docker ps 87 | ID IMAGE COMMAND CREATED STATUS PORTS 88 | c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours 89 | 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours 90 | $ docker commit c3f279d17e0a SvenDowideit/testimage:version3 91 | f5283438590d 92 | $ docker images | head 93 | REPOSITORY TAG ID CREATED VIRTUAL SIZE 94 | SvenDowideit/testimage version3 f5283438590d 16 seconds ago 335.7 MB 95 | 96 | ##改变容器运行的命令 97 | 98 | 有时你运行一个应用容器服务,你需要迅速改变它,然后变回来 99 | 100 | 做为一个雷子,我们使用ls运行一个容器,然后我们改变镜像运行ls /etc 101 | 102 | $ docker run -t -name test ubuntu ls 103 | bin boot dev etc home lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var 104 | $ docker commit -run='{"Cmd": ["ls","/etc"]}' test test2 105 | 933d16de9e70005304c1717b5c6f2f39d6fd50752834c6f34a155c70790011eb 106 | $ docker run -t test2 107 | adduser.conf gshadow login.defs rc0.d 108 | alternatives gshadow- logrotate.d rc1.d 109 | apt host.conf lsb-base rc2.d 110 | ... 111 | 112 | ![run example](http://yun.widuu.com/docker/run.png) 113 | 114 | ##完整的 -run 例子 115 | 116 | -run json hash 改变配置部分当运行的docker检查容器或者配置当容器运行检索的ImageId 117 | 118 | $ sudo docker commit -run=' 119 | { 120 | "Entrypoint" : null, 121 | "Privileged" : false, 122 | "User" : "", 123 | "VolumesFrom" : "", 124 | "Cmd" : ["cat", "-e", "/etc/resolv.conf"], 125 | "Dns" : ["8.8.8.8", "8.8.4.4"], 126 | "MemorySwap" : 0, 127 | "AttachStdin" : false, 128 | "AttachStderr" : false, 129 | "CpuShares" : 0, 130 | "OpenStdin" : false, 131 | "Volumes" : null, 132 | "Hostname" : "122612f45831", 133 | "PortSpecs" : ["22", "80", "443"], 134 | "Image" : "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", 135 | "Tty" : false, 136 | "Env" : [ 137 | "HOME=/", 138 | "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 139 | ], 140 | "StdinOnce" : false, 141 | "Domainname" : "", 142 | "WorkingDir" : "/", 143 | "NetworkDisabled" : false, 144 | "Memory" : 0, 145 | "AttachStdout" : false 146 | }' $CONTAINER_ID 147 | 148 | ##CP 149 | 150 | Usage :docker cp CONTAINER:PATH HOSTPATH 151 | 152 | 将容器的文件和文件夹复制到主机中 153 | 154 | path. 路径相对于文件系统的跟 155 | 156 | $ sudo docker cp 7bb0e258aefe:/etc/debian_version . 157 | $ sudo docker cp blue_frog:/etc/hosts . 158 | 159 | ##diff 160 | 161 | Usage:docker diff CONTAINER 162 | 163 | 更改的文件和目录列表容器的文件系统 164 | 165 | 有3中列出不同的diff事件 166 | 167 | 1. `A` - Add 168 | 1. `D` - Delete 169 | 1. `C` - Change 170 | 171 | 例子 172 | 173 | $ sudo docker diff 7bb0e258aefe 174 | 175 | C /dev 176 | A /dev/kmsg 177 | C /etc 178 | A /etc/mtab 179 | A /go 180 | A /go/src 181 | A /go/src/github.com 182 | A /go/src/github.com/dotcloud 183 | A /go/src/github.com/dotcloud/docker 184 | A /go/src/github.com/dotcloud/docker/.git 185 | .... 186 | 187 | ![docker diff](http://yun.widuu.com/docker/diff.png) 188 | 189 | 本文由widuu贡献翻译,转载请注明来自[http://www.widuu.com](http://www.widuu.com)~ 190 | -------------------------------------------------------------------------------- /command/cli_3.md: -------------------------------------------------------------------------------- 1 | #Docker命令行帮助(3) 2 | 3 | ------ 4 | 5 | ##events 6 | 7 | Usage :docker events 8 | 9 | 从服务器获取实时事件 10 | 11 | -since="": 显示以前创建的事件流() 12 | 13 | ##Examples 14 | 15 | 在这个例子里你需要运行两个shell 16 | 17 | ###Shell 1:监听事件 18 | 19 | sudo docker events 20 | 21 | ###Shell 2:开始和关闭一个容器 22 | 23 | $ sudo docker start 4386fb97867d 24 | $ sudo docker stop 4386fb97867d 25 | 26 | ###Shell 1: 再一次。。你会看到下面的事件 27 | 28 | [2013-09-03 15:49:26 +0200 CEST] 4386fb97867d: (from 12de384bfb10) start 29 | [2013-09-03 15:49:29 +0200 CEST] 4386fb97867d: (from 12de384bfb10) die 30 | [2013-09-03 15:49:29 +0200 CEST] 4386fb97867d: (from 12de384bfb10) stop 31 | 32 | ###查看事件从一个指定的过去的时间段 33 | 34 | $ sudo docker events -since 1378216169 35 | [2013-09-03 15:49:29 +0200 CEST] 4386fb97867d: (from 12de384bfb10) die 36 | [2013-09-03 15:49:29 +0200 CEST] 4386fb97867d: (from 12de384bfb10) stop 37 | 38 | $ sudo docker events -since '2013-09-03' 39 | [2013-09-03 15:49:26 +0200 CEST] 4386fb97867d: (from 12de384bfb10) start 40 | [2013-09-03 15:49:29 +0200 CEST] 4386fb97867d: (from 12de384bfb10) die 41 | [2013-09-03 15:49:29 +0200 CEST] 4386fb97867d: (from 12de384bfb10) stop 42 | 43 | $ sudo docker events -since '2013-09-03 15:49:29 +0200 CEST' 44 | [2013-09-03 15:49:29 +0200 CEST] 4386fb97867d: (from 12de384bfb10) die 45 | [2013-09-03 15:49:29 +0200 CEST] 4386fb97867d: (from 12de384bfb10) stop 46 | 47 | ![docker events](http://yun.widuu.com/docker/events.png) 48 | 49 | ##export 50 | 51 | Usage: docker export CONTAINER(容器) 52 | 53 | 导出文件系统作为一个tar文档发送到stdout 54 | 55 | ###例子 56 | 57 | $ sudo docker export red_panda > latest.tar 58 | 59 | ![docker export](http://yun.widuu.com/docker/export.png) 60 | 61 | ##history 62 | 63 | Usage: docker history [OPTIONS] IMAGE 64 | 65 | 显示镜像的历史操作 66 | 67 | -notrunc=false: 不截断输出 68 | -q=false: 只显示数字id 69 | 70 | ###查看docker:last最新创建的镜像 71 | 72 | $ docker history docker 73 | ID CREATED CREATED BY 74 | docker:latest 19 hours ago /bin/sh -c #(nop) ADD . in /go/src/github.com/dotcloud/docker 75 | cf5f2467662d 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["hack/dind"] 76 | 3538fbe372bf 2 weeks ago /bin/sh -c #(nop) WORKDIR /go/src/github.com/dotcloud/docker 77 | 7450f65072e5 2 weeks ago /bin/sh -c #(nop) VOLUME /var/lib/docker 78 | b79d62b97328 2 weeks ago /bin/sh -c apt-get install -y -q lxc 79 | 36714852a550 2 weeks ago /bin/sh -c apt-get install -y -q iptables 80 | 8c4c706df1d6 2 weeks ago /bin/sh -c /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEYn' > /.s3cfg 81 | b89989433c48 2 weeks ago /bin/sh -c pip install python-magic 82 | a23e640d85b5 2 weeks ago /bin/sh -c pip install s3cmd 83 | 41f54fec7e79 2 weeks ago /bin/sh -c apt-get install -y -q python-pip 84 | d9bc04add907 2 weeks ago /bin/sh -c apt-get install -y -q reprepro dpkg-sig 85 | e74f4760fa70 2 weeks ago /bin/sh -c gem install --no-rdoc --no-ri fpm 86 | 1e43224726eb 2 weeks ago /bin/sh -c apt-get install -y -q ruby1.9.3 rubygems libffi-dev 87 | 460953ae9d7f 2 weeks ago /bin/sh -c #(nop) ENV GOPATH=/go:/go/src/github.com/dotcloud/docker/vendor 88 | 8b63eb1d666b 2 weeks ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/goroot/bin 89 | 3087f3bcedf2 2 weeks ago /bin/sh -c #(nop) ENV GOROOT=/goroot 90 | 635840d198e5 2 weeks ago /bin/sh -c cd /goroot/src && ./make.bash 91 | 439f4a0592ba 2 weeks ago /bin/sh -c curl -s https://go.googlecode.com/files/go1.1.2.src.tar.gz | tar -v -C / -xz && mv /go /goroot 92 | 13967ed36e93 2 weeks ago /bin/sh -c #(nop) ENV CGO_ENABLED=0 93 | bf7424458437 2 weeks ago /bin/sh -c apt-get install -y -q build-essential 94 | a89ec997c3bf 2 weeks ago /bin/sh -c apt-get install -y -q mercurial 95 | b9f165c6e749 2 weeks ago /bin/sh -c apt-get install -y -q git 96 | 17a64374afa7 2 weeks ago /bin/sh -c apt-get install -y -q curl 97 | d5e85dc5b1d8 2 weeks ago /bin/sh -c apt-get update 98 | 13e642467c11 2 weeks ago /bin/sh -c echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list 99 | ae6dde92a94e 2 weeks ago /bin/sh -c #(nop) MAINTAINER Solomon Hykes 100 | 101 | ###带图的都是我本地自己测试的 102 | 103 | ![docker history](http://yun.widuu.com/docker/history.png) 104 | 105 | ##images 106 | 107 | Usage: docker images [OPTIONS] [NAME] 108 | 109 | 列出镜像 110 | 111 | -a=false: 显示所有镜像(默认情况下过略掉了用于构建的镜像) 112 | -notrunc=false: 不截断输出 113 | -q=false: 指输出镜像id 114 | -tree=false: 用树形结构输出镜像 115 | -viz=false: 用graphviz输出镜像图(非官方备注,你需要安装apt-get install graphviz) 116 | 117 | ###列出最近创建的镜像 118 | 119 | $ sudo docker images | head 120 | REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 121 | 77af4d6b9913 19 hours ago 1.089 GB 122 | committest latest b6fa739cedf5 19 hours ago 1.089 GB 123 | 78a85c484f71 19 hours ago 1.089 GB 124 | docker latest 30557a29d5ab 20 hours ago 1.089 GB 125 | 0124422dd9f9 20 hours ago 1.089 GB 126 | 18ad6fad3402 22 hours ago 1.082 GB 127 | f9f1e26352f0 23 hours ago 1.089 GB 128 | tryout latest 2629d1fa0b81 23 hours ago 131.5 MB 129 | 5ed6274db6ce 24 hours ago 1.089 GB 130 | 131 | ![docker images](http://yun.widuu.com/docker/images1.png) 132 | 133 | ###列出全部的镜像ID 134 | 135 | $ sudo docker images -notrunc | head 136 | REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 137 | 77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182 19 hours ago 1.089 GB 138 | committest latest b6fa739cedf5ea12a620a439402b6004d057da800f91c7524b5086a5e4749c9f 19 hours ago 1.089 GB 139 | 78a85c484f71509adeaace20e72e941f6bdd2b25b4c75da8693efd9f61a37921 19 hours ago 1.089 GB 140 | docker latest 30557a29d5abc51e5f1d5b472e79b7e296f595abcf19fe6b9199dbbc809c6ff4 20 hours ago 1.089 GB 141 | 0124422dd9f9cf7ef15c0617cda3931ee68346455441d66ab8bdc5b05e9fdce5 20 hours ago 1.089 GB 142 | 18ad6fad340262ac2a636efd98a6d1f0ea775ae3d45240d3418466495a19a81b 22 hours ago 1.082 GB 143 | f9f1e26352f0a3ba6a0ff68167559f64f3e21ff7ada60366e2d44a04befd1d3a 23 hours ago 1.089 GB 144 | tryout latest 2629d1fa0b81b222fca63371ca16cbf6a0772d07759ff80e8d1369b926940074 23 hours ago 131.5 MB 145 | 5ed6274db6ceb2397844896966ea239290555e74ef307030ebb01ff91b1914df 24 hours ago 1.089 GB 146 | 147 | ![docker images -notrunc ](http://yun.widuu.com/docker/imagesfull.png) 148 | 149 | ###显示图像图片 150 | 151 | $ sudo docker images -viz | dot -Tpng -o docker.png 152 | 153 | (这里不引用官方的了,我本地测试的) 154 | 155 | ![docker images -viz](http://yun.widuu.com/docker/docker-images.png) 156 | 157 | ###显示镜像的曾次结构 158 | 159 | $ sudo docker images -tree 160 | 161 | ├─8dbd9e392a96 Size: 131.5 MB (virtual 131.5 MB) Tags: ubuntu:12.04,ubuntu:latest,ubuntu:precise 162 | └─27cf78414709 Size: 180.1 MB (virtual 180.1 MB) 163 | └─b750fe79269d Size: 24.65 kB (virtual 180.1 MB) Tags: ubuntu:12.10,ubuntu:quantal 164 | ├─f98de3b610d5 Size: 12.29 kB (virtual 180.1 MB) 165 | │ └─7da80deb7dbf Size: 16.38 kB (virtual 180.1 MB) 166 | │ └─65ed2fee0a34 Size: 20.66 kB (virtual 180.2 MB) 167 | │ └─a2b9ea53dddc Size: 819.7 MB (virtual 999.8 MB) 168 | │ └─a29b932eaba8 Size: 28.67 kB (virtual 999.9 MB) 169 | │ └─e270a44f124d Size: 12.29 kB (virtual 999.9 MB) Tags: progrium/buildstep:latest 170 | └─17e74ac162d8 Size: 53.93 kB (virtual 180.2 MB) 171 | └─339a3f56b760 Size: 24.65 kB (virtual 180.2 MB) 172 | └─904fcc40e34d Size: 96.7 MB (virtual 276.9 MB) 173 | └─b1b0235328dd Size: 363.3 MB (virtual 640.2 MB) 174 | └─7cb05d1acb3b Size: 20.48 kB (virtual 640.2 MB) 175 | └─47bf6f34832d Size: 20.48 kB (virtual 640.2 MB) 176 | └─f165104e82ed Size: 12.29 kB (virtual 640.2 MB) 177 | └─d9cf85a47b7e Size: 1.911 MB (virtual 642.2 MB) 178 | └─3ee562df86ca Size: 17.07 kB (virtual 642.2 MB) 179 | └─b05fc2d00e4a Size: 24.96 kB (virtual 642.2 MB) 180 | └─c96a99614930 Size: 12.29 kB (virtual 642.2 MB) 181 | └─a6a357a48c49 Size: 12.29 kB (virtual 642.2 MB) Tags: ndj/mongodb:latest 182 | 183 | ![docker images tree](http://yun.widuu.com/docker/images-tree.png) 184 | 185 | ##import 186 | 187 | Usage: docker import URL|- [REPOSITORY[:TAG]] 188 | 189 | 创建一个空文件系统映像和引用压缩文件的内容 190 | (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, 然后选择性的标记. 191 | 192 | 此时,这个URl必须指向一个文件存档(.tar, .tar.gz, .tgz, .bzip, .tar.xz, or .txz) 包含一个跟文件系统,如果你想引用一个本地的文件压缩文件,你可以使用从输入端使用参数 193 | 194 | ###Examples 195 | 196 | ####输入一个远程的地址 197 | 198 | sudo docker import http://example.com/exampleimage.tgz 199 | 200 | **你可以引用我的url速度快,http://docker.widuu.com/ubuntu.tar** 201 | 202 | ####输入一个本地的文件 203 | 204 | 通过管道输入docker 205 | 206 | cat exampleimage.tgz | sudo docker import - exampleimagelocal:new 207 | 208 | ![docker import](http://yun.widuu.com/docker/docker-import.png) 209 | 210 | 注意本例子中 sudo 你必须保留文件的所有权(特别是root所有权)在tar文档,如果当你的tar不是root(或者 sudo 命令),那么所有权可能不会保留! 211 | 212 | ##info 213 | 214 | Usage: docker info 215 | 216 | 显示整个文件系统 217 | 218 | $ sudo docker info 219 | Containers: 292 220 | Images: 194 221 | Debug mode (server): false 222 | Debug mode (client): false 223 | Fds: 22 224 | Goroutines: 67 225 | LXC Version: 0.9.0 226 | EventsListeners: 115 227 | Kernel Version: 3.8.0-33-generic 228 | WARNING: No swap limit support 229 | 230 | ![docker info](http://yun.widuu.com/docker/info.png) 231 | 232 | 本文由widuu贡献翻译,转载请注明来自[http://www.widuu.com](http://www.widuu.com)~ -------------------------------------------------------------------------------- /command/cli_4.md: -------------------------------------------------------------------------------- 1 | #Docker命令行帮助(4) 2 | 3 | 4 | ##insert 5 | 6 | Usage: docker insert IMAGE URL PATH 7 | 8 | 通过url给镜像路径增加文件 9 | 10 | 使用指定的镜像作为父镜像增加一层新的文件,insert命令不修改原始奖项,而新的镜像的内容包含父镜像和新文件 11 | 12 | ###Examples 13 | 14 | 增加github文件 15 | 16 | $ sudo docker insert 8283e18b24bc https://raw.github.com/metalivedev/django/master/postinstall /tmp/postinstall.sh 17 | 06fd35556d7b 18 | 19 | ##inspect 20 | 21 | Usage: docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...] 22 | 23 | 返回容器底层信息 24 | 25 | -format="": 格式化输出的格式 26 | 27 | 默认情况下,这将使所有结果放在一个JSON数组中,如果指定格式,就安装指定的格式来执行输出每个结果 28 | 29 | Go的text/template包描述格式化的细节 30 | 31 | ![docker inspect](http://yun.widuu.com/docker/inspect.png) 32 | 33 | ###Examples 34 | 35 | 获得一个容器ip地址 36 | 37 | sudo docker inspect -format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID 38 | 39 | 列出所有绑定的端口地址 40 | 41 | sudo docker inspect -format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID 42 | 43 | 查找一个特定端口映射 44 | 45 | 当放字段名是一个数字时.Field语法不工作,网络设置端口部分包含一个内部端口影响到外部地址和端口的对象的列表!如果你要找出数字公共端口,你使用索引来查找特定端口映射,索引0包含的第一个对象!我们要求主机端口字段是获得公共地址! 46 | 47 | $ sudo docker inspect -format='{{(index (index .NetworkSettings.Ports "8787/tcp") 0).HostPort}}' $INSTANCE_ID 48 | 49 | ##kill 50 | 51 | Usage: docker kill CONTAINER [CONTAINER...] 52 | 53 | 杀死一个正在运行的容器(发送终止信号) 54 | 55 | >已知问题(kill) issue 197标明`docker kill`将很难删除目录和删除容器 56 | 57 | ##load 58 | 59 | Usage: docker load < ubuntu.tar 60 | 61 | 从输入流中加载一个压缩包,恢复包含的所有镜像和tag 62 | 63 | ##login 64 | 65 | Usage: docker login [OPTIONS] [SERVER] 66 | 67 | 登陆你在docker服务器注册的账号 index.docker.io 68 | 69 | -e="": email 70 | -p="": password 71 | -u="": username 72 | 73 | 如果你想登陆你的私有的仓库你可以添加的你服务器名称 74 | 75 | example: 76 | docker login localhost:8080 77 | 78 | ##logs 79 | 80 | Usage: docker logs [OPTIONS] CONTAINER 81 | 82 | 取出容器的log日志 83 | 84 | ![docker logs](http://yun.widuu.com/docker/logs.png) 85 | 86 | `docker logs`命令提供一个便利的任何执行时间的记录,当你使用`docker run`的时候并不能保证执行顺序(当你`docker logs`你就可能没有产生一些执行记录) 87 | 88 | ##port 89 | 90 | Usage: docker port [OPTIONS] CONTAINER PRIVATE_PORT 91 | 92 | 查找私有地址转换到共有地址端口 93 | 94 | ![docker port](http://yun.widuu.com/docker/port.png) 95 | 96 | ##ps 97 | 98 | Usage: docker ps [OPTIONS] 99 | 100 | List containers 101 | 102 | -a=false: 查看所有的镜像 默认情况下只查看正在运行的镜像 103 | -notrunc=false: 不把输出截断 104 | -q=false: 仅仅只显示镜像ID 105 | 106 | 运行docker ps查看2个容器 107 | 108 | $ docker ps 109 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 110 | 4c01db0b339c ubuntu:12.04 bash 17 seconds ago Up 16 seconds webapp 111 | d7886598dbe2 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db 112 | 113 | ![docker ps](http://yun.widuu.com/docker/ps.png) 114 | 115 | ##pull 116 | 117 | Usage: docker pull NAME 118 | 119 | 从远程仓库中获取镜像 120 | 121 | ##push 122 | 123 | Usage: docker push NAME 124 | 125 | 推送本地镜像到远程仓库 126 | 127 | ##restart 128 | 129 | Usage: docker restart [OPTIONS] NAME 130 | 131 | 重启正在运行的远程仓库 132 | 133 | ##rm 134 | 135 | Usage: docker rm [OPTIONS] CONTAINER 136 | 137 | 删除一个或者所有的容器 138 | 139 | -link="": Remove the link instead of the actual container 140 | 141 | >已知问题(kill) issue 197标明`docker kill`将很难删除目录和删除容器 142 | 143 | #Examples 144 | 145 | $ sudo docker rm /redis 146 | /redis 147 | 148 | 这将删除容器下引用的链接/reids 149 | 150 | $ sudo docker rm -link /webapp/redis 151 | /webapp/redis 152 | 153 | 这将删除/webapp /redis底层之间的联系,容器中会删除所有的网络通信 154 | 155 | $ sudo docker rm `docker ps -a -q` 156 | 157 | 这个命令会删除所有停止运行的容器,`docker ps -a -q`会返回所有的镜像ID通过这些镜像ID再执行rm命令删除它们,当然正在运行的是不会被删除的 158 | 159 | ##rmi 160 | 161 | Usage: docker rmi IMAGE [IMAGE...] 162 | 163 | 删除一个或者多个镜像 164 | 165 | ##删除标记的镜像 166 | 167 | 镜像可以通过它们的长或者短ID删除或者他们的镜像名称,如果一个镜像有一个或者多个名称,在删除镜像之前,他们每一个都必须要删除 168 | 169 | $ sudo docker images 170 | REPOSITORY TAG IMAGE ID CREATED SIZE 171 | test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) 172 | test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) 173 | test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) 174 | 175 | $ sudo docker rmi fd484f19954f 176 | Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories 177 | 2013/12/11 05:47:16 Error: failed to remove one or more images 178 | 179 | $ sudo docker rmi test1 180 | Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 181 | $ sudo docker rmi test2 182 | Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 183 | 184 | $ sudo docker images 185 | REPOSITORY TAG IMAGE ID CREATED SIZE 186 | test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) 187 | $ sudo docker rmi test 188 | Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 189 | Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 190 | 191 | ##run 192 | 193 | Usage: docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...] 194 | 195 | Run a command in a new container 196 | 197 | -a=map[]: 附加标准输入、输出或者错误输出 198 | -c=0: 共享CPU格式(相对重要) 199 | -cidfile="": 将容器的ID标识写入文件 200 | -d=false: 分离模式,在后台运行容器,并且打印出容器ID 201 | -e=[]: 设置环境变量 202 | -h="": 容器的主机名称 203 | -i=false: 保持输入流开放即使没有附加输入流 204 | -privileged=false: 给容器扩展的权限 205 | -m="": 内存限制 (格式: , unit单位 = b, k, m or g) 206 | -n=true: 允许镜像使用网络 207 | -p=[]: 匹配镜像内的网络端口号 208 | -rm=false:当容器退出时自动删除容器 (不能跟 -d一起使用) 209 | -t=false: 分配一个伪造的终端输入 210 | -u="": 用户名或者ID 211 | -dns=[]: 自定义容器的DNS服务器 212 | -v=[]: 创建一个挂载绑定:[host-dir]:[container-dir]:[rw|ro]. 如果容器目录丢失,docker会创建一个新的卷 213 | -volumes-from="": 挂载容器所有的卷 214 | -entrypoint="": 覆盖镜像设置默认的入口点 215 | -w="": 工作目录内的容器 216 | -lxc-conf=[]: 添加自定义 -lxc-conf="lxc.cgroup.cpuset.cpus = 0,1" 217 | -sig-proxy=true: 代理接收所有进程信号 (even in non-tty mode) 218 | -expose=[]: 让你主机没有开放的端口 219 | -link="": 连接到另一个容器 (name:alias) 220 | -name="": 分配容器的名称,如果没有指定就会随机生成一个 221 | -P=false: Publish all exposed ports to the host interfaces 公布所有显示的端口主机接口 222 | 223 | docker会先创建一个新的可写的容器层来指定镜像,通过指定命令来启动他,`docker run `相当于运行API/containers/create在/container/(id)/start之前 224 | 225 | `docker run`命令可以用结合`docker commit`来改变正在运行的容器! 226 | 227 | ###知道问题(run -volumes-from) 228 | 229 | Issue 2702: “lxc-start: Permission denied - failed to mount” 这是AppArmor一个权限的问题,请参见问题解决方案 230 | 231 | $ sudo docker run -cidfile /tmp/docker_test.cid ubuntu echo "test" 232 | 233 | 这个命令将会创建一个容器,并且在终端打印'test',cidfile参数使docker试图穿件一个文件并且写入容器的id,如果这个文件存在,docker就会返回一个错误,如果`docker run`exists,docker就会关闭这个文件! 234 | 235 | $ sudo docker run -t -i -rm ubuntu bash 236 | root@bc338942ef20:/# mount -t tmpfs none /mnt 237 | mount: permission denied 238 | 239 | 这条命令没有执行,因为在默认情况下,大多数有潜在危险内核命令都被舍弃,包括cap_sys_admin(需要挂载文件系统),然而 240 | -privileged参数会让其执行 241 | 242 | $ sudo docker run -privileged ubuntu bash 243 | root@50e3f57e16e6:/# mount -t tmpfs none /mnt 244 | root@50e3f57e16e6:/# df -h 245 | Filesystem Size Used Avail Use% Mounted on 246 | none 1.9G 0 1.9G 0% /mnt 247 | 248 | -privileged参数给容器所有功能,同时它也强迫升级了所有设备的执行权限,换句话说,这个容器已经有了所有主机能做的事情,这个参数的存在允许特殊的用例,像docker内运行docker 249 | 250 | $ sudo docker run -w /path/to/dir/ -i -t ubuntu pwd 251 | 252 | -w 让命令在在目录/path/to/dir内运行,如果路径不存在创建,在容器外运行 253 | 254 | ![docker run -w](http://yun.widuu.com/docker/run-w1.png) 255 | 256 | $ sudo docker run -v `pwd`:`pwd` -w `pwd` -i -t ubuntu pwd 257 | 258 | ![docker run -v -w](http://yun.widuu.com/docker/run-w.png) 259 | 260 | -v参数安装当前工作目录到容器中,-w参数让命令在当前目录执行,通过pwd改变目录的返回值,这种组合命令使容器在当前目录下中心命令! 261 | 262 | $ sudo docker run -p 127.0.0.1:80:8080 ubuntu bash 263 | 264 | 容器的8080端口绑定在主机127.0.0.1的80端口。端口重定向解释了docker的端口是如何工作的 265 | 266 | $ sudo docker run -expose 80 ubuntu bash 267 | 268 | 让主机系统开放80端口供容器连接 269 | 270 | $ sudo docker run -name console -t -i ubuntu bash 271 | 272 | 这会创建一个新的容器并且运行bash,容器的名字是console 273 | 274 | ![docker run -name](http://yun.widuu.com/docker/name.png) 275 | 276 | $ sudo docker run -link /redis:redis -name console ubuntu bash 277 | 278 | -link表示会将连接一个名为/redis的容器到新建的一个容器别名叫做redis,新的容器可以通过redis容器的环境变量访问网络和环境, -name参数会将名字console分配给新建的容器! 279 | 280 | ![docker run -link](http://yun.widuu.com/docker/link.png) 281 | 282 | $ sudo docker run -volumes-from 777f7dc92da7,ba8c0c54f0f2:ro -i -t ubuntu pwd 283 | 284 | -volumes-from 参数将从引用容器中挂载所有定义的卷. 容器引用列表可以用逗号分隔或者重复的引用 -volumes-from参数. 容器ID可以用:ro或者:rw来作为后缀挂载卷来标识只读或者读写权限,默认情况下,挂载的权限(读写权限)和引用容器的权限相同. 285 | 286 | ###一个完整的例子 287 | 288 | $ sudo docker run -d -name static static-web-files sh 289 | $ sudo docker run -d -expose=8098 -name riak riakserver 290 | $ sudo docker run -d -m 100m -e DEVELOPMENT=1 -e BRANCH=example-code -v $(pwd):/app/bin:ro -name app appserver 291 | $ sudo docker run -d -p 1443:443 -dns=dns.dev.org -v /var/log/httpd -volumes-from static -link riak -link app -h www.sven.dev.org -name web webserver 292 | $ sudo docker run -t -i -rm -volumes-from web -w /var/log/httpd busybox tail -f access.log 293 | 294 | 这个实例展示了5个容器设置测试一个web应用程序的改变: 295 | 296 | 后台运行一个已经准备好的镜像卷 static-web-files,镜像里含有CSS,images,和静态html, (Dockerfile中的卷指令允许web server使用这些文件); 297 | 298 | 运行一个预先准备好的riakserver,给这个容器命名为riak,并且开放8098端口让其它镜像可以连接它! 299 | 300 | give the container name riak and expose port 8098 to any containers that link to it; 301 | 302 | 运行一个appserver镜像,限制它的内存时100MB,设置两个环境变量DEVELOPMENT和BRANCH,并且依只读模式将本地文件pwd的目录挂载绑定到你容器的/app/bin下 303 | 304 | 运行webserver,将容器443端口映射到外部的docker主机的1443端口,设置DNS服务dns.dev.org,创建一个卷来存放日志文件(所以我们可以从另外的主机访问它),导入静态文件从开放的8098端口,从static容器,连接riak和app的所有开放端口,最后我们设置hostname web.sven.dev.org,与生成的SSL证书一致. 305 | 306 | 307 | 最终,我们创建了一个容器,可以运行tail -f access.log来查看web容器的卷日志,设置工作目录是/var/log/httpd. -rm表示的意思是如果这个容器存在,我们就删除容器的层 308 | 309 | 310 | ##save 311 | 312 | Usage: docker save image > repository.tar 313 | 314 | 通过标准输出流存储镜像包含所有父层的、tag、version 315 | 316 | ##search 317 | 318 | Usage: docker search TERM 319 | 320 | 搜索docker 镜像 321 | 322 | -notrunc=false: 不截断输出 323 | -stars=0: 仅仅输出带有lastest标记的镜像 324 | -trusted=false: 只显示被信任的构建 325 | 326 | ##start 327 | 328 | Usage: docker start [OPTIONS] CONTAINER 329 | 330 | 启动一个停止的容器 331 | 332 | -a=false: 附加标准输入和输出,并转发所有进程信号 333 | -i=false: 附加标准输入 334 | 335 | ##stop 336 | 337 | Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...] 338 | 339 | 关闭一个容器 340 | 341 | -t=10: 等待停止容器需要的时间 342 | 343 | 这个容器主进程接收终止进程信号,在一段时间内,终止 344 | 345 | ##tag 346 | 347 | Usage: docker tag [OPTIONS] IMAGE REPOSITORY[:TAG] 348 | 349 | 给镜像仓库添加标签 350 | 351 | -f=false: Force 352 | 353 | ##top 354 | 355 | Usage: docker top CONTAINER [ps OPTIONS] 356 | 357 | 查看容器内运行的进程 358 | 359 | ![docker top](http://yun.widuu.com/docker/top.png) 360 | 361 | ##version 362 | 363 | 显示docker的版本和最后更新版本信息 364 | 365 | ##wait 366 | 367 | Usage: docker wait [OPTIONS] NAME 368 | 369 | 等待容器停止,打印出退出编码 -------------------------------------------------------------------------------- /contributing/devenv.md: -------------------------------------------------------------------------------- 1 | #设置一个开发环境 2 | 3 | 更容易的使用docker,我们提供了一个标准的开发环境,同样的测试、构建和发布环境是非常重要的。标准开发环境定义所有构建的系统库和二进制文件、go环境、go依赖环境等等 4 | 5 | ##Step 1: 安装Docker 6 | 7 | docker构建环境本身就是一个docker容器,所以你第一步需要在你的主机上安装docker 8 | 9 | 你可以按照相关系统的安装说明来安装,为了确保正常工作,你需要升级到最新的docker安装版本,然后再执行下一步 10 | 11 | ##Step 2: 获取资源文件 12 | 13 | git clone http://git@github.com/dotcloud/docker 14 | cd docker 15 | 16 | ##Step 3: 构建环境 17 | 18 | 下面命令会使用当前目录下的dockerfile来建立开发环境,从本质上将,它将安装所有运行时 测试docker的所有依赖包,这个命令在第一次执行时候需要一点时间 19 | 20 | sudo make build 21 | 22 | 如果编译成功,祝贺你!你有纯净的docker,封装了一个标准的构建环境 23 | 24 | ##Step 4: 创建docker的二进制文件 25 | 26 | 创建docker二进制文件,运行下边的命令 27 | 28 | sudo make binary 29 | 30 | 这将会在 ./bundles/-dev/binary/创建二进制文件 31 | 32 | ##用你创建的二进制文件 33 | 34 | 允许在容器外执行的目录是./bundles/-dev/binary/. 你可以交换docker的可执行文件与二进制文件进行现场测试 例如在ubuntu上 35 | 36 | sudo service docker stop ; sudo cp $(which docker) $(which docker)_ ; sudo cp ./bundles/-dev/binary/docker--dev $(which docker);sudo service docker start 37 | 38 | >Note:Its safer to run the tests below before swapping your hosts docker binary. 39 | 40 | ##Step 5: 执行测试 41 | 42 | 执行测试,运行这个命令 43 | 44 | sudo make test 45 | 46 | >注意:如果你在vagrant中运行测试,你需要手动指定dns条目(或者编辑Makefile文件,或者手动运行): 47 | 48 | sudo docker run -dns 8.8.8.8 -privileged -v `pwd`:/go/src/github.com/dotcloud/docker docker hack/make.sh test 49 | 50 | 如果测试成功,输入的结构应该是这样的 51 | 52 | --- PASS: TestWriteBroadcaster (0.00 seconds) 53 | === RUN TestRaceWriteBroadcaster 54 | --- PASS: TestRaceWriteBroadcaster (0.00 seconds) 55 | === RUN TestTruncIndex 56 | --- PASS: TestTruncIndex (0.00 seconds) 57 | === RUN TestCompareKernelVersion 58 | --- PASS: TestCompareKernelVersion (0.00 seconds) 59 | === RUN TestHumanSize 60 | --- PASS: TestHumanSize (0.00 seconds) 61 | === RUN TestParseHost 62 | --- PASS: TestParseHost (0.00 seconds) 63 | === RUN TestParseRepositoryTag 64 | --- PASS: TestParseRepositoryTag (0.00 seconds) 65 | === RUN TestGetResolvConf 66 | --- PASS: TestGetResolvConf (0.00 seconds) 67 | === RUN TestCheckLocalDns 68 | --- PASS: TestCheckLocalDns (0.00 seconds) 69 | === RUN TestParseRelease 70 | --- PASS: TestParseRelease (0.00 seconds) 71 | === RUN TestDependencyGraphCircular 72 | --- PASS: TestDependencyGraphCircular (0.00 seconds) 73 | === RUN TestDependencyGraph 74 | --- PASS: TestDependencyGraph (0.00 seconds) 75 | PASS 76 | ok github.com/dotcloud/docker/utils 0.017s 77 | 78 | ##Step 6: 使用Docker 79 | 80 | 你可以新建一个容器,运行一个交互式回话 81 | 82 | sudo make shell 83 | 84 | # type 'exit' or Ctrl-D to exit 85 | 86 | ##Extra Step: 创建文档 87 | 88 | 如果你想从你的本地网站来阅读文档,会进行更改,你可以构建文档服务 89 | 90 | sudo make docs 91 | # when its done, you can point your browser to http://yourdockerhost:8000 92 | # type Ctrl-C to exit -------------------------------------------------------------------------------- /contributing/dockercon.md: -------------------------------------------------------------------------------- 1 | #贡献Docker 2 | 3 | 想要做Docker黑客吗?太棒了! 4 | 5 | 存储库中包含了你所有需要开始的命令https://github.com/dotcloud/docker/blob/master/CONTRIBUTING.md 6 | 7 | [开发环境的Dockerfile](https://github.com/dotcloud/docker/blob/master/Dockerfile)是指定使用创建docker的版本测试工具 8 | 9 | 如果你要修改文档请查看[README.md](https://github.com/dotcloud/docker/blob/master/docs/README.md) 10 | 11 | [文档环境Dockerfile](https://github.com/dotcloud/docker/blob/master/docs/Dockerfile)是构建文档指定的版本工具 12 | 13 | 更多有趣的细节可以在包中查找 -------------------------------------------------------------------------------- /example/cfengine.md: -------------------------------------------------------------------------------- 1 | #Process Management with CFEngine 2 | 3 | 创建Docker容器来管理进程 4 | 5 | docker监控容器的进程从开始到结束的整个过程,通过在Docker容器内引入CFEngine,我们可以解决以下几个问题: 6 | 7 | - 可以轻松的在一个容器内启动多个进程,并且所有进程将呗自动管理,与标准的docker run 命令。 8 | 9 | - 如果管理进程终止或者崩溃,CFEngine会在一分钟内重新启动它。 10 | 11 | - 容器本身的生存是入住在CFEgine的后台进程中生存的,CFEgine中,我们能够分离正常运行的服务的容器 12 | 13 | ##如何工作 14 | 15 | CFEngine,和cfe-docker融合使用,将会作为Dockerfile中安装的一部分。来用作创建我们的Docker的CFEngine镜像。 16 | 17 | Dockerfile的ENTRYPOINT需要任意数量的命令(与任何需要的参数)作为参数,当我们运行docker容器,这些会被写如到CFEngine策略中并且由CFEngine接管,以确保容器运行在一个理想的过程中 18 | 19 | 如果没有找到basename ,CFEngine会扫描进程表通过ENTRYPOINT给的基本命令来生成basename ,并在进程启动时运行命令。举例,如果我们启动容器使用 docker run "/path/to/my/application parameters",CFEngine将会查找一个进程命名的应用并运行命令,如果在进程表的任何时间内没有找到这个进程,CFEngine将会再次执行/path/to/my/application parameters来启动应用,它会检查进程表在每一分钟内发生的变化。 20 | 21 | 请注意,因此重要的是启动你的应用程序来离开相对文件的命令,如果你需要你可以做一些小CFEngine策略调整,使其更加灵活 22 | 23 | ##使用 24 | 这个例子假设你已经安装好了docker并且正常运行,我们将会在一个容器中安装和管理apache2和sshd。 25 | 26 | 这里有三个步骤: 27 | 28 | - 在容器内安装CFEngine。 29 | 30 | - 复制CFEngine进程管理策略到已经安装的CFEngine容器内。 31 | 32 | - 启动你的应用进程作为docker运行的一部分 33 | 34 | ##创建一个镜像容器 35 | 36 | 前两个步骤可以作为Dockerfile的一部分,如下 37 | 38 | FROM ubuntu 39 | MAINTAINER Eystein Måløy Stenberg 40 | 41 | RUN apt-get -y install wget lsb-release unzip 42 | 43 | # install latest CFEngine 44 | RUN wget -qO- http://cfengine.com/pub/gpg.key | apt-key add - 45 | RUN echo "deb http://cfengine.com/pub/apt $(lsb_release -cs) main" > /etc/apt/sources.list.d/cfengine-community.list 46 | RUN apt-get update 47 | RUN apt-get install cfengine-community 48 | 49 | # install cfe-docker process management policy 50 | RUN wget --no-check-certificate https://github.com/estenberg/cfe-docker/archive/master.zip -P /tmp/ && unzip /tmp/master.zip -d /tmp/ 51 | RUN cp /tmp/cfe-docker-master/cfengine/bin/* /var/cfengine/bin/ 52 | RUN cp /tmp/cfe-docker-master/cfengine/inputs/* /var/cfengine/inputs/ 53 | RUN rm -rf /tmp/cfe-docker-master /tmp/master.zip 54 | 55 | # apache2 and openssh are just for testing purposes, install your own apps here 56 | RUN apt-get -y install openssh-server apache2 57 | RUN mkdir -p /var/run/sshd 58 | RUN echo "root:password" | chpasswd # need a password for ssh 59 | 60 | ENTRYPOINT ["/var/cfengine/bin/docker_processes_run.sh"] 61 | 62 | 通过在你的工作目录保存Dockerfile,你可以通过docker build命令来创建你的容器,docker build -t managed_image. 63 | 64 | ##测试容器 65 | 66 | 启动容器apache2和sshd运行和管理,转发端口SSH实例: 67 | 68 | docker run -p 127.0.0.1:222:22 -d managed_image "/usr/sbin/sshd" "/etc/init.d/apache2 start" 69 | 70 | 现在我们可以看到cfe-docker集成的好处,它允许我们使用docker run命令启动多个进程。 71 | 72 | 我们现在可以登录我们新创建容器并且发现apache2和sshd正在运行,我们需要在上边的Dockerfile文件设置root密码来登录ssh: 73 | 74 | ssh -p222 root@127.0.0.1 75 | 76 | ps -ef 77 | UID PID PPID C STIME TTY TIME CMD 78 | root 1 0 0 07:48 ? 00:00:00 /bin/bash /var/cfengine/bin/docker_processes_run.sh /usr/sbin/sshd /etc/init.d/apache2 start 79 | root 18 1 0 07:48 ? 00:00:00 /var/cfengine/bin/cf-execd -F 80 | root 20 1 0 07:48 ? 00:00:00 /usr/sbin/sshd 81 | root 32 1 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start 82 | www-data 34 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start 83 | www-data 35 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start 84 | www-data 36 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start 85 | root 93 20 0 07:48 ? 00:00:00 sshd: root@pts/0 86 | root 105 93 0 07:48 pts/0 00:00:00 -bash 87 | root 112 105 0 07:49 pts/0 00:00:00 ps -ef 88 | 89 | 如果我们停止apache2,CFEngine会在一分钟内重启它。 90 | 91 | service apache2 status 92 | Apache2 is running (pid 32). 93 | service apache2 stop 94 | * Stopping web server apache2 ... waiting [ OK ] 95 | service apache2 status 96 | Apache2 is NOT running. 97 | # ... wait up to 1 minute... 98 | service apache2 status 99 | Apache2 is running (pid 173). 100 | 101 | ##选配你的应用程序 102 | 103 | 为了确保你的应用程序以相同的方式得到管理,目前你可以在上边的例子中做两处调整: 104 | 105 | - 在上边的Dockerfile安装你的应用来代替apache2和sshd。 106 | 107 | - 当你docker run启动容器, 则在你的应用程序内指定命令参数,而不是apache2和sshd -------------------------------------------------------------------------------- /example/couchdb.md: -------------------------------------------------------------------------------- 1 | #CouchDB Service 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | 这里有一个例子,使用数据卷在两个CouchDb之间共享相同的数据容器,这个可以用于热生计,测试不同版本的CouchDB数据等等 8 | 9 | ##创建第一个数据库 10 | 11 | 现在我们创建/var/lib/couchdb作为数据卷 12 | 13 | COUCH1=$(sudo docker run -d -p 5984 -v /var/lib/couchdb shykes/couchdb:2013-05-03) 14 | 15 | ##添加一条数据在第一个数据库中 16 | 17 | 我们假设你的docker主机默认是本地localhost.如果不是localhost请换到你docker的公共IP 18 | 19 | HOST=localhost 20 | URL="http://$HOST:$(sudo docker port $COUCH1 5984 | grep -Po '\d+$')/_utils/" 21 | echo "Navigate to $URL in your browser, and use the couch interface to add data" 22 | 23 | ##创建第二个数据库 24 | 25 | 这次,我们请求共享访问$COUCH1的卷。 26 | 27 | COUCH2=$(sudo docker run -d -p 5984 -volumes-from $COUCH1 shykes/couchdb:2013-05-03) 28 | 29 | ##在第二个数据库上来浏览数据 30 | 31 | HOST=localhost 32 | URL="http://$HOST:$(sudo docker port $COUCH2 5984 | grep -Po '\d+$')/_utils/" 33 | echo "Navigate to $URL in your browser. You should see the same data as in the first database"'!' 34 | 35 | 祝贺你,你已经运行了两个Couchdb容器,并且两个都相互独立,除了他们的数据 36 | 37 | -------------------------------------------------------------------------------- /example/helloword.md: -------------------------------------------------------------------------------- 1 | #Hello word 2 | 3 | --- 4 | 5 | ##运行例子 6 | 7 | 8 | 所有的实例你都需要在你的机器中运行docker进程,后台运行docker进程,简单演示 9 | 10 | sudo docker -d & 11 | 12 | 13 | 现在你可以运行Docker客户端,默认情况下所有的命令都会经过一个受保护的Unix socket转发给docker进程,所以我们必须运行root或者通过sudo授权。 14 | 15 | sudo docker help 16 | 17 | ##hello word 18 | 19 | 20 | >注: 21 | 22 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 23 | 24 | 这个是docker的最基础的使用例子 25 | 26 | 27 | 下载ubuntu base镜像 28 | 29 | # Download an ubuntu image 30 | sudo docker pull ubuntu 31 | 32 | --- 33 | 34 | (注:非官方)相对比较而且你可以下载busybox镜像,他是最小的linux系统,这个镜像可以从docker仓库获取! 35 | 36 | sudo docker pull busybox 37 | 38 | --- 39 | 40 | sudo docker run ubuntu /bin/echo hello world 41 | 42 | 43 | 这个命令会运行一个简单的echo 命令,这个时候我们的控制其就会输出"hello word"。 44 | 45 | 讲解: 46 | 47 | - `sudo` 执行root权限 48 | - `docker run` 运行一个新的容器 49 | - `ubuntu` 我们想要在内部运行命令的镜像 50 | - `/bin/echo` 我们想要在内部运行的命令 51 | - `hello word` 输出的内容 52 | 53 | ##Hello World 进程 54 | 55 | >注: 56 | 57 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 58 | 59 | 这是有史以来最无聊的进程 60 | 61 | 62 | 这个例子假设是你已经安装了docker,并且你已经通过docker pull下载导入了ubuntu镜像,我们将会用到ubuntu镜像运行一些姜丹的例子hello word进程,这里的将会每秒钟打印出hello word一直到我们停止他 63 | 64 | CONTAINER_ID=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done") 65 | 66 | 67 | 我们已经用ubuntu镜像新建一个容器并且运行了一个简单的hello world进程 68 | 69 | - `sudo docker run -d` 运行提个新的容器,我们通过-d命令让他作为一个进程运行 70 | - `ubuntu` 是一个我们想要在内部运行命令的镜像 71 | - `/bin/sh -c` 是我们想要在容器内部运行的命令 72 | - `while true; do echo hello world; sleep 1; done` 这是一个简单的脚本,我们仅仅只是每秒打印一次hello word 一直到我们结束它 73 | - `$CONTAINER_ID` 我们运行命令将会返回一个容器id 74 | 75 | sudo docker logs $CONTAINER_ID 76 | 77 | Check the logs make sure it is working correctly. 78 | 79 | 我们查看日志文件来确认它是否正常工作 80 | 81 | - `docker logs` 返回容器的日志 82 | - `$CONTAINER_ID` 我们想查看的容器ID 83 | 84 | sudo docker attach -sig-proxy=false $CONTAINER_ID 85 | 86 | 连接到容器实时查看结果 87 | 88 | 89 | - `docker attach` 允许我们查看一个后台进程. 90 | - `-sig-proxy=false` 不使用容器转发信号,允许我们使用ctrl -c来退出 91 | - `$CONTAINER_ID` 我们要查看的容器id 92 | 93 | sudo docker ps 94 | 95 | 查看正在运行的进程 96 | 97 | `docker ps`查看所有运行的docker管理进程 98 | 99 | sudo docker stop $CONTAINER_ID 100 | 101 | 当我们不需要时停止容器 102 | 103 | - `docker stop` 停止一个容器 104 | - `$CONTAINER_ID` 我们需要停止的容器id 105 | 106 | 确认它是否停止了 107 | 108 | sudo docker ps -------------------------------------------------------------------------------- /example/mongodb.md: -------------------------------------------------------------------------------- 1 | #Building an Image with MongoDB 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | 这个例子是讲述如何创建你的已经安装号mongodb的docker镜像,我们会通过构造一个Dockerfile来下载一个基础镜像,增加一个apt源和在ubuntu安装数据库软件 8 | 9 | ##创建一个Dockerfile 10 | 11 | 创建一个空的Dockerfile文件 12 | 13 | touch Dockerfile 14 | 15 | 下一步,定义你你需要构建你的镜像的父级镜像,这里我们使用ubuntu(tag:latest)可从docker index获得: 16 | 17 | FROM ubuntu:latest 18 | 19 | 这里我们想要运行最新的mongodb,我们需要添加10gen repo到我们的源 20 | 21 | # Add 10gen official apt source to the sources list 22 | RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 23 | RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/ sources.list.d/ 24 | 25 | 这里我们不希望ubuntu报出init不可用,我们需要转移专一/sbin/initctl 到 /bin/true,认为一切都是可以正常工作的 26 | 27 | # Hack for initctl not being available in Ubuntu 28 | RUN dpkg-divert --local --rename --add /sbin/initctl 29 | RUN ln -s /bin/true /sbin/initctl 30 | 31 | 之后我们就更新存储库和安装mongodb 32 | 33 | # Install MongoDB 34 | RUN apt-get update 35 | RUN apt-get install mongodb-10gen 36 | 37 | 我们需要创建一个数据库目录运行mongodb(因为我们希望它运行还需要提供一个特殊的配置文件) 38 | 39 | # Create the MongoDB data directory 40 | RUN mkdir -p /data/db 41 | 42 | 最后我们需要开放mongodb运行的端口27107,我们用ENTRYPOINT指令来定义这个容器 43 | 44 | EXPOSE 27017 45 | ENTRYPOINT ["usr/bin/mongod"] 46 | 47 | 现在,我们通过我们制作的Dockerfile创建镜像 48 | 49 | sudo docker build -t /mongodb . 50 | 51 | 现在我们需要确定运行mongodb作为一个后台进程,并且本地可以连接它 52 | 53 | # Regular style 54 | MONGO_ID=$(sudo docker run -d /mongodb) 55 | 56 | # Lean and mean 57 | MONGO_ID=$(sudo docker run -d /mongodb --noprealloc --smallfiles) 58 | 59 | # Check the logs out 60 | sudo docker logs $MONGO_ID 61 | 62 | # Connect and play around 63 | mongo --port 64 | 65 | 酷毙了! -------------------------------------------------------------------------------- /example/node.md: -------------------------------------------------------------------------------- 1 | #Node.js Web App 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | 这个例子目的是展示如何用父镜像创建自己的镜像,修改和保存一个新的镜像,我们会通过一个简单的web镜像做hello沙箱测试 8 | 9 | 这个例子的目的是想你展示如何使用Dockerfile来创建自己的docker,我们将会制作一个简单的node.js的hello word web应用运行在centos容器上。有你可以获取所有源代码在[https://github.com/gasi/docker-node-hello.](https://github.com/gasi/docker-node-hello.) 10 | 11 | ##创建一个Node.js 应用 12 | 13 | 首先,创建一个package.json文件来作为描述文件和依赖: 14 | 15 | { 16 | "name": "docker-centos-hello", 17 | "private": true, 18 | "version": "0.0.1", 19 | "description": "Node.js Hello World app on CentOS using docker", 20 | "author": "Daniel Gasienica ", 21 | "dependencies": { 22 | "express": "3.2.4" 23 | } 24 | } 25 | 26 | 现在,创建一个index.ks文件。。来设置一个web应用使用Express.js 框架: 27 | 28 | var express = require('express'); 29 | 30 | // Constants 31 | var PORT = 8080; 32 | 33 | // App 34 | var app = express(); 35 | app.get('/', function (req, res) { 36 | res.send('Hello World\n'); 37 | }); 38 | 39 | app.listen(PORT) 40 | console.log('Running on http://localhost:' + PORT); 41 | 42 | 下一步,我们将看到如何使用docker运行这个app在centos容器内,第一步,你需要为你的app创建一个Docker镜像 43 | 44 | ##创建Dockerfile 45 | 46 | 创建一个空的Dockerfile文件 47 | 48 | touch Dockerfile 49 | 50 | 用你喜欢的编辑器打开Dockerfile并且添加一行来要求docker的版本来创建镜像: 51 | 52 | # DOCKER-VERSION 0.3.4 53 | 54 | 接下来,定义父镜像用于构建自己的镜像,在这里我们使用Centps(tag:6.4)在[Docker index](https://index.docker.io/): 55 | 56 | FROM centos:6.4 57 | 58 | 因为我们正在创建一个node.js的应用,我们就要先安装node.js使用的npm在你的centos镜像中,node.js运行运行你的应用并且通过npm安装你的app应用程序的依赖包.正确的安装centosnpm包,我们可以使用[Node.js wiki](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager#rhelcentosscientific-linux-6)的指令: 59 | 60 | # Enable EPEL for Node.js 61 | RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 62 | # Install Node.js and npm 63 | RUN yum install -y npm 64 | 65 | 捆绑你的应用程序源代码在你的docker镜像内,你可以使用ADD指令 66 | 67 | # Bundle app source 68 | ADD . /src 69 | 70 | 安装你的应用程序的二进制依赖包: 71 | 72 | # Install app dependencies 73 | RUN cd /src; npm install 74 | 75 | 你的应用绑定8080端口,所以你需要使用EXPOSE指令来映射到docker后台进程 76 | 77 | EXPOSE 8080 78 | 79 | 最后但并不是不重要,定义命令来运行你的应用程序,是用CMD指令来指定运行node 你的应用程序路径,即src/index.js(参见不周我们将源代码添加到容器中) 80 | 81 | CMD ["node", "/src/index.js"] 82 | 83 | 现在你的Dockerfile像下边这样 84 | 85 | # DOCKER-VERSION 0.3.4 86 | FROM centos:6.4 87 | 88 | # Enable EPEL for Node.js 89 | RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 90 | # Install Node.js and npm 91 | RUN yum install -y npm 92 | 93 | # Bundle app source 94 | ADD . /src 95 | # Install app dependencies 96 | RUN cd /src; npm install 97 | 98 | EXPOSE 8080 99 | CMD ["node", "/src/index.js"] 100 | 101 | ##创建你的镜像 102 | 103 | 来到你的Dockerfile目录并运行创建命令来创建一个docker镜像,-t参数让你设置的镜像名称,所以稍后用docker images命令你会很容器找到你的镜像: 104 | 105 | sudo docker build -t /centos-node-hello . 106 | 107 | 你的镜像现在将会列出来: 108 | 109 | sudo docker images 110 | 111 | > # Example 112 | > REPOSITORY TAG ID CREATED 113 | > centos 6.4 539c0211cd76 8 weeks ago 114 | > gasi/centos-node-hello latest d64d3505b0d2 2 hours ago 115 | 116 | ##运行镜像 117 | 118 | 用-d运行你的镜像在后台模式下,-p参数会将你容器的私有端口转发到你主机上的共有端口,运行你创建的镜像 119 | 120 | sudo docker run -p 49160:8080 -d /centos-node-hello 121 | 122 | 打印你的APP输出 123 | 124 | # Get container ID 125 | sudo docker ps 126 | 127 | # Print app output 128 | sudo docker logs 129 | 130 | > # Example 131 | > Running on http://localhost:8080 132 | 133 | ##测试 134 | 135 | 测试你的应用,获得你的应用端口在主机上映射出的端口: 136 | 137 | sudo docker ps 138 | 139 | > # Example 140 | > ID IMAGE COMMAND ... PORTS 141 | > ecce33b30ebf gasi/centos-node-hello:latest node /src/index.js 49160->8080 142 | 143 | 上边的例子,docker映射8080端口到容器的49160端口 144 | 145 | 现在你可以用curl你的app应用(通过`sudo apt-get install curl`安装curl) 146 | 147 | curl -i localhost:49160 148 | 149 | > HTTP/1.1 200 OK 150 | > X-Powered-By: Express 151 | > Content-Type: text/html; charset=utf-8 152 | > Content-Length: 12 153 | > Date: Sun, 02 Jun 2013 03:53:22 GMT 154 | > Connection: keep-alive 155 | > 156 | > Hello World 157 | 158 | 如果你想同学学习运行node.js在centos在docker上,你可以获取全部的源代码在[https://github.com/gasi/docker-node-hello.](https://github.com/gasi/docker-node-hello.) -------------------------------------------------------------------------------- /example/postgresql.md: -------------------------------------------------------------------------------- 1 | #PostgreSQL Service 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | ##在docker安装PostgreSQL 8 | 9 | 运行一个docker容器shell 10 | 11 | sudo docker run -i -t ubuntu /bin/bash 12 | 13 | 升级依赖包 14 | 15 | apt-get update 16 | 17 | 安装 python-software-properties, software-properties-common, wget and vim. 18 | 19 | apt-get -y install python-software-properties software-properties-common wget vim 20 | 21 | 添加PostgreSQL的存储库,它包含了PostgreSQL最新稳定版本9.3。 22 | 23 | wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - 24 | echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list 25 | apt-get update 26 | 27 | 最后,我们安装PostgreSQL9.3 28 | 29 | apt-get -y install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3 30 | 31 | 现在,创建一个PostgreSQL超级用户,来创建数据库和其他工作,Vagrant’s 惯例角色名字是docker并且把docker的密码分配给它 32 | 33 | su postgres -c "createuser -P -d -r -s docker" 34 | 35 | 创建一个测试数据库名字也叫docker所有者是上边我们创建的docker角色 36 | 37 | su postgres -c "createdb -O docker docker" 38 | 39 | 调整PostgreSQL配置,远程连接到数据库。确保在 /etc/postgresql/9.3/main/postgresql.conf有以下行 40 | 41 | host all all 0.0.0.0/0 md5 42 | 43 | 另外, 在 /etc/postgresql/9.3/main/postgresql.conf 取消监听地址,像这样: 44 | 45 | listen_addresses='*' 46 | 47 | >注意 48 | 49 | >这对于开发postgresql设置是唯一的,请参考postgresql文档如何调整这些设置,以确保安全 50 | 51 | 退出 52 | 53 | exit 54 | 55 | 创建一个容器,给它添加名字。容器 在bash中有提示;你可以本地使用docker ps -a获得。 56 | 57 | sudo docker commit /postgresql 58 | 59 | 最后通过docker运行postgresql服务 60 | 61 | CONTAINER=$(sudo docker run -d -p 5432 \ 62 | -t /postgresql \ 63 | /bin/su postgres -c '/usr/lib/postgresql/9.3/bin/postgres \ 64 | -D /var/lib/postgresql/9.3/main \ 65 | -c config_file=/etc/postgresql/9.3/main/postgresql.conf') 66 | 67 | 使用psql PostgreSQL服务器(您将需要连接到PostgreSQL客户机上安装这台机器。对于ubuntu,使用sudo apt-get安装postgresql-client)。 68 | 69 | CONTAINER_IP=$(sudo docker inspect -format='{{.NetworkSettings.IPAddress}}' $CONTAINER) 70 | psql -h $CONTAINER_IP -p 5432 -d docker -U docker -W 71 | 72 | 在这之前如果你需要,请创建用户或者数据库 73 | 74 | psql (9.3.1) 75 | Type "help" for help. 76 | 77 | docker=# CREATE DATABASE foo OWNER=docker; 78 | CREATE DATABASE 79 | 80 | 另外,提交你的新创建的镜像到docker index 81 | 82 | sudo docker login 83 | Username: 84 | [...] 85 | 86 | sudo docker push /postgresql 87 | 88 | PostgreSQL服务自动启动 89 | 90 | 运行我们的镜像似乎很复杂,我们必须指定docker运行整个命令,让我们简化服务器启动时自动运行的命令。 91 | 92 | sudo docker commit -run='{"Cmd": \ 93 | ["/bin/su", "postgres", "-c", "/usr/lib/postgresql/9.3/bin/postgres -D \ 94 | /var/lib/postgresql/9.3/main -c \ 95 | config_file=/etc/postgresql/9.3/main/postgresql.conf"], "PortSpecs": ["5432"]}' \ 96 | /postgresql 97 | 98 | 从现在开始,只需要输入 docker run /postgresql ,PostgreSQL就会自动启动了 99 | 100 | 101 | -------------------------------------------------------------------------------- /example/python.md: -------------------------------------------------------------------------------- 1 | #Python Web App 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | 这个例子目的是展示如何用父镜像创建自己的镜像,修改和保存一个新的镜像,我们会通过一个简单的web镜像做hello沙箱测试 8 | 9 | ##步骤 10 | 11 | sudo docker pull shykes/pybuilder 12 | 13 | 我们要下载shykes/pybuilder的docker镜像 14 | 15 | URL=http://github.com/shykes/helloflask/archive/master.tar.gz 16 | 17 | 我们通过设置URl来指向一个简单的helloflask web的简单应用 18 | 19 | BUILD_JOB=$(sudo docker run -d -t shykes/pybuilder:latest /usr/local/bin/buildapp $URL) 20 | 21 | 在shykes/pybuilder镜像内部有一个叫buildapp的命令,通过URL的值运行后创建一个新的容器,其中BUILD_JOB就是容器返回的id 22 | 23 | sudo docker attach -sig-proxy=false $BUILD_JOB 24 | 25 | 当容器运行时,我们可以连接容器来查看,参数-sig-proxy设置fasle允许我们连接和断开(CTRL -c)这个容器 26 | 27 | sudo docker ps -a 28 | 29 | 列出所有docker容器,如果容器运行完成,它就会出现在这里 30 | 31 | BUILD_IMG=$(sudo docker commit $BUILD_JOB _/builds/github.com/shykes/helloflask/master) 32 | 33 | 保存镜像的更改,并且新建镜像的名称是 _/builds/github.com/shykes/helloflask/master 34 | 35 | WEB_WORKER=$(sudo docker run -d -p 5000 $BUILD_IMG /usr/local/bin/runapp) 36 | 37 | - `docker run -d` 创建一个新的容器,通过-d参数让他作为一个后台进程运行 38 | - `-p 5000` 这个web应用运行时候的端口,所以这个端口必须从镜像映射到主机上 39 | - `$BUILD_IMG` 我们要运行的容器 40 | - `/usr/local/bin/runapp`是启动web应用的命令 41 | 42 | 43 | 用新创建的容器并且这个容器开放了5000端口,会返回容器id,并且存储了WEB_WORKER变量 44 | 45 | sudo docker logs $WEB_WORKER 46 | 47 | * Running on http://0.0.0.0:5000/ 48 | 49 | 50 | 查看日志上新容器使用WEB_WORKER变量,如果一切按计划工作你应该看到在http://0.0.0.0:5000上运行的日志中输出。 51 | 52 | WEB_PORT=$(sudo docker port $WEB_WORKER 5000 | awk -F: '{ print $2 }') 53 | 54 | 55 | 查找私有端口内存储的web端口值来查看转发到主机的上的公共端口 56 | 57 | # install curl if necessary, then ... 58 | curl http://127.0.0.1:$WEB_PORT 59 | Hello world! 60 | 61 | 通过curl命令来访问,如果正常工作你就会在你的控制台看到hello word -------------------------------------------------------------------------------- /example/redis.md: -------------------------------------------------------------------------------- 1 | #Redis Service 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | 非常简单,没有任何装饰,redis是附加到一个web应用程序使用的一个连接。 8 | 9 | ##创建一个redis docker容器 10 | 11 | 首先,我们先为redis创建一个Dockerfile 12 | 13 | FROM ubuntu:12.10 14 | RUN apt-get update 15 | RUN apt-get -y install redis-server 16 | EXPOSE 6379 17 | ENTRYPOINT ["/usr/bin/redis-server"] 18 | 19 | 现在你需要通过Dockerfile创建一个镜像,将替换成你自己的名字。 20 | 21 | sudo docker build -t /redis . 22 | 23 | ##运行服务 24 | 25 | 使用我们刚才创建的redis镜像 26 | 27 | 使用 -d 运行这个服务f分离模式,让容器在后台运行。 28 | 29 | 重要的是我们没有开放容器端口,相反,我们将使用一个容器来连接redis容器数据库 30 | 31 | sudo docker run -name redis -d /redis 32 | 33 | ##创建你的web应用容器 34 | 35 | 现在我们可以创建我们的应用程序容器,我们使用-link参数来创建一个连接redis容器,我们使用别名db,这将会在redis容器和redis实例容器中创建一个安全的通信隧道 36 | 37 | sudo docker run -link redis:db -i -t ubuntu:12.10 /bin/bash 38 | 39 | 进入我们刚才创建的容器,我们需要安装redis的redis-cli的二进制包来测试连接 40 | 41 | apt-get update 42 | apt-get -y install redis-server 43 | service redis-server stop 44 | 45 | 现在我们可以测试连接,首先我么要先查看下web应用程序容器的环境变量,我们可以用我们的ip和端口来连接redis容器 46 | 47 | env 48 | . . . 49 | DB_NAME=/violet_wolf/db 50 | DB_PORT_6379_TCP_PORT=6379 51 | DB_PORT=tcp://172.17.0.33:6379 52 | DB_PORT_6379_TCP=tcp://172.17.0.33:6379 53 | DB_PORT_6379_TCP_ADDR=172.17.0.33 54 | DB_PORT_6379_TCP_PROTO=tcp 55 | 56 | 我们可以看到我们有一个DB为前缀的环境变量列表,DB来自指定别名连接我们的现在的容器,让我们使用DB_PORT_6379_TCP_ADDR变量连接到Redis容器。 57 | 58 | redis-cli -h $DB_PORT_6379_TCP_ADDR 59 | redis 172.17.0.33:6379> 60 | redis 172.17.0.33:6379> set docker awesome 61 | OK 62 | redis 172.17.0.33:6379> get docker 63 | "awesome" 64 | redis 172.17.0.33:6379> exit 65 | 66 | 我们可以很容易低使用这个或者其他环境变量在我们的web应用程序容器上连接到redis容器 -------------------------------------------------------------------------------- /example/riak.md: -------------------------------------------------------------------------------- 1 | #Riak Service 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | 这个例子会展示如何安装一个预安装号的docker 8 | 9 | ##创建一个Dockerfile 10 | 11 | 创建一个空文件叫做Dockerfile 12 | 13 | touch Dockerfile 14 | 15 | 下一步,定义你想要创建你自己镜像的父级镜像,我们用ubuntu(tag:latest),你可以通过docker index中获取 16 | 17 | # Riak 18 | # 19 | # VERSION 0.1.0 20 | 21 | # Use the Ubuntu base image provided by dotCloud 22 | FROM ubuntu:latest 23 | MAINTAINER Hector Castro hector@basho.com 24 | 25 | 下一步,我们更新APT并且应用一些升级 26 | 27 | # Update the APT cache 28 | RUN sed -i.bak 's/main$/main universe/' /etc/apt/sources.list 29 | RUN apt-get update 30 | RUN apt-get upgrade -y 31 | 32 | 做完以后,我们安装一些依赖包需要一段时间 33 | 34 | - curl 用来下载 Basho’s APT仓库key 35 | - lsb-release 帮助我们获得ubuntu版本代号 36 | - openssh-server 允许我们远程登录容器,加入riak节点组成集群 37 | - supervisor 用来管理openssh和Riak进程 38 | 39 | # Install and setup project dependencies 40 | RUN apt-get install -y curl lsb-release supervisor openssh-server 41 | 42 | RUN mkdir -p /var/run/sshd 43 | RUN mkdir -p /var/log/supervisor 44 | 45 | RUN locale-gen en_US en_US.UTF-8 46 | 47 | ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf 48 | 49 | RUN echo 'root:basho' | chpasswd 50 | 51 | 现在我们需要添加 Basho’s APT 仓库: 52 | 53 | RUN curl -s http://apt.basho.com/gpg/basho.apt.key | apt-key add -- 54 | RUN echo "deb http://apt.basho.com $(lsb_release -cs) main" > /etc/apt/sources.list.d/basho.list 55 | RUN apt-get update 56 | 57 | 做完之后,我们需要默认安装Riak需要一点时间 58 | 59 | # Install Riak and prepare it to run 60 | RUN apt-get install -y riak 61 | RUN sed -i.bak 's/127.0.0.1/0.0.0.0/' /etc/riak/app.config 62 | RUN echo "ulimit -n 4096" >> /etc/default/riak 63 | 64 | 到这里,下一步我们需要添加一个方法来让我们的nitctl缺失: 65 | 66 | # Hack for initctl 67 | # See: https://github.com/dotcloud/docker/issues/1024 68 | RUN dpkg-divert --local --rename --add /sbin/initctl 69 | RUN ln -s /bin/true /sbin/initctl 70 | 71 | 接下来,我们需要开放raik协议缓冲区/http/ssh接口 72 | 73 | # Expose Riak Protocol Buffers and HTTP interfaces, along with SSH 74 | EXPOSE 8087 8098 22 75 | 76 | 最后我们运行supervisord让riak和openssh开始: 77 | 78 | CMD ["/usr/bin/supervisord"] 79 | 80 | ##创建一个supervisord配置文件 81 | 82 | 创建一个空文件叫做supervisord.conf,使配置文件的目录路径和你的Dockerfile的文件相同 83 | 84 | touch supervisord.conf 85 | 86 | 填充下面的定义: 87 | 88 | [supervisord] 89 | nodaemon=true 90 | 91 | [program:sshd] 92 | command=/usr/sbin/sshd -D 93 | stdout_logfile=/var/log/supervisor/%(program_name)s.log 94 | stderr_logfile=/var/log/supervisor/%(program_name)s.log 95 | autorestart=true 96 | 97 | [program:riak] 98 | command=bash -c ". /etc/default/riak && /usr/sbin/riak console" 99 | pidfile=/var/log/riak/riak.pid 100 | stdout_logfile=/var/log/supervisor/%(program_name)s.log 101 | stderr_logfile=/var/log/supervisor/%(program_name)s.log 102 | 103 | ##创建一个Riak的docker 镜像 104 | 105 | docker build -t "/riak" . 106 | 107 | ##下一步 108 | 109 | Riak是分布式数据库,很多生产部署至少5个节点,你可以在docker-riak项目中获得如何通过docker和管道来部署riak集群 110 | 111 | 112 | -------------------------------------------------------------------------------- /example/sshd.md: -------------------------------------------------------------------------------- 1 | #SSH Daemon Service 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | --- 8 | 9 | >官方视频可以官方查看,但是我也做了视频你可以查看中文版的我做的视频 10 | 11 | --- 12 | 13 | 你可以直接获得sshd容器 14 | 15 | sudo docker pull dhrp/sshd 16 | 17 | 密码是screencast 18 | 19 | ##视频讲解内容 20 | 21 | # 大家好!我们试着安装sshd并且让它作为一个服务来运行 22 | # 我们需要先用pull获得一个base ubuntu镜像. 23 | $ docker pull ubuntu 24 | # 我下载它非常快(因为视频的在美国) 25 | # 现在我们用-i -t命令来运行镜像的bash 26 | # . 27 | $ docker run -i -t ubuntu /bin/bash 28 | # 好的!我们进来了 29 | # 让我们安装openssh-server 30 | $ apt-get update 31 | $ apt-get install openssh-server 32 | # 好的,让我们看看如何运行它. 33 | $ which sshd 34 | # 我们需要建立授权目录 35 | $ mkdir /var/run/sshd 36 | $ /usr/sbin/sshd 37 | $ exit 38 | # 我们需要提交它 39 | # 我们应该提交哪一个? 40 | $ docker ps -a |more 41 | $ docker commit a30a3a2f2b130749995f5902f079dc6ad31ea0621fac595128ec59c6da07feea dhrp/sshd 42 | # 我给这个容器命名 dhrp/sshd 43 | # 我们可以继续运行 44 | $ docker run -d dhrp/sshd /usr/sbin/sshd -D # D for daemon mode 45 | # 它运行了吗? 46 | $ docker ps 47 | # 是的! 48 | # 让我们停止它 49 | $ docker stop 0ebf7cec294755399d063f4b1627980d4cbff7d999f0bc82b59c300f8536a562 50 | $ docker ps 51 | # 我们重新连接并且指定端口 52 | $ docker run -d -p 22 dhrp/sshd /usr/sbin/sshd -D 53 | $ docker port b2b407cf22cf8e7fa3736fa8852713571074536b1d31def3fdfcd9fa4fd8c8c5 22 54 | # 现在我们可以通过端口连接 55 | # 我们可以使用公共ip来连接 56 | $ hostname 57 | # *ifconfig* 来查看我们的公网ip地址 58 | $ ifconfig 59 | $ ssh root@192.168.33.10 -p 49153 60 | # 哦不好意思我们忘记了设置密码 61 | $ docker commit b2b407cf22cf8e7fa3736fa8852713571074536b1d31def3fdfcd9fa4fd8c8c5 dhrp/sshd 62 | $ docker ps -a 63 | $ docker run -i -t dhrp/sshd /bin/bash 64 | $ passwd 65 | $ exit 66 | $ docker commit 9e863f0ca0af31c8b951048ba87641d67c382d08d655c2e4879c51410e0fedc1 dhrp/sshd 67 | $ docker run -d -p 22 dhrp/sshd /usr/sbin/sshd -D 68 | $ docker port a0aaa9558c90cf5c7782648df904a82365ebacce523e4acc085ac1213bfe2206 22 69 | # *ifconfig* 我们查看公网地址 70 | $ ifconfig 71 | $ ssh root@192.168.33.10 -p 49154 72 | # 谢谢你查看,如果有问题可以发送邮件到 thatcher@dotcloud.com -------------------------------------------------------------------------------- /example/supervisor.md: -------------------------------------------------------------------------------- 1 | #Using Supervisor with Docker 2 | 3 | >注: 4 | 5 | >这个例子环境是假设你已经运行了docker进程,更多详细信息请查看运行例子,如果你不喜欢sudo,你可以用户授权命令和docker组 6 | 7 | 传统的docker启动时只运行一个进程,例如apache进程或者ssh服务进程。但是镜像你想要在一个容器中运行多个进程。有许多方法可以做到这一点,譬如使用一个简单的bash脚本作为容易的CMD指令来管理 8 | 9 | 在这个例子中,我们将利用线程管理工具,管理多个进程在我们的容器内运行,使用Supervisor使我们更好的控制、管理和重启这个进程,这个将演示我们要安装和管理一个SSH后台进程和apache后台进程 10 | 11 | ##创建Dockerfile 12 | 13 | 让我们为新镜像创建一个基础的Dockerfile 14 | 15 | FROM ubuntu:latest 16 | MAINTAINER examples@docker.io 17 | RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list 18 | RUN apt-get update 19 | RUN apt-get upgrade -y 20 | 21 | ##安装Supervisor 22 | 23 | 现在我们安装我们的ssh和apache 以及Supervisor在我们的容器内 24 | 25 | RUN apt-get install -y openssh-server apache2 supervisor 26 | RUN mkdir -p /var/run/sshd 27 | RUN mkdir -p /var/log/supervisor 28 | 29 | 这里我们安装openssh-server、apache2和supervisor(提供supervisor进程)我们还需要创建两个目录运行ssh进程和supervisor进程 30 | 31 | ##添加一个supervisor的配置文件 32 | 33 | 现在让我们天津唉一个supervisor的配置文件,默认的配置文件叫做supervisor.conf,路径位置是etc/supervisor/conf.d/。 34 | 35 | ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf 36 | 37 | 让我们看看添加什么配置到supervisord.conf文件 38 | 39 | [supervisord] 40 | nodaemon=true 41 | 42 | [program:sshd] 43 | command=/usr/sbin/sshd -D 44 | 45 | [program:apache2] 46 | command=/bin/bash -c "source /etc/apache2/envvars && /usr/sbin/apache2 -DFOREGROUND" 47 | 48 | supervisord.conf配置文件包含supervisord配置和进程管理,第一块[supervisord]提供本身配置文件。然后我们使用一个指令,来告诉supervisord运行交互式的nodaemon而不是daemonize。 49 | 50 | 下边两块是管理服务控制的,每一块是一个单独的进程,块包含指令,每个流程的开始决定于它指定了什么指令 51 | 52 | ##开放端口和运行Supervisor 53 | 54 | 现在我们完成Dockerfile指定开发一些端口,并且用CMD指令来在容器启动开时开始Supervisor。 55 | 56 | EXPOSE 22 80 57 | CMD ["/usr/bin/supervisord"] 58 | 59 | 现在我们的容器开启了22和80端口,当容器运行时,我们运行/usr/bin/supervisord 60 | 61 | ##创建我们的容器 62 | 63 | 我们现在可以创建一个新的容器 64 | 65 | sudo docker build -t /supervisord . 66 | 67 | ##运行我们的Supervisor容器 68 | 69 | 一旦我们有了镜像我们就可以启动一个容器了 70 | 71 | sudo docker run -p 22 -p 80 -t -i /supervisor 72 | 2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file) 73 | 2013-11-25 18:53:22,312 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing 74 | 2013-11-25 18:53:22,342 INFO supervisord started with pid 1 75 | 2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6 76 | 2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7 77 | 78 | 我们用一个新的容器来交互式的使用docker运行命令。容器已经运行Supervisor、ssh和apache进程,我们指定了开放端口22和80,从这里我们确定开放端口连接到一个或者所有的ssh和apache进程。 79 | -------------------------------------------------------------------------------- /install/binaries.md: -------------------------------------------------------------------------------- 1 | #Binaries 2 | 3 | - 官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/08/getting-to-docker-1-0/ 4 | 5 | 通过配置docker环境来执行docker的指令集。 6 | 7 | 在开始下边之前,你应该检查docker版本是否提供你的发行版支持,我们已经提供了许多发行版 8 | 9 | ##检查你的内核 10 | 11 | 你的linux主机内核是docker 内核支持的 12 | 13 | ##查看你的空间工具 14 | 15 | 你必须安装了lxc。 16 | 17 | ##获取docker二进制文件 18 | 19 | wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O docker 20 | chmod +x docker 21 | 22 | ##后台运行docker 23 | 24 | # start the docker in daemon mode from the directory you unpacked 25 | sudo ./docker -d & 26 | 27 | ##启动你的第一个容器 28 | 29 | # check your docker version 30 | sudo ./docker version 31 | 32 | # run a container and open an interactive shell in the container 33 | sudo ./docker run -i -t ubuntu /bin/bash 34 | 35 | 继续你可以运行hello word实例了。 36 | -------------------------------------------------------------------------------- /install/docker-arch.md: -------------------------------------------------------------------------------- 1 | #Arch Linux安装 2 | 3 | ##官方警告 4 | 5 | 1. 官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/08/getting-to-docker-1-0/ 6 | 7 | 1. windows的安装是社区贡献出来的,唯一的官方的安装方法是ubuntu就是上一节我们介绍的,这个版本可能是过期的因为它取决于一些二进制包的更新和发布 8 | 9 | 在Arch Linux可以从社区通过包来安装: 10 | 11 | - [docker](https://www.archlinux.org/packages/community/x86_64/docker/) 12 | 13 | 或者选择AUR包 14 | 15 | - [docker-git](https://aur.archlinux.org/packages/docker-git/?setlang=zh_CN) 16 | 17 | docker计划安装最新的docker版本,docker-git包从当前主分支获得 18 | 19 | ##相关性 20 | 21 | 22 | docker需要指定几个依赖的包,核心依赖关系: 23 | 24 | - bridge-utils 25 | - device-mapper 26 | - iproute2 27 | - lxc 28 | - sqlite 29 | 30 | ##安装 31 | 32 | 一个简单的普通安装包 33 | 34 | pacman -S docker 35 | 36 | 包含了所有你需要的 37 | 38 | 通过AUR包执行 39 | 40 | yaourt -S docker-git 41 | 42 | 这里的指令需要先安装yaourt,如果你之前没有安装,需要去看一下用户安装包和[Arch User Repository](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages)的信息 43 | 44 | ##运行docker 45 | 46 | 系统中已经安装好了docker服务,我们需要运行docker服务 47 | 48 | sudo systemctl start docker 49 | 50 | 设置开机启动 51 | 52 | sudo systemctl enable docker 53 | 54 | ##设置网络环境 55 | 56 | IPv4数据包转发在缺省值的情况下是禁用的,所以容器可能是不起作用的, 57 | 58 | 需要开启转发,作为root用户运行在主机系统上 59 | 60 | sysctl net.ipv4.ip_forward=1 61 | 62 | 允许IPv4修改主机的/etc/sysctl.d/docker.conf,需要重新启动: 63 | 64 | net.ipv4.ip_forward=1 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /install/docker-fedora.md: -------------------------------------------------------------------------------- 1 | #Fedora安装 2 | 3 | ##官方警告 4 | 5 | 1. 官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/08/getting-to-docker-1-0/ 6 | 7 | 1. windows的安装是社区贡献出来的,唯一的官方的安装方法是ubuntu就是上一节我们介绍的,这个版本可能是过期的因为它取决于一些二进制包的更新和发布 8 | 9 | docker允许在Fedora 19以后版本中运行,请注意由于docker的限制,docker只能运行在64位主机上 10 | 11 | ##安装 12 | 13 | 在Fedora中已经提供docker-io包了 14 | 15 | 如果你已经安装了(不相关)的docker包,它会跟docker-io有冲突,有一个错误报告,如果想继续安装docker-io,请先删除docker. 16 | 17 | sudo yum -y remove docker 18 | 19 | 在Fedora 20版本之后,wmdocker包与docker-io提供相同的功能,但是也不会冲突 20 | 21 | sudo yum -y install wmdocker 22 | sudo yum -y remove docker 23 | 24 | 开始安装docker-io包在我们的主机上 25 | 26 | sudo yum -y install docker-io 27 | 28 | 升级docker-io包 29 | 30 | sudo yum -y update docker-io 31 | 32 | 现在已经安装好了,让我们启动docker进程 33 | 34 | sudo systemctl start docker 35 | 36 | 如果我们想开机启动,我们需要 37 | 38 | sudo systemctl enable docker 39 | 40 | 现在测试一下是否正常工作了 41 | 42 | sudo docker run -i -t fedora /bin/bash 43 | 44 | 好了,现在你可以继续做hello word的例子 45 | -------------------------------------------------------------------------------- /install/docker-redhat.md: -------------------------------------------------------------------------------- 1 | #Red Hat Enterprise Linux安装 2 | 3 | ##官方警告 4 | 5 | 1. 官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/08/getting-to-docker-1-0/ 6 | 7 | 1. windows的安装是社区贡献出来的,唯一的官方的安装方法是ubuntu就是上一节我们介绍的,这个版本可能是过期的因为它取决于一些二进制包的更新和发布 8 | 9 | docker可以在RHEL的EPEL上运行。docker指令可以在RHEL和Centos上工作,他们可能会和其他二进制EL6所兼容工作,但是我们没有去测试! 10 | 11 | 请注意,这个包是有社区一起努力创建和维护的,作为一个RHEL的额外包! 12 | 13 | 还要注意docker的局限性,docker只能运行在64位系统上! 14 | 15 | ##安装 16 | 17 | 首先,你需要安装EPEL仓库,请看这里[EPEL installation instructions.](https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F) 18 | 19 | docker的包是由EPEL提供的 20 | 21 | 如果你已经安装了(不相关)的docker包,它会跟docker-io有冲突,有一个错误报告,如果想继续安装docker-io,请先删除docker. 22 | 23 | 下一步,来让我们安装docker-io在我们的主机上 24 | 25 | sudo yum -y install docker-io 26 | 27 | 升级docker-io包 28 | 29 | sudo yum -y update docker-io 30 | 31 | 现在我们就安装好了,让我们开始docker进程 32 | 33 | sudo service docker start 34 | 35 | 如果你想让他开机启动,我们需要这样做 36 | 37 | sudo chkconfig docker on 38 | 39 | 现在让我们确认一下docker是否工作了 40 | 41 | sudo docker run -i -t fedora /bin/bash 42 | 43 | 运行了,OK你现在去运行hello word的实例吧 44 | 45 | 问题? 46 | 47 | 如果你有一些问题,你可以去这个地址报告[Red Hat Bugzilla for docker-io component.](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora%20EPEL&component=docker-io) -------------------------------------------------------------------------------- /install/docker-windows.md: -------------------------------------------------------------------------------- 1 | #Docker教程-在windows下的安装 2 | 3 | **非官方备注:你的CPU一定要支持VT才可以,笔者的笔记本T6400不支持VT是装不上的,所以一定要支持VT,好在笔者的MAC很OK,公司电脑也给力** 4 | 5 | > 上一节我们介绍了在ubuntu和centos下的安装,当然都是基于64位系统的,在学习过程中,你可能没有这些东西,当然你可以用virtualbox或者Vmware虚拟化出来,今天我们介绍的是官网给我们提供的using vagrant! 6 | 7 | ####介绍 8 | 9 | >Docker可以用虚拟主机技术运行在Windows上像virtualbox,你可以运行linux在虚拟主机里! 10 | 11 | ####安装 12 | 13 | #####警告 14 | 15 | 1. 官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/08/getting-to-docker-1-0/ 16 | 17 | 1. windows的安装是社区贡献出来的,唯一的官方的安装方法是ubuntu就是上一节我们介绍的,这个版本可能是过期的因为它取决于一些二进制包的更新和发布 18 | 19 | #####安装前准备 20 | 21 | 1. 安装virtualbox官网下载地址:https://www.virtualbox.org一路next就可以了(非官方备注:当然你不会安装或者感觉下载速度慢,可以用360或者QQ软甲管家下载自动安装) 22 | 23 | 1. 安装vagrant从官网:http://www.vagrantup.com,选择安装路径一路next就可以了 24 | 25 | 1. 下载安装git(带有ssh功能的)从官网:http://git-scm.com/downloads下载和安装,这个其实也是一路next(向github提交过代码的应该最清楚) 26 | 27 | >官方推荐至少有2GB的磁盘空间和2GB的内存! 28 | 29 | #####运行命令提示符 30 | 31 | 首先要打开cmd命令提示符,你可以同时按住windows键(非官方备注:ctrl键旁边那个微软图标)+R,然后输入cmd,按回车(Enter)就可以了,当然你也可以在你的计算机中搜索cmd.exe(非官方备注:如果你跟我一样用win8,可以windows键+x选择命令提示符管理员那个) 32 | 33 | 当然你可以用Cygwin终端或者git bash这些命令行都可以,操作都是一样的 34 | 35 | #####安装一个Ubuntu virtual server 36 | 37 | >让我们下载和运行一个已经安装好了ubuntu的docker的二进制文件 38 | 39 | git clone https://github.com/dotcloud/docker.git 40 | cd docker 41 | vagrant up 42 | 43 | ![安装docker](http://yun.widuu.com/docker/1.png) 44 | 45 | ![下载文件](http://yun.widuu.com/docker/2.png) 46 | 47 | ![更新内核](http://yun.widuu.com/docker/3.png) 48 | 49 | --- 50 | 51 | #####官方文档没有的但是你会遇到的 52 | 53 | >更新内核完成后,就出现一些字段,譬如升级完内核可能出现 vagrant halt的字样,这个时候你就要输入`vagrant halt`,然后再输入vagrant up可能会会出现如下 54 | 55 | ![更新内核](http://yun.widuu.com/docker/10.png) 56 | 57 | 这个时候你就要输入`vagrant provision`然后会检测继续更新安装,然后再`vagrant ssh`就可以了 58 | 59 | --- 60 | 61 | >这里你要稍等比较长的时间,去打个游戏玩会吧!因为它会下载很多东西,而且我们访问美国的网速一般都比较慢,所以我建议你还是先干点别的! 62 | 63 | 我发现我安装的场景跟官方提供的显示一点都不一样,不过安装好了之后是一样的,我就拿实际的给大家看! 64 | 65 | ![](http://yun.widuu.com/docker/12.png) 66 | 67 | 68 | >出现上边的截图后,输入`vagrant halt`,然后输出`vagrant up`来开启机器,当然你可以在virtualbox里边去关闭它! 69 | 70 | ![](http://yun.widuu.com/docker/13.png) 71 | 72 | **Congratulations! You are running an Ubuntu server with docker installed on it. You do not see it though, because it is running in the background** 73 | 74 | >接官方-现在你可以庆祝了,你正在运行着装好docker的unbuntu服务器了,但是你看不到它,因为它一直在后台运行(非官方备注:但是你可以从你的virtualbox中看到它) 75 | 76 | ![](http://yun.widuu.com/docker/22.png) 77 | 78 | ####登录你的unbuntu服务器 79 | 80 | #####现在登录你的ubuntu服务器,你现在有两个选择 81 | 82 | - 运用vagrant的命令行来操作 83 | - 运用ssh(我用的putty) 84 | 85 | #####运用windows命令行来操作 86 | 87 | vagrant ssh 88 | 89 | >这个时候你可能看到错误信息**“ssh executable not found”.**,错误的原因是你的ssh没有加入到可执行PATH路径中,这个时候,你可以用set命令来添加路径,譬如你的ssh.exe在你的“C:Program Files (x86)Gitbin”这个目录中,你就只要输入命令 90 | 91 | set PATH=%PATH%;C:\Program Files (x86)\Git\bin 92 | 93 | 然后就OK了`vagrant ssh`,登录之后是这样的 94 | 95 | ![](http://yun.widuu.com/docker/15.png) 96 | 97 | 如果这个时候你出现错误*“The program ‘docker’ is currently not installed”*,那就很遗憾你只能从头开始重新安装了 98 | 99 | #####运用ssh客户端登录 100 | 101 | >首先,你要拿到你登录的IP和端口,输入 102 | 103 | `vagrant ssh-config` 104 | 105 | >这个时候,你会看到输出了hostname就是你登录的ip,端口号`2222`,用户默认的vagrant,密码一样都是vagrant,然后你就可以用ssh登录了,我用的是putty,官方用的也是putty 106 | 107 | ![ssh登录](http://yun.widuu.com/docker/16.png) 108 | 109 | ![ssh登录](http://yun.widuu.com/docker/17.png) 110 | 111 | >当然如果你用git bash这种终端运行的时候也可以输入命令,然后账号密码也都是vagrant 112 | 113 | ssh vagrant@127.0.0.1 –p 2222 114 | 115 | #####运行docker 116 | 117 | 118 | ####首先获得root 119 | 120 | sudo su 121 | 122 | #####这个时候你就可以运行demo hello word了 123 | 124 | ![docker运行](http://yun.widuu.com/docker/19.png) 125 | 126 | **下边是我用virtualbox安装的ubuntu然后用ubuntu安装的docker** 127 | 128 | ![docker运行ubuntu](http://yun.widuu.com/docker/21.png) 129 | 130 | 131 | 本文由widuu贡献翻译,转载请注明来自[http://www.widuu.com](http://www.widuu.com)~ 132 | -------------------------------------------------------------------------------- /install/docker.md: -------------------------------------------------------------------------------- 1 | #DOCKER教程 2 | 3 | ####注意事项 4 | 5 | >1.官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/08/getting-to-docker-1-0/ 6 | 7 | >2.系统注意事项-由于现在的docker的局限性,现在只能使用在64位的服务器上边 8 | 9 | ####安装教程 10 | 11 | #####ubntu安装教程(12.04) 12 | >由于linux容器的bug,docker在linux的kernel3.8上运行最佳,由于12.04的内核是3.2kernel,所以我们必须,如果你不确定你的内核或者你只是装在virbox上使用,你可以跳过这些步骤 13 | 14 | #安装内核 15 | sudo apt-get update 16 | sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring 17 | 18 | #重启 19 | sudo reboot 20 | 21 | >安装警告-由于Docker指令在0.6的版本有所改变,如果你从一个早期版本升级,你需要重新安装他们 22 | 23 | - Docker作为一个有效的debian的安装包,当你安装的时候你可能看到‘ See the :ref:`installmirrors` section below if you are not in the United States’,你可以选择其他的镜像源debain包来进行快速的安装。 24 | 25 | 第一次添加Docker的repository到你的本地秘钥库 26 | 27 | 28 | sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 29 | 30 | 31 | 将Docker添加到你的apt软件安装源中,然后update和install lxc-docker,期间会遇到一个警告,说这个包不可靠,你只需要回复yes然后继续安装就可以了! 32 | 33 | 34 | sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\ 35 | >/etc/apt/sources.list.d/docker.list" 36 | sudo apt-get update 37 | sudo apt-get install lxc-docker 38 | 39 | >提示,官方也提供了一个简单脚本帮助你安装,你可以用curl来获取这个脚本然后执行安装 40 | 41 | curl -s https://get.docker.io/ubuntu/ | sudo sh 42 | 43 | >现在你就可以下载安装ubuntu的镜像封装到一个沙箱中了 44 | 45 | sudo docker run -i -t ubuntu /bin/bash 46 | 47 | 48 | #####ubntu安装教程(13.04) 49 | 50 | >首先要确认是否安装了AUFS,如果没有安装运行下边的命令 51 | 52 | sudo apt-get update 53 | sudo apt-get install linux-image-extra-`uname -r` 54 | 55 | 然后下边安装教程同12.04看上边就可以了! 56 | 57 | #####安装好后测试hello word 58 | 59 | >可以用命令行,让它在后台执行(原文英语太长简缩就是这样) 60 | 61 | sudo docker -d & 62 | 63 | >现在你可以运行docker的客户端了,但是如果你运行命令的话,一定要用root权限,或者用sudo执行,因为docker是被当做一个软件使用,而且是受保护的,你的命令会被转发到docker的进程中来运行,就像你vim一个受保护的文档,所以需要root权限,原文太简单怕各位不理解(by default all commands will be forwarded to the docker daemon via a protected Unix socket, so you must run as the root or via the sudo command.) 64 | 65 | >hello word最基本的例子就是可以共用Docker,先要现在最基本的ubunt的镜像(就好像你写程序的基类) 66 | 67 | sudo docker pull ubuntu 68 | 69 | >获得ubuntu的镜像后,你可以选择你的镜像盒子,一个最小化的linux系统,这个镜像是你从Docker的仓库中检索出来的 70 | 71 | sudo docker run ubuntu /bin/echo hello world 72 | 73 | 上边的是运用docker运行echo命令输出hello word 74 | 75 | - “sudo” 运用root权限运行 76 | - “docker run” 在一个新的容器中运行命令 77 | - “ubuntu” 是我们想要运行命令的镜像 78 | - “/bin/echo” 我们在容器用运行的shell命令行 79 | - “hello word” 我们要输出的 80 | 81 | 82 | #####Docker 和 UFW 83 | 84 | >Dockers是用桥接的方式管理容器的网络,默认情况下,如果你安装了UFW防火墙,他会过滤掉所有的转发,所以你需要允许UFW转发 85 | 86 | sudo nano /etc/default/ufw 87 | ---- 88 | # Change: 89 | # DEFAULT_FORWARD_POLICY="DROP" 90 | # to 91 | DEFAULT_FORWARD_POLICY="ACCEPT" 92 | 93 | >然后刷新UFW 94 | 95 | sudo ufw reload 96 | 97 | >当然你也可以只放行Docker容器允许的端口4243 98 | 99 | sudo ufw allow 4243/tcp 100 | 101 | #####Mirrors 102 | 103 | 你应该ping get.docker.io ,然后看下延迟,选择最快的一个 104 | 105 | #####Yandex 106 | 107 | 这个的意思是普京他们家那边有个镜像包搜索的引擎,每6个小时更新一次,你可以用 http://mirror.yandex.ru/mirrors/docker/代替 http://get.docker.io/ubuntu 108 | 109 | 举个简单的例子 110 | 111 | sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main\ 112 | > /etc/apt/sources.list.d/docker.list" 113 | sudo apt-get update 114 | sudo apt-get install lxc-docker 115 | 116 | ####Red Hat Enterprise Linux安装教程 117 | 118 | >注意事项是red hat是社区贡献的所以这个不需要我多说了,人家建议用ubuntu 119 | 120 | ####安装步骤 121 | 122 | #安装包 123 | sudo yum -y install docker-io 124 | 125 | #升级安装包 126 | sudo yum -y update docker-io 127 | 128 | #启动docker 129 | sudo service docker start 130 | 131 | #开机启动,加入3,5就可以了 132 | sudo chkconfig docker on 133 | 134 | #然后运行吧--比较坑的就是fedora 135 | sudo docker run -i -t fedora /bin/bash 136 | 137 | 138 | 本文由widuu贡献翻译,转载请注明来自[http://www.widuu.com](http://www.widuu.com)~ 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /install/macos.md: -------------------------------------------------------------------------------- 1 | #Mac OS X安装教程 2 | 3 | >注意事项 4 | 5 | >这些指令使用的版本是docker version 0.8版本,当然随时可能发生变化。 6 | 7 | >注意事项 8 | 9 | >docker一直在稳健的发展,不建议在生产环境中使用,但是我们已经离那个版本越来越近了。请参阅我们的博客,“Getting to Docker 1.0” 10 | 11 | docker支持 Mac OS X 10.6及以上版本 12 | 13 | ##如何在Mac OS X上安装Docker 14 | 15 | ##VirtualBox 16 | 17 | 在OS X运行docker需要安装virtualbox,首先,先从Virtualbox页面获取安装包(OS X 主机版本 x86/amd64)。 18 | 19 | 下载完成后,打开磁盘镜像,设置和运行文件(VirtualBox.pkg)来安装virtualbox,不要简单的复制没有运行的安装包。 20 | 21 | ###boot2docker 22 | 23 | [boot2docker](https://github.com/steeve/boot2docker)提供了一个简单的脚本来管理正在运行docker进程的虚拟主机。它还负责为操作系统镜像的安装工作。 24 | 25 | 如果你还没安装boot2docker请打开一个新的终端窗口 26 | 27 | 运行下边的命令来获得boot2docker 28 | 29 | # 进去安装目录 30 | cd ~/bin 31 | 32 | # 获取安装文件 33 | curl https://raw.github.com/steeve/boot2docker/master/boot2docker > boot2docker 34 | 35 | # 设置可执行 36 | chmod +x boot2docker 37 | 38 | ##Docker OS X Client 39 | 40 | docker进程使用docker客户端访问。 41 | 42 | 运行下边的命令,来获取docker并且设置它 43 | 44 | # 获取文件 45 | curl -o docker http://get.docker.io/builds/Darwin/x86_64/docker-latest 46 | 47 | # 设置可执行 48 | chmod +x docker 49 | 50 | # 设置docker进程的环境变量 51 | export DOCKER_HOST=tcp:// 52 | 53 | # 复制可执行文件 54 | sudo cp docker /usr/local/bin/ 55 | 56 | 然后让我们看看如何使用它。 57 | 58 | ##如何在Mac OS X上使用Docker 59 | 60 | ###docker进程(通过boot2docker) 61 | 62 | 进行~/bin目录,运行下边的命令: 63 | 64 | # 初始化虚拟主机 65 | ./boot2docker init 66 | 67 | # 运行虚拟主机 (the docker daemon) 68 | ./boot2docker up 69 | 70 | # 看所有可用的命令: 71 | ./boot2docker 72 | 73 | # Usage ./boot2docker {init|start|up|pause|stop|restart|status|info|delete|ssh|download} 74 | 75 | 76 | 77 | ##docker客户端 78 | 79 | 一旦虚拟主机运行docker进程,你可以像使用其它的一些应用一样来使用docker客户端。 80 | 81 | 82 | docker version 83 | # Client version: 0.7.6 84 | # Go version (client): go1.2 85 | # Git commit (client): bc3b2ec 86 | # Server version: 0.7.5 87 | # Git commit (server): c348c04 88 | # Go version (server): go1.2 89 | 90 | 91 | ##用SSH来连接虚拟主机 92 | 93 | 如果你感觉需要连接虚拟主机,你可以简单的运行下边的命令: 94 | 95 | 96 | ./boot2docker ssh 97 | 98 | # User: docker 99 | # Pwd: tcuser 100 | 101 | 现在你可以使用hello World的例子了~ 102 | 103 | ##学习更多 104 | 105 | ###boot2docker: 106 | 107 | 查看[boot2docker](https://github.com/steeve/boot2docker) github页面 108 | 109 | 如果SSH提示需要秘钥 110 | 111 | ssh-keygen -R '[localhost]:2022' 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /install/upgrading.md: -------------------------------------------------------------------------------- 1 | #升级 2 | 3 | 通过docker升级到一个新的版本,通过安装方式来选择你如何升级 4 | 5 | *新版本version0.5.3(现在已经不是)*你希望使用docker用户组,避免使用sudo(可以查看basic里边) 6 | 7 | ##apt-get安装 8 | 9 | 如果你的docker使用apt-get或者vagrant安装,你就必须用apt-get 升级 10 | 11 | 最新的version 0.6版本,你需要先添加仓库信息到你的系统 12 | 13 | # 将docker仓库秘钥添加到本地 14 | sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 15 | 16 | # 将docker仓库添加到你的软件源 17 | sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" 18 | 19 | # 升级 20 | sudo apt-get update 21 | 22 | # 安装 23 | sudo apt-get install lxc-docker 24 | 25 | ##手动安装 26 | 27 | 如果你是用二进制文件安装的请参考如下几个步骤 28 | 29 | # 杀死docker正在运行的进程 30 | killall docker 31 | 32 | 33 | #获取最新更新的docker版本 34 | wget http://get.docker.io/builds/Linux/x86_64/docker-latest -O docker 35 | 36 | # 给docker执行权限 37 | chmod +x docker 38 | 39 | 使用-d模式开启和断开docker进程,后台运行进程使用参数(&).保证你使用./docker的版本是最新版本的路径而不是上一个版本的路径 40 | 41 | # 执行新的版本 42 | sudo ./docker -d & 43 | 44 | 或者你可以替换在/usr/local/bin的下的docker -------------------------------------------------------------------------------- /introduction/introduction.md: -------------------------------------------------------------------------------- 1 | #Docker简介 2 | 3 | docker-作为一个容器运行,运行一个unix进程与服务器隔离提供里强大的安全保障,你的软件可以重复地运行在任何地方,因为它的容器包含了所有的环境依赖关系! 4 | 5 | docker有三种方式运行 6 | 7 | - 作为一个守护进程来管理你的linux主机上的LXC容器(sudo docker -d) 8 | 9 | - 作为一个命令行的方式来告诉docker进程的程序接口来做什么(docker run ...) 10 | 11 | - 作为一个仓库的客户端让你分享你搭建的环境(docker pull,docker commit) 12 | 13 | 这里记录着如何使用docker,docker的特性正在积极开发中,所以这个文档会经常变化。 14 | 15 | docker的介绍,请看详细介绍,当你准备开始使用docker,我们有一个[快速开始教程](http://www.docker.io/gettingstarted/)和深入的[Ubuntu指南](http://docs.docker.io/en/latest/installation/ubuntulinux/#ubuntu-linux)和其它的[安装方式](http://docs.docker.io/en/latest/installation/#installation-list)包括二进制文件安装、Vagrant创建VMS、Rackspace和Amazon的实例! 16 | 17 | 完成阅读后,来[试一试](http://docs.docker.io/en/latest/examples/hello_world/#running-examples) -------------------------------------------------------------------------------- /me/docker-netapp.md: -------------------------------------------------------------------------------- 1 | #在docker上运行.NET应用 2 | 3 | 这篇博客涵盖了在轻量级容器docker中使用mono(1)来运行简单的.net应用。我在windows中运行docker,这个工作非常快,您可以参照[安装说明来安装docker](http://www.widuu.com/docker/) 4 | 5 | >(1)Mono 是一个由Novell 公司主持的项目。该项目的目标是创建一系列符合ECMA 标准(Ecma-334 和Ecma-335)的.NET 工具,包括C# 编译器和共通语言执行平台。与微软的.NET Framework 不同,Mono 项目不仅可以运行于Windows 系统上,还可以运行于Linux,FreeBSD,Unix,Mac OS X 和Solaris。 6 | 7 | ###创建基础镜像 8 | 9 | 第一步创建一个docker镜像来安装mono。我们将使用这个作为容器的基本镜像。获取最新的Mono版本,我们使用[Timotheus Pokorra创建的包](http://software.opensuse.org/download/package?project=home:tpokorra:mono&package=mono-opt)来安装在Ubuntu12.04的镜像上,下边是Dockerfile: 10 | 11 | FROM ubuntu:12.04 12 | MAINTAINER widuu 13 | 14 | RUN apt-get -y -q install wget 15 | RUN wget -q http://download.opensuse.org/repositories/home:tpokorra:mono/xUbuntu_12.04/Release.key -O- | apt-key add - 16 | RUN apt-get remove -y --auto-remove wget 17 | RUN sh -c "echo 'deb http://download.opensuse.org/repositories/home:/tpokorra:/mono/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/mono-opt.list" 18 | RUN apt-get -q update 19 | RUN apt-get -y -q install mono-opt 20 | 21 | #####对应上边的步骤: 22 | 23 | 1. 安装wget 24 | 2. 添加apt-get源 25 | 3. 卸载wget 26 | 4. 添加openSUSE的镜像源列表 27 | 5. 安装mono 28 | 29 | 30 | 起初,我做了以上所有的步骤,而且我是按照上边的步骤一个一个来执行的。没有人会对安装wget感兴趣,最后我分裂成独立的RUN命令,因为这正是其他人所做的。 31 | 32 | 我们利用Dockerfile来创建镜像: 33 | 34 | $ docker build -t widuu/mono . 35 | 36 | 我们需要运行这个制作的镜像来检查mono是否安装成功 37 | 38 | vagrant@precise64:~/mono$ docker run -i -t widuu/mono bash 39 | root@0bdca65e6e8e:/# /opt/mono/bin/mono --version 40 | Mono JIT compiler version 3.2.6 (tarball Sat Jan 18 16:48:05 UTC 2014) 41 | 42 | 现在mono安装在/opt下并且工作了 43 | 44 | ###运行一个应用程序 45 | 46 | 首先我们需要部署一个简单的应用程序 47 | 48 | using System; 49 | 50 | namespace HelloWorld 51 | { 52 | public class Program 53 | { 54 | static void Main(string[] args) 55 | { 56 | Console.WriteLine("Hello World"); 57 | } 58 | } 59 | } 60 | 61 | 这个例子的目的,我们使用VS命令和 msbuild来构建将要创建的应用程序,并且在容器内输出 62 | 63 | msbuild /property:OutDir=C:\tmp\helloworld HelloWorld.sln 64 | 65 | 或者,我们可以在容器内调用xbuild或gmcs。 66 | 67 | 运用Dockerfile运行这个应用程序非常简单: 68 | 69 | FROM widuu/mono 70 | MAINTAINER widuu 71 | 72 | ADD app/ . 73 | CMD /opt/mono/bin/mono `ls *.exe | head -1` 74 | 75 | >注意:这个例子依赖于上边所创建的widuu/mono镜像,也认为编译后的应用程序在/app文件夹中: 76 | 77 | $ ls app 78 | HelloWorld.exe 79 | 80 | CMD命令将简单地使用mono运行中发现的第一个可执行程序来构建输出,让我们创建这个镜像并运行: 81 | 82 | $ docker build -t widuu/helloworld-container . 83 | ... 84 | $ docker run widuu/helloworld-container 85 | Hello World 86 | 87 | It worked! 88 | 89 | ###WEB应用程序 90 | 91 | 运行一个web应用程序到[OWIN](http://www.asp.net/vnext/overview/owin-and-katana "OWIN")(2)然后做更多的工作,在这个例子中我们使用的简单源码来自[OWIN/Katana-on-Heroku post.](http://friism.com/running-owin-katana-apps-on-heroku) 92 | 93 | >(2)OWIN(Open Web Interface for .NET)是在.net的web server和web应用之间定义了一套规范.Katana是微软实现了OWIN的一个Web Server的项目 94 | 95 | $ ls app/ 96 | HelloWorldWeb.exe Microsoft.Owin.Diagnostics.dll Microsoft.Owin.dll Microsoft.Owin.Host.HttpListener.dll Microsoft.Owin.Hosting.dll Owin.dll 97 | 98 | Dockerfile会使容器开放5000端口,CMD命令会开启web应用程序并且监听5000端口 99 | 100 | FROM widuu/mono 101 | MAINTAINER widuu 102 | 103 | ADD app/ . 104 | EXPOSE 5000 105 | CMD ["/opt/mono/bin/mono", "HelloWorldWeb.exe", "5000"] 106 | 107 | 我们运行这个容器,并且将5000端口映射到我们主机的80端口上: 108 | 109 | $ docker run -p 80:5000 -t widuu/mono-hello-world-web 110 | 111 | 我们可以访问OWiN的网站了,http://localhost 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /use/Basic.md: -------------------------------------------------------------------------------- 1 | #学习基本命令 2 | 3 | ###启动docker 4 | 5 | 如果你使用快速安装并且添加到PATH中,docker就被安装到快捷启动了,当Ubuntu系统启动时就启动了!你只需要运行命令`sudo run docker help`获得输出. 6 | 7 | 如果你获得结果是"docker: command not found"或者像" /var/lib/docker/repositories: permission denied",你需要手动指定路径执行它. 8 | 9 | # Run docker in daemon mode 10 | sudo /docker -d & 11 | 12 | ###下载一个预建立的镜像 13 | 14 | # 下载一个ubuntu镜像 15 | sudo docker pull ubuntu 16 | 17 | 这个将从索引仓库中通过名字找到ubuntu镜像,并且从索引仓库顶级中心来下载到本地镜像存储 18 | 19 | >注:当镜像下载成功后,你可以看到12位的hash值像539c0211cd76,这是下载完整的镜像的精简ID,这些短的镜像ID是完整镜像ID的前12个字符--可以使用`docker inspect` 或者 `docker images -notrunc=true`来获得完整的镜像ID 20 | 21 | ![docker inspect](http://yun.widuu.com/docker/inspect.png) 22 | 23 | ![docker notrunc](http://yun.widuu.com/docker/notrunc.png) 24 | 25 | 26 | ####运行交互性的shell(就像运行一个单独的linux) 27 | 28 | # 使用ubuntu运行一个交互性的shell, 29 | # 分配一个伪终端,附带stdin和stdout(输入/输出流) 30 | # 如果你想退出分离出来的伪终端, 31 | # 可以使用CTRL -p+CTRL -q --就像先按CTRL -p 然后CTRL -q 32 | sudo docker run -i -t ubuntu /bin/bash 33 | 34 | ####管理员命令和docker组 35 | 36 | docker进程经常使用root用户运行,从docker的0.5.2版本开始,docker的进程绑定Unix Socket来代替一个TCP端口,在默认情况下Unix Socket属于root用户,所以在默认情况下,你需要赋予权限sudo 37 | 38 | 从0.5.3版本开始,如果你(或者你安装的docker)创建的时候用的docker或者添加用户的unix群组,当docker进程启动的时候,这个docker进程会把Unix socket的读写(read/writable)的所有权交给docker群组.docker进程一般必须root用户运行,但是你运行docker客户端的用户是docker组的,这个时候你就不需要加sudo就可以运行全部的客户端命令 39 | 40 | >警告:docker群组必须是和root等价的 41 | 42 | ####Example: 43 | 44 | # 如果不存在docker群组,添加一个用户群组 45 | sudo groupadd docker 46 | 47 | # Add the connected user "${USER}" to the docker group. 48 | # Change the user name to match your preferred user. 49 | # You may have to logout and log back in again for 50 | # this to take effect. 51 | sudo gpasswd -a ${USER} docker 52 | 53 | # Restart the docker daemon. 54 | sudo service docker restart 55 | 56 | ####让Docker使用其它的host/port或者Unix socket 57 | 58 | >警告 59 | 60 | >改变默认的docker进程绑定的TCP端口或者Unix docker的用户组,将会 61 | 通过允许非root用户获得root权限来修改主机,会增加你的安全风险! 62 | 63 | 使用 -H 他可以运行你改变docker进程监听指定的IP和端口。默认情况下,他会监听 unix:///var/run/docker.sock只允许本地的root用户连接,你可以设置他 0.0.0.0:4243 或者指定主机IP给任何用户,但是这不是我们所推荐的,因为那么低权限将会获得root正在运行的主机进程的访问权限! 64 | 65 | 同样,docker客户端可以使用-H 来指定连接的端口 66 | 67 | -H 授权主机和端口的格式是这样的:tcp://[host][:port] or unix://path 68 | 69 | 举个例子 70 | 71 | - tcp://host:4243 -> 使用tcp连接 host:4243 72 | - unix://path/to/socket -> 使用socket位于 path/to/socket 73 | 74 | -H 当空的时候 将会使用默认值就像没有 -H一样 75 | 76 | -H 也可以用简短的方式授权TCP绑定: host[:port] or :port 77 | 78 | # Run docker in daemon mode 79 | sudo /docker -H 0.0.0.0:5555 -d & 80 | # Download an ubuntu image 81 | sudo docker -H :5555 pull ubuntu 82 | 83 | 你可以是用多个 -H 例如你想监听你所有的TCP和Unix socket 84 | 85 | # Run docker in daemon mode 86 | sudo /docker -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock -d & 87 | # Download an ubuntu image, use default Unix socket 88 | sudo docker pull ubuntu 89 | # OR use the TCP port 90 | sudo docker -H tcp://127.0.0.1:4243 pull ubuntu 91 | 92 | ####开启一个长时间运行的工作进程 93 | 94 | # 开启一个非常有用的长时间工作进程 95 | JOB=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done") 96 | 97 | # 到目前为止的收集的输出 98 | sudo docker logs $JOB 99 | 100 | # 杀死这个进程 101 | sudo docker kill $JOB 102 | 103 | ![docker ps](http://yun.widuu.com/docker/job.png) 104 | 105 | ####监听所有运行着的容器 106 | 107 | sudo docker ps 108 | 109 | ![docker ps](http://yun.widuu.com/docker/ps.png) 110 | 111 | ####为服务绑定一个TCP端口 112 | 113 | # 为容器绑定4444端口,并告诉网络监听4444 114 | JOB=$(sudo docker run -d -p 4444 ubuntu:12.10 /bin/nc -l 4444) 115 | 116 | # 查看我的容器用的公共端口 117 | PORT=$(sudo docker port $JOB 4444 | awk -F: '{ print $2 }') 118 | 119 | # 连接公共端口 120 | echo hello world | nc 127.0.0.1 $PORT 121 | 122 | # 确认网络连接是否工作 123 | 124 | echo "Daemon received: $(sudo docker logs $JOB)" 125 | 126 | 127 | ####提交(保存)容器的状态 128 | 129 | 保存你的容器状态作为一个容器镜像,所以容易状态可以重用 130 | 131 | 当你保存你的容器的时候,仅仅只是保存现在容器和创建容器时候的不同状态(as a diff),用'docker images'命令查看哪些镜像是你正在所使用 132 | 133 | #Commit your container to a new named image 134 | sudo docker commit 135 | 136 | # List your containers 137 | sudo docker images 138 | 139 | 现在你有一个新的镜像状态(其实就是一个新的镜像),从中你可以创建新的实例 140 | 141 | 本文由widuu贡献翻译,转载请注明来自[http://www.widuu.com](http://www.widuu.com)~ 142 | -------------------------------------------------------------------------------- /use/buildimage.md: -------------------------------------------------------------------------------- 1 | #创建镜像 (Dockerfile 参考) 2 | 3 | **Docker可以作为创建者**读取Dockerfile文件中的指令,自动执行步骤并且创建一个新的镜像。执行`docker build`命令,它会按照文档执行并最终创建一个镜像。 4 | 5 | 6 | 目录 7 | 8 | - 创建镜像 9 | 10 | - 1.使用 11 | - 2.格式 12 | - 3.指令 13 | 14 | - 3.1 FROM 15 | - 3.2 MAINTAINER 16 | - 3.3 RUN 17 | - 3.4 CMD 18 | - 3.5 EXPOSE 19 | - 3.6 ENV 20 | - 3.7 ADD 21 | - 3.8 ENTRYPOINT 22 | - 3.9 VOLUME 23 | - 3.10 USER 24 | - 3.11 WORKDIR 25 | 26 | - 4.Dockerfile举例 27 | 28 | 29 | 1.Usage 30 | 31 | 从镜像资源中创建一个镜像,在你的跟目录下创建一个描述文件叫做Dockerfile,这个将描述你创建镜像的步骤. 32 | 33 | `docker build`要用路径的资源库来作为参数(像.) 34 | 35 | sudo docker build . 36 | 37 | 先从存储源查找要本地创建的环境,build会在docker后台运行的,而不是用命令行界面,所以所有的本地环境都会被后台进程多调度。当环境被发送到后台进程时,Docker命令行会报告"Uploading context" 38 | 39 | 你可以指定存储卡和标记,来保存构建成功的镜像: 40 | 41 | sudo docker build -t shykes/myapp . 42 | 43 | Docker进程会按照步骤步骤一步操作,必要时会输出必要的结果, 创建完成之后会输出你的镜像id,Docker会自动清楚你发送的环境。 44 | 45 | 当你构建成功之后,你就要考虑把镜像推送到库中。 46 | 47 | #2. Format 48 | 49 | Dockerfile格式很简单的: 50 | 51 | # Comment 52 | 指令 参数 53 | 54 | 指令是不区分大小写的, 然而约定是大写的以便区分其他的参数 55 | 56 | Docker会读测试Dockerfile中的指令,第一条命令必须是'FROM',来指定你正在构建的基本镜像 57 | 58 | docker以#开头为一个注释,一个#在的地方会被认为是一个注释,例如 59 | 60 | # Comment 61 | RUN echo 'we are running some # of cool things' 62 | 63 | #3.指令 64 | 65 | 可以使用Dockerfile中的指令来构建镜像 66 | 67 | ##3.1 FROM 68 | 69 | FROM 70 | 71 | 或者 72 | 73 | FROM : 74 | 75 | FROM指令来构建基础镜像。因此,一个有效的Dockerfile必须是用FROM做第一个指令。镜像可以是任何有效的镜像,它会很容易从公共存储卡中获取。 76 | 77 | FROM在Dockerfile必须是第一个没有意见性(RUN之类的)指令 78 | 79 | FROM命令可以在Dockerfile中出现多次创建多个镜像,在用新的FROM之前简单的记录下镜像的id 80 | 81 | 如果FROM指令没有tag,就假设tag是latest.如果tag不存在,就会发挥一个错误信息。 82 | 83 | ##3.2 MAINTAINER 84 | 85 | MAINTAINER 86 | 87 | 这个指令是允许你设置镜像生成的作者信息 88 | 89 | ##3.3 RUN 90 | 91 | RUN 92 | 93 | RUN指令将会在当前镜像执行任何命令并提交结果,提交的镜像的结果将用户Dockerfile的下一步操作 94 | 95 | 分层RUN指令和生成提交是docker的核心概念,提交是廉价的从任何点创建一个镜像历史,就行代码控制一样。 96 | 97 | >已知问题 98 | 99 | - 问题783 关于文件权限的问题,可能会发生在使用AUFS文件系统。你要注意她视图使用rm文件,例如,描述一个解决方案 100 | 101 | - 问题2424 本地将不会自动被设置 102 | 103 | ##3.4 CMD 104 | 105 | CMD有三种形式: 106 | 107 | - CMD ["executable","param1","param2"](就像exec,首选) 108 | 109 | - CMD ["param1","param2"] (作为ENTRYPOINT默认参数) 110 | 111 | - CMD command param1 param2 (像shell一样) 112 | 113 | Dockerfile只能有一个CMD,如果你写了多个CMD,最后那个CMD会生效。 114 | 115 | CMD主要给一个容器执行提供默认参数,这些默认值可以是一个热可执行的,或者他们可以省略可执行文件,在这种情况下,你必须指定一个ENTRYPOINT你交号 116 | 117 | 当shell中使用执行格式,CMD命令会设置镜像运行的指令,这个功能相当于docker 提交 -run 将会执行在/bin/sh -c 118 | 119 | FROM ubuntu 120 | CMD echo "This is a test." | wc - 121 | 122 | 如果你希望你的容器每次都执行相同的可执行文件,那么你应该考虑使用ENTRYPOINT结合CMD,可以查看3.8 ENTRYPOINT. 123 | 124 | >注意 125 | 126 | >不要混淆运行CMD。RUN CMD,RUN必须提交结果,CMD在构建镜像是并不执行,但在镜像构建成功后会执行 127 | 128 | ##3.5 EXPOSE 129 | 130 | EXPOSE [...] 131 | 132 | EXPOSE指令会对连接着开放端口使用,这个功能相当于运行docker提交 -run '{"PortSpecs": ["", ""]}',相当于docker run -p 133 | 134 | ##3.6 ENV 135 | 136 | ENV 137 | 138 | ENV指令设置环境变量key对应值value,这个值将会被传递给后边使用的指令,这个功能相当于在命令前面加了= 139 | 140 | >注意: 141 | 142 | >环境变量会持续到一个镜像的生成 143 | 144 | ##3.7 ADD 145 | 146 | ADD 147 | 148 | ADD指令是将复制新文件,并将它们添加到容器的文件系统。 149 | 150 | 必须是一个文件或者目录相对于源目录(也就是构建的环境)或者一个远程文件的URL。 151 | 152 | 是容器将被复制的目录地址。 153 | 154 | 所有新创建的文件和目录都是0755权限,uid和gid 0。 155 | 156 | >注意 157 | 158 | >如果你有stdin标准输入流创建(docker build - < somefile),没有建立环境,所以Dockerfile只能包含一个基于URL添加语句。 159 | 160 | >注意 161 | 162 | >如果你的URL文件需要身份认证,你将需要使用运行wget,运行curl或者其他工具添加到容器是不支持身份验证的 163 | 164 | 副本必须遵循一下规则: 165 | 166 | 路径必须是声称到环境中,你不能添加../something/someting,因为docker build第一步会发送环境目录(和子目录)到dicker后台进程 167 | 168 | 如果是URl,并将不已斜线结尾,然后将从URl中下载并复制到 169 | 170 | 如果是URL,并且以斜线结尾,则文件名是从URL推断然后文件会下载到/,例如,ADD http://example.com/foobar/将会创建file/foobar,这个URL必须是一个平常的路径,使用合适的文件名,一下情况下是无法工作的(http://example.com) 171 | 172 | 如果是目录,将整个目录复制,包含文件的原始数据 173 | 174 | 如果是压缩文件个事(譬如,gzip、bzip2或者xz),那么它会解压到目录,从URL资源不解压 175 | 176 | 如果一个目录被复制或者解压,他们都会执行相同的行为tar -x 作为结果的集合 177 | 178 | - 无论目标路径是否存在 179 | - 源的tree内容是否存在 180 | 181 | 产生冲突的时候会按照2来解决 182 | 183 | 如果是其它文件类型,她被单独复制连同它的数据。这种情况下,如果以斜线结尾,它就会被认为是一个目录,并将src中的写入/base(). 184 | 185 | 如果不已斜线结尾,它会被认为是一个常规文件,并且的文件会被写入到文件中。 186 | 187 | 如果不存在,创建连同所有缺失的目录路径 188 | 189 | ##3.8 ENTRYPOINT 190 | 191 | ENTRYPOINT有两种形式: 192 | 193 | - ENTRYPOINT ["executable", "param1", "param2"] (像 exec, 首选) 194 | 195 | - ENTRYPOINT command param1 param2 (作为shell执行) 196 | 197 | Dockerfile中只能有一个ENTRYPOINT,如果你有多个ENTRYPOINT,则Dockerfile中只能最后一个会被执行 198 | 199 | 一个ENTRYPOINT会帮你配置容器作为容器的一个可执行文件,也就是说当你指定一个ENTRYPOINT,那么整个容器中都会运行这个可执行文件 200 | 201 | ENTRYPOINT指令将会被当作一个不会被覆盖的命令参数传给运行的docker,不像CMD,这就是允许参数传递给入口,即docker run -d 将会通过 -d参数来作为执行入口 202 | 203 | 你可以指定参数在 ENTRYPOINT JSON数组(如exec执行多个),或者通过使用一个CMD命令语句,这个入口的参数不会被docker run所重写,但是通过指定CMD的参数来重写docker run 参数 204 | 205 | 像CMD,你可以指定一个ENTRYPOINT的字符串,它将会在/bin/sh -c中执行 206 | 207 | FROM ubuntu 208 | ENTRYPOINT wc -l - 209 | 210 | 例如,Dockerfile的镜像经常会将stdin作为输入("-")或者但列出行数("-l"),如果你像让这个可选,默认情况下你可以使用CMD 211 | 212 | FROM ubuntu 213 | CMD ["-l", "-"] 214 | ENTRYPOINT ["/usr/bin/wc"] 215 | 216 | 217 | ##3.9 VOLUME 218 | 219 | VOLUME ["/data"] 220 | 221 | VOLUME指令会创建一个挂载点根据指定的名字和标记挂在外部的主机或者其他容器,更多实例可以查看docker安装说明,共享文档和目录 222 | 223 | ##3.10 USER 224 | 225 | USER daemon 226 | 227 | USER质量设置镜像运行时的用户名或者Uid 228 | 229 | ##3.11 WORKDIR 230 | 231 | WORKDIR /path/to/workdir 232 | 233 | WORKDIR命令执行工作目录的来执行CMD 234 | 235 | #4. Dockerfile 例子 236 | 237 | # Nginx 238 | # 239 | # VERSION 0.0.1 240 | 241 | FROM ubuntu 242 | MAINTAINER Guillaume J. Charmes 243 | 244 | # make sure the package repository is up to date 245 | RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list 246 | RUN apt-get update 247 | 248 | RUN apt-get install -y inotify-tools nginx apache2 openssh-server 249 | 250 | --- 251 | 252 | # Firefox over VNC 253 | # 254 | # VERSION 0.3 255 | 256 | FROM ubuntu 257 | # make sure the package repository is up to date 258 | RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list 259 | RUN apt-get update 260 | 261 | # Install vnc, xvfb in order to create a 'fake' display and firefox 262 | RUN apt-get install -y x11vnc xvfb firefox 263 | RUN mkdir /.vnc 264 | # Setup a password 265 | RUN x11vnc -storepasswd 1234 ~/.vnc/passwd 266 | # Autostart firefox (might not be the best way, but it does the trick) 267 | RUN bash -c 'echo "firefox" >> /.bashrc' 268 | 269 | EXPOSE 5900 270 | CMD ["x11vnc", "-forever", "-usepw", "-create"] 271 | 272 | --- 273 | 274 | # Multiple images example 275 | # 276 | # VERSION 0.1 277 | 278 | FROM ubuntu 279 | RUN echo foo > bar 280 | # Will output something like ===> 907ad6c2736f 281 | 282 | FROM ubuntu 283 | RUN echo moo > oink 284 | # Will output something like ===> 695d7793cbe4 285 | 286 | # You'll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with 287 | # /oink. 288 | 289 | -------------------------------------------------------------------------------- /use/puppet.md: -------------------------------------------------------------------------------- 1 | ##Using Puppet 2 | 3 | >注意 4 | 5 | >请注意这是一个社区贡献的安装方式,官方使用ubuntu安装,这个版本可能随时过期。 6 | 7 | ##要求 8 | 9 | 使用本指南你需要从Puppetlabs安装Puppet。 10 | 11 | 目前模块还是使用官方PPA,也只能运行在ubuntu上 12 | 13 | ##安装 14 | 15 | [Puppet Forge](https://forge.puppetlabs.com/garethr/docker/)有可用的模块,并且你可以使用内置工具安装。 16 | 17 | puppet module install garethr/docker 18 | 19 | 如果你想下载源代码,你可以可以在[Github](https://www.github.com/garethr/garethr-docker)上找到它。 20 | 21 | ##使用 22 | 23 | 模块提供一个puppet类来安装docker,并且两种方式来管理镜像和容器 24 | 25 | ###安装 26 | 27 | include 'docker' 28 | 29 | ###镜像 30 | 31 | 下一步是安装一个docker镜像,我们可以使用如下的方法来定义: 32 | 33 | docker::image { 'ubuntu': } 34 | 35 | 这相当于运行 36 | 37 | docker pull ubuntu 38 | 39 | 注意只有镜像的名字不存在时,这将会下载一个大的二进制文件所以第一次运行需要一段时间,出于这个原因,关闭定义默认的5分钟超时。请注意,你也可以删除你不需要的镜像: 40 | 41 | docker::image { 'ubuntu': 42 | ensure => 'absent', 43 | } 44 | 45 | ##容器 46 | 47 | 现在你有一个容器,你可以用docker的run命令来管理容器 48 | 49 | docker::run { 'helloworld': 50 | image => 'ubuntu', 51 | command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"', 52 | } 53 | 54 | 这就相当于运行了下面的命令 55 | 56 | docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 57 | 58 | 运行还可以包含一些可选的参数: 59 | 60 | docker::run { 'helloworld': 61 | image => 'ubuntu', 62 | command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"', 63 | ports => ['4444', '4555'], 64 | volumes => ['/var/lib/counchdb', '/var/log'], 65 | volumes_from => '6446ea52fbc9', 66 | memory_limit => 10485760, # bytes 67 | username => 'example', 68 | hostname => 'example.com', 69 | env => ['FOO=BAR', 'FOO2=BAR2'], 70 | dns => ['8.8.8.8', '8.8.4.4'], 71 | } 72 | 73 | 注意,上边可以用数组的方式定义ports、env、卷等等 -------------------------------------------------------------------------------- /use/shareimage.md: -------------------------------------------------------------------------------- 1 | #通过存储库来分享镜像 2 | 3 | 存储库是托管带标签的镜像,是容器创建的文件系统在一起的集合。库的名称是一个标签,指示存储卡的来源,即创造源文件的所在地。 4 | 5 | 你可以找到一个和多个存储库在主机的注册表中。这里可以有一个显性或者隐性主机名作为标记库的一部分。隐性位于index.docker.io的注册中心,是"顶级"存储库和索引中心。这个注册表中可能还包含公共“用户”存储库。 6 | 7 | 所以Dockerfile不仅是一种工具,用于创建和管理自己的容器,Docker也是分享的工具.Docker项目提供了一个公共仓库中央主机注册,由用户命名空间,这个中央索引仓库提供用户身份认证,并且提供公共存储库的搜索服务。你也可以用你自己的注册表,docker会作为一个客户端运行docker search,pull login和push来提供服务 8 | 9 | 10 | ##公共存储库 11 | 12 | 这里有两种形式的公共信息库:顶级的库是有docker团队或者用户个人贡献的自己创建的库。任何人都可以读取这些仓库,他们可以帮助人们快速开发!你可以授权权限来控制某些人可以访问你的镜像,但我们只会用公共仓库为例子: 13 | 14 | - 顶级仓库很容易被认出来,因为他们的名字没有/隔开,这些仓库都可以信任。 15 | 16 | - 用户总是用的方式来存储库,这是你提交的镜像推送到共公中央注册表中。 17 | 18 | - 只有通过身份验证的用户可以把他们的命名镜像推送到中央注册表中。 19 | 20 | - 用户镜像是不会被检查,因此你要绝对是否信任这个镜像的创造着 21 | 22 | ##在中央索引中查找公共库 23 | 24 | 你可以在命令行中执行命令通过网络在中央索引中搜索镜像,通过镜像名字,用户名字或者描述来搜索镜像: 25 | 26 | $ sudo docker help search 27 | Usage: docker search NAME 28 | 29 | Search the docker index for images 30 | 31 | -notrunc=false: Don't truncate output 32 | $ sudo docker search centos 33 | Found 25 results matching your query ("centos") 34 | NAME DESCRIPTION 35 | centos 36 | slantview/centos-chef-solo CentOS 6.4 with chef-solo. 37 | ... 38 | 39 | 上边例子你可以看到两个搜索结构:centos和slantview/centos-chef-solo,第二个例子来自用户slantview/仓库提供的公共库,第一个结果,没有列出详细信息,它是来自中央仓库的可信任库,/来分割用户库和镜像名称。 40 | 41 | 一旦你找到镜像名称,你可以下载它: 42 | 43 | # sudo docker pull 44 | $ sudo docker pull centos 45 | Pulling repository centos 46 | 539c0211cd76: Download complete 47 | 48 | 你可以用这个镜像做什么?你可以查看example(例子)如果你准备创建自己的镜像,回到这里学习如何分享它。 49 | 50 | ##在中央注册中心贡献 51 | 52 | 任何人都可以pull在中央注册中心下载镜像,但是如果你想分享你的镜像,你必须第一步去注册一个用户,你可以在这里[central Docker Index online](https://index.docker.io/account/signup/)注册和登录你创建的用户,或者运行 53 | 54 | docker run login 55 | 56 | 这里会提示你输入用户名,这将成为公共存储库的命名空间。如果您的用户名可用,docker会提示你输入一个密码和你的邮箱地址,然后自动保存你的登录记录,然后在你准备提交你创建的镜像的时候使用! 57 | 58 | ##提交一个命名的容器 59 | 60 | 当你在一个镜像内做了一些改变然后退出,这些修改会被记录在容器的文件系统,然后你可以将容器提交成一个镜像,除了将一个容器转换成为镜像,这也是你给镜像命名的机会,具体包含你central Docker Index的用户作为你上边登录的和一个有意义的镜像名字, 61 | 62 | # format is "sudo docker commit /" 63 | $ sudo docker commit $CONTAINER_ID myname/kickassapp 64 | 65 | ##提交一个镜像到存储库 66 | 67 | 为了推送镜像到存储库,你需要把你的容器来命名镜像(见上文),现在你可以把这个镜像的名称或者标签推送到你指定的库了 68 | 69 | # format is "docker push /" 70 | $ sudo docker push myname/kickassapp 71 | 72 | ##可信任的创建 73 | 74 | 通过github自动化构建可信任的镜像建设和更新,直接到docker.io的服务,他会通过层架一个commit的钩子到你选择的存储库,当你推送的时候会引发一个新的构建和更新 75 | 76 | ##可信任构建的步骤 77 | 78 | 1. 创建一个账户并且登录 79 | 80 | 1. 通过链接账户菜单连接你的github账户 81 | 82 | 1. 创建一个可信任的构建 83 | 84 | 1. 选择一个github项目来构建你想要的Dockerfile。 85 | 86 | 1. 选择你想要创建的分支(默认是主分支) 87 | 88 | 1. 为受信任的建立一个名称。 89 | 90 | 1. 指定一个可选的docker tag来构建 91 | 92 | 1. 指定Dockerfile所在地,默认是/ 93 | 94 | 一旦信任的构建被配置,他就会被自动的触发构建,在几分钟内,如果没有错误,你可以在docker index 看到一个新的信任构建,他将会一直同步你的github一直到你取消信任构建 95 | 96 | 如果你像查看你的信任构建状态,你可以docker index中你的[Trusted Builds page](https://index.docker.io/builds/)中查看,你可以看见构建的状态和构建的历史 97 | 98 | 一旦你创建了一个信任的连接,你可以删除和注销它。但是你不能push命令,这个金金只是通过github上的提交的代码来管理的 99 | 100 | 你可以创建多个信任的存储仓库,配置他们指定的Dockerfile或者git分支 101 | 102 | ##私有仓库 103 | 104 | 现在(version 0.6)私有库只能通过托管到自己的登记处,pull或者push你自己的登记处,你必须定义一个tag前缀来作为登记处的主机地址 105 | ,像这样: 106 | 107 | # Tag to create a repository with the full registry location. 108 | # The location (e.g. localhost.localdomain:5000) becomes 109 | # a permanent part of the repository name 110 | sudo docker tag 0u812deadbeef localhost.localdomain:5000/repo_name 111 | 112 | # Push the new repository to its home location on localhost 113 | sudo docker push localhost.localdomain:5000/repo_name 114 | 115 | 一旦你注册中心存储库的主机名作为标记的一部分,你可以像任何push或者pull像其他的存储库,但是你不能从中央索引搜索到它,没有用户名进行检查,你的登记功能将独立中央索引 116 | 117 | ##授权文件 118 | 119 | 这个授权文件用json存储,在你的本地家目录下的.dockercfg,它支持多个登记信息 120 | 121 | docker login 将会创建 “https://index.docker.io/v1/” key. 122 | 123 | docker login https://my-registry.com 将会创建 “https://my-registry.com” key. 124 | 125 | 举个例子 126 | 127 | { 128 | "https://index.docker.io/v1/": { 129 | "auth": "xXxXxXxXxXx=", 130 | "email": "email@example.com" 131 | }, 132 | "https://my-registry.com": { 133 | "auth": "XxXxXxXxXxX=", 134 | "email": "email@my-registry.com" 135 | } 136 | } 137 | 138 | 身份验证是通过base64(:) --------------------------------------------------------------------------------