├── .gitignore ├── ABOUTDOCKER.md ├── README.md ├── SUMMARY.md ├── articles ├── SupervisorwithDocker.md ├── baseimages.md ├── basics.md ├── https.md └── networking.md ├── book.json ├── compose ├── cli.md └── install.md ├── docker-hub ├── accounts.md ├── builds.md ├── docker-hub.md └── repos.md ├── examples ├── Dockerfile ├── apt-cacher-ng.md ├── couchdb_data_volumes.md ├── mongodb.md ├── nodejs_web_app.md ├── postgresql_service.md ├── running_redis_service.md ├── running_riak_service.md └── running_ssh_service.md ├── images ├── alauda.png ├── bad_host.png ├── bad_host1.png ├── bitbucket_hook_menu.png ├── bitbucket_hook_menu_2.png ├── bitbucket_hook_post.png ├── containers.png ├── cool_view.png ├── cool_view1.png ├── docker-friends.png ├── github_docker_service_hook.png ├── github_service_hook_docker_activate.png ├── github_service_hooks.png ├── github_settings.png ├── github_submodule_deploy_key.png ├── github_submodule_deploy_key_2.png ├── good_host.png ├── good_host1.png ├── groups.png ├── hub.png ├── installing.png ├── kitematic.png ├── linux_docker_host.png ├── linux_docker_host.svg ├── login-web.png ├── mac-page-two.png ├── mac-password-prompt.png ├── mac-success.png ├── mac-welcome-page.png ├── mac_docker_host.png ├── mac_docker_host.svg ├── newsite_view.png ├── newsite_view1.png ├── orgs.png ├── register-confirm.png ├── register-web.png ├── repos.png ├── search.png ├── webapp1.png ├── windows-boot2docker-cmd.png ├── windows-boot2docker-powershell.png └── windows-boot2docker-start.png ├── installation ├── amazon.md ├── archlinux.md ├── azure.md ├── binaries.md ├── centos.md ├── crux.md ├── debian.md ├── fedora.md ├── frugalware.md ├── gentoo.md ├── google.md ├── joyent.md ├── mac.md ├── opensuse.md ├── rackspace.md ├── redhat.md ├── softlayer.md ├── ubuntu.md └── windows.md ├── kitematic └── README.md ├── machine └── install-machine.md ├── swarm └── install-w-machine.md ├── terms ├── image.md └── images │ ├── docker-filesystems-debian.png │ ├── docker-filesystems-debianrw.png │ └── docker-filesystems-multilayer.png └── userguide ├── README.md ├── artchitecture.md ├── dockerhub.md ├── dockerimages.md ├── dockerizing.md ├── dockerlinks.md ├── dockerrepos.md ├── dockervolumes.md └── usingdocker.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | book.json -------------------------------------------------------------------------------- /ABOUTDOCKER.md: -------------------------------------------------------------------------------- 1 | 关于DOCKER 2 | === 3 | 4 | ###在任何地方开发、部署和运行任何应用 5 | 6 | > Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。 7 | 8 | Docker 组件 9 | 10 | - The Docker Engine - Docker Engine 是一个基于虚拟化技术的轻量级并且功能强大的开源容器引擎管理工具。它可以将不同的 work flow 组合起来构建成你的应用。 11 | - [Docker Hub](https://hub.docker.com/) 可以分享和管理你的images镜像的一个 [Saas](http://baike.baidu.com/link?url=5tvuoV_M-qsaJsLx-Du4De6fsd67SJ3HDnun3UJJVBM9NhfeivUfawx_Pd_VwJ-9myIqiDK8ye6I9-Tu9mUKQa) 服务。 12 | 13 | ###为什么选择Docker 14 | 15 | 快速交付应用程序 16 | 17 | - 我们希望你的开发环境能够更好的提高你的工作效率。Docker容器能够帮助开发人员、系统管理员、QA和版本控制工程师在一个生产环节中一起协同工作。我们制定了一套容器标准,而这套容器标准能够使系统管理员更改容器的时候,程序员不需要关心容器的变化,而更专注自己的应用程序代码。从而隔离开了开发和管理,简化了开发和部署的成本。 18 | - 我们使应用的构建方式更加简单,可以快速的迭代你的应用,并且可以可视化的来查看应用的细微更改。这能够帮助组织里边的成员来更好的理解一个应用从构建到运行的过程。 19 | - Docker 是一个轻量级的容器,所以它的速度是非常快的,而容器的启动时间只需要一秒钟,从而大大的减少了开发、测试和部署的时间。 20 | 21 | 轻松部署和扩展 22 | 23 | - Docker 容器可以运行在大多数的环境中,你可以在桌面环境、物理主机、虚拟主机再到数据中,私有或者公有云中部署。 24 | - 因为 Docker 可以从多平台下运行。你可以很容器的迁移你的应用程序。如果需要,你可以非常简单的将应用程序从测试环境迁移到云,或者从云迁移到测试环境。 25 | - Docker 是一个轻量级的容器,因此它可以在很短的时间内启动和关闭。当你需要的时候,你可以启动多个容器引擎,并且在不需要使用他们的时候,可以将他们全部关闭。 26 | 27 | Get higher density and run more workloads 28 | 29 | Docker的容器本身不需要额外创建虚拟机管理系统,因此你可以启动多套Docker容器,这样就可以充分发挥主机服务器的物理资源,也可以降低因为采购服务器licenses而带来的额外成本。 30 | 31 | 快速构建 轻松管理 32 | 33 | 因为Docker上述轻便,快速的特性。可以使您的应用达到快速迭代的目的。每次小的变更,马上就可以看到效果。而不用将若干个小变更积攒到一定程度再变更。每次变更一小部分其实是一种非常安全的方式。 34 | 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Docker 中文指南 2 | === 3 | 4 | 5 | ## 注意 6 | 7 | > 现在已经开始v1.12版本的翻译,因为现在的版本中很多都已经不适用了,如果您想参加或者查看进度 [https://github.com/widuu/chinese_docker/tree/v1.12.0](https://github.com/widuu/chinese_docker/tree/v1.12.0) 8 | [文章目录](./SUMMARY.md) 9 | 10 | 11 | >Docker 已经出到1.8了,很多文章翻译的不对或者是已经过时,需要重新翻译和核对。从现在开始每天抽一点额外的时间来翻译文章。 12 | 13 | 演示站点:[http://docker.widuu.com](http://docker.widuu.com) 14 | 15 | ##进度 16 | 17 | >现在 Docker 的安装篇基本完成,但是也是会随时更新和修改,请大家注意。其它篇正在更新中...,灰色的代表未翻译~~ 18 | 19 | ##联系方式 20 | 21 | - 邮箱联系 admin#widuu.com(#换成@) 22 | 23 | ## Contributing 24 | 25 | 1. 登录 26 | 2. 仓库地址分布: 27 | 1. Coding仓库: 28 | 1. github仓库: 29 | 1. oschina仓库: 30 | 3. 创建您的特性分支 (`git checkout -b my-new-feature`) 31 | 4. 提交您的改动 (`git commit -am 'Added some feature'`) 32 | 5. 将您的改动记录提交到远程 git 仓库 (`git push origin my-new-feature`) 33 | 6. 然后到 coding 网站的该 git 远程仓库的 `my-new-feature` 分支下发起 Pull Request 34 | 35 | 36 | ##TODO 37 | 38 | - 修改以前的翻译错误 39 | - 增加官方新的文章 40 | - 修改过时的信息或者说官方文档已经改变的 41 | 42 | ##其他信息 43 | 44 | Coding地址:[https://coding.net/u/widuu/p/chinese_docker/git](https://coding.net/u/widuu/p/chinese_docker/git) 45 | 46 | gitHub地址:[http://github.com/widuu/chinese_docker](http://github.com/widuu/chinese_docker) 47 | 48 | blog地址:[http://www.widuu.com](http://www.widuu.com) 49 | 50 | 新浪微博:[http://weibo.com/widuu](http://weibo.com/widuu) 51 | 52 | 53 | ##授权许可 54 | 55 | 除特别声明外,本书中的内容使用[CC BY-SA 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/)(创作共用 署名-相同方式共享3.0许可协议)授权 。 56 | 57 | ![Docker friend](./images/docker-friends.png) 58 | 59 | 60 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # 目录 2 | * [安装](README.md) 3 | * [Docker 引擎](#Docker Engine) 4 | - [Mac OS X 安装 Docker](installation/mac.md) 5 | - [Windows 安装 Docker](installation/windows.md) 6 | * [Linux](#Linux) 7 | - [Arch Linux 安装 Docker](installation/archlinux.md) 8 | - [CRUX Linux 安装 Docker](installation/crux.md) 9 | - [CentOS 安装 Docker](installation/centos.md) 10 | - [Debian 安装 Docker](installation/debian.md) 11 | - [Fedora 安装 Docker](installation/fedora.md) 12 | - [FrugalWare 安装 Docker](installation/frugalware.md) 13 | - [Gentoo 安装 Docker](installation/gentoo.md) 14 | - [Red Hat Enterprise Linux 安装 Docker](installation/redhat.md) 15 | - [Ubuntu 安装 Docker](installation/ubuntu.md) 16 | - [openSUSE and SUSE Linux Enterprise 安装 Docker](installation/opensuse.md) 17 | * [Cloud](#Cloud) 18 | - [Amazon EC2 安装](installation/amazon.md) 19 | - [Joyent Public Cloud 安装 Docker](installation/joyent.md) 20 | - [Google Cloud Platform 安装 Docker](installation/google.md) 21 | - [IBM SoftLayer 安装 Docker](installation/softlayer.md) 22 | - [Microsoft Azure platform 安装 Docker](installation/azure.md) 23 | - [Rackspace Cloud 安装 Docker](installation/rackspace.md) 24 | * [二进制安装](installation/binaries.md) 25 | * [Kitematic](kitematic/) 26 | * [Docker Machine](machine/install-machine.md) 27 | * [Docker Compose](compose/install.md) 28 | * [Docker Swarm](swarm/install-w-machine.md) 29 | * [Docker 基本原理](#Docker 基本原理) 30 | * [The Docker user guide](userguide/README.md) 31 | * [Work with Docker Images](#Work with Docker Images) 32 | - [Best practices for writing Dockerfiles](#Best practices for writing Dockerfiles) 33 | - [Create a base image](articles/baseimages.md) 34 | - [Get started with images](userguide/dockerimages.md) 35 | - [Get started with Docker Hub](userguide/dockerrepos.md) 36 | * [Work with Docker Containers](#Work with Docker Containers) 37 | - [Get started with containers](articles/basics.md) 38 | - [Working with containers](userguide/usingdocker.md) 39 | - [Managing data in containers](userguide/dockervolumes.md) 40 | - [Linking containers together](userguide/dockerlinks.md) 41 | - [Automatically start containers](#Automatically start containers) 42 | * [Docker on Windows & OSX](#Docker on Windows & OSX) 43 | - [PowerShell DSC Usage](#PowerShell DSC Usage) 44 | - [Resizing a Boot2Docker volume](#Resizing a Boot2Docker volume) 45 | * [Use the Kitematic GUI](#Use the Kitematic GUI) 46 | - [Kitematic User Guide: Intro & Overview](#Kitematic User Guide: Intro & Overview) 47 | - [Set up an Nginx web server](#Set up an Nginx web server) 48 | - [Set up a Minecraft Server](#Set up a Minecraft Server) 49 | - [Creating a Local RethinkDB Database for Development](#Creating a Local RethinkDB Database for Development) 50 | - [Frequently Asked Questions](#Frequently Asked Questions) 51 | - [Known Issues](#Known Issues) 52 | * [Use Docker](#Use Docker) 53 | * [About Docker](#About Docker) 54 | * [Apply custom metadata](#Apply custom metadata) 55 | * [Understand the architecture](#Understand the architecture) 56 | * [ Provision & set up Docker hosts](#Provision & set up Docker hosts) 57 | - [Overview of Docker Machine](#Overview of Docker Machine) 58 | * [使用Docker Hub](userguide/dockerhub.md) 59 | * [在Docker中运行应用](userguide/dockerizing.md) 60 | * [使用容器](userguide/usingdocker.md) 61 | * [使用docker镜像](userguide/dockerimages.md) 62 | * [连接容器](userguide/dockerlinks.md) 63 | * [管理容器数据](userguide/dockervolumes.md) 64 | * [使用Docker Hub](userguide/dockerrepos.md) 65 | * [Docker Hub](docker-hub/docker-hub.md) 66 | * [Docker Hub](docker-hub/docker-hub.md) 67 | * [账户](docker-hub/accounts.md) 68 | * [存储库](docker-hub/repos.md) 69 | * [自动构建](docker-hub/builds.md) 70 | * [官方案例](examples/nodejs_web_app.md) 71 | * [Docker中运行MongoDB](examples/mongodb.md) 72 | * [Docker中运行Redis服务](examples/running_redis_service.md) 73 | * [Docker中运行PostgreSQL](examples/postgresql_service.md) 74 | * [Docker中运行Riak服务](examples/running_riak_service.md) 75 | * [Docker中运行SSH进程服务](examples/running_ssh_service.md) 76 | * [Docker中运行CouchDB服务](examples/couchdb_data_volumes.md) 77 | * [Docker中运行Apt-Cacher-ng服务](examples/apt-cacher-ng.md) 78 | * [文章](articles/basics.md) 79 | * [使用docker第一步](articles/basics.md) 80 | * [创建一个基本镜像](articles/baseimages.md) 81 | 82 | -------------------------------------------------------------------------------- /articles/SupervisorwithDocker.md: -------------------------------------------------------------------------------- 1 | Using Supervior with Docker 2 | ==== 3 | 4 | 注意:如果你不喜欢使用sudo,那么你可以看看[Giving non-root access](http://docs.docker.com/installation/binaries/#dockergroup) 5 | 6 | 传统上的docker容器中一次只能运行一个进程,例如一次只运行一个Apache守护进程或SSH服务器守护进程一个进程。你经常遇到需要 7 | 在一个容器中运行多个进程的情形。有许多方法可以实现这一点,从使用简单的bash脚本来运行的`CMD`指令到安装进程管理工具。 8 | 9 | 在这个例子中,我们将要利用进程管理工具,[`Supervior`](http://supervisord.org/),来管理我们容器中的多个进程。使用Supervior使我们能够更好地控制,管理, 10 | 和重新启动我们想要运行的进程。为了证明这一点,我们接下来要安装并管理的SSH服务进程和一个Apache守护进程。 11 | 12 | 创建Dockerfile 13 | ----- 14 | 让我们先创建一个基本的`Dockerfile`来创建我们的新镜像。 15 | 16 | ```sh 17 | FROM ubuntu:13.04 18 | MAINTAINER examples@docker.com 19 | RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list 20 | RUN apt-get update 21 | RUN apt-get upgrade -y 22 | ``` 23 | 安装Supervisor 24 | ----- 25 | 现在,我们可以安装我们的SSH和Apache,以及Supervisor在我们的容器中。 26 | 27 | ```sh 28 | RUN apt-get install -y openssh-server apache2 supervisor 29 | RUN mkdir -p /var/run/sshd 30 | RUN mkdir -p /var/log/supervisor 31 | ``` 32 | 这里我们组装了一个包含Openssh-server,Apache2和supervisor(它提供了超级守护进程)的封装包。我们也创建了用来运行 33 | 我们SSH和Supervisor的两个新目录 34 | 35 | 添加Supervisor的配置文件 36 | ------- 37 | 现在,让我们为Supervisor添加一个配置文件。默认的文件名为`supervisord.conf`,位于`/etc/supervisor/conf.d/`。 38 | 39 | ```sh 40 | COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf 41 | ``` 42 | 让我们来看看supervisord.conf文件。 43 | 44 | ```sh 45 | [supervisord] 46 | nodaemon=true 47 | 48 | [program:sshd] 49 | command=/usr/sbin/sshd -D 50 | 51 | [program:apache2] 52 | command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" 53 | ``` 54 | 该`supervisord.conf`配置文件包含了配置Supervisor的指令和Supervisor用来管理进程的指令。第一部分`[supervisord]`为Supervisor本身的配置。 55 | 我们使用一个`nodaemon`指令,来告诉Supervisor以交互方式而非以后台进程方式运行。 56 | 57 | 接下来的两个部分用来管理我们要控制的服务。每个部分控制一个单独的进程。该部分包含一个`command`指令,指定用什么命令来启动每个过程。 (*译者注:要运行什么指令按照相同格式添加即可*) 58 | 59 | 开放端口以及运行Supervisor 60 | ------ 61 | 现在,让我们开放一些需要口,并指定当容器启动时要运行的CMD指令来结束`Dockerfile`文件。 62 | 63 | ```sh 64 | EXPOSE 22 80 65 | CMD ["/usr/bin/supervisord"] 66 | ``` 67 | 在这里,当我们的容器启动时,会自动开放了容器的22和80端口,同时运行`/usr/bin/supervisord`命令。 68 | 69 | 创建我们自己的镜像 70 | -------- 71 | 现在,我们可以创建我们的新镜像。 72 | 73 | ```sh 74 | $ sudo docker build -t /supervisord . 75 | ``` 76 | 启动我们的Supervisor容器 77 | --------- 78 | 一旦我们创建了一个镜像,我们就可以从它启动一个容器。 79 | 80 | ```sh 81 | $ sudo docker run -p 22 -p 80 -t -i /supervisord 82 | 2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file) 83 | 2013-11-25 18:53:22,312 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing 84 | 2013-11-25 18:53:22,342 INFO supervisord started with pid 1 85 | 2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6 86 | 2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7 87 | . . . 88 | ``` 89 | 90 | 我们已经使用`docker run`命令以交互方式启动一个新的容器。该容器已运行Supervisor,并启动了SSH和Apache后台进程。 91 | 我们已经指定了`-p`参数开放了端口22和80。通过这种方式我们可以确认我们开放的端口,并且通过这些端口连接到SSH和Apache后台进程。 92 | -------------------------------------------------------------------------------- /articles/baseimages.md: -------------------------------------------------------------------------------- 1 | # 创建一个基本镜像 2 | ================== 3 | 4 | 5 | 你想创建你自己的[基础镜像](../terms/image.md)?很好! 6 | 7 | 具体的过程会严重依赖于你想打包的Linux发行版。我们有下面一些例子供你参考。 8 | 同时,我们鼓励你通过提交推送请求来贡献你的新镜像。 9 | 10 | 11 | ### 使用 tar 来创建一个完整的镜像 12 | 13 | 通常,你要先运行一个可工作的发行版的机器,来打包一个基础镜像。虽然有一些 14 | 工具不是必需的,比如 Debian 的 Deboostrap,但是你还是可以用它来生成 Ubuntu 15 | 镜像。 16 | 17 | 下面的例子尽可能简单地创建一个 Ubuntu 基础镜像: 18 | 19 | $ sudo debootstrap raring raring > /dev/null 20 | $ sudo tar -C raring -c . | sudo docker import - raring 21 | a29c15f1bf7a 22 | $ sudo docker run raring cat /etc/lsb-release 23 | DISTRIB_ID=Ubuntu 24 | DISTRIB_RELEASE=13.04 25 | DISTRIB_CODENAME=raring 26 | DISTRIB_DESCRIPTION="Ubuntu 13.04" 27 | 28 | 在 Docker 的 GitHub 上,有更多的创建基础镜像的脚本示例: 29 | 30 | - [BusyBox](https://github.com/dotcloud/docker/blob/master/contrib/mkimage-busybox.sh) 31 | - CentOS / Scientific Linux CERN (SLC) [on Debian/Ubuntu](https://github.com/dotcloud/docker/blob/master/contrib/mkimage-rinse.sh) or on [CentOS/RHEL/SLC/etc](https://github.com/dotcloud/docker/blob/master/contrib/mkimage-yum.sh). 32 | - [Debian / Ubuntu](https://github.com/dotcloud/docker/blob/master/contrib/mkimage-debootstrap.sh) 33 | 34 | 35 | ### 使用 scratch 创建简单的基础镜像 36 | 37 | 在 Docker 的注册中,有一个使用空的 tar 文件创建的特殊的版本库,叫 scratch : 38 | 39 | $ tar cv --files-from /dev/null | docker import - scratch 40 | 41 | 你可以用 *** docker pull *** 把它拉取下来。然后你就可以基于它来做新的最小 42 | 的容器了: 43 | 44 | FROM scratch 45 | COPY true-asm /true 46 | CMD ["/true"] 47 | 48 | 上面的 Dockerfile 来自外部的一个最小镜像:[tianon/true](https://github.com/tianon/dockerfiles/tree/master/true)。 49 | -------------------------------------------------------------------------------- /articles/basics.md: -------------------------------------------------------------------------------- 1 | 使用docker第一步 2 | === 3 | 4 | ###检查你的Docker是否安装 5 | 6 | 本指南假设你已经完成了Docker的安装工作。检查你安装的Docker,运行以下命令: 7 | 8 | # Check that you have a working install 9 | $ docker info 10 | 11 | 如果你得到 `docker: command not found`,你可能没有完整的安装上Docker。 12 | 13 | 如果你得到 `/var/lib/docker/repositories: permission denied` ,那你可能没有权限访问你主机上的Docker。 14 | 15 | 为获得访问Docker权限可以直接在命令前加`sudo`,或者采取以下步骤授予权限:: 16 | 17 | # 如果还没有docker group就添加一个: 18 | $ sudo groupadd docker 19 | # 将用户加入该group内。然后退出并重新登录即可生效。 20 | $ sudo gpasswd -a ${USER} docker 21 | # 重启docker 22 | $ sudo service docker restart 23 | 24 | 请参考[安装指南](../install/)安装。 25 | 26 | ###下载预构建镜像 27 | 28 | # Download an ubuntu image 29 | $ sudo docker pull ubuntu 30 | 31 | 这将从Docker Hub中查找到 `Ubuntu` 镜像,并且从Docker Hub中下载镜像到本地缓存中。 32 | 33 | >提示:当镜像下载成功之后,你将会看到镜像的短id一个12字符的hash, `539c0211cd76: Download complete`,这些短的镜像IDS是完整ID的前12个字符。你可以使用 `docker inspect`和 `docker images --no-trunc=true`来查看完整ID。 34 | 35 | 如果你使用OS X,你可以使用 `sudo`。 36 | 37 | ###运行交互shell 38 | 39 | # 在ubuntu镜像中使用运行交互shell, 40 | # 分配一个控制台,分配输入输出流 41 | # To detach the tty without exiting the shell, 42 | # use the escape sequence Ctrl-p + Ctrl-q 43 | # note: This will continue to exist in a stopped state once exited (see "docker ps -a") 44 | $ sudo docker run -i -t ubuntu /bin/bash 45 | 46 | ###绑定Docker到另外的主机/端口或者Unix socket 47 | 48 | >提示:修改默认的 docker 进程绑定到一个tcp端口或者 Unix docker群组,这将会增加你的安全风险,允许非 root 用户获得 root 访问的主机权限。请确保你的 `docker` 权限。如果你绑定一个 `TCP` 端口任何人可以通过这个端口来访问你的 `Docker`,所以它不应该放在一个开放的网络中。 49 | 50 | 使用 `-H` 标记可以使 `Docker` 来监听指定的IP和端口。默认情况下,它将监听 `unix:///var/run/docker.sock`只允许本地root用户连接。你可以将它设置为 `0.0.0.0:2375`或者指定的主机IP来给所有人访问权限。但是这不推荐,因为这样普通用户获得主机上运行进程的root权限。 51 | 52 | 同样,Docker 客户端可以使用 `-H` 来连接指定的主机端口。 53 | 54 | `-H` 使用以下格式来分配主机和端口 55 | 56 | tcp://[host][:port]` or `unix://path 57 | 58 | 举例: 59 | 60 | + tcp://host:2375 -> TCP connection on host:2375 61 | + unix://path/to/socket -> Unix socket located at path/to/socket 62 | 63 | `-H`,当输入为空的时候,将默认为相同的原始值,即没有`-H`输入。 64 | `-H`也接受短形式的TCP绑定。 65 | 66 | host[:port]` or `:port 67 | 68 | 进程模式运行Docker 69 | 70 | $ sudo /docker -H 0.0.0.0:5555 -d & 71 | 72 | 下载`Ubuntu`镜像: 73 | 74 | sudo docker -H :5555 pull ubuntu 75 | 76 | 你可以使用多个`-H`标记,例如,你想要同时监听TCP和Unix socket。 77 | 78 | # 进程模式下运行docker 79 | $ sudo /docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock -d & 80 | # 使用默认的unix socker来下载ubuntu镜像 81 | $ sudo docker pull ubuntu 82 | # 或者使用TCP端口 83 | $ sudo docker -H tcp://127.0.0.1:2375 pull ubuntu 84 | 85 | ####开始一个长时间运行的工作进程 86 | 87 | # 开始一个非常有用的长时间运行的进程 88 | $ JOB=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done") 89 | 90 | # 到目前为止收集的输出工作 91 | $ sudo docker logs $JOB 92 | 93 | # 关闭这项进程 94 | $ sudo docker kill $JOB 95 | 96 | ####列出容器 97 | 98 | $ sudo docker ps # Lists only running containers 99 | $ sudo docker ps -a # Lists all containers 100 | $ sudo docker ps -l # List the last running container 101 | 102 | ####控制容器 103 | 104 | # 开始一个新的容器 105 | $ JOB=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done") 106 | 107 | # 停止容器 108 | $ docker stop $JOB 109 | 110 | # 开始容器 111 | $ docker start $JOB 112 | 113 | # 重启容器 114 | $ docker restart $JOB 115 | 116 | # 杀死一个工作 117 | $ docker kill $JOB 118 | 119 | # 删除一个容器 120 | $ docker stop $JOB # Container must be stopped to remove it 121 | $ docker rm $JOB 122 | 123 | 124 | ####绑定服务到TCP端口 125 | 126 | 127 | #让容器绑定4444端口,并通知netcat监听它。 128 | $ JOB=$(sudo docker run -d -p 4444 ubuntu:12.10 /bin/nc -l 4444) 129 | 130 | # 查看容器转发的公共端口 131 | $ PORT=$(sudo docker port $JOB 4444 | awk -F: '{ print $2 }') 132 | 133 | # 连接这个公共端口 134 | $ echo hello world | nc 127.0.0.1 $PORT 135 | 136 | # 确认网络连接工作 137 | $ echo "Daemon received: $(sudo docker logs $JOB)" 138 | 139 | ####提交(存储)一个容器的状态 140 | 141 | 保存你镜像容器的状态,这也就可以重复利用。 142 | 143 | 当你提交你的容器,仅仅是镜像和容器之间的不同,从创建到容器的当前状态来存储(作为差异)。你可以使用 `docker images`来查看已有镜像。 144 | 145 | # 使用新的名称来提交你的镜像 146 | $ sudo docker commit 147 | 148 | # 列出你的容器 149 | $ sudo docker images 150 | 151 | 你现在有一个镜像的状态,你可以创建新的实例。 152 | 153 | ####删除Docker镜像 154 | 155 | 首先要保证有权限对Docker镜像或者容器进行操作,具体做法参见进入前文安装部分。 156 | 157 | # 停止所有容器 158 | $ docker stop $(docker ps -a -q) 159 | 160 | # 删除指定镜像 161 | $ docker rmi $image 162 | 163 | # 删除无标示镜像,即id为的镜像 164 | $ docker rmi $(docker images | grep "^" | awk "{print $3}") 165 | 166 | # 删除所有镜像 167 | $ docker rmi $(docker images -q) 168 | 169 | 170 | -------------------------------------------------------------------------------- /articles/https.md: -------------------------------------------------------------------------------- 1 | 使用 HTTPS 保护 Docker Socket 进程 2 | === 3 | 4 | 默认情况下,Docker 使用的是无网络环境的 Unix Socket。它可以使用 HTTP Socket 进行通信。 5 | 6 | 如果你需要 Docker 使用安全的方式来进行网络通信,你可以使用 `tlsverify` 标识来启用 TLS,并使用 `tlscacert` 标识来指定 CA 证书。 7 | 8 | >警告:使用 TLS 和管理 CA 证书是一个高级话题。在投入生成环境使用之前,你需要自行熟悉了解 OpenSSL,X509 和 TLS 。 9 | 10 | >警告:这些 TLS 指令只能生成在 Linux 上工作的证书,Mac OSX 附带的 OpenSSL 版本与 Docker 所需要使用的证书不兼容。 -------------------------------------------------------------------------------- /articles/networking.md: -------------------------------------------------------------------------------- 1 | 网络配置 2 | === 3 | 4 | ###TL;DR(原文的这些个符号,几个意思?) 5 | 6 | `Dockers`启动后,会在宿主机上创建名为`docker0`的虚拟网卡,并给`docker0`随机分配一个宿主机没有使用,且满足RFC 1918定义的私有网络地址和子网段。举例来说,在我做这个步骤时,Docker分配的子网段是`172.17.42.1/16`,(最后那个16是掩码,表示该子网段可以会为宿主机和容器提供65534个地址)。容器的MAC地址根据IP地址生成,可以避免产生ARP冲突,它的范围从 02:42:ac:11:00:00 开始到 02:42:ac:11:ff:ff结束。 7 | 8 | >注:本文档讨论的是 `docker` 的网络高级配置选项,初级用户无需阅读。如果想了解`docker`网络或容器间的连接方式,请查看[docker用户指南](../userguide/dockerlinks) 9 | 10 | 当然, `docker0` 除了是虚拟网卡,还是负责其附属网卡间数据转发的虚拟网桥。`docker`每新建一个容器,就会同时创建了两个相对应的网卡接口,它们就像一条管道的两端:数据从一端进入(发送),从另一端出来(接受)。这两个网卡,一个被分配给新建的容器做`eth0`网卡,另一个被分配给宿主机,并取个类似于`vethAQI2QT`的唯一名称。就这样,通过绑定每个`veth*`网卡到`docker0`网桥,`Docker`在宿主机和各docker容器间搭建起了一个虚拟子网。 11 | 12 | 接下来,我们详细阐述如何使用`docker`参数或Linux网络命令来进一步修改、完善、或者完全替代`docker`的默认网络配置。 13 | 14 | ###参数快速指南 15 | 16 | 首先,来浏览`docker`的网络相关的命令行选项列表,下面的章节对一一进行介绍: 17 | 18 | 第一部分:只能在`docker`服务启动时使用使用的网络命令行选项,一旦运行,不能改变。 19 | 20 | + `-b BRIDGE` or `--bridge=BRIDGE` — 请查看[搭建私人网桥](#bridge-building)小节 21 | + `--bip=CIDR` — 请查看[定制 docker0](#docker0)小节 22 | + `-H SOCKET...` 或 `--host=SOCKET...` —这个参数听起来像是在说容器网络,但实际上是在干另一件事:用来向`Docker`服务传递类似"运行容器"和“停止容器”的命令。 23 | + `--icc=true|false` — 请查看[容器间通信](#between-containers)小节小节 24 | + `--ip=IP_ADDRESS` — 请查看[绑定容器端口](#binding-port)小节 25 | + `--ipv6=true|false` — 请查看[IPV6](#ipv6)小节 26 | + `--ip-forward=true|false` — 请查看[容器与外部通讯](#the-world)小节 27 | + `--iptables=true|false` — 请查看[容器间通信](#between-containers)小节 28 | + `--mtu=BYTES` — 请查看[定制 docker0](#docker0)小节 29 | 30 | 第二部分:下面两个参数,可以在启动时或者当 `docker run` 运行调用。如果启动时进行了设置,就会作为`docker run`运行时的初始默认值。 31 | 32 | + `--dns=IP_ADDRESS...` — 请查看[配置 DNS](#dns)小节 33 | + `--dns-search=DOMAIN...` — 请查看[配置 DNS](#dns)小节 34 | 35 | 第三部分:只能在`docker run`运行时调用的参数,特别用来定制容器的特性: 36 | 37 | + `-h HOSTNAME` or `--hostname=HOSTNAME` — 请查看[配置 DNS](#dns)小节和[如何设置容器的网络](#containers-networking)小节 38 | + `--link=CONTAINER_NAME:ALIAS` — 请查看[配置 DNS](#dns)小节和[容器间通信](#between-containers)小节 39 | + `--net=bridge|none|container:NAME_or_ID|host` — 请查看[如何设置容器的网络](#containers-networking)小节 40 | + `--mac-address=MACADDRESS...` — 请查看[如何设置容器的网络](#containers-networking)小节 41 | + `-p SPEC` or `--publish=SPEC` — 请查看[绑定容器端口](#binding-port)小节 42 | + `-P` or `--publish-all=true|false` — 请查看[绑定容器端口](#binding-port)小节 43 | 44 | 接下来,我们从浅到深的讲解上述题目。 45 | 46 | ###配置DNS 47 | 48 | docker如何给每个容器提供独立的主机名和DNS配置呢?当然不是直接把主机名写到镜像里。docker巧妙的利用可刷新的虚拟文件覆盖了容器`/etc`目录下的三个关键文件。可以在容器内运行`mount`命令进行查看: 49 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docker中文指南", 3 | "version": "0.0.1", 4 | "description": "docker中文教程,docker中文指南", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/widuu/chinese_docker.git" 8 | }, 9 | "author": "admin@widuu.com", 10 | "dependencies": { 11 | "gitbook-plugin-autocover": "0.0.5" 12 | } 13 | } -------------------------------------------------------------------------------- /compose/cli.md: -------------------------------------------------------------------------------- 1 | Compose 相关命令行 2 | = 3 | 4 | 下面将介绍 `docker-compose` 子命令的使用。也可以通过运行 `docker-compose --help`来查看这些信息。 5 | 6 | - [build](#build) 7 | - [help](#help) 8 | - [kill](#kill) 9 | - [ps](#ps) 10 | - [restart](#restart) 11 | - [run](#run) 12 | - [start](#start) 13 | - [up](#up) 14 | - [logs](#logs) 15 | - [port](#port) 16 | - [pull](#pull) 17 | - [rm](#rm) 18 | - [scale](#scale) 19 | - [stop](#stop) 20 | 21 | 22 | ### build 23 | ``` 24 | 用法:build [options] [SERVICE...] 25 | 选项: 26 | --force-rm 总是移除构建过程中产生的中间项容器 27 | --no-cache 构建镜像过程中不使用Cache 28 | --pull 总是尝试获取更新版本的镜像 29 | ``` 30 | 构建服务并打上`project_service`风格的标签(如:`composetest_db`)。如果你更改了服务的`Dockerfile`或者构建目录下的内容,需要运行`docker-compose build`重新构建服务。 31 | 32 | ### help 33 | ``` 34 | 用法:help COMMAND 35 | ``` 36 | 显示命令的帮助信息及用法教程。 37 | 38 | ### kill 39 | ``` 40 | 用法:kill [options] [SERVICE...] 41 | 选项: 42 | -s SIGNAL SIGNAL 是发送给容器的信号量,默认是 SIGKILL 43 | ``` 44 | 通过发送`SIGKILL`信号来强制终止运行中的容器,也可以发送指定的信号量,例如: 45 | 46 | $ docker-compose kill -s SIGINT 47 | 48 | ### ps 49 | ``` 50 | 用法:ps [options] [SERVICE...] 51 | 选项: 52 | -q 仅仅显示容器ID 53 | ``` 54 | 列出容器。 55 | 56 | ### restart 57 | ``` 58 | 用法:restart [options] [SERVICE...] 59 | 选项: 60 | -t, --timeout TIMEOUT 设置关闭服务的超时时间,单位为秒,默认为10 61 | ``` 62 | 重启服务。 63 | 64 | ### run 65 | ``` 66 | 用法:run [options] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] 67 | 选项: 68 | -d 分离模式:在后台运行容器,只打印新的容器名称 69 | --entrypoint CMD 覆盖镜像的入口点(CMD ...) 70 | -e KEY=VAL 设置环境变量,可以使用多次 71 | -u, --user="" 通过指定的用户名或用户id来运行 72 | --no-deps 不启动link连接的服务 73 | --rm 运行结束后移除容器,在分离模式下将被忽略 74 | -p, --publish=[] 将容器暴露端口映射到主机端口 75 | --service-ports 通过服务映射到主机的端口执行命令 76 | -T 禁用pseudo-tty分配,默认会分配一个TTY 77 | ``` 78 | 对服务运行的命令。例如,以下命令启动web服务并运行bash命令 79 | 80 | $ docker-compose run web bash 81 | 82 | `run`命令,将使用服务中已经定义的配置来创建运行一个新的容器。也就是说,如此创建的容器,将会使用相同的挂载卷、容器连接等相同的配置,但它们依旧可以存在差异。 83 | 84 | 第一个区别是,可以使用`run`命令覆盖服务中指定的运行命令。例如,`web`服务中的配置指定的运行命令为`bash`,那么`docker-compose run web python app.py`将使用`python app.py`来覆盖它。 85 | 86 | 第二个区别是,`docker-compose run`命令不会创建任何服务配置中指定的端口映射,这样可以防止多个容器映射同一端口的冲突。如果你需要使得服务的端口创建并映射到主机,需要指定`--service-ports`标记,如下: 87 | 88 | $ docker-compose run --service-ports web python manage.py shell 89 | 90 | 或者可以手动指定端口映射,和使用`docker run`一样,使用`--publish`或`-p`选项: 91 | 92 | $ docker-compose run --publish 8080:80 -p 2022:22 -p 127.0.0.1:2021:21 web python manage.py shell 93 | 94 | 如果启动一个带有容器连接的服务,`run`命令将首先检查连接到的服务是否已运行,如果是停止状态,将会启动它,直到所有的相关服务都处于正在运行状态,才会执行你创建的命令。例如: 95 | 96 | $ docker-compose run db psql -h db -U docker 97 | 98 | 这将创建一个与PostgreSQL容器`db`交互服务。 99 | 100 | 如果你不希望启动相关联容器,可以使用`--no-deps`标记: 101 | 102 | $ docker-compose run --no-deps web python manage.py shell 103 | 104 | ### start 105 | ``` 106 | 用法:start [SERVICE...] 107 | ``` 108 | 启动服务中已经存在的容器。 109 | 110 | ### up 111 | ``` 112 | 用法:up [options] [SERVICE...] 113 | 选项: 114 | -d 分离模式:在后台运行容器,只打印新的容器名称 115 | --no-color 单色输出 116 | --no-deps 不启动link连接的服务 117 | --force-recreate 强制重新创建容器,即使镜像没有任何改变。与--no-recreate会冲突 118 | --no-recreate 如果对应容器已经存在,不重新创建它。与--force-recreate会冲突 119 | --no-build 不构建镜像,即使缺失 120 | -t, --timeout TIMEOUT 为容器设置关闭超时时间,单位:秒 (默认为 10) 121 | ``` 122 | 对服务,构建镜像、(重新)创建容器、启动容器。 123 | 124 | 该命令还将启动任何相关的且没有被启动的服务。 125 | 126 | `docker-compose up`命令将显示所有容器的输出,命令结束时,所有容器都将关闭。运行`docker-compose up -d `将在后台启动运行容器。 127 | 128 | 如果服务中已经存在运行中的容器了,并且在容器创建后更改服务配置或者镜像,`docker-compose up`命令将会停止当前容器(保存挂载卷)并重新构建启动容器。当然,也可以通过`--no-recreate`选项来避免重新构建。 129 | 130 | 使用`--force-recreate`标记,可以强制停止并重构所有容器。 131 | 132 | ### logs 133 | ``` 134 | 用法:logs [options] [SERVICE...] 135 | 选项: 136 | --no-color 单色输出 137 | ``` 138 | 显示服务输出的日志内容。 139 | 140 | ### port 141 | ``` 142 | 用法:port [options] SERVICE PRIVATE_PORT 143 | 选项: 144 | --protocol=proto tcp 或 udp [默认为 tcp] 145 | --index=index 对应实例服务的第几个容器[默认为 1] 146 | ``` 147 | 打印服务中端口绑定对应的主机端口。 148 | 149 | ### pull 150 | ``` 151 | 用法:pull [options] [SERVICE...] 152 | 选项: 153 | --ignore-pull-failures 尽可能拉取服务,忽略拉取失败 154 | ``` 155 | 拉取服务镜像。 156 | 157 | ### rm 158 | ``` 159 | 用法:rm [options] [SERVICE...] 160 | 选项: 161 | -f, --force 强制删除,不询问确认信息 162 | -v 移除容器挂载的卷 163 | ``` 164 | 删除停止的服务容器。 165 | 166 | ### scale 167 | ``` 168 | 用法:scale [SERVICE=NUM...] 169 | ``` 170 | 设置一个服务需要运行的容器数量。 171 | 参数形式为`service=num`。例如: 172 | 173 | $ docker-compose scale web=2 worker=3 174 | 175 | ### stop 176 | ``` 177 | 用法:stop [options] [SERVICE...] 178 | 选项: 179 | -t, --timeout TIMEOUT 设置关闭容器的超时时间 180 | ``` 181 | 停止容器而不移除,可以通`docker-compose start`重新启动。 182 | 183 | -------------------------------------------------------------------------------- /compose/install.md: -------------------------------------------------------------------------------- 1 | 安装 Compose 2 | === 3 | 4 | 在安装 Compose之前,你需要先安装好 Docker 。然后你需要使用 `curl` 指令来安装 Compose 5 | 6 | ###安装 Docker 7 | 8 | 9 | 首先,你需要安装大于或者等于1.6版本的 Docker 。 10 | 11 | - [MAC OSX 安装指南](../installation/mac.md) 12 | - [Ubuntu 安装指南](../installation/ubuntu.md) 13 | - [其它系统安装指南](../installation/) 14 | 15 | 16 | ###安装 Compose 17 | 18 | 运行下边的命令来安装 Compose: 19 | 20 | curl -L https://github.com/docker/compose/releases/download/1.3.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 21 | chmod +x /usr/local/bin/docker-compose 22 | 23 | >注意:如果你在安装的时候出现了 “Permission denied” 的错误信息,这说明你的 `/usr/local/bin` 目录是不可写的,你需要使用超级用户来安装。运行 `sudo -i` , 然后运行上边的两个命令,然后 `exit` 退出。 24 | 25 | 可选,你也可以在 shell 中使用命令行安装。 26 | 27 | Compose 适用于 OS X 和 64位的Linux 。 如果你使用其他平台,你可以安装一个 Compose 的 Python 包来完成安装。 28 | 29 | $ sudo pip install -U docker-compose 30 | 31 | 32 | 到这里安装就结束了;Compose已经安装完成。你可以使用 ` docker-compose --version` 来进行测试 。 33 | 34 | ###升级 35 | 36 | 如果你使用的是 Compose 1.2或者早期版本,当你升级完成后,你需要删除或者迁移你现有的容器。这是因为,1.3版本, Composer 使用 Docker 标签来对容器进行检测,所以它们需要重新创建索引标记。 37 | 38 | 如果 Composer 检测到创建的容器没有标签,它将拒绝运行,这样你就不会有两组容器。如果你想要保留已经存在的容器(举例:这里有容器的数据卷上保留这非常重要的数据),你可以使用下边的命令来迁移: 39 | 40 | docker-compose migrate-to-labels 41 | 42 | 或者,如果这些容器是不必要的,你可以删除它们 - Composer 会重新创建一个新的。 43 | 44 | docker rm -f myapp_web_1 myapp_db_1 ... 45 | 46 | 47 | ###Compose 文档 48 | 49 | + [用户指南](../compose/) 50 | + [使用命令行](../compose/cli.md) 51 | + [Yaml 文件使用](../compose/yml.md) 52 | + [Compose 环境变量](../compose/env.md) 53 | + [命令行安装Compose](../compose/completion.md) -------------------------------------------------------------------------------- /docker-hub/accounts.md: -------------------------------------------------------------------------------- 1 | Docker Hub账户 2 | === 3 | 4 | ##Docker Hub账户 5 | 6 | 当没有数字签名和账户的时候,你只能从 [Docker Hub](https://hub.docker.com/) 上 `search` 和 `pull` 一个 Docker 镜像。然后,想要 `push `镜像到服务器、发表评论或者 star 一个仓库,你就需要去创建一个 [Docker Hub](https://hub.docker.com/) 账户。 7 | 8 | ###注册一个Docker Hub账户 9 | 10 | 你可以通过电子邮件来[注册](https://hub.docker.com/account/signup/)一个 Docker Hub 账户,验证邮箱后即可使用。 11 | 12 | ###电子邮件激活过程 13 | 14 | 你至少需要有一个有效的电子邮件地址来验证你的账户。如果你未收到验证邮件,你可以通过访问[此页面](https://hub.docker.com/account/resend-email-confirmation/)来请求重新发送确认邮件。 15 | 16 | ###密码重置流程 17 | 18 | 如果由于某种原因,你忘记密码,不能访问您的账户,你可以从[密码重置页面](https://hub.docker.com/account/forgot-password/)来重置你的密码。 19 | 20 | ##组织&机构 21 | 22 | Docker Hub 的机构和群组允许你加入组织和团队。你可以在[这里](https://hub.docker.com/account/organizations/)查看你属于哪个组织,你也可以从选项卡中添加新的组织。 23 | 24 | ![../images/orgs.png](../images/orgs.png) 25 | 26 | 在你的组织中,你可以创建群组,让您进一步管理可以与你的版本库进行交互的人员。 27 | 28 | ![../images/groups.png](../images/groups.png) 29 | -------------------------------------------------------------------------------- /docker-hub/builds.md: -------------------------------------------------------------------------------- 1 | Docker Hub上的自动化构建 2 | === 3 | 4 | ##关于自动化构建 5 | 6 | 自动化构建是一个特殊的功能,它允许您在 Docker Hub 上使用构建集群,根据指定的 `Dockerfile` 或者 GitHub 、 BitBucket 仓库(或环境)来自动创建镜像。该系统将从仓库复制一份,并根据以仓库为环境的 `Dockerfile` 的描述构建镜像。由此产生的镜像将被上传到注册表,并且自动生成标记。 7 | 8 | 自动化构建有许多优势: 9 | 10 | * 你的自动化构建项目一定是准确按照预期构建的 11 | * 在 Docker Hub 注册表上,任何拥有你仓库访问权限的用户都乐意浏览 `Dockerfile` 12 | * 自动化构建保证了你的仓库总是最新的 13 | 14 | 自动化构建支持 [GitHub](http://GitHub.com/) 和 [BitBucket](https://bitbucket.org/) 的私有和公有的仓库。 15 | 16 | 要使用自动化构建,你必须拥有经过验证有效的 Docker Hub 账户和 GitHub/Bitbucket 账户。 17 | 18 | ##设置GitHub自动化构建 19 | 20 | 首先,你需要将 GitHub 账户链接到你的 [Docker Hub](https://hub.docker.com/) 账户,以允许注册表查看你的仓库。 21 | 22 | >注:目前我们需要有读写权限以建立 Docker Hub 和 GitHub 的挂钩服务,这是GitHub管理权限的方式,我们别无选择。抱歉!我们将保护您的账户及隐私,确保不会被他人非法获取。 23 | 24 | 开始构建!登录到你的 Docker Hub 账户,点击屏幕右上方的 "+ Add Repository" 按钮,选择[自动化构建](https://registry.hub.docker.com/builds/add/)。 25 | 26 | 选择[GitHub服务](https://registry.hub.docker.com/associate/GitHub/) 27 | 28 | 然后按照说明授权和连接你的 GitHub 账户到 Docker Hub。连接成功后,你就可以选择用来自动化构建的仓库了。 29 | 30 | ###创建一个自动化构建项目 31 | 32 | 你可以用你的 `Dockerfile` 从你的公共或者私有仓库[创建一个自动化构建项目](https://registry.hub.docker.com/builds/GitHub/select/)。 33 | 34 | ###GitHub子模块 35 | 36 | 如果你的 GitHub 仓库包含了私有子模块的连接,你需要在 Docker Hub 上添加部署秘钥。 37 | 38 | 部署秘钥位于自动化构建主页的 “Build Details” 菜单。访问设置 GitHub 仓库的页面,选择 “Deploy keys” 来添加秘钥。 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 |
StepScreenshotDescription
1.你的自动化构建部署秘钥位于 “Build Details” 菜单的 “Deploy keys” 下。
2.在你的 GitHub 子模块仓库设置页,添加部署秘钥。
61 | 62 | ###GitHub组织 63 | 64 | 一旦你的组织成员身份设置为公开,对应的 GitHub 组织状态便会被公开在你的 GitHub 上。为了验证,你可以查看 GitHub 上你的组织的成员选项卡。 65 | 66 | ###GitHub服务挂钩 67 | 68 | 按照以下步骤配置自动化构建的 GitHub 服务挂钩: 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 |
StepScreenshotDescription
1.登录到 GitHub.com,并转到您的仓库页面,点击右侧页面“Settings”。 83 | 执行该操作要求你有该仓库的管理员权限。
2.Webhooks & Services点击页面左侧的“Webhooks & Services”。
3.Find the service labeled Docker找到 "Docker" 并点击它.
4.Activate Service Hooks确认 "Active" 被选中,然后点击 “Update service” 按钮以保存您的更改。
96 | 97 | ##设置BitBucket自动化构建 98 | 99 | 为了设置自动化构建,你需要先把 BitBucket 连接到你的 Docker Hub 账户,以允许其访问你的仓库。 100 | 101 | 登录到你的 Docker Hub 账户,点击屏幕右上方的 "+ Add Repository" 按钮,选择[自动化构建](https://registry.hub.docker.com/builds/add/)。 102 | 103 | 选择的 [Bitbucket 服务](https://registry.hub.docker.com/associate/bitbucket/)。 104 | 105 | 然后按照说明授权和连接你的 Bitbucket 账户到 Docker Hub。连接成功后,你就可以选择用来自动化构建的仓库了。 106 | 107 | ###创建自动化构建项目 108 | 109 | 你可以用你的 `Dockerfile` 从你的公共或者私有仓库[创建一个自动化构建项目](https://registry.hub.docker.com/builds/bitbucket/select/)。 110 | 111 | ###Bitbucket服务挂钩 112 | 113 | 当你成功连接账户以后,一个 `POST` 挂钩将会自动被添加到你的仓库。请按照以下步骤确认或者更改你的挂钩设置: 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 |
StepScreenshotDescription
1.Settings登录到 Bitbucket.org 进入仓库页面。点击左侧导航下的 “Settings”。执行该操作要求你有该仓库的管理员权限。
2.Hooks点击左侧 “Settings” 下的 "Hooks"。
3.Docker Post Hook现在你应该能看到关联了该仓库的挂钩列表,包括一个指向 registry.hub.docker.com/hooks/bitbucket 的 POST 挂钩。
139 | 140 | ##Dockerfile和自动化构建 141 | 142 | 在构建过程中,我们将复制 `Dockerfile` 的内容。我们也将添加它到 Docker Hub 上,使得 Docker 社区(公共仓库)或者得到许可的团队成员可以访问仓库页面。 143 | 144 | ##README.md 145 | 146 | 如果你的仓库有一个 `README.md` 文件,我们将使用它作为仓库的描述。构建过程中会寻找 `Dockerfile` 同一目录下的 `README.md`。 147 | 148 | >警告:如果你需要在创建之后修改描述,它会在下一次自动化构建完成之后生效。 149 | 150 | ###建立触发器 151 | 152 | 如果你需要 GitHub 或者 BitBucket 以外的方式来触发自动化构建,你可以创建一个构建触发器。当你打开构建触发器,它会提供给你一个 url 来发送 POST 请求。这将触发自动化构建过程,类似于 GitHub webhook。 153 | 154 | 建立触发器可在自动化构建项目的 Settings 菜单中设置。 155 | 156 | >注:你在五分钟内只能触发一个构建,如果你已经进行一个构建,或你最近提交了构建请求,这些请求将被忽略。你可以在设置页面来找到最后10条触发日志来验证是否一切正常工作。 157 | 158 | ###Webhooks 159 | 160 | 也可以使用 Webhooks 来自动化构建,Webhooks 会在仓库推送成功后被调用。 161 | 162 | 此webhook调用将生成一个 HTTP POST,JSON样例如下: 163 | 164 | { 165 | "push_data":{ 166 | "pushed_at":1385141110, 167 | "images":[ 168 | "imagehash1", 169 | "imagehash2", 170 | "imagehash3" 171 | ], 172 | "pusher":"username" 173 | }, 174 | "repository":{ 175 | "status":"Active", 176 | "description":"my docker repo that does cool things", 177 | "is_automated":false, 178 | "full_description":"This is my full description", 179 | "repo_url":"https://registry.hub.docker.com/u/username/reponame/", 180 | "owner":"username", 181 | "is_official":false, 182 | "is_private":false, 183 | "name":"reponame", 184 | "namespace":"username", 185 | "star_count":1, 186 | "comment_count":1, 187 | "date_created":1370174400, 188 | "dockerfile":"my full dockerfile is listed here", 189 | "repo_name":"username/reponame" 190 | } 191 | } 192 | 193 | Webhooks 可在自动化构建项目的 Settings 菜单中设置。 194 | 195 | >注意:如果你想测试你的 webhook,我们建议使用像 [requestb.in](http://requestb.in/) 的工具。 196 | 197 | ###仓库链接 198 | 199 | 仓库链接是一种建立自动化项目与项目之间关联的方式。如果一个项目得到更新,连接系统还会触发另一个项目的更新构建。这使得你可以轻松地让所有关联项目保持更新同步。 200 | 201 | 要添加链接的话,访问你想要添加链接的项目的仓库设置页面,在设置菜单下地右侧点击 “Repository Links”。然后输入你想要与之链接的仓库名称。 202 | 203 | >警告:您可以添加多个仓库的链接,但要小心。自动化构建之间的双向关系会造成一个永不停止的构建循环。 204 | -------------------------------------------------------------------------------- /docker-hub/docker-hub.md: -------------------------------------------------------------------------------- 1 | Docker Hub 2 | === 3 | 先来看看 Docker Hub 的界面: 4 | 5 | ![](../images/hub.png) 6 | === 7 | 在这个章节,我们来学习 Docker Hub 的相关话题: 8 | 9 | [账户](accounts.md) 10 | 11 | 学习如何创建一个Docker Hub账户来管理你的组织和机构。 12 | 13 | [仓库](repos.md) 14 | 15 | 了解如何分享你 Docker Hub 上的 Docker 镜像,以及如何存储和管理你的私人镜像。 16 | 17 | [自动构建](builds.md) 18 | 19 | 学习如何自动化构建、部署和管理 20 | -------------------------------------------------------------------------------- /docker-hub/repos.md: -------------------------------------------------------------------------------- 1 | Docker Hub上的仓库和镜像 2 | === 3 | ![仓库镜像](../images/repos.png) 4 | 5 | ##搜索仓库和镜像 6 | 7 | 你可以使用 Docker 来搜索所有公开可用的仓库和镜像。 8 | 9 | $ docker search ubuntu 10 | 11 | 这将通过 Docker 提供的关键字匹配来显示您可用的仓库列表。 12 | 13 | 私有仓库将不会显示到仓库搜索结果上。你可以通过 Docker Hub 的简况页面来查看仓库的状态。 14 | 15 | ##仓库 16 | 17 | 你的 Docker Hub 仓库有许多特性。 18 | 19 | ###stars 20 | 21 | 你的仓库可以用星被标记,你也可以用星标记别的仓库。Stars 也是显示你喜欢这个仓库的一种方法,也是一种简单的方法来标记你喜欢的仓库。 22 | 23 | ###评论 24 | 25 | 你可以与其他 Docker 社区的成员和维护者留下评论。如果你发现有不当的评论,你可以标记他们以供审核。 26 | 27 | ###合作者及其作用 28 | 29 | 指定的合作者可以通过你提供的权限访问你的私人仓库。一旦指定,他们可以 `push` 和 `pull` 你的仓库。但他们将不会被允许执行任何管理任务,如从删除仓库或者改变其状态。 30 | 31 | 32 | >注:一个合作者不能添加其他合作者。只有仓库的所有者才有管理权限。 33 | 34 | 你也可以与在 Docker Hub 上的组织和团队进行协作,更多信息。 35 | 36 | ##官方仓库 37 | 38 | Docker Hub 包含了许多[官方仓库](http://registry.hub.docker.com/official)。这些都是 Docker 供应商和 Docker 贡献者提供的认证库,他们包含了来自供应商,如 Oracle 和 Red Hat的镜像,您可以使用它们来构建应用程序和服务。 39 | 40 | 如果使用官方库,供应商会对镜像进行持续维护、升级和优化,从而为项目提供强大的驱动力。 41 | 42 | >注:如果你的组织、产品或者团队想要给官方资源库做贡献。可以再[这里](https://github.com/docker/stackbrew)查看更多信息。 43 | 44 | ##私有Docker仓库 45 | 46 | 私人仓库用来存储你的私有镜像,前提是你需要一个 Docker 账户,或者你已经属于 Docker Hub 上的某个组织或群组。 47 | 48 | 要使用 Docker Hub 私有仓库,首先在[这里](https://registry.hub.docker.com/account/repositories/add/)进行添加。你的 Docker Hub 账户会免费获得一个私人仓库。如果你需要更多的账户,你需要升级你的 [Docker Hub 计划](https://registry.hub.docker.com/plans/)。 49 | 50 | 私有仓库建立好后,你可以使用 Docker 来 `push` 和 `pull` 你的镜像。 51 | 52 | >注:你需要先登录并获得权限来访问你的私人仓库。 53 | 54 | 私有仓库和公共仓库基本相同,但是以公共身份是无法浏览或者搜索到私有仓库及其内容的,他们也不会以同样的方式被缓存。 55 | 56 | 在设置页面你可以指定哪些人有权限访问(如合作者),在这里你可以切换仓库状态(公共到私有,或者反过来)。你需要有一个可用的私有仓库,并开启相关设置才能做这样的转换。如果你无法进行相关操作,请升级你的 [Docker Hub 计划](https://registry.hub.docker.com/plans/)。 57 | 58 | ##Webhooks 59 | 60 | 您可以在仓库设置页面来配置你的 webhooks。只有成功 `push` 以后,`webhook` 才会生效。webhooks 会调用 HTTP POST 请求一个json,类似如下所示的例子: 61 | 62 | >你可以使用 http 工具进行测试,例如 [requestb.in.](http://requestb.in/) 63 | 64 | webhook json例子: 65 | 66 | 67 | { 68 | "push_data":{ 69 | "pushed_at":1385141110, 70 | "images":[ 71 | "imagehash1", 72 | "imagehash2", 73 | "imagehash3" 74 | ], 75 | "pusher":"username" 76 | }, 77 | "repository":{ 78 | "status":"Active", 79 | "description":"my docker repo that does cool things", 80 | "is_automated":false, 81 | "full_description":"This is my full description", 82 | "repo_url":"https://registry.hub.docker.com/u/username/reponame/", 83 | "owner":"username", 84 | "is_official":false, 85 | "is_private":false, 86 | "name":"reponame", 87 | "namespace":"username", 88 | "star_count":1, 89 | "comment_count":1, 90 | "date_created":1370174400, 91 | "dockerfile":"my full dockerfile is listed here", 92 | "repo_name":"username/reponame" 93 | } 94 | } 95 | 96 | Webhooks 允许你将你镜像和仓库的更新信息通知指定用户、服务以及其他应用程序。 97 | 98 | 99 | -------------------------------------------------------------------------------- /examples/Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerizing MongoDB: Dockerfile for building MongoDB images 2 | # Based on ubuntu:latest, installs MongoDB following the instructions from: 3 | # http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/ 4 | 5 | FROM ubuntu:latest 6 | MAINTAINER Docker 7 | 8 | # Installation: 9 | # Import MongoDB public GPG key AND create a MongoDB list file 10 | RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 11 | RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/10gen.list 12 | 13 | # Update apt-get sources AND install MongoDB 14 | RUN apt-get update 15 | RUN apt-get install -y -q mongodb-org 16 | 17 | # Create the MongoDB data directory 18 | RUN mkdir -p /data/db 19 | 20 | # Expose port #27017 from the container to the host 21 | EXPOSE 27017 22 | 23 | # Set usr/bin/mongod as the dockerized entry-point application 24 | ENTRYPOINT usr/bin/mongod 25 | -------------------------------------------------------------------------------- /examples/apt-cacher-ng.md: -------------------------------------------------------------------------------- 1 | 在Docker中运行Apt-Cacher-ng服务 2 | === 3 | 4 | >注意:——如果你不喜欢sudo,可以查看[非root用户使用](installation/binaries.md),--如何你使用OS X或者通过TCP使用Docker,你需要使用sudo 5 | 6 | 当你有许多docker服务器,或者不能使用Docker缓存来构建不相干的Docker容器,他可以为你的包缓存代理,这是非常有用的。该容器使第二个下载的任何包几乎瞬间下载。 7 | 8 | 使用下边的Dockerfile 9 | 10 | # 11 | # Build: docker build -t apt-cacher . 12 | # Run: docker run -d -p 3142:3142 --name apt-cacher-run apt-cacher 13 | # 14 | # and then you can run containers with: 15 | # docker run -t -i --rm -e http_proxy http://dockerhost:3142/ debian bash 16 | # 17 | FROM ubuntu 18 | MAINTAINER SvenDowideit@docker.com 19 | 20 | VOLUME ["/var/cache/apt-cacher-ng"] 21 | RUN apt-get update ; apt-get install -yq apt-cacher-ng 22 | 23 | EXPOSE 3142 24 | CMD chmod 777 /var/cache/apt-cacher-ng ; /etc/init.d/apt-cacher-ng start ; tail -f /var/log/apt-cacher-ng/* 25 | 26 | 使用下边的命令构建镜像: 27 | 28 | $ sudo docker build -t eg_apt_cacher_ng . 29 | 30 | 现在运行它,映射内部端口到主机 31 | 32 | $ sudo docker run -d -p 3142:3142 --name test_apt_cacher_ng eg_apt_cacher_ng 33 | 34 | 查看日志文件,默认使用`tailed`命令,你可以使用 35 | 36 | $ sudo docker logs -f test_apt_cacher_ng 37 | 38 | 让你Debian-based容器使用代理,你可以做三件事之一: 39 | 40 | 1.添加一个apt代理设置` echo 'Acquire::http { Proxy "http://dockerhost:3142"; };' >> /etc/apt/conf.d/01proxy` 41 | 42 | 2.设置环境变量:`http_proxy=http://dockerhost:3142/` 43 | 44 | 3.修改你的`sources.list`来开始`http://dockerhost:3142/` 45 | 46 | 选项1注入是安全设置到你的apt配置在本地的公共基础版本。 47 | 48 | FROM ubuntu 49 | RUN echo 'Acquire::http { Proxy "http://dockerhost:3142"; };' >> /etc/apt/apt.conf.d/01proxy 50 | RUN apt-get update ; apt-get install vim git 51 | 52 | # docker build -t my_ubuntu . 53 | 54 | 选项2针对测试时非常好的,但是会破坏其它从http代理的HTTP客户端,如curl 、wget或者其他: 55 | 56 | $ sudo docker run --rm -t -i -e http_proxy=http://dockerhost:3142/ debian bash 57 | 58 | 选项3是最轻便的,但是有时候你可能需要做很多次,你也可以在你的`Dockerfile`这样做: 59 | 60 | $ sudo docker run --rm -t -i --volumes-from test_apt_cacher_ng eg_apt_cacher_ng bash 61 | 62 | $$ /usr/lib/apt-cacher-ng/distkill.pl 63 | Scanning /var/cache/apt-cacher-ng, please wait... 64 | Found distributions: 65 | bla, taggedcount: 0 66 | 1. precise-security (36 index files) 67 | 2. wheezy (25 index files) 68 | 3. precise-updates (36 index files) 69 | 4. precise (36 index files) 70 | 5. wheezy-updates (18 index files) 71 | 72 | Found architectures: 73 | 6. amd64 (36 index files) 74 | 7. i386 (24 index files) 75 | 76 | WARNING: The removal action may wipe out whole directories containing 77 | index files. Select d to see detailed list. 78 | 79 | (Number nn: tag distribution or architecture nn; 0: exit; d: show details; r: remove tagged; q: quit): q 80 | 81 | 最后,停止测试容器,删除容器,删除镜像: 82 | 83 | $ sudo docker stop test_apt_cacher_ng 84 | $ sudo docker rm test_apt_cacher_ng 85 | $ sudo docker rmi eg_apt_cacher_ng -------------------------------------------------------------------------------- /examples/couchdb_data_volumes.md: -------------------------------------------------------------------------------- 1 | Docker中运行CouchDB服务 2 | === 3 | 4 | >注:如果你不喜欢使用sudo,你可以查看[这里非root用户运行](../installation/binaries.md) 5 | 6 | 这里有一个例子,使用数据卷在两个CouchDb之间共享相同的数据容器,这个可以用于热升级,测试不同版本的CouchDB数据等等。 7 | 8 | ##创建第一个数据库 9 | 10 | 现在我们创建/var/lib/couchdb作为数据卷 11 | 12 | COUCH1=$(sudo docker run -d -p 5984 -v /var/lib/couchdb shykes/couchdb:2013-05-03) 13 | 14 | ##添加一条数据在第一个数据库中 15 | 16 | 我们假设你的docker主机默认是本地localhost.如果不是localhost请换到你docker的公共IP 17 | 18 | HOST=localhost 19 | URL="http://$HOST:$(sudo docker port $COUCH1 5984 | grep -Po '\d+$')/_utils/" 20 | echo "Navigate to $URL in your browser, and use the couch interface to add data" 21 | 22 | ##创建第二个数据库 23 | 24 | 这次,我们请求共享访问$COUCH1的卷。 25 | 26 | COUCH2=$(sudo docker run -d -p 5984 -volumes-from $COUCH1 shykes/couchdb:2013-05-03) 27 | 28 | ##在第二个数据库上来浏览数据 29 | 30 | HOST=localhost 31 | URL="http://$HOST:$(sudo docker port $COUCH2 5984 | grep -Po '\d+$')/_utils/" 32 | echo "Navigate to $URL in your browser. You should see the same data as in the first database"'!' 33 | 34 | 祝贺你,你已经运行了两个Couchdb容器,并且两个都相互独立,除了他们的数据 35 | 36 | -------------------------------------------------------------------------------- /examples/mongodb.md: -------------------------------------------------------------------------------- 1 | Docker 中运行 MongoDB 2 | === 3 | 4 | ###描述 5 | 6 | 在这个例子里,我们会学到如何构建一个预装 `MongoDB` 的镜像。我们还将会看到如何推送镜像到 Docker Hub 并分享给其他人。 7 | 8 | 使用 Docker 容器来部署 [MongoDB](https://www.mongodb.org/) 实例将会给你带来许多好处,例如: 9 | 10 | * 易于维护、高可配置的 MongoDB 实例 11 | * 准备好运行和毫秒级内开始工作 12 | * 基于全球访问的共享镜像 13 | 14 | >注意: 如果你不喜欢sudo,可以查看[非 root 用户使用](installation/binaries.md) 15 | 16 | ###为 MongoDB 创建一个 Dockerfile 17 | 18 | 让我们创建一个 `Dockerfile` 并构建: 19 | 20 | $ nano Dockerfile 21 | 22 | 虽然这部分是可选的,但是在 `Dockerfile` 开头处添加注释,可以更好的去解释其目的: 23 | 24 | # Dockerizing MongoDB: Dockerfile for building MongoDB images 25 | # Based on ubuntu:latest, installs MongoDB following the instructions from: 26 | # http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/ 27 | 28 | >小贴士:`Dockerfile`文件是灵活的。然而,他们遵循一定的格式。第一项定义的是镜像的名称,这里是 Dockerized MongoDB 应用的父镜像。 29 | 30 | 我们将使用 Docker Hub 中最新版本的 Ubuntu 镜像来构建。 31 | 32 | # Format: FROM repository[:version] 33 | FROM ubuntu:latest 34 | 35 | 继续,我们将在 `Dockerfile` 中指定 `MAINTAINER` 36 | 37 | # Format: MAINTAINER Name 38 | MAINTAINER M.Y. Name 39 | 40 | >注:尽管 Ubuntu 系统已经有 MongoDB 包,但是它们可能过时,因此,在这个例子中,我们将使用 MongoDB 的官方包。 41 | 42 | 我们将开始导入 MongoDB 公共 GPG 秘钥。我们还将创建一个 MongoDB 库包管理器 43 | 44 | # Installation: 45 | # Import MongoDB public GPG key AND create a MongoDB list file 46 | RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 47 | RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/10gen.list 48 | 49 | 这个初步的准备后,我们将更新我们的包并且安装 MongoDB 。 50 | 51 | # Update apt-get sources AND install MongoDB 52 | RUN apt-get update 53 | RUN apt-get install -y -q mongodb-org 54 | 55 | >小贴士: 您可以通过使用所需的软件包版本列表来指定 MongoDB的特定版本,例如: 56 | 57 | RUN apt-get install -y -q mongodb-org=2.6.1 mongodb-org-server=2.6.1 mongodb-org-shell=2.6.1 mongodb-org-mongos=2.6.1 mongodb-org-tools=2.6.1 58 | 59 | MongoDB 需要数据目录,让我们在最后一步中执行 60 | 61 | # Create the MongoDB data directory 62 | RUN mkdir -p /data/db 63 | 64 | 最后我们设置 `ENTRYPOINT` 指令来告诉 Docker 如何在我们的 MongoDB 镜像容器内运行 `mongod` 。并且我们将使用 `EXPOSE` 命令来指定端口: 65 | 66 | # Expose port 27017 from the container to the host 67 | EXPOSE 27017 68 | 69 | # Set usr/bin/mongod as the dockerized entry-point application 70 | ENTRYPOINT usr/bin/mongod 71 | 72 | 现在保存我们的文件并且构建我们的镜像。 73 | 74 | >注:完整版的 `Dockerfile` 可以在这里[下载](Dockerfile) 75 | 76 | ###构建 MongoDB 的 Docker 镜像 77 | 78 | 我们可以使用我们的 `Dockerfile` 来构建我们的 MongoD B镜像。除非实验,使用 `docker build` 的 `--tag` 参数来给 docker 镜像指定标签始终是一个很好的做法。 79 | 80 | # Format: sudo docker build --tag/-t / . 81 | # Example: 82 | $ sudo docker build --tag my/repo . 83 | 84 | 当我们发出这个命令时,Docker 将会通过 `Dockerfile` 来构建镜像。最终镜像将被标记成 `my/repo` 。 85 | 86 | ###推送 MongoDB 镜像到 Docker Hub 87 | 88 | `docker push` 命令将会把镜像推送到 Docker Hub 上,你可以在 Docker Hub 上托管和分享推送的镜像。为此,你需要先登录: 89 | 90 | # Log-in 91 | $ sudo docker login 92 | Username: 93 | .. 94 | 95 | # Push the image 96 | # Format: sudo docker push / 97 | $ sudo docker push my/repo 98 | The push refers to a repository [my/repo] (len: 1) 99 | Sending image list 100 | Pushing repository my/repo (1 tags) 101 | .. 102 | 103 | ###使用 MongoDB 的镜像 104 | 105 | 使用我们创建的MongoDB镜像,我们可以运行一个或多个的 MongoDB 守护进程。 106 | 107 | # Basic way 108 | # Usage: sudo docker run --name -d / 109 | $ sudo docker run --name mongo_instance_001 -d my/repo 110 | 111 | # Dockerized MongoDB, lean and mean! 112 | # Usage: sudo docker run --name -d / --noprealloc --smallfiles 113 | $ sudo docker run --name mongo_instance_001 -d my/repo --noprealloc --smallfiles 114 | 115 | # Checking out the logs of a MongoDB container 116 | # Usage: sudo docker logs 117 | $ sudo docker logs mongo_instance_001 118 | 119 | # Playing with MongoDB 120 | # Usage: mongo --port 121 | $ mongo --port 12345 -------------------------------------------------------------------------------- /examples/nodejs_web_app.md: -------------------------------------------------------------------------------- 1 | Docker中运行Node.js web应用 2 | === 3 | 4 | >**注意:——如果你不喜欢 sudo **,可以查看[使用非root用户](installation/binaries.md) 5 | 6 | 这个例子的目的是向您展示如何通过使用 `Dockerfile `来构建自己的docker镜像。我们将在`Centos`上运行一个简单 `node.js` web应用并输出'hello word'。您可以在https://github.com/enokd/docker-node-hello/获得完整的源代码。 7 | 8 | ##创建Node.js应用 9 | 10 | 首先,先创建一个文件存放目录`src`。然后创建`package.json`文件来描述你的应用程序和依赖关系: 11 | 12 | { 13 | "name": "docker-centos-hello", 14 | "private": true, 15 | "version": "0.0.1", 16 | "description": "Node.js Hello world app on CentOS using docker", 17 | "author": "Daniel Gasienica ", 18 | "dependencies": { 19 | "express": "3.2.4" 20 | } 21 | } 22 | 23 | 然后,创建一个 `index.js` 文件使用 [Express.js](http://expressjs.com/) 框架来创建一个web应用程序: 24 | 25 | var express = require('express'); 26 | 27 | // Constants 28 | var PORT = 8080; 29 | 30 | // App 31 | var app = express(); 32 | app.get('/', function (req, res) { 33 | res.send('Hello world\n'); 34 | }); 35 | 36 | app.listen(PORT); 37 | console.log('Running on http://localhost:' + PORT); 38 | 39 | 在接下来的步骤中,我们将看到如何使用 docker 的 centos 容器来运行这个应用程序。首先,你需要为你的应用程序构建一个 docker 镜像。 40 | 41 | ##创建Dockerfile 42 | 43 | 创建一个空文件叫`Dockerfile`: 44 | 45 | touch Dockerfile 46 | 47 | 使用你喜欢的编辑器打开Dockerfile 48 | 49 | 接下来,定义构建自己镜像的顶级镜像。在这里我们使用 Docker Hub 中 Centos(tag:6)镜像: 50 | 51 | FROM centos:6 52 | 53 | 因为我们要构建一个`Node.js`应用,你需要在你的 `Centos` 镜像中安装Node.js。Node.js运行应用程序需要使用 npm 安装你 package.json 中定义的依赖关系。安装 Centos 包,你可以查看 Node.js 维基指令: 54 | 55 | # Enable EPEL for Node.js 56 | RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 57 | # Install Node.js and npm 58 | RUN yum install -y npm 59 | 60 | 将你的应用程序源代码添加到你的Docker镜像中,使用`ADD`指令: 61 | 62 | # Bundle app source 63 | ADD . /src 64 | 65 | 使用npm安装你的应用程序依赖: 66 | 67 | # Install app dependencies 68 | RUN cd /src; npm install 69 | 70 | 应用程序绑定到端口8080,您将使用`EXPOSE`指令对 docker 端口进程映射: 71 | 72 | EXPOSE 8080 73 | 74 | 最后,定义命令,使用 `CMD` 定义运行时的node服务和应用 `src/index.js `的路径(看我们添加源代码到容器的步骤): 75 | 76 | CMD ["node", "/src/index.js"] 77 | 78 | 你的`Dockerfile`现在看起来像如下这样: 79 | 80 | FROM centos:centos6 81 | 82 | # Enable EPEL for Node.js 83 | RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 84 | # Install Node.js and npm 85 | RUN yum install -y npm 86 | 87 | # Bundle app source 88 | COPY . /src 89 | # Install app dependencies 90 | RUN cd /src; npm install 91 | 92 | EXPOSE 8080 93 | CMD ["node", "/src/index.js"] 94 | 95 | ##创建你的个人镜像 96 | 97 | 到你的 `Dockerfile` 目录下,运行命令来构建镜像。`-t` 参数给镜像添加标签,为了让我们在 `docker images` 命令更容易查找到它: 98 | 99 | $ sudo docker build -t /centos-node-hello . 100 | 101 | 你的镜像现在将在列表中: 102 | 103 | $ sudo docker images 104 | 105 | # Example 106 | REPOSITORY TAG ID CREATED 107 | centos centos6 539c0211cd76 8 weeks ago 108 | /centos-node-hello latest d64d3505b0d2 2 hours ago 109 | 110 | ##运行镜像 111 | 112 | 使用 `-d` 参数来运行你的镜像并将容器在后台运行。使用 `-p` 参数来绑定一个公共端口到私有容器端口上。运行你之前构建的镜像: 113 | 114 | $ sudo docker run -p 49160:8080 -d /centos-node-hello 115 | 116 | 打印应用输出: 117 | 118 | # Get container ID 119 | $ sudo docker ps 120 | 121 | # Print app output 122 | $ sudo docker logs 123 | 124 | # Example 125 | Running on http://localhost:8080 126 | 127 | 128 | ##测试 129 | 130 | 要测试应用程序,先得到 docker 应用程序映射的端口: 131 | 132 | $ sudo docker ps 133 | 134 | # Example 135 | ID IMAGE COMMAND ... PORTS 136 | ecce33b30ebf /centos-node-hello:latest node /src/index.js 49160->8080 137 | 138 | 在上面的示例中,docker 映射容器的 `49160` 端口到 `8080` 端口。 139 | 140 | 现在你可以使用`curl`来访问你的app(安装curl:sudo apt-get install curl): 141 | 142 | $ curl -i localhost:49160 143 | 144 | HTTP/1.1 200 OK 145 | X-Powered-By: Express 146 | Content-Type: text/html; charset=utf-8 147 | Content-Length: 12 148 | Date: Sun, 02 Jun 2013 03:53:22 GMT 149 | Connection: keep-alive 150 | 151 | Hello world 152 | 153 | 如果你使用的是 OS X 的 Boot2docker,实际上端口映射到的是 Docker 虚拟主机,你需要使用如下命令来测试: 154 | 155 | $ curl $(boot2docker ip):49160 156 | 157 | 158 | 我们希望本教程能够帮助您在 Docker 上构建的 `Centos` 镜像来运行Node.js。你可以获得全部源代码 。 159 | 160 | 161 | 162 | -------------------------------------------------------------------------------- /examples/postgresql_service.md: -------------------------------------------------------------------------------- 1 | 在Docker中运行PostgreSQL 2 | === 3 | 4 | >注意:——如果你不喜欢sudo,可以查看[非root用户使用](installation/binaries.md) 5 | 6 | ###在Docker中安装PostgreSQL 7 | 8 | 如果Docker Hub中没有你需要的Docker镜像,你可以创建自己的镜像,开始先创建一个`Dockerfile`: 9 | 10 | 11 | >注意:这个PostgreSQL仅设置用途。请参阅PostgreSQL文档来调整这些设置,以便它是安全的。 12 | 13 | # 14 | # example Dockerfile for http://docs.docker.com/examples/postgresql_service/ 15 | # 16 | 17 | FROM ubuntu 18 | MAINTAINER SvenDowideit@docker.com 19 | 20 | # Add the PostgreSQL PGP key to verify their Debian packages. 21 | # It should be the same key as https://www.postgresql.org/media/keys/ACCC4CF8.asc 22 | RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 23 | 24 | # Add PostgreSQL's repository. It contains the most recent stable release 25 | # of PostgreSQL, ``9.3``. 26 | RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list 27 | 28 | # Update the Ubuntu and PostgreSQL repository indexes 29 | RUN apt-get update 30 | 31 | # Install ``python-software-properties``, ``software-properties-common`` and PostgreSQL 9.3 32 | # There are some warnings (in red) that show up during the build. You can hide 33 | # them by prefixing each apt-get statement with DEBIAN_FRONTEND=noninteractive 34 | RUN apt-get -y -q install python-software-properties software-properties-common 35 | RUN apt-get -y -q install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3 36 | 37 | # Note: The official Debian and Ubuntu images automatically ``apt-get clean`` 38 | # after each ``apt-get`` 39 | 40 | # Run the rest of the commands as the ``postgres`` user created by the ``postgres-9.3`` package when it was ``apt-get installed`` 41 | USER postgres 42 | 43 | # Create a PostgreSQL role named ``docker`` with ``docker`` as the password and 44 | # then create a database `docker` owned by the ``docker`` role. 45 | # Note: here we use ``&&\`` to run commands one after the other - the ``\`` 46 | # allows the RUN command to span multiple lines. 47 | RUN /etc/init.d/postgresql start &&\ 48 | psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&\ 49 | createdb -O docker docker 50 | 51 | # Adjust PostgreSQL configuration so that remote connections to the 52 | # database are possible. 53 | RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf 54 | 55 | # And add ``listen_addresses`` to ``/etc/postgresql/9.3/main/postgresql.conf`` 56 | RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf 57 | 58 | # Expose the PostgreSQL port 59 | EXPOSE 5432 60 | 61 | # Add VOLUMEs to allow backup of config, logs and databases 62 | VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"] 63 | 64 | # Set the default command to run when starting the container 65 | CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"] 66 | 67 | 使用Dockerfile构建镜像并且指定名称 68 | 69 | $ sudo docker build -t eg_postgresql . 70 | 71 | 并且运行PostgreSQL服务容器 72 | 73 | $ sudo docker run --rm -P --name pg_test eg_postgresql 74 | 75 | 有2种方法可以连接到PostgreSQL服务器。我们可以使用链接容器,或者我们可以从我们的主机(或网络)访问它。 76 | 77 | >注:`--rm`删除容器,当容器存在时成功。 78 | 79 | ###使用容器连接 80 | 81 | 在客户端`docker run`中直接使用`-link remote_name:local_alias`使容器连接到另一个容器端口。 82 | 83 | $ sudo docker run --rm -t -i --link pg_test:pg eg_postgresql bash 84 | 85 | postgres@7ef98b1b7243:/$ psql -h $PG_PORT_5432_TCP_ADDR -p $PG_PORT_5432_TCP_PORT -d docker -U docker --password 86 | 87 | ###连接到你的主机系统 88 | 89 | 假设你有安装postgresql客户端,您可以使用主机端口映射测试。您需要使用`docker ps`找出映射到本地主机端口: 90 | 91 | $ docker ps 92 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 93 | 5e24362f27f6 eg_postgresql:latest /usr/lib/postgresql/ About an hour ago Up About an hour 0.0.0.0:49153->5432/tcp pg_test 94 | $ psql -h localhost -p 49153 -d docker -U docker --password 95 | 96 | ###测试数据 97 | 98 | 一旦你已经通过身份验证,并且有`docker =#`提示,您可以创建一个表并填充它。 99 | 100 | psql (9.3.1) 101 | Type "help" for help. 102 | 103 | $ docker=# CREATE TABLE cities ( 104 | docker(# name varchar(80), 105 | docker(# location point 106 | docker(# ); 107 | CREATE TABLE 108 | $ docker=# INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)'); 109 | INSERT 0 1 110 | $ docker=# select * from cities; 111 | name | location 112 | ---------------+----------- 113 | San Francisco | (-194,53) 114 | (1 row) 115 | 116 | ###使用容器卷 117 | 118 | 您可以使用PostgreSQL卷检查定义日志文件、备份配置和数据: 119 | 120 | $ docker run --rm --volumes-from pg_test -t -i busybox sh 121 | 122 | / # ls 123 | bin etc lib linuxrc mnt proc run sys usr 124 | dev home lib64 media opt root sbin tmp var 125 | / # ls /etc/postgresql/9.3/main/ 126 | environment pg_hba.conf postgresql.conf 127 | pg_ctl.conf pg_ident.conf start.conf 128 | /tmp # ls /var/log 129 | ldconfig postgresql -------------------------------------------------------------------------------- /examples/running_redis_service.md: -------------------------------------------------------------------------------- 1 | 在Docker中运行Reids服务 2 | === 3 | 4 | 非常简单,没有任何修饰,redis是使用一个连接附加到一个web应用程序。 5 | 6 | ##创建一个redis docker容器 7 | 8 | 首先,我们先为redis创建一个Dockerfile 9 | 10 | FROM ubuntu:12.10 11 | RUN apt-get update 12 | RUN apt-get -y install redis-server 13 | EXPOSE 6379 14 | ENTRYPOINT ["/usr/bin/redis-server"] 15 | 16 | 现在你需要通过Dockerfile创建一个镜像,将替换成你自己的名字。 17 | 18 | sudo docker build -t /redis . 19 | 20 | ##运行服务 21 | 22 | 使用我们刚才创建的redis镜像 23 | 24 | 使用 -d 运行这个服务分离模式,让容器在后台运行。 25 | 26 | 重要的是我们没有开放容器端口,相反,我们将使用一个容器来连接redis容器数据库 27 | 28 | sudo docker run --name redis -d /redis 29 | 30 | ##创建你的web应用容器 31 | 32 | 现在我们可以创建我们的应用程序容器,我们使用-link参数来创建一个连接redis容器,我们使用别名db,这将会在redis容器和redis实例容器中创建一个安全的通信隧道 33 | 34 | sudo docker run -link redis:db -i -t ubuntu:12.10 /bin/bash 35 | 36 | 进入我们刚才创建的容器,我们需要安装redis的redis-cli的二进制包来测试连接 37 | 38 | apt-get update 39 | apt-get -y install redis-server 40 | service redis-server stop 41 | 42 | 现在我们可以测试连接,首先我么要先查看下web应用程序容器的环境变量,我们可以用我们的ip和端口来连接redis容器 43 | 44 | env 45 | . . . 46 | DB_NAME=/violet_wolf/db 47 | DB_PORT_6379_TCP_PORT=6379 48 | DB_PORT=tcp://172.17.0.33:6379 49 | DB_PORT_6379_TCP=tcp://172.17.0.33:6379 50 | DB_PORT_6379_TCP_ADDR=172.17.0.33 51 | DB_PORT_6379_TCP_PROTO=tcp 52 | 53 | 我们可以看到我们有一个DB为前缀的环境变量列表,DB来自指定别名连接我们的现在的容器,让我们使用DB_PORT_6379_TCP_ADDR变量连接到Redis容器。 54 | 55 | redis-cli -h $DB_PORT_6379_TCP_ADDR 56 | redis 172.17.0.33:6379> 57 | redis 172.17.0.33:6379> set docker awesome 58 | OK 59 | redis 172.17.0.33:6379> get docker 60 | "awesome" 61 | redis 172.17.0.33:6379> exit 62 | 63 | 我们可以很容易的使用这个或者其他环境变量在我们的web应用程序容器上连接到redis容器 64 | -------------------------------------------------------------------------------- /examples/running_riak_service.md: -------------------------------------------------------------------------------- 1 | 在Docker中使用Riak服务 2 | === 3 | 4 | 这个例子的目的是向您展示如何构建一个预装Riak的docker镜象。 5 | 6 | ###创建Dockerfile 7 | 8 | 创建一个空文件`Dockerfile` 9 | 10 | $ touch Dockerfile 11 | 12 | 接下来,定义你想要来建立你镜像的父镜像。我们将使用Ubuntu(tag:最新版),从Docker Hub中下载: 13 | 14 | # Riak 15 | # 16 | # VERSION 0.1.0 17 | 18 | # Use the Ubuntu base image provided by dotCloud 19 | FROM ubuntu:latest 20 | MAINTAINER Hector Castro hector@basho.com 21 | 22 | 接下来,我们更新APT缓存和应用更新: 23 | 24 | # Update the APT cache 25 | RUN sed -i.bak 's/main$/main universe/' /etc/apt/sources.list 26 | RUN apt-get update 27 | RUN apt-get upgrade -y 28 | 29 | 之后,我们安装和设置一些依赖关系: 30 | 31 | - `CURL`来下载 Basho's APT存储库秘钥。 32 | - `lsb-release`帮助我们查看Ubuntu版本。 33 | - `openssh-server`允许我们登陆远程容器,加入Riak节点组成一个集群。 34 | - `supervisor `用于管理`OpenSSH`和`Riak`进程。 35 | 36 | # Install and setup project dependencies 37 | RUN apt-get install -y curl lsb-release supervisor openssh-server 38 | 39 | RUN mkdir -p /var/run/sshd 40 | RUN mkdir -p /var/log/supervisor 41 | 42 | RUN locale-gen en_US en_US.UTF-8 43 | 44 | ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf 45 | 46 | RUN echo 'root:basho' | chpasswd 47 | 48 | 下一步,添加 Basho's APT仓库: 49 | 50 | RUN curl -s http://apt.basho.com/gpg/basho.apt.key | apt-key add -- 51 | RUN echo "deb http://apt.basho.com $(lsb_release -cs) main" > /etc/apt/sources.list.d/basho.list 52 | RUN apt-get update 53 | 54 | 之后,我们安装Riak和改变一些默认值: 55 | 56 | # Install Riak and prepare it to run 57 | RUN apt-get install -y riak 58 | RUN sed -i.bak 's/127.0.0.1/0.0.0.0/' /etc/riak/app.config 59 | RUN echo "ulimit -n 4096" >> /etc/default/riak 60 | 61 | 接下来,我们为缺少的`initctl`来添加一个软连接: 62 | 63 | # Hack for initctl 64 | # See: https://github.com/dotcloud/docker/issues/1024 65 | RUN dpkg-divert --local --rename --add /sbin/initctl 66 | RUN ln -s /bin/true /sbin/initctl 67 | 68 | 然后我们开发Riak协议缓冲区、HTTP接口以及SSH: 69 | 70 | # Expose Riak Protocol Buffers and HTTP interfaces, along with SSH 71 | EXPOSE 8087 8098 22 72 | 73 | 最后,运行`supervisord `这里Riak和OpenSSH将启动: 74 | 75 | CMD ["/usr/bin/supervisord"] 76 | 77 | ###创建一个supervisord配置文件 78 | 79 | 创建一个supervisord.conf空文件,并且保证和Dockerfile是平级目录: 80 | 81 | touch supervisord.conf 82 | 83 | 填充下面定义的程序: 84 | 85 | [supervisord] 86 | nodaemon=true 87 | 88 | [program:sshd] 89 | command=/usr/sbin/sshd -D 90 | stdout_logfile=/var/log/supervisor/%(program_name)s.log 91 | stderr_logfile=/var/log/supervisor/%(program_name)s.log 92 | autorestart=true 93 | 94 | [program:riak] 95 | command=bash -c ". /etc/default/riak && /usr/sbin/riak console" 96 | pidfile=/var/log/riak/riak.pid 97 | stdout_logfile=/var/log/supervisor/%(program_name)s.log 98 | stderr_logfile=/var/log/supervisor/%(program_name)s.log 99 | 100 | ###构建Riak的Docker镜像 101 | 102 | 现在你应该能够构建一个Riak的docker镜像: 103 | 104 | $ docker build -t "/riak" . 105 | 106 | ###下一步 107 | 108 | Riak是分布式数据库。很多生产部署包括至少5个节点。查看docker-riak[https://github.com/hectcastro/docker-riak](https://github.com/hectcastro/docker-riak)项目细节来使用Docker和Pipework部署Riak集群。 109 | -------------------------------------------------------------------------------- /examples/running_ssh_service.md: -------------------------------------------------------------------------------- 1 | 在Docker中运行SSH进程服务 2 | === 3 | 4 | 以下是用`Dockerfile`设置sshd服务容器,您可以使用连接并检查其他容器的卷,或者可以快速访问测试容器。 5 | 6 | # sshd 7 | # 8 | # VERSION 0.0.1 9 | 10 | FROM ubuntu:12.04 11 | MAINTAINER Thatcher R. Peskens "thatcher@dotcloud.com" 12 | 13 | # make sure the package repository is up to date 14 | RUN apt-get update 15 | 16 | RUN apt-get install -y openssh-server 17 | RUN mkdir /var/run/sshd 18 | RUN echo 'root:screencast' |chpasswd 19 | 20 | EXPOSE 22 21 | CMD ["/usr/sbin/sshd", "-D"] 22 | 23 | 使用如下命令构建镜像: 24 | 25 | $ sudo docker build --rm -t eg_sshd . 26 | 27 | 然后运行它,你可以使用`docker port`来找出容器端口22映射到主机的端口 28 | 29 | $ sudo docker run -d -P --name test_sshd eg_sshd 30 | $ sudo docker port test_sshd 22 31 | 0.0.0.0:49154 32 | 33 | 现在你可以使用ssh登陆Docker进程的主机IP地址,端口是49154(IP地址可以使用ifconfig获取): 34 | 35 | $ ssh root@192.168.1.2 -p 49154 36 | # The password is ``screencast``. 37 | $$ 38 | 39 | 最后,清理停止的容器,并且删除容器,然后删除镜像。 40 | 41 | $ sudo docker stop test_sshd 42 | $ sudo docker rm test_sshd 43 | $ sudo docker rmi eg_sshd -------------------------------------------------------------------------------- /images/alauda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/alauda.png -------------------------------------------------------------------------------- /images/bad_host.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/bad_host.png -------------------------------------------------------------------------------- /images/bad_host1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/bad_host1.png -------------------------------------------------------------------------------- /images/bitbucket_hook_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/bitbucket_hook_menu.png -------------------------------------------------------------------------------- /images/bitbucket_hook_menu_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/bitbucket_hook_menu_2.png -------------------------------------------------------------------------------- /images/bitbucket_hook_post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/bitbucket_hook_post.png -------------------------------------------------------------------------------- /images/containers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/containers.png -------------------------------------------------------------------------------- /images/cool_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/cool_view.png -------------------------------------------------------------------------------- /images/cool_view1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/cool_view1.png -------------------------------------------------------------------------------- /images/docker-friends.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/docker-friends.png -------------------------------------------------------------------------------- /images/github_docker_service_hook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/github_docker_service_hook.png -------------------------------------------------------------------------------- /images/github_service_hook_docker_activate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/github_service_hook_docker_activate.png -------------------------------------------------------------------------------- /images/github_service_hooks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/github_service_hooks.png -------------------------------------------------------------------------------- /images/github_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/github_settings.png -------------------------------------------------------------------------------- /images/github_submodule_deploy_key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/github_submodule_deploy_key.png -------------------------------------------------------------------------------- /images/github_submodule_deploy_key_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/github_submodule_deploy_key_2.png -------------------------------------------------------------------------------- /images/good_host.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/good_host.png -------------------------------------------------------------------------------- /images/good_host1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/good_host1.png -------------------------------------------------------------------------------- /images/groups.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/groups.png -------------------------------------------------------------------------------- /images/hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/hub.png -------------------------------------------------------------------------------- /images/installing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/installing.png -------------------------------------------------------------------------------- /images/kitematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/kitematic.png -------------------------------------------------------------------------------- /images/linux_docker_host.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/linux_docker_host.png -------------------------------------------------------------------------------- /images/login-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/login-web.png -------------------------------------------------------------------------------- /images/mac-page-two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/mac-page-two.png -------------------------------------------------------------------------------- /images/mac-password-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/mac-password-prompt.png -------------------------------------------------------------------------------- /images/mac-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/mac-success.png -------------------------------------------------------------------------------- /images/mac-welcome-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/mac-welcome-page.png -------------------------------------------------------------------------------- /images/mac_docker_host.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/mac_docker_host.png -------------------------------------------------------------------------------- /images/newsite_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/newsite_view.png -------------------------------------------------------------------------------- /images/newsite_view1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/newsite_view1.png -------------------------------------------------------------------------------- /images/orgs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/orgs.png -------------------------------------------------------------------------------- /images/register-confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/register-confirm.png -------------------------------------------------------------------------------- /images/register-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/register-web.png -------------------------------------------------------------------------------- /images/repos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/repos.png -------------------------------------------------------------------------------- /images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/search.png -------------------------------------------------------------------------------- /images/webapp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/webapp1.png -------------------------------------------------------------------------------- /images/windows-boot2docker-cmd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/windows-boot2docker-cmd.png -------------------------------------------------------------------------------- /images/windows-boot2docker-powershell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/windows-boot2docker-powershell.png -------------------------------------------------------------------------------- /images/windows-boot2docker-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/images/windows-boot2docker-start.png -------------------------------------------------------------------------------- /installation/amazon.md: -------------------------------------------------------------------------------- 1 | # Amazon EC2 2 | 3 | 这里有几种方法可以在 AWS EC2 上安装 Docker。你可以使用 Amazon Linux , 它的软件源中已经包含了 Docker 包,或者你也可以选择其它支持 Docker 的 Linux 镜像 ,例如:[*标准的 Ubuntu 安装*](#standard-ubuntu-installation)。 4 | 5 | 当然,首先你要创建一个AWS帐号。 6 | 7 | ## Amazon QuickStart with Amazon Linux AMI 2014.09.1 8 | 9 | 1. **选择一个镜像:** 10 | 11 | - 在你的 AWS 控制台选择 [Create Instance Wizard](https://console.aws.amazon.com/ec2/v2/home?#LaunchInstanceWizard: "Create Instance Wizard") 菜单。 12 | 13 | - 在 Quick Start 按钮中,选择 Amazon 提供的Amazon Linux 2014.09.1 机器镜像(AMI) 14 | 15 | - 作为测试,你可以使用默认的(可能免费) `t2.micro` 实例,(更多价格,[请查看这里](http://aws.amazon.com/ec2/pricing/))。 16 | 17 | - 单击右下角的 `Next: Configure Instance Details` 按钮 。 18 | 19 | 2. 在几个标准的选项(这里一般默认选择就可以)之后,你的 Amazon Linux 实例可能就运行了。 20 | 21 | 3. 使用 SSH 登录你的实例中 (instance) 来安装 Docker: 22 | 23 | `ssh -i ec2-user@` 24 | 25 | 4. 当你连接到你的实例 (instance)之后,输入 : 26 | 27 | `sudo yum install -y docker ; sudo service docker start` 28 | 29 | 来安装和启动 Docker 。 30 | 31 | **如果这是你第一个 AWS 实例,您可能需要配置您的安全组规则来允许 ssh 连接**。默认情况下,新实例(instance) 所有流入端口都会被 AWS 安全组过滤掉。所以当你尝试连接的时候,会出现超时。 32 | 33 | 在安装完成 Docker 之后,当你准备试用它的时候,你可以查看[用户指南](../userguide/README.md) 34 | 35 | ###标准Ubuntu安装 36 | 37 | 如果你想手动配置安装,请在 EC2 主机上根据 [Ubuntu](ubuntu.md) 文档安装 Docker。只要按照步骤1快速选择一个镜像(或者使用你自己现有的),并跳过用户数据的步骤。然后继续按照 [Ubuntu](ubuntu.md) 说明进行操作。 38 | 39 | 继续查看[用户指南](../userguide/README.md) 40 | -------------------------------------------------------------------------------- /installation/archlinux.md: -------------------------------------------------------------------------------- 1 | Arch Linux 2 | === 3 | 4 | 你可以使用 Arch Linux 社区发布的 Docker 软件包进行安装: 5 | 6 | - [docker](https://www.archLinux.org/packages/community/x86_64/docker/) 7 | 8 | 或者使用 AUR 包 9 | 10 | - [docker-git](https://aur.archLinux.org/packages/docker-git/) 11 | 12 | `docker` 软件包将会安装最新版本的 Docker。`docker-git` 则是由当前master分支构建的包。 13 | 14 | ###依赖关系 15 | 16 | Docker 依赖于几个指定的安装包,核心的几个依赖包为: 17 | 18 | - bridge-utils 19 | - device-mapper 20 | - iproute2 21 | - lxc 22 | - sqlite 23 | 24 | ###安装 25 | 26 | 一般包的简单安装: 27 | 28 | pacman -S docker 29 | 30 | 这就安装了你所需要的一切。 31 | 32 | 对于AUR包的执行: 33 | 34 | yaourt -S docker-git 35 | 36 | 这里假设你已经安装好了 yaourt.如果你之前没有安装构建过这个包,请参考 [Arch User Repository](https://wiki.archLinux.org/index.php/Arch_User_Repository#Installing_packages) . 37 | 38 | ###开启Docker 39 | 40 | Docker 会创建一个系统服务,用下面命令来启动 Docker: 41 | 42 | $ sudo systemctl start docker 43 | 44 | 设置开机启动: 45 | 46 | $ sudo systemctl enable docker 47 | 48 | ## 自定义进程选项 49 | 50 | 如果你想要添加一个 HTTP 代理,为 Docker 运行文件设置不同的目录或分区,又或者定制一些其它的功能,请阅读我们的系统文章,了解[如何定制 Docker 进程](/articles/systemd.md) -------------------------------------------------------------------------------- /installation/azure.md: -------------------------------------------------------------------------------- 1 | #Microsoft Azure 2 | 3 | ##在 Azure 上创建 Docker 主机。 4 | 5 | 请仔细阅读由 [Microsoft Azure](http://azure.microsoft.com/) 网站上提供的详细教程,教程中包含了使用不同方法在 Azure 上创建 Docker 虚拟主机。 6 | 7 | * [ Azure 的 Docker 虚拟主机组件 ][1] 8 | * [ 如何使用 Azure 提供的跨平台接口使用 Docker 虚拟机组件 ][2] 9 | * [ 如何在 Azure 用户中心使用 Docker 虚拟机组件 ][3] 10 | * [ 在 Azure 上使用 Docker 虚拟机 ][4] 11 | 12 | ## 下一步? 13 | 14 | 阅读 [用户指南](../userguide/). 15 | 16 | [0]: http://azure.microsoft.com/ 17 | [1]: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-docker-vm-extension/ 18 | [2]: http://azure.microsoft.com/documentation/articles/virtual-machines-docker-with-xplat-cli/ 19 | [3]: http://azure.microsoft.com/documentation/articles/virtual-machines-docker-with-portal/ 20 | [4]: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-docker-machine/ 21 | -------------------------------------------------------------------------------- /installation/binaries.md: -------------------------------------------------------------------------------- 1 | #Binaries 2 | 3 | 本安装说明是提供给那些想在多种环境中安装 Docker 的 hacker 们的。 4 | 5 | 在进行安装之前,请检查你的 Linux 发行版本是否有打包好的 Docker 安装包。我们已经发布了许多发行版包,这样会节省您很多时间。 6 | 7 | ##检查运行时的依赖关系 8 | 9 | 如果想要 Docker 正常运行,需要安装以下软件: 10 | 11 | - iptables version 1.4 or later 12 | - Git version 1.7 or later 13 | - procps (or similar provider of a "ps" executable) 14 | - XZ Utils 4.9 or later 15 | - a [properly mounted](https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount) cgroupfs hierarchy (having a single, all-encompassing "cgroup" mount point [is not sufficien](https://github.com/docker/docker/issues/3485)) 16 | 17 | ##检查内核的依赖关系 18 | 19 | Docker 进程模式需要特定的内核环境支持。详情请检查您的[发行版](../SUMMARY.md)。 20 | 21 | Docker 对 Linux 内核版本的最低要求是3.10,如果内核版本低于 3.10 会缺少一些运行 Docker 容器的功能。这些比较旧的内核,在一定条件下会导致数据丢失和频繁恐慌错误。 22 | 23 | 推荐使用版本号为(3.x.y)的 3.10 Linux 内核版本(或者新的维护版本),保持跟上内核的次要版本更新来确保内核的BUG已经被修复。 24 | 25 | >警告:安装自定义内核时,Linux 版本发行商可能不支持内核软件包。请务必在安装自定义内核之前,先咨询供应商是否支持 Docker。 26 | 27 | >警告:一些发行版本上还不能够安装新版本的内核,因为这些发行版本提供的包太老或者与新内核不兼容。 28 | 29 | 值得注意的是 Docker 可以以客户端模式存在,它几乎可以运行在任何的Linux内核(甚至 OS X 上)。 30 | 31 | ##Enable AppArmor and SELinux when possible 32 | 33 | 如果你的 Linux 发行版上支持 AppArmor 或者 Selinux 请启用。这有助于提高安全性并阻止某些漏洞。关与如何启动设置推荐的安全机制,在发行版提供的文档上提供了详细的步骤。 34 | 35 | 某些 Linux 发行版上默认情况下是启用 AppArmor 或者 Selinux,但是它们的内核不符合安装 Docker 的最低要求(3.10或更高版本)。为了让系统能够启动 Docker 和 运行容器,需要更新内核到3.10或者更高版本。AppArmor/SELinux 用户空间(user space) 工具提供的系统与内核版本的不兼容性可能会阻止 Docker 的运行,容器的启动或者造成容器的意外退出。 36 | 37 | >警告:如果机器上启用了安全机制,它就不应该被禁用来使 Docker 和 容器运行。这样会使系统失去发行版供应商的支持,并可能打破严格的监管环境和安全策略。 38 | 39 | ##获取Docker二进制文件 40 | 41 | 你可以下载最新版本或者特定版本的二进制版本。下载完二进制文件之后,你必须要给文件可执行权限来运行。 42 | 43 | 在 Linux 或 OS X 上指定文件的执行权限: 44 | 45 | $ chmod +x docker 46 | 47 | 从 Github 上获取稳定的发行版本号列表,请查看 `docker/docker` [发布页面](https://github.com/docker/docker/releases) 48 | 49 | >注意 50 | 51 | > 1) 你可以通过在 URL 中分别附加 MD5 和 SHA256 哈希值来获得二进制包。 52 | 53 | > 2) 你可以通过 URL 中附加 .tgz 地址来获得压缩的二进制包。 54 | 55 | ###获取 Linux 二进制包 56 | 57 | 通过下边的链接来下载最新版本的 Linux 二进制包: 58 | 59 | https://get.docker.com/builds/Linux/i386/docker-latest 60 | 61 | https://get.docker.com/builds/Linux/x86_64/docker-latest 62 | 63 | 使用下边的链接模式来下载指定版本的 Linux 二进制包: 64 | 65 | https://get.docker.com/builds/Linux/i386/docker- 66 | 67 | https://get.docker.com/builds/Linux/x86_64/docker- 68 | 69 | 举例: 70 | 71 | https://get.docker.com/builds/Linux/i386/docker-1.6.0 72 | 73 | https://get.docker.com/builds/Linux/x86_64/docker-1.6.0 74 | 75 | ### 获取 Mac OS X 二进制包 76 | 77 | Mac OS X 的二进制文件仅仅是一个客户端。你不可以使用它来启动 docker 进程。通过下边的链接来下载最新的 Mac OS X 版本: 78 | 79 | https://get.docker.com/builds/Darwin/i386/docker-latest 80 | 81 | https://get.docker.com/builds/Darwin/x86_64/docker-latest 82 | 83 | 通过下边的 URL 模式来下载指定的 Mac OS X 版本: 84 | 85 | https://get.docker.com/builds/Darwin/i386/docker- 86 | 87 | https://get.docker.com/builds/Darwin/x86_64/docker- 88 | 89 | 举例: 90 | 91 | https://get.docker.com/builds/Darwin/i386/docker-1.6.0 92 | 93 | https://get.docker.com/builds/Darwin/x86_64/docker-1.6.0 94 | 95 | ### 获取 Windows 的二进制包 96 | 97 | 从 1.60 版本开始,你可以只下载 Windows 客户端的二进制包。此外,二进制包仅是一个客户端,你不能用它来启动 docker 进程。通过下边的链接来下载最新的 Windows 版本: 98 | 99 | https://get.docker.com/builds/Windows/i386/docker-latest.exe 100 | 101 | https://get.docker.com/builds/Windows/x86_64/docker-latest.exe 102 | 103 | 通过下边的 URL 模式来下载指定的 Windows 版本: 104 | 105 | https://get.docker.com/builds/Windows/i386/docker-.exe 106 | 107 | https://get.docker.com/builds/Windows/x86_64/docker-.exe 108 | 109 | 举例: 110 | 111 | https://get.docker.com/builds/Windows/i386/docker-1.6.0.exe 112 | 113 | https://get.docker.com/builds/Windows/x86_64/docker-1.6.0.exe 114 | 115 | ## 运行Docker进程 116 | 117 | # start the docker in daemon mode from the directory you unpacked 118 | $ sudo ./docker -d & 119 | 120 | ##非root用户运行 121 | 122 | 123 | `docker` 进程一般来说默认用 `root` 用户运行, docker 进程绑定 unix socket 来代替 TCP 端口。默认情况下由用户 `root` 来管理 unix socket ,但是你也可以使用 `sudo` 来使用。 124 | 125 | 如果你(你安装的 Docker)创建一个叫 `docker` 的 unix 群组,并且在群组中添加用户,当进程启动的时候,Docker 群组将有 `docker` 进程 unix socket 的读/写使用权。docker 进程必须使用root用户运行,但是当使用 Docker 群组的一个用户来运行 Docker 客户端的时候,你不需要在命令前添加 `sudo` 。 126 | 127 | >警告:Docker 用户组(或者用`-G`指定的用户组)和 root 等效, 128 | 129 | ###更新 130 | 131 | 升级你手动安装的 Docker ,需要先关闭你的 docker 进程: 132 | 133 | $ killall docker 134 | 135 | 然后按照常规的步骤安装。 136 | 137 | ###运行你的第一个Docker容器 138 | 139 | # check your docker version 140 | $ sudo ./docker version 141 | 142 | # run a container and open an interactive shell in the container 143 | $ sudo ./docker run -i -t Ubuntu /bin/bash 144 | 145 | 继续阅读[用户指南](../userguide/README.md) -------------------------------------------------------------------------------- /installation/centos.md: -------------------------------------------------------------------------------- 1 | # CentOS 2 | 3 | 以下版本的CentOS 支持 Docker : 4 | 5 | - [*CentOS 7 (64-bit)*](#installing-docker-centos-7) 6 | - [*CentOS 6.5 (64-bit)*](#installing-docker-centos-6.5) or later 7 | 8 | 该指南可能会适用于其它的 EL6/EL7 的 Linux 发行版,譬如 Scientific Linux 。但是我们没有做过任何测试。 9 | 10 | 请注意,由于 Docker 的局限性,Docker 只能运行在64位的系统中。 11 | 12 | 13 | ## 内核支持 14 | 15 | 目前的 CentOS 项目,仅发行版本中的内核支持 Docker。如果你打算在非发行版本的内核上运行 Docker ,内核的改动可能会导致出错。 16 | 17 | Docker 运行在 [CentOS-6.5](www.centos.org) 或更高的版本的 CentOS 上,需要内核版本是 2.6.32-431 或者更高版本 ,因为这是允许它运行的指定内核补丁版本。 18 | 19 | ##安装 - CentOS-7 20 | 21 | Docker 软件包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下: 22 | 23 | $ sudo yum install docker 24 | 25 | 开始运行 [Docker daemon](#starting-the-docker-daemon)。 26 | 27 | ### FirewallD 28 | 29 | CentOS-7 中介绍了 firewalld,firewall的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突。 30 | 31 | 当 `firewalld` 启动或者重启的时候,将会从 iptables 中移除 `DOCKER` 的规则,从而影响了 Docker 的正常工作。 32 | 33 | 当你使用的是 Systemd 的时候, `firewalld` 会在 Docker 之前启动,但是如果你在 Docker 启动之后再启动 或者重启 `firewalld` ,你就需要重启 Docker 进程了。 34 | 35 | ## 安装 Docker - CentOS-6.5 36 | 37 | 在 CentOS-6.5 中,Docker 包含在 [Extra Packages 38 | for Enterprise Linux (EPEL)](https://fedoraproject.org/wiki/EPEL) 提供的镜像源中,该组织致力于为 RHEL 发行版创建和维护更多可用的软件包。 39 | 40 | 首先,你需要安装 EPEL 镜像源,请查看 [EPEL installation instructions](https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F). 41 | 42 | 在 CentOS-6 中,一个系统自带的可执行的应用程序与 docker 包名字发生冲突,所以我们重新命名 docker 的RPM包名字为 `docker-io` 。 43 | 44 | CentOS-6 中 安装 `docker-io` 之前需要先卸载 `docker` 包。 45 | 46 | $ sudo yum -y remove docker 47 | 48 | 下一步,安装 `docker-io` 包来为我们的主机安装 Docker。 49 | 50 | $ sudo yum install docker-io 51 | 52 | 开始运行 [Docker daemon](#starting-the-docker-daemon)。 53 | 54 | ## 手动安装最新版本的 Docker 55 | 56 | 57 | 当你使用推荐方法来安装 Docker 的时候,上述的 Docker 包可能不是最新发行版本。 如果你想安装最新版本,[你可以直接安装二进制包](./binaries.md) 58 | 59 | 当你使用二进制安装时,你可能想将 Docker 集成到 Systemd 的系统服务中。为了实现至一点,你需要从github中下载 [service and socket](https://github.com/docker/docker/tree/master/contrib/init/systemd)两个文件,然后安装到 `/etc/systemd/system` 中。 60 | 61 | Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon). 62 | 63 | ## Starting the Docker daemon 64 | 65 | 当 Docker 安装完成之后,你需要启动 docker 进程。 66 | 67 | $ sudo service docker start 68 | 69 | 如果我们希望 Docker 默认开机启动,如下操作: 70 | 71 | $ sudo chkconfig docker on 72 | 73 | 现在,我们来验证 Docker 是否正常工作。第一步,我们需要下载最新的 `centos` 镜像。 74 | 75 | $ sudo docker pull centos 76 | 77 | 下一步,我们运行下边的命令来查看镜像,确认镜像是否存在: 78 | 79 | $ sudo docker images centos 80 | 81 | 这将会输出如下的信息: 82 | 83 | $ sudo docker images centos 84 | REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 85 | centos latest 0b443ba03958 2 hours ago 297.6 MB 86 | 87 | 运行简单的脚本来测试镜像: 88 | 89 | $ sudo docker run -i -t centos /bin/bash 90 | 91 | 如果正常运行,你将会获得一个简单的 bash 提示,输入 `exit` 来退出。 92 | 93 | ## 自定义进程选项 94 | 95 | 如果你想要添加一个 HTTP 代理,为 Docker 运行文件设置不同的目录或分区,又或者定制一些其它的功能,请阅读我们的系统文章,了解[如何定制 Docker 进程](/articles/systemd.md) 96 | 97 | ## Dockerfiles 98 | 99 | CentOS 项目为开发者提供了大量的的示例镜像,作为开发模板或者学习 Docker 的实例。你可以在这里找到这些示例: 100 | 101 | [https://github.com/CentOS/CentOS-Dockerfiles](https://github.com/CentOS/CentOS-Dockerfiles) 102 | 103 | 好!现在你可以去查看[用户指南](../userguide/README.md),或者创建你自己的镜像了。 104 | 105 | 106 | ##发现问题? 107 | 108 | 如果有关于在 CentOS 上的 Docker 问题,请直接在这里提交:[CentOS Bug Tracker](http://bugs.centos.org/). 109 | 110 | 111 | -------------------------------------------------------------------------------- /installation/crux.md: -------------------------------------------------------------------------------- 1 | CRUX Linux 2 | === 3 | 4 | 在CRUX Linux可以通过由 [James Mills](http://prologic.shortcircuit.net.au/) 提供的 ports,或者官方的 [contrib](http://crux.nu/portdb/?a=repo&q=contrib) ports. 5 | 6 | - docker 7 | 8 | `docker` port 将构建安装最新版本的 Docker。 9 | 10 | ###安装 11 | 12 | 如果你的版本允许,更新你的 ports 目录树并且安装docker(用root用户): 13 | 14 | # prt-get depinst docker 15 | 16 | 如果你想节省你的编译时间,你可以安装`docker-bin` 17 | 18 | ###内核要求 19 | 20 | 如果使 CRUX + Docker 主机正常工作,你必须确保你的内核安装必要的模块来保证 Docker 进程的正常运行。 21 | 22 | 请阅读`README`: 23 | 24 | $ prt-get readme docker 25 | 26 | `docker` ports 安装由 Docker 发行版提供的 contrib/check-config.sh 脚本,以供检查你的内核配置是否适合安装 Docker 主机。 27 | 28 | 运行下面的命令来检查你的内核: 29 | 30 | $ /usr/share/docker/check-config.sh 31 | 32 | ###启动docker 33 | 34 | 我们提供一个 rc 脚本来创建 Docker.请使用下列命令来启动 Docker 服务(root用户): 35 | 36 | # /etc/rc.d/docker start 37 | 38 | 设置开机启动 39 | 40 | - 编辑 `/etc/rc.conf` 41 | - 将 `docker` 放到 `SERVICES=(...)` 数组 `net` 之后. 42 | 43 | ###镜像 44 | 45 | “官方库”中提供了由 [James Mills](http://prologic.shortcircuit.net.au/) 制作的 CRUX 镜像。你可以使用 `pull` 命令来使用这个镜像,当然你也可以在 `Dockerfile(s)` 中的 `FROM` 部分来设置使用。 46 | 47 | 48 | $ docker pull crux 49 | $ docker run -i -t crux 50 | 51 | 在 Docker Hub 中也有其他用户贡献的 [CRUX 基础镜像](https://registry.hub.docker.com/repos/crux/) 。 52 | 53 | ###Issues 54 | 55 | 如果你有一些问题,请在 [CRUX Bug Tracker](http://crux.nu/bugs/) 提交。 56 | 57 | ###支持 58 | 59 | 寻求更多技术支持,请查看 [CRUX 邮件列表](http://crux.nu/Main/MailingLists) 或加入在 [FreeNode](http://freenode.net/) 网络上的 [IRC Channels](http://crux.nu/Main/IrcChannels). 60 | -------------------------------------------------------------------------------- /installation/debian.md: -------------------------------------------------------------------------------- 1 | Debian 2 | === 3 | 4 | 以下版本的 Debian 支持 Docker: 5 | 6 | + [Debian 8.0 Jessie (64-bit)](#debian-jessie-80-64-bit) 7 | + [Debian 7.7 Wheezy (64-bit)](#debian-wheezystable-7x-64-bit) 8 | 9 | 10 | ##Debian Jessie 8.0 (64-bit)Debian 11 | 12 | Debian 8 使用的是 3.14.0 的内核版本,可以从 Debian 的镜像源来安装 `docker.io` 包。 13 | 14 | >提示:Debian 包含一个特别老的KDE3/GNOME2包叫 `docker` ,所以我们把这个包叫`docker.io`。 15 | 16 | ###安装 17 | 18 | 安装最新版的 Debian 软件包(可能不是最新版本 Docker ) 19 | 20 | $ sudo apt-get update 21 | $ sudo apt-get install docker.io 22 | 23 | 验证 Docker 是否正常工作 : 24 | 25 | $ sudo docker run -i -t Ubuntu /bin/bash 26 | 27 | 该命令将下载 `Ubuntu` 镜像,并且在容器内运行 `bash`. 28 | 29 | > 注意:如果你打算启用内存和交换空间设置,请查看[这里](./ubuntu.md) 30 | 31 | ##Debian Wheezy/Stable 7.x (64-bit) 32 | 33 | 安装 Docker 需要内核在3.8版本以上,但是 Wheezy 的内核版本是 3.2([bug #407](https://github.com/docker/docker/issues/407%20kernel%20versions)对 Docker 需要3.8版本内核进行了讨论。) 34 | 35 | 幸运的是,官方提供了 `wheezy-backports` ,它内核版本是3.16,可以支持 Docker。 36 | 37 | ###安装 38 | 39 | 1. 从 wheezy-backports 镜像源来安装内核 40 | 41 | 在 `/etc/apt/sources.list` 文件下添加如下内容: 42 | 43 | deb http://http.debian.net/debian wheezy-backports main 44 | 45 | 安装 `linux-image-amd64` 包 (注意使用 `-t wheezy-backports`) 46 | 47 | $ sudo apt-get update 48 | $ sudo apt-get install -t wheezy-backports linux-image-amd64 49 | 50 | 2. 从 get.docker.com 获取安装脚本并安装: 51 | 52 | curl -sSL https://get.docker.com/ | sh 53 | 54 | 55 | ###使用非root 56 | 57 | docker 进程通过监听一个 Unix Socket 来替代 TCP 端口。在默认情况下,docker 的 Unix Socket属于`root`用户,当然其他用户可以使用`sudo`方式来访问。因为这个原因, docker 进程就一直是`root`用户运行的。 58 | 59 | 如果你(或者说你安装Docker的时候)创建一个叫 `docker` 的用户组,并为用户组添加用户。这时候,当 Docker 进程启动的时候,`docker` 用户组对 Unix Socket 有了读/写权限。 你必须使用root用户来运行 docker 进程,但你可以用 `docker` 群组用户来使用 docker 客户端,你再使用 docker 命令的时候前边就不需要加 `sudo` 了。从Docker 0.9版本开始,你可以使用`-G`来指定用户组。 60 | 61 | >警告:Docker 用户组(或者用 `-G` 指定的用户组)有等同于root用户的权限,有关系统安全影响的细节,请查看 [Docker 进程表面攻击细节]() 62 | 63 | 操作演示: 64 | 65 | # Add the docker group if it doesn't already exist. 66 | $ sudo groupadd docker 67 | 68 | # Add the connected user "${USER}" to the docker group. 69 | # Change the user name to match your preferred user. 70 | # You may have to logout and log back in again for 71 | # this to take effect. 72 | $ sudo gpasswd -a ${USER} docker 73 | 74 | # Restart the Docker daemon. 75 | $ sudo service docker restart 76 | ##下一步 77 | 78 | 继续阅读[用户指南](../userguide/README.md)。 79 | -------------------------------------------------------------------------------- /installation/fedora.md: -------------------------------------------------------------------------------- 1 | # Fedora 2 | 3 | Docker 已经支持以下版本的 Fedora : 4 | 5 | - [*Fedora 20 (64-bit)*](#fedora-20-installation) 6 | - [*Fedora 21 and later (64-bit)*](#fedora-21-and-later-installation) 7 | 8 | 目前的 Fedora 项目,仅发行版本中的内核支持 Docker。如果你打算在非发行版本的内核上运行 Docker ,内核的改动可能会导致出错。 9 | 10 | ## Fedora 21 或更高版本安装 Docker 11 | 12 | 在你的主机上安装 `docker` 包来安装 Docker 。 13 | 14 | $ sudo yum -y install docker 15 | 16 | 更新 `docker` : 17 | 18 | $ sudo yum -y update docker 19 | 20 | 请继续阅读启动 Docker 进程 [Starting the Docker daemon](#starting-the-docker-daemon)。 21 | 22 | 23 | ## Fedora 20 安装 Docker 24 | 25 | 在 `Fedora 20` 中,一个系统自带的可执行的应用程序与 docker 包名字发生冲突,所以我们给 docker 的RPM包重命名为 docker-io 。 26 | 27 | `Fedora 20` 中 安装 `docker-io` 之前需要先卸载 `docker` 包。 28 | 29 | $ sudo yum -y remove docker 30 | $ sudo yum -y install docker-io 31 | 32 | 更新 `docker` 33 | 34 | $ sudo yum -y update docker-io 35 | 36 | 请继续阅读启动 Docker 进程 [Starting the Docker daemon](#starting-the-docker-daemon)。 37 | 38 | ## Starting the Docker daemon 39 | 40 | 当 Docker 安装完成之后,你需要启动 docker 进程。 41 | 42 | $ sudo systemctl start docker 43 | 44 | 如果我们希望开机时自动启动 Docker ,如下操作: 45 | 46 | $ sudo systemctl enable docker 47 | 48 | 现在,我们来验证 Docker 是否正常工作。 49 | 50 | $ sudo docker run -i -t fedora /bin/bash 51 | 52 | > 注意 : 如果你使用的时候提示了 `Cannot start container` 错误,错误中提到了 SELINUX 或者权限不足,你需要更新 SELinux 策略,你可以使用 `sudo yum upgrade selinux-policy` 来改变 SELinux策略并重启。 53 | 54 | ## 为使用 Docker 用户授权 55 | 56 | `docker` 命令行工具通过 socket 文件 `/var/run/docker.sock` 和 `docker` 守护进程进行通信的。而这个 socket 文件的用户权限是 `root:root`。 虽然 57 | [推荐](https://lists.projectatomic.io/projectatomic-archives/atomic-devel/2015-January/msg00034.html) 58 | 使用 `sudo` 命令来使用 docker 命令,但是如果你不想使用 `sudo`, 系统管理员可以创建一个 `docker` 用户组,并将 `/var/run/docker.sock` 赋予 docker 用户组权限,然后给 docker 用户组添加用户即可。 59 | 60 | 61 | $ sudo groupadd docker 62 | $ sudo chown root:docker /var/run/docker.sock 63 | $ sudo usermod -a -G docker $USERNAME 64 | 65 | ## 自定义进程选项 66 | 67 | 如果你想要添加一个 HTTP 代理,为 Docker 运行文件设置不同的目录或分区,又或者定制一些其它的功能,请阅读我们的系统文章,了解[如何定制 Docker 进程](/articles/systemd.md) 68 | 69 | 70 | ## 下一步 71 | 72 | 阅读 [用户指南](../userguide/). 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /installation/frugalware.md: -------------------------------------------------------------------------------- 1 | FrugalWare 2 | === 3 | 4 | 在FrugalWare上使用官方包来安装: 5 | 6 | - [lxc-docker i686](http://www.frugalware.org/packages/200141) 7 | - [lxc-docker x86_64](http://www.frugalware.org/packages/200130) 8 | 9 | `lxc-docker` 包将会安装最新版本的 Docker。 10 | 11 | ###依赖关系 12 | 13 | Docker 有几个依赖包需要安装,核心依赖包如下: 14 | 15 | - systemd 16 | - lvm2 17 | - sqlite3 18 | - libguestfs 19 | - lxc 20 | - iproute2 21 | - bridge-utils 22 | 23 | ###安装 24 | 25 | 只需一步就可以完整安装: 26 | 27 | pacman -S lxc-docker 28 | 29 | 30 | ###开始用docker 31 | 32 | Docker 会创建一个系统服务,使用下面的命令启动该服务: 33 | 34 | $ sudo systemctl start lxc-docker 35 | 36 | 设置开机启动: 37 | 38 | $ sudo systemctl enable lxc-docker 39 | 40 | ## 自定义进程选项 41 | 42 | 如果你想要添加一个 HTTP 代理,为 Docker 运行文件设置不同的目录或分区,又或者定制一些其它的功能,请阅读我们的系统文章,了解[如何定制 Docker 进程](/articles/systemd.md) -------------------------------------------------------------------------------- /installation/gentoo.md: -------------------------------------------------------------------------------- 1 | #Gentoo 2 | 3 | 在 Gentoo Linux 上安装 Docker 可以通过以下两种方式的任一种实现:官方安装方法和 `docker-overlay` 方法。 4 | 5 | 官方 [ Gentoo Docker ](https://wiki.gentoo.org/wiki/Project:Docker) 团队页面。 6 | 7 | ## 官方方式 8 | 9 | 如果你正在寻找一种稳定的方案,最好的办法就是直接在 portage tree 上安装官方的 app-emulation/docker 包。 10 | 11 | 如果 ebuild 时出现任何问题,包括缺少内核配置标识或依赖,请到 Gentoo 的 [ Bugzilla ](https://bugs.gentoo.org/) 网站上指定的 `docker AT gentoo DOT org` 提交问题,或者加入 Freenode 的 Gentoo 官方 [IRC](http://webchat.freenode.net?channels=%23gentoo-containers&uio=d4) 频道来提问。 12 | 13 | ## docker-overlay 方法 14 | 15 | 如果你正在寻找一个 `-bin` ebuild, live ebuild, 或者 bleeding edge ebuild,可以使用 overlay 提供的[docker-overlay](https://github.com/tianon/docker-overlay)。使用 app-portage/layman 来添加第三方的 portage。查看最新的安装和使用 overlay 的文档请,请点击 [the overlay README](https://github.com/tianon/docker-overlay/blob/master/README.md#using-this-overlay)。 16 | 17 | 18 | 如果 ebuild 或者生成的二进制文件时出现任何问题,包括特别是缺少内核配置标识或依赖关系,请 [在 docker-overlay 仓库提交一个 issue](https://github.com/tianon/docker-overlay/issues) 或者直接在 freenode 网络的 #docker IRC 频道上联系 tianon。 19 | 20 | 21 | ## 安装 22 | 23 | ### Available USE flags 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 |
USE FlagDefaultDescription
aufsEnables dependencies for the "aufs" graph driver, including necessary kernel flags.
btrfsEnables dependencies for the "btrfs" graph driver, including necessary kernel flags.
contribYesInstall additional contributed scripts and components.
device-mapperYesEnables dependencies for the "devicemapper" graph driver, including necessary kernel flags.
docAdd extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally.
lxcEnables dependencies for the "lxc" execution driver.
vim-syntaxPulls in related vim syntax scripts.
zsh-completionEnable zsh completion support.
76 | 77 | 78 | 这个包会适当的获取必要的依赖和提示的内核选项。 79 | 80 | [ tianon's ](https://tianon.github.io/post/2014/05/17/docker-on-gentoo.html) 的博客中有详细的使用标识的介绍。 81 | 82 | $ sudo emerge -av app-emulation/docker 83 | 84 | >注:有时候官方的 **Gentoo tree** 和 **docker-overlay** 的最新版本还是有差距的,请耐心等待,最新版本会很快更新。 85 | 86 | 87 | ##启动 Docker 88 | 89 | 请确保您运行的内核包含了所有必要的模块和配置(可选的 device-mapper 和 AUFS 或 Btrfs ,这主要取决于你要使用的存储驱动程序)。 90 | 91 | 使用 Docker,docker 进程必须以 **root** 用户运行。 92 | 93 | 用 **非root** 用户使用 Docker,可以使用下边的命令,将你自己的用户添加到 **docker** 用户组 。 94 | 95 | $ sudo usermod -a -G docker user 96 | 97 | ###OpenRC 98 | 99 | 启动 `docker` 进程: 100 | 101 | $ sudo /etc/init.d/docker start 102 | 103 | 开机启动: 104 | 105 | $ sudo rc-update add docker default 106 | 107 | ###systemd 108 | 109 | 启动 `docker` 进程: 110 | 111 | $ sudo systemctl start docker.service 112 | 113 | 开机启动: 114 | 115 | $ sudo systemctl enable docker.service 116 | 117 | 如果你想要添加一个 HTTP 代理,为 Docker 运行文件设置不同的目录或分区,又或者定制一些其它的功能,请阅读我们的系统文章,了解[如何定制 Docker 进程](../articles/systemd.md) 118 | -------------------------------------------------------------------------------- /installation/google.md: -------------------------------------------------------------------------------- 1 | Google Cloud Platform 2 | === 3 | 4 | ###Google Compute Enginer 镜像快速入门 5 | 6 | 1.去谷歌云控制台,创建一个新的云计算项目,启用云引擎 7 | 8 | 2.使用如下的命令来下载谷歌云 SDK 并配置您的项目: 9 | 10 | $ curl https://sdk.cloud.google.com | bash 11 | $ gcloud auth login 12 | $ gcloud config set project 13 | 14 | 3.启动一个新实例,使用最新的 Container-optimized 镜像:(选择一个接近你所需实例大小的分区) 15 | 16 | $ gcloud compute instances create docker-playground \ 17 | --image https://www.googleapis.com/compute/v1/projects/google-containers/global/images/container-vm-v20140522 \ 18 | --zone us-central1-a \ 19 | --machine-type f1-micro 20 | 21 | 4.用ssh来连接这个实例: 22 | 23 | $ gcloud compute ssh --zone us-central1-a docker-playground 24 | docker-playground:~$ sudo docker run hello-world 25 | 26 | 当 Docker 输出 hello word 消息的时候,说明你的 Docker 工作正常。 27 | 28 | 更多,请阅读 [ google 云平台部署容器 ](https://developers.google.com/compute/docs/containers) -------------------------------------------------------------------------------- /installation/joyent.md: -------------------------------------------------------------------------------- 1 | ## Joyent 公有云安装 Docker 2 | 3 | 1. 登录 Joyent [用户中心](https://my.joyent.com/) 4 | 5 | 2. [创建一个 Docker 主机](https://docs.joyent.com/jpc/managing-docker-containers/creating-a-docker-host). 6 | 7 | ## 启动和管理容器 8 | 9 | 1. [在 WEB 界面中启动容器](https://docs.joyent.com/jpc/managing-docker-containers/starting-a-container) 10 | 11 | 2. [在你的电脑上配置 Docker ](https://docs.joyent.com/jpc/managing-docker-containers/access-your-jpc-docker-hosts-from-the-docker-cli) 连接远程主机来开启和管理容器。 12 | 13 | 3. 在 Docker 主机中添加 SSH. 14 | 15 | 4. 使用 Docker 命令行来启动容器. 16 | 17 | ##下一步 18 | 19 | 查看 [用户指南](../userguide/), 或阅读 Joyent's [ 博客中的开始教程 ](https://www.joyent.com/blog/first-steps-with-joyents-container-service)和 [管理容器文档](https://docs.joyent.com/jpc/managing-docker-containers). -------------------------------------------------------------------------------- /installation/mac.md: -------------------------------------------------------------------------------- 1 | Mac OS X 安装 Docker 2 | === 3 | 4 | > 注意: 5 | > 该 Docker 版本为了支持 Docker 机,于是不再支持 Boot2Docker 命令行。使用 Docker Toolbox 和其它 Docker 工具来安装 Docker 机。 6 | 7 | 您可以利用 Docker Toolbox 来安装 Docker。Docker Toolbox 提供了以下工具: 8 | 9 | * 用于运行 docker-machine 二进制文件的 `Docker Machine` 10 | * 用于运行 docker 二进行文件的 `Docker Engine` 11 | * 用于运行 docker-compose 二进行文件的 `Docker Compose (Mac 特有)` 12 | * Kitematic,Docker 的图形用户界面 13 | * 用于 Docker 命令行环且预先配置好的 shell 14 | * Oracle VM VirtualBox 15 | 16 | 由于 Docker 的后台程序使用了 Linux 特有的内核特性,所以您不能直接在 OS X 上运行 Docker。相反,您必须使用 `docker-machine` 来创建并附加一台虚拟机(VM)。该虚拟机需要安装 Linux 操作系统以便在您 Mac 机上运行 Docker。 17 | 18 | ####前提条件 19 | 20 | 您 Mac 机的 OS X 版本必须大于等于 10.8 "Snow Leopard" 才可以安装 Docker Toolbox。 21 | 22 | ###在安装之前先来了解一些关键概念 23 | 24 | 当我们在一台 Linux 主机上安装完 Docker 之后,我们的机器中就包含了本地主机和 Docker 主机。如果从网络层来划分,本地主机就代表你的电脑,而 Docker 主机就是运行 container 的那台机器。 25 | 26 | 在 Linux 机器上的一种典型安装 Docker 方法:Docker 客户端,Docker 后台程序和 container 会直接运行在您的机器上。这就意味着您可以使用标准的本地主机寻址(例如 `localhost:8000` 或者 `0.0.0.0:8376`)来为 Docker container 分配一个地址。 27 | 28 | ![linux_docker_host](../images/linux_docker_host.svg) 29 | 30 | 在 OS X 上安装的 Docker ,其 Docker 后台程序是运行在一个名为 `default` 的 Linux 虚拟机上的。`default` 是 Linux 上的一个轻量级的虚拟机,是专门用于在 Mac OS X 机器上运行 Docker 的。 31 | 32 | ![mac_docker_host](../images/mac_docker_host.svg) 33 | 34 | 在 OS X 中,Docker 主机地址就是 Linux 虚拟机的地址。当你使用 `docker-machine` 启动虚拟机的时候,该虚拟机会自动获取到 IP 地址。当您开启一个 container 的时候,container 上的端口会映射到虚拟机的端口上。本页面上的实践操作会一一印证上述内容。 35 | 36 | ###安装 37 | 38 | 如果您有一个正在运行着的 VirtualBox,那么请您在运行安装器(Docker Toolbox)之前务必关闭它。 39 | 40 | 1. 进入 [Docker Toolbox](https://www.docker.com/toolbox) 页面。 41 | 42 | 2. 点击 Docker Toolbox 下载链接,进行下载。 43 | 44 | 3. 双击安装包或者通过右击并在快捷菜单中选择“打开”的方式安装 Docker Toolbox。 45 | 46 | 此时会弹出“Install Docker Toolbox”(安装 Docker 工具箱)窗口。 47 | 48 | ![mac-welcome-page](../images/mac-welcome-page.png) 49 | 50 | 4. 点击“继续”(Continue),安装 toolbox。 51 | 52 | 此时,toolbox 会展现给你一些选项,供您自定义标准安装。 53 | 54 | ![mac-page-two](../images/mac-page-two.png) 55 | 56 | 默认情况下,标准的 Docker Toolbox 安装是这样的: 57 | * 向 `/usr/local/bin` 目录中添加 Docker 工具的二进制文件。 58 | * 修改权限使得这些二进制文件可供任何用户使用。 59 | * 更新现有的 VirtualBox 安装。 60 | 61 |
62 | 通过点击“自定义”或“更改安装目录”修改这些默认安装值。 63 | 64 | 5. 点击“安装”,执行标准安装。 65 | 66 | 系统提示您输入密码。 67 | 68 | ![mac-password-prompt](../images/mac-password-prompt.png) 69 | 70 | 6. 输入密码,继续安装 71 | 72 | 安装完成后,Docker Toolbox 会为您提供一些信息,通过这些信息您可以完成一些常见的任务。 73 | 74 | 7. 点击“关闭”,离开当前窗口。 75 | 76 | ##运行 Docker Container 77 | 78 | 想要运行一个 Docker 容器,你需要做如下内容: 79 | * 创建一个新的(或开启一台已存在的)Docker 虚拟机 80 | * 从您当前的环境切换到新的虚拟机的环境中 81 | * 利用 `docker` 客户端创建,加载并管理 container 82 | 83 | 一旦您创建了一台虚拟机,您就可以随时使用它。如同任意一台 VirtualBox 虚拟机,在每次使用它的时候都会保存其配置。 84 | 85 | 这里提供两种使用 Docker Toolbox 的方法:使用 Docker 的快速入门终端或使用您的 shell 环境。 86 | 87 | ###使用 Docker 的快速入门终端 88 | 1. 打开“应用程序”文件夹或“启动面板”。 89 | 2. 找到 Docker 快速入门终端并双击启动它。 90 | 91 | 该应用程序: 92 | * 开启一个终端窗口 93 | * 如果还没有虚拟机的化,请创建一台名叫 `default` 的虚拟机;如果已经存在这样一台虚拟机,请你开启它。 94 | * 将当前终端环境切换到虚拟机环境中。 95 | 96 | 一旦启动完成,Docker 快速入门终端会是如下状态: 97 | 98 | ![mac-success](../images/mac-success.png) 99 | 现在,您可以运行 `docker` 命令了。 100 | 101 | 3. 通过运行 `hello-world` container 来核实您的安装是否成功。 102 | 103 | 104 | ``` 105 | $ docker run hello-world 106 | Unable to find image 'hello-world:latest' locally 107 | 511136ea3c5a: Pull complete 108 | 31cbccb51277: Pull complete 109 | e45a5af57b00: Pull complete 110 | hello-world:latest: The image you are pulling has been verified. 111 | Important: image verification is a tech preview feature and should not be 112 | relied on to provide security. 113 | Status: Downloaded newer image for hello-world:latest 114 | Hello from Docker. 115 | This message shows that your installation appears to be working correctly. 116 | 117 | 118 | To generate this message, Docker took the following steps: 119 | 1. The Docker client contacted the Docker daemon. 120 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 121 | (Assuming it was not already locally available.) 122 | 3. The Docker daemon created a new container from that image which runs the 123 | executable that produces the output you are currently reading. 124 | 4. The Docker daemon streamed that output to the Docker client, which sent it 125 | to your terminal. 126 | 127 | 128 | To try something more ambitious, you can run an Ubuntu container with: 129 | $ docker run -it ubuntu bash 130 | 131 | 132 | For more examples and ideas, visit: 133 | http://docs.docker.com/userguide/ 134 | ``` 135 | 136 | 137 | 一个可以和 Docker 工具进行交互的另一种典型方法就是:从您的 shell 命令行入手。 138 | 139 | ###使用shell 命令行 140 | 该部分假设您正在运行一个 Bash shell。您运行的可能是不同的 shell,例如 C shell,但是不用担心,命令都是一样的。 141 | 142 | 1. 创建一个新的 Docker 虚拟机。 143 | 144 | ``` 145 | $ docker-machine create --driver virtualbox default 146 | 147 | Creating VirtualBox VM... 148 | Creating SSH key... 149 | Starting VirtualBox VM... 150 | Starting VM... 151 | To see how to connect Docker to this machine, run: docker-machine env default 152 | ``` 153 | 154 | 这就在 VirtualBox 中创建了一台新的 `default` 虚拟机。 155 | 156 | 该命令还会在 `~/.docker/machine/machines/default` 目录下生成一个 docker machine 的配置文件。您只需执行一次 `create` 命令。然后,您可以使用 `docker-machine` 命令来开启,停止,查询并管理虚拟机。 157 | 158 | 2. 列出所有可用的 docker machine。 159 | 160 | ``` 161 | $ docker-machine ls 162 | NAME ACTIVE DRIVER STATE URL SWARM 163 | default * virtualbox Running tcp://192.168.99.101:2376 164 | ``` 165 | 如果您之前安装了现在已经舍弃了的 Boot2Docker 这个应用程序的话或者您运行了 Docker 快速入门终端,在列表中还会有一个 `dev` 虚拟机。当 您创建 `default` 虚拟机的时候,`docker-machine` 命令给出了一些指导,以便您您连接虚拟机。 166 | 167 | 3. 获取 `default` 虚拟机的环境变量 168 | 169 | ``` 170 | $ docker-machine env default 171 | export DOCKER_TLS_VERIFY="1" 172 | export DOCKER_HOST="tcp://192.168.99.101:2376" 173 | export DOCKER_CERT_PATH="/Users/mary/.docker/machine/machines/default" 174 | export DOCKER_MACHINE_NAME="default" 175 | # Run this command to configure your shell: 176 | # eval "$(docker-machine env default)" 177 | ``` 178 | 179 | 4. 连接到 `default` 虚拟机 180 | 181 | ``` 182 | $ eval "$(docker-machine env default)" 183 | ``` 184 | 185 | 5. 运行 `hello-world` container 来验证您的安装是否已经成功。 186 | 187 | ``` 188 | docker run hello-world 189 | ``` 190 | 191 | ##学习 Toolbox 安装 192 | 193 | Toolbox 将 Docker Engine 的可执行文件和 Docker 的可执行文件下载到您的系统中。当您使用 Docker 快速入门终端或手动创建一个 `default` 虚拟机的时候,Docker Machine 会更新 `~/.docker/machine/machines/default` 文件。该文件夹中包含了虚拟机的配置文件。 194 | 195 | 您可以利用 Docker Machine 在系统中创建多个虚拟机,那么也就会有多个虚拟机的配置文件。如果您想要删除某台虚拟机,请您使用 `docker-machine rm ` 命令。 196 | 197 | ##从 Boot2Docker 迁移 198 | 如果您现在用的还是 Boot2Docker 的话,在您的本地系统中还会有一个 `boot2docker-vm` 虚拟机。为了允许 Docker Machine 管理该台虚拟机,你可以对它进行迁移。 199 | 1. 打开一个终端或 Docker 的命令行界面。 200 | 2. 输入以下命令。 201 | 202 | ``` 203 | docker-machine create -d virtualbox --virtualbox-import-boot2docker-vm boot2docker-vm docker-vm 204 | ``` 205 | 3. 使用 `docker-machine` 命令与该台要被迁移的虚拟机进行交互。 206 | `docker-machine` 的子命令和 `boot2docker` 的子命令比起来还是有一些不同之处的。下面这个表列出了对比了二者的不同并介绍其功能。 207 | 208 | 209 | | **`boot2docker`** | **`docker-machine`** | **`docker-machine`** description | 210 | | --------------------- | ------------------------ | ------------------------------------ | 211 | | init | create | Creates a new docker host. | 212 | | up | start | Starts a stopped machine. | 213 | | ssh | ssh | Runs a command or interactive ssh session on the machine. | 214 | | save | - | Not applicable. | 215 | | down | stop | Stops a running machine. | 216 | | poweroff | stop | Stops a running machine. | 217 | | reset | restart | Restarts a running machine. | 218 | | config | inspect | Prints machine configuration details. | 219 | | status | ls | Lists all machines and their status. | 220 | | info | inspect | Displays a machine's details. | 221 | | ip | ip | Displays the machine's ip address. | 222 | | shellinit | env | Displays shell commands needed to configure your shell to interact with a machine. | 223 | | delete | rm | Removes a machine. | 224 | | download | - | Not applicable. | 225 | | upgrade | upgrade | Upgrades a machine's Docker client to the latest stable release. | 226 | 227 | ##Mac OS X 上 Docker 的实例 228 | 通过了解本小节,您可以尝试在虚拟机上进行一些可行的 container 任务。现在,您应该有一台运行着的虚拟机,且通过 shell 脚本可以连接到该虚拟机。为了验证上面所说的,可以执行如下命令来验证: 229 | 230 | 231 | $ docker-machine ls 232 | NAME ACTIVE DRIVER STATE URL SWARM 233 | default * virtualbox Running tcp://192.168.99.100:2376 234 | 235 | 该台处于 `ACTIVE` 状态的虚拟机,即本例中的 default 虚拟机,就是您的环境所指向的虚拟机。 236 | 237 | ###访问 container 的端口 238 | 239 | 1. 在 DOCKER_HOST 上开启一个NGINX container。 240 | 241 | $ docker run -d -P --name web nginx 242 | 一般来说,`docker run` 命令会开启一个 container,并运行它,最后关闭它。加上 `-d` 这个参数,container 就可以在您执行了 `docker run` 这条命令后继续在后台运行了。加上 `-P` 这个参数就可以将 container 监听的那个端口告知给 Docker Host;这样您就可以在您的 Mac 机上访问 container 了。 243 | 244 | 2. 执行 `docker ps` 命令,查看运行着的 container 245 | 246 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 247 | 5fb65ff765e9 nginx:latest 248 | 此时,您会发现 `nginx` 依然在后台运行。 249 | 250 | 3. 查看 container 的端口 251 | 252 | $ docker port web 253 | 443/tcp -> 0.0.0.0:49156 254 | 80/tcp -> 0.0.0.0:49157 255 | 该命令显示出的内容会告诉你 `web` container 的 `80` 端口已经映射到了 Docker Host 上的 `49157` 端口上。 256 | 257 | 4. 在您的浏览器中输入地址 ```http://localhost:49157```(localhost 就是 0.0.0.0)。 258 | 259 | ![bad_host1](../images/bad_host1.png) 260 | 并没有生效,其原因就是 `DOCKER_HOST` 的地址并不是你本地的机器的地址(0.0.0.0),而是您的 Docker 虚拟机的地址。 261 | 262 | 5. 获取 Docker 虚拟机(即 `default`)的地址。 263 | 264 | $ docker-machine ip default 265 | 192.168.59.103 266 | 267 | 6. 在您的浏览器中输入地址 `http://192.168.59.103:49157` 268 | 269 | ![good_host1](../images/good_host1.png) 270 | 成功了! 271 | 272 | 7. 如果您想停止并删除正在运行的 `nginx` container 的话,请执行如下操作: 273 | 274 | $ docker stop web 275 | $ docker rm web 276 | 277 | 278 | ###为容器挂载一个卷 279 | 280 | 当您开启一个 container 的时候,系统会自动将您本机中的 `/Users/username` 目录共享给 Docker 虚拟机。通过本次共享,您可以将该目录挂载到您的 container 上。下面的内容将会介绍如何做到这些。 281 | 282 | 1. 跳转到您的用户 `$HOME` 目录下。 283 | 284 | $ cd $HOME 285 | 286 | 2. 创建一个新的 `site` 目录。 287 | 288 | $ mkdir site 289 | 290 | 3. 跳转到 `site` 目录中。 291 | 292 | $ cd site 293 | 294 | 4. 创建一个新的 `index.html` 文件。 295 | 296 | $ echo "my new site" > index.html 297 | 298 | 5. 开启一个新 `nginx` container 并将 `html` 目录替换为 `site` 目录。 299 | 300 | $ docker run -d -P -v $HOME/site:/usr/share/nginx/html --name mysite nginx 301 | 302 | 6. 获取到 `mysite` 这个 container 的端口。 303 | 304 | $ docker port mysite 305 | 80/tcp -> 0.0.0.0:49166 306 | 443/tcp -> 0.0.0.0:49165 307 | 308 | 7. 在浏览器中输入地址: 309 | 310 | ![newsite_view1](../images/newsite_view1.png) 311 | 312 | 8. 立即添加一个文件到 `$HOME/siet` 目录下。 313 | 314 | $ echo "This is cool" > cool.html 315 | 316 | 9. 在浏览器中输入地址: 317 | 318 | ![cool_view1](../images/cool_view1.png) 319 | 320 | 10. 停止然后删除正在运行的 `mysite` container。 321 | 322 | $ docker stop mysite 323 | $ docker rm mysite 324 | 325 | ##更新 Docker Toolbox 326 | 327 | 为更新Docker Toolbox, 需要下载并重新运行[Docker Toolbox安装器](https://docker.com/toolbox/). 328 | 329 | ##卸载 Docker Toolbox 330 | 331 | 按照以下步骤卸载Toolbox: 332 | 333 | 1. 列出所有的虚拟机 334 | 335 | $ docker-machine ls 336 | NAME ACTIVE DRIVER STATE URL SWARM 337 | dev * virtualbox Running tcp://192.168.99.100:2376 338 | my-docker-machine virtualbox Stopped 339 | default virtualbox Stopped 340 | 341 | 2. 删除(列出的)每一台虚拟机. 342 | 343 | $ docker-machine rm dev 344 | Successfully removed dev 345 | 删除一台虚拟机,意味着从`VirtualBox`和`~/.docker/machine/machines`目录中同时删除虚拟机文件。 346 | 347 | 3. 从“应用程序“文件夹中删除Docker快捷终端(Quickstart Terminal)和Kitematic. 348 | 349 | 4. 从/usr/local/bin文件夹中删除docker, docker-compose和 docker-machine命令文件. 350 | 351 | $ rm /usr/local/bin/docker 352 | 353 | 5. 从系统中删除 `~/.docker` 文件夹. 354 | 355 | ##学习更多 356 | 357 | 使用"docker-machine help"命令可以列出关于Docker Machine的全部命令行参考信息.参照[Docker Machine文档](https://docs.docker.com/machine/)来获得关于如何使用 SSH 或者 SCP 访问虚拟机的信息。 358 | 接下来,可以继续了解[Docker用户手册](https://docs.docker.com/userguide) . 如果对使用Kitematic图形界面工具感兴趣,可以参考阅读 [Kitermatic用户手册](https://docs.docker.com/kitematic/userguide/). 359 | -------------------------------------------------------------------------------- /installation/opensuse.md: -------------------------------------------------------------------------------- 1 | openSUSE 2 | === 3 | 4 | Docker 支持 openSUSE 12.3 或更高版本。由于 Docker 的限制,Docker 只能运行在64位的主机上。 5 | 6 | Docker 不被包含在 openSUSE 12.3 和 openSUSE 13.1 的官方镜像仓库中。因此需要添加 OBS 的 [虚拟化仓库](https://build.opensuse.org/project/show/Virtualization "Virtualization repository ") 来安装 `docker` 包 7 | 8 | 9 | 执行下边的命令来添加虚拟化仓库(Virtualization repository): 10 | 11 | # openSUSE 12.3 12 | $ sudo zypper ar -f http://download.opensuse.org/repositories/Virtualization/openSUSE_12.3/ Virtualization 13 | 14 | # openSUSE 13.1 15 | $ sudo zypper ar -f http://download.opensuse.org/repositories/Virtualization/openSUSE_13.1/ Virtualization 16 | 17 | 在 openSUSE 13.2版本以后就不需要添加额外的库了。 18 | 19 | ###SUSE Linux Enterprise 20 | 21 | 可以在 SUSE Linux Enterprise 12 或 更高版本上来运行 Docker 。这里需要注意的是由于 Docker 当前的限制,只能在**64位**的主机上运行。 22 | 23 | ##安装 24 | 25 | 安装 Docker 包 26 | 27 | $ sudo zypper in docker 28 | 29 | 30 | 现在已经安装完毕,让我们来启动 docker 进程 31 | 32 | $ sudo systemctl start docker 33 | 34 | 设置开机启动 docker: 35 | 36 | $ sudo systemctl enable docker 37 | 38 | Docker 包会创建一个的叫 `docker` 的群组 ,如果想使用非 root 用户来运行,这个用户需要是 `docker` 群组的成员才可以与 docker 进程进行交互,你可以使用如下命令添加用户: 39 | 40 | $ sudo usermod -a -G docker 41 | 42 | 确认一切都是否按照预期工作: 43 | 44 | $ sudo docker run --rm -i -t opensuse /bin/bash 45 | 46 | 这条命令将下载和导入 `opensuse` 镜像,并且在容器内运行 bash,输入 exit 来退出容器。 47 | 48 | 49 | 如果你想要你的容器能够访问外部的网络,你就需要开启 `net.ipv4.ip_forward` 规则。这里你可以使用 YaST 工具查找 Network Devices -> Network Settings -> Routing 按钮来确认 IPv4 Forwarding 选择框是否被选中。 50 | 51 | 当由 Network Manager 来管理网络的时候,就不能按照上边的方法设置了。这里我们需要手动的编辑 `/etc/sysconfig/SuSEfirewall2` 文件来确保 `FW_ROUTE` 被设置成 `yes`,如下: 52 | 53 | FW_ROUTE="yes" 54 | 55 | ## 自定义进程选项 56 | 57 | 如果你想要添加一个 HTTP 代理,为 Docker 运行文件设置不同的目录或分区,又或者定制一些其它的功能,请阅读我们的系统文章,了解[如何定制 Docker 进程](/articles/systemd.md) 58 | 59 | ##下一步 60 | 61 | 阅读[用户指南](../userguide/README.md)。 -------------------------------------------------------------------------------- /installation/rackspace.md: -------------------------------------------------------------------------------- 1 | #Rackspace Cloud 2 | 3 | 由 Rackspace 提供的 Ubuntu 安装 Docker 是非常简单的,你可以大多按照[Ubuntu](../installation/ubuntu.md "Ubuntu")的安装指南。 4 | 5 | **不过请注意:** 6 | 7 | 如果你使用的 Linux 发行版没有运行 3.8 内核,你就必须升级内核,这个在 Rackspace 上是有些困难的。 8 | 9 | Rackspace 使用 grub 的 `menu.lst` 启动服务,虽然它们运行正常,但是并不像非虚拟软件包(如xen兼容)内核那样。所以你必须手动设置内核。 10 | 11 | 不要在上线部署的机器上尝试这样做: 12 | 13 | # 更新apt 14 | $ apt-get update 15 | 16 | # 安装新内核 17 | $ apt-get install linux-generic-lts-raring 18 | 19 | 非常好,现在你已经将内核安装到 `/boot/` 下,下一步你需要让它在重新启动后生效。 20 | 21 | # find the exact names 22 | $ find /boot/ -name '*3.8*' 23 | 24 | # this should return some results 25 | 26 | 现在你需要手动编译 `/boot/grub/menu.list` ,在底部有相关选项。复制和替换成新内核,确保新内核在最上边,仔细检查内核和 initrd 指向的文件是否正确。 27 | 28 | 要特别注意检查内核和 initrd 条目。 29 | 30 | # 现在编辑 /boot/grub/menu.lst 31 | vi /boot/grub/menu.lst 32 | 33 | 这是配置好的样子: 34 | 35 | ## ## End Default Options ## 36 | 37 | title Ubuntu 12.04.2 LTS, kernel 3.8.x generic 38 | root (hd0) 39 | kernel /boot/vmlinuz-3.8.0-19-generic root=/dev/xvda1 ro quiet splash console=hvc0 40 | initrd /boot/initrd.img-3.8.0-19-generic 41 | 42 | title Ubuntu 12.04.2 LTS, kernel 3.2.0-38-virtual 43 | root (hd0) 44 | kernel /boot/vmlinuz-3.2.0-38-virtual root=/dev/xvda1 ro quiet splash console=hvc0 45 | initrd /boot/initrd.img-3.2.0-38-virtual 46 | 47 | title Ubuntu 12.04.2 LTS, kernel 3.2.0-38-virtual (recovery mode) 48 | root (hd0) 49 | kernel /boot/vmlinuz-3.2.0-38-virtual root=/dev/xvda1 ro quiet splash single 50 | initrd /boot/initrd.img-3.2.0-38-virtual 51 | 52 | 重启你的服务器(通过命令行或者控制台): 53 | 54 | reboot 55 | 56 | 验证你的内核是否升级成功 57 | 58 | $ uname -a 59 | # Linux docker-12-04 3.8.0-19-generic #30~precise1-Ubuntu SMP Wed May 1 22:26:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 60 | 61 | # nice! 3.8. 62 | 63 | 现在升级内核完成,更多信息查看[ubuntu文档安装](../installation/ubuntu.md) -------------------------------------------------------------------------------- /installation/redhat.md: -------------------------------------------------------------------------------- 1 | # Red Hat Enterprise Linux 2 | 3 | 以下是支持 Docker 的 RHEL 版本: 4 | 5 | - [*Red Hat Enterprise Linux 7 (64-bit)*](#red-hat-enterprise-linux-7-installation) 6 | - [*Red Hat Enterprise Linux 6.5 (64-bit)*](#red-hat-enterprise-linux-6.5-installation) 或更高版本 7 | 8 | ## 内核支持 9 | 10 | 如果你的 RHEL 运行的是发行版内核。那就仅支持通过 *extras* 渠道或者 EPEL 包来安装 Docker。如果你打算在非发行版本的内核上运行 Docker ,内核的改动可能会导致出错 11 | 12 | ## Red Hat Enterprise Linux 7 installation 13 | 14 | **Red Hat Enterprise Linux 7 (64位)** [自带Docker](https://access.redhat.com/site/products/red-hat-enterprise-linux/docker-and-containers). 你可以在[发行日志](https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/7.0_Release_Notes/chap-Red_Hat_Enterprise_Linux-7.0_Release_Notes-Linux_Containers_with_Docker_Format.html)中找到概述和指南。 15 | 16 | Docker 包含在 **extras** 镜像源中,使用下面的方法可以安装 Docker: 17 | 18 | 1. 启用 **extras** 镜像源: 19 | 20 | $ sudo subscription-manager repos --enable=rhel-7-server-extras-rpms 21 | 22 | 2. 安装 Docker : 23 | 24 | $ sudo yum install docker 25 | 26 | 如果你是RHEL客户,更多的 RHEL-7 安装、配置和[用户指南](https://access.redhat.com/site/articles/881893)可以在[客户中心](https://access.redhat.com/)中找到。 27 | 28 | 请继续阅读 [ 启动 Docker 进程 ](#starting-the-docker-daemon). 29 | 30 | ## Red Hat Enterprise Linux 6.5 installation 31 | 32 | 你需要在 **64位** 的 [RHEL 6.5](https://access.redhat.com/site/articles/3078#RHEL6) 或更高的版本上来安装 Docker,Docker 工作需要特定的内核补丁, 因此 RHEL 的内核版本应为 2.6.32-431 或者更高。 33 | 34 | Docker 已经包含在 RHEL 的 EPEL 源中。该源是 Extra Packages for Enterprise Linux (EPEL) 的一个额外包,社区中正在努力创建和维护相关镜像。 35 | 36 | ## 内核支持 37 | 38 | 如果你的 RHEL 运行的是发行版内核。那就仅支持通过 *extras* 渠道或者 EPEL 包来安装 Docker。如果你打算在非发行版本的内核上运行 Docker ,内核的改动可能会导致出错 39 | 40 | > **Warning**: 41 | > Please keep your system up to date using `yum update` and rebooting 42 | > your system. Keeping your system updated ensures critical security 43 | > vulnerabilities and severe bugs (such as those found in kernel 2.6.32) 44 | > are fixed. 45 | 46 | 首先,你需要安装EPEL镜像源,请查看 [EPEL installation instructions](https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F). 47 | 48 | 在EPEL中已经提供了 `docker-io` 包 49 | 50 | 如果你安装了(不相关)的 Docker 包,它将与 `docker-io` 冲突。在安装 `docker-io` 之前,请先卸载 Docker 51 | 52 | 下一步,我们将要在我们的主机中安装 Docker,也就是 `docker-io` 包: 53 | 54 | $ sudo yum -y install docker-io 55 | 56 | 更新`docker-io`包: 57 | 58 | $ sudo yum -y update docker-io 59 | 60 | 现在 Docker 已经安装好了,我们来启动 docker 进程: 61 | 62 | $ sudo service docker start 63 | 64 | 设置开机启动: 65 | 66 | $ sudo chkconfig docker on 67 | 68 | 现在,让我们确认 Docker 是否正常工作: 69 | 70 | $ sudo docker run -i -t fedora /bin/bash 71 | 72 | 73 | 继续 [ 启动 Docker 进程 ]( #启动Docker进程 ) 74 | 75 | ## 启动 Docker 进程 76 | 77 | 现在 Docker 已经安装好了,让我们来启动 Docker 进程 78 | 79 | $ sudo service docker start 80 | 81 | 如果我们想要开机启动 Docker ,我们需要执行如下的命令: 82 | 83 | $ sudo chkconfig docker on 84 | 85 | 现在测试一下是否正常工作. 86 | 87 | $ sudo docker run -i -t fedora /bin/bash 88 | 89 | > 注意: 如果你运行的时候提示一个 `Cannot start container` 的错误,错误中提到了 SELINUX 或者 权限不足。你需要更新 SELINUX 规则。你可以使用 `sudo yum upgrade selinux-policy` 然后重启。 90 | 91 | 92 | **下一步** 93 | 94 | 好!现在你可以去查看[用户指南](../userguide/README.md)。 95 | 96 | ## 自定义进程选项 97 | 98 | 如果你想要添加一个 HTTP 代理,为 Docker 运行文件设置不同的目录或分区,又或者定制一些其它的功能,请阅读我们的系统文章,了解[如何定制 Docker 进程](/articles/systemd.md) 99 | 100 | 101 | ##问题 102 | 103 | 遇到问题请到 [Red Hat Bugzilla for docker-io component](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora%20EPEL&component=docker-io) 进行反馈。 104 | -------------------------------------------------------------------------------- /installation/softlayer.md: -------------------------------------------------------------------------------- 1 | IBM SoftLayer 2 | === 3 | 4 | 1.创建一个 [IBM SoftLayer 账户](https://www.softlayer.com/cloud-servers/). 5 | 6 | 2.登陆到 [SoftLayer Customer Portal](https://control.softlayer.com/). 7 | 8 | 3.在 `Devices` 菜单中选择[设备列表](https://control.softlayer.com/devices). 9 | 10 | 4.点击位于菜单条下方、窗口顶部右侧的 *Order Devices*. 11 | 12 | 5.在 `Virtual Server` 下点击 [Hourly](https://manage.softlayer.com/Sales/orderHourlyComputingInstance). 13 | 14 | 6.创建一个新的 SoftLayer Virtual Server Instance (VSI),使用全部字段的默认值: 15 | 16 | * `Datacenter` 的部署位置 17 | * Ubuntu Linux 12.04 LTS Precise Pangolin - 最小化安装的64位系统 18 | 19 | 7.点击底部右侧的 *Continue Your Order*. 20 | 21 | 8.填写 VSI 主机名和域名。 22 | 23 | 9.填写用户所需的元数据和订单。 24 | 25 | 10.接下来请继续阅读 [Ubuntu](https://docs.docker.com/installation/ubuntulinux/#ubuntu-linux). 26 | 27 | ###What next 28 | 29 | 更多信息请阅读[用户指南](../userguide/README.md)。 -------------------------------------------------------------------------------- /installation/ubuntu.md: -------------------------------------------------------------------------------- 1 | Ubuntu 2 | === 3 | 4 | Docker 支持以下的 Ubuntu 版本 5 | 6 | + Ubuntu Trusty 14.04 (LTS) (64-bit) 7 | + Ubuntu Precise 12.04 (LTS) (64-bit) 8 | + Ubuntu Raring 13.04 and Saucy 13.10 (64 bit) 9 | 10 | 这个页面可以指导你安装 Docker 包管理器,并了解其中的安装机制。通过下边的安装方式可以确保你获取的是最新版本的 Docker。如果你想要使用 'Ubuntu包管理器' 安装,你可以查阅你的 Ubuntu 文档。 11 | 12 | ###前提条件 13 | 14 | Docker 需要在64位版本的Ubuntu上安装。此外,你还需要保证你的 Ubuntu 内核的最小版本不低于 3.10,其中3.10 小版本和更新维护版也是可以使用的。 15 | 16 | 在低于3.10版本的内核上运行 Docker 会丢失一部分功能。在这些旧的版本上运行 Docker 会出现一些BUG,这些BUG在一定的条件里会导致数据的丢失,或者报一些严重的错误。 17 | 18 | 打开控制台使用 `uname -r`命令来查看你当前的内核版本。 19 | 20 | $ uname -r 21 | 3.11.0-15-generic 22 | >Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的Ubuntu版本是否支持 Docker 。 23 | 24 | ###Trusty 14.04 25 | 26 | 这个版本不需要考虑前提条件 27 | 28 | ###Precise 12.04 (LTS) 29 | 30 | 对于Ubuntu Precise版本, 安装Docker需要内核在3.13及以上版本。如果你的内核版本低于3.13你需要升级你的内核。 通过下边的表,请查阅下边的表来确认你的环境需要哪些包。 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 47 | 48 | 49 | 50 | 51 | 52 |
linux-image-generic-lts-trusty基本Linux 内核镜像。这个内核内置了AUFS。这是运行Docker必备的软件。
linux-headers-generic-lts-trusty允许ZFS和VirtualBox客户机额外的包。如果你不安装已存在内核的头文件,那么你可以跳过"trusty"内核的这些头文件。如果你不确定,为安全起见,你应该包含这些包。
xserver-xorg-lts-trusty在没有Unity/Xorg的非图形环境中可选。必选 当在图形环境的机器中运行Doker时。 44 |

学习使用这些包的原因,请参考内核安装教程。详情 LTS 46 | 实现栈 Stack — 参考每个版本下的标记5。

libgl1-mesa-glx-lts-trusty
  53 | 54 | 通过下边的操作来升级你的内核和安装额外的包 55 | 56 | 1. 在Ubuntu系统中打开命令行控制台。 57 | 58 | 2. 升级你的包管理器 59 | 60 | $ sudo apt-get update 61 | 62 | 3. 安装所有必须和可选的包 63 | 64 | $ sudo apt-get install linux-image-generic-lts-trusty 65 | 66 | 根据个人的系统环境来选择是否安装更多的包(前表列出)。 67 | 68 | 4. 重启系统 69 | 70 | $ sudo reboot 71 | 72 | 5. 等到系统重启成功之后,查看[安装Docker](#Ubuntu安装Docker) 73 | 74 | ###Saucy 13.10 (64 bit) 75 | 76 | Docker 使用 AUFS 作为默认的后端存储方式,如果你之前没有安装 AUFS ,Docker 在安装过程中会自动添加。 77 | 78 | ##Ubuntu安装Docker 79 | 80 | 首先要确认你的 Ubuntu 版本是否符合安装 Docker 的前提条件。如果没有问题,你可以通过下边的方式来安装 Docker : 81 | 82 | 1. 使用具有`sudo`权限的用户来登录你的Ubuntu。 83 | 84 | 2. 查看你是否安装了`wget` 85 | 86 | $ which wget 87 | 88 | 如果`wget`没有安装,先升级包管理器,然后再安装它。 89 | 90 | $ sudo apt-get update $ sudo apt-get install wget 91 | 92 | 3. 获取最新版本的 Docker 安装包 93 | 94 | $ wget -qO- https://get.docker.com/ | sh 95 | 96 | 系统会提示你输入`sudo`密码,输入完成之后,就会下载脚本并且安装Docker及依赖包。 97 | 98 | 4. 验证 Docker 是否被正确的安装 99 | 100 | $ sudo docker run hello-world 101 | 102 | 上边的命令会下载一个测试镜像,并在容器内运行这个镜像。 103 | 104 | 105 | ##Ubuntu Docker可选配置 106 | 107 | 这部分主要介绍了 Docker 的可选配置项,使用这些配置能够让 Docker 在 Ubuntu 上更好的工作。 108 | 109 | 110 | - 创建 Docker 用户组 111 | - 调整内存和交换空间(swap accounting) 112 | - 启用防火墙的端口转发(UFW) 113 | - 为 Docker 配置DNS服务 114 | 115 | ###创建 Docker 用户组 116 | 117 | docker 进程通过监听一个 Unix Socket 来替代 TCP 端口。在默认情况下,docker 的 Unix Socket属于`root`用户,当然其他用户可以使用`sudo`方式来访问。因为这个原因, docker 进程就一直是`root`用户运行的。 118 | 119 | 为了在使用 `docker` 命令的时候前边不再加`sudo`,我们需要创建一个叫 `docker` 的用户组,并且为用户组添加用户。然后在 `docker` 进程启动的时候,我们的 `docker` 群组有了 Unix Socket 的所有权,可以对 Socket 文件进行读写。 120 | 121 | >注意:`docker` 群组就相当于root用户。有关系统安全影响的细节,请查看 [Docker 进程表面攻击细节]() 122 | 123 | 创建 `docker` 用户组并添加用户 124 | 125 | 1. 使用具有`sudo`权限的用户来登录你的Ubuntu。 126 | 127 | 在这过程中,我们假设你已经登录了Ubuntu。 128 | 129 | 2. 创建 `docker` 用户组并添加用户。 130 | 131 | $ sudo usermod -aG docker ubuntu 132 | 133 | 3. 注销登录并重新登录 134 | 135 | 这里要确保你运行用户的权限。 136 | 137 | 4. 验证 `docker` 用户不使用 `sudo` 命令开执行 `Docker` 138 | 139 | $ docker run hello-world 140 | 141 | ###调整内存和交换空间(swap accounting) 142 | 143 | 当我们使用 Docker 运行一个镜像的时候,我们可能会看到如下的信息提示: 144 | 145 | WARNING: Your kernel does not support cgroup swap limit. WARNING: Your 146 | kernel does not support swap limit capabilities. Limitation discarded.、 147 | 148 | 为了防止以上错误信息提示的出现,我们需要在系统中启用内存和交换空间。我们需要修改系统的 GUN GRUB (GNU GRand Unified Bootloader) 来启用内存和交换空间。开启方法如下: 149 | 150 | 1. 使用具有`sudo`权限的用户来登录你的Ubuntu。 151 | 152 | 2. 编辑 `/etc/default/grub` 文件 153 | 154 | 3. 设置 `GRUB_CMDLINE_LINUX` 的值如下: 155 | 156 | GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" 157 | 158 | 4. 保存和关闭文件 159 | 160 | 5. 更新 GRUB 161 | 162 | $ sudo update-grub 163 | 164 | 6. 重启你的系统。 165 | 166 | ### 允许UFW端口转发 167 | 168 | 当你在运行 `docker` 的宿主主机上使用UFW(简单的防火墙)。你需要做一些额外的配置。Docker 使用桥接的方式来管理网络。默认情况下,UFW 过滤所有的端口转发策略。因此,当在UFW启用的情况下使用 `docker` ,你必须适当的设置UFW的端口转发策略。 169 | 170 | 默认情况下UFW是过滤掉所有的入站规则。如果其他的主机能够访问你的容器。你需要允许Docker的默认端口(2375)的所有连接。 171 | 172 | 设置 UFW 允许Docker 端口的入站规则: 173 | 174 | 1. 使用具有`sudo`权限的用户来登录你的Ubuntu。 175 | 2. 验证UFW的安装和启用状态 176 | 177 | $ sudo ufw status 178 | 179 | 3. 打开和编辑`/etc/default/ufw`文件 180 | 181 | $ sudo nano /etc/default/ufw 182 | 183 | 4. 设置 `DEFAULT_FORWARD_POLICY ` 如下: 184 | 185 | DEFAULT_FORWARD_POLICY="ACCEPT" 186 | 187 | 5. 保存关闭文件。 188 | 189 | 6. 重新加载UFW来使新规则生效。 190 | 191 | $ sudo ufw reload 192 | 193 | 7. 允许 Docker 端口的入站规则 194 | 195 | $ sudo ufw allow 2375/tcp 196 | 197 | 198 | ###Docker 配置 DNS 服务 199 | 200 | 无论是Ubuntu还是Ubuntu 桌面繁衍版在系统运行的时候都是使用`/etc/resolv.conf`配置文件中的127.0.0.1作为域名服务器(nameserver)。NetworkManager设置dnsmasq使用真实的dns服务器连接,并且设置 /etc/resolv.conf的域名服务为127.0.0.1。 201 | 202 | 在桌面环境下使用这些配置来运行 docker 容器的时候, Docker 用户会看到如下的警告: 203 | 204 | WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers 205 | can't use it. Using default external servers : [8.8.8.8 8.8.4.4] 206 | 207 | 该警告是因为 Docker 容器不能使用本地的DNS服务。相反 Docker 使用一个默认的外部域名服务器。 208 | 209 | 为了避免此警告,你可以给 Docker 容器指定一个DNS服务器。或者你可以禁用 NetworkManager 的 `dnsmasq`。不过当禁止 `dnsmasq` 可能使某些网络的DNS解析速度变慢。 210 | 211 | 为 Docker 指定一个DNS服务器 212 | 213 | 1. 使用具有`sudo`权限的用户来登录你的Ubuntu。 214 | 215 | 2. 打开并编辑 `/etc/default/docker` 216 | 217 | $ sudo nano /etc/default/docker 218 | 219 | 3. 添加设置 220 | 221 | DOCKER_OPTS="--dns 8.8.8.8" 222 | 223 | 使用8.8.8.8替换如192.168.1.1的本地DNS服务器。你可以指定多个DNS服务器,多个DNS服务器使用空格分割例如 224 | 225 | --dns 8.8.8.8 --dns 192.168.1.1 226 | 227 | >警告:如果你正在使用的电脑需要连接到不同的网络,一定要选择一个公共DNS服务器。 228 | 229 | 4. 保存关闭文件。 230 | 231 | 5. 重启 Docker 进程 232 | 233 | $ sudo restart docker 234 | 235 | 或者,作为替代先前的操作过程,禁止NetworkManager中的`dnsmasq `(这样会使你的网络变慢) 236 | 237 | 1. 打开和编辑 `/etc/default/docker` 238 | 239 | $ sudo nano /etc/NetworkManager/NetworkManager.conf 240 | 241 | 2. 注释掉 dns = dsnmasq: 242 | 243 | dns=dnsmasq 244 | 245 | 3. 保存关闭文件 246 | 247 | 4. 重启NetworkManager 和 Docker 248 | 249 | $ sudo restart network-manager $ sudo restart docker 250 | 251 | 252 | 253 | ###升级Docker 254 | 255 | 在`wget`的时候使用`-N`参数来安装最新版本的Docker: 256 | 257 | $ wget -N https://get.docker.com/ | sh 258 | 259 | -------------------------------------------------------------------------------- /installation/windows.md: -------------------------------------------------------------------------------- 1 | #windows 2 | 3 | >提示:Docker 已经在windows7.1和windows 8上通过测试,当然它也可以在低版本的windows上使用。但是你的处理器必须支持硬件虚拟化。 4 | 5 | Docker 引擎使用的是Linux内核特性,所以我们需要在 Windows 上使用一个轻量级的虚拟机 (VM) 来运行 Docker。我们使用 Windows的Docker客户端来控制 Docker 虚拟化引擎的构建、运行和管理 。 6 | 7 | 为了简化这个过程,我们设计了一个叫 [Boot2Docker](https://github.com/boot2docker/boot2docker) 的应用程序,你可以通过它来安装虚拟机和运行 Docker。 8 | 9 | 虽然你使用的是 Windows 的 Docker 客户端,但是 docker 引擎容器依然是运行在 Linux 宿主主机上(现在是通过Virtual box)。直到我们开发了 windows 版本的 Docker 引擎,你只需要在你的 Windows 主机上启动一个 Linux 容器。 10 | 11 | ##安装 12 | 13 | 1. 下载最新版本的[Docker for Windows Installer](https://github.com/boot2docker/windows-installer/releases/latest) 14 | 15 | 2. 运行安装文件,它将会安装virtualbox、MSYS-git boot2docker Linux镜像和Boot2Docker的管理工具。 16 | 17 | ![docker windows软件安装](http://widuu.u.qiniudn.com/windows_docker.png) 18 | 19 | 3. 从桌面上或者Program Files中找到Boot2Docker for Windows,运行 `Boot2Docker Start` 脚本。这个脚本会要求你输入 ssh 密钥密码 - 可以简单点(但是起码看起来比较安全),然后只需要按[Enter]按钮即可。 20 | 21 | 4. `Boot2Docker Start` 将启动一个 Unix shell 来配置和管理运行在虚拟主机中的 Docker,运行 `docker version` 来查看它是否正常工作。 22 | 23 | ![windows docker run](../images/windows-boot2docker-start.png) 24 | 25 | 26 | ###运行 Docker 27 | 28 | >注意:如果你使用的是一个远程的 Docker 进程,像 `Boot2docker` ,你就不需要像前边的文档实例中那样在输入 Docker 命令之前输入 `sudo`。 29 | 30 | 31 | **Boot2docker start** 将会自动启动一个 shell 命令框并配置好环境变量,以便您可以马上使用 Docker : 32 | 33 | 让我们尝试运行 `hello-world` 例子。 运行: 34 | 35 | $ docker run hello-world 36 | 37 | 这将会下载一个非常小的 `hello-world` 镜像,并且打印出 `Hello from Docker.` 信息。 38 | 39 | 40 | ###使用 Windows 的命令行(cmd.exe) 来管理运行 Docker 41 | 42 | 启动一个 Windows 命令行(cmd.exe). 43 | 44 | 运行 Boot2docker 命令,这需要你的 Windows PATH环境变量中包含了 `ssh.exe`。因此我们需要将安装的 Git 的 bin 目录 (其中包含了 ssh.exe) 配置到我们的 `%PATH%` 环境变量中,运行如下命令: 45 | 46 | set PATH=%PATH%;"c:\Program Files (x86)\Git\bin" 47 | 48 | 49 | 现在,我们可以运行 `boot2docker start` 命令来启动 Boot2docker 虚拟机。(如果有虚拟主机不存在的错误提示,你需要运行 `boot2docker init` 命令)。复制上边的指令到 cmd.exe 来设置你的 windows 控制台的环境变量,然后你就可以运行 docker 命令了,譬如 `docker ps` : 50 | 51 | ![docker cmd.exe](../images/windows-boot2docker-cmd.png) 52 | 53 | 54 | ### PowerShell 中使用 Docker 55 | 56 | 启动 PowerShell,你需要将 `ssh.exe` 添加到你的 PATH 中。 57 | 58 | $Env:Path = "${Env:Path};c:\Program Files (x86)\Git\bin" 59 | 60 | 之后,运行 `boot2docker start` 命令行,它会打印出 PowerShell 命令,这些命令是用来设置环境变量来连接运行在虚拟机中 Docker 的。运行这些命令,然后你就可以运行 docker 命令了,譬如 `docker ps` : 61 | 62 | ![Powershell Docker](../images/windows-boot2docker-powershell.png) 63 | 64 | >提示:你可以使用 `boot2docker shellinit | Invoke-Expression` 来设置你的环境变量来代替复制粘贴 Powershell 命令。 65 | 66 | ##进一步的细节 67 | 68 | Boot2Docker 管理工具提供了如下几个命令: 69 | 70 | $ boot2docker 71 | Usage: boot2docker.exe [] {help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|shellinit|delete|download|upgrade|version} [] 72 | 73 | 74 | ###升级 75 | 76 | + 下载最新的 [Docker for Windows Installer](https://github.com/boot2docker/windows-installer/releases/tag/v1.5.0) 77 | + 运行安装程序,这将升级 Boot2Docker 管理工具 78 | + 打开终端输入如下的命令来升级你现有的虚拟机: 79 | 80 | $ boot2docker stop 81 | $ boot2docker download 82 | $ boot2docker start 83 | 84 | 85 | ###容器端口重定向 86 | 87 | boot2Docker的默认用户是 `docker` 密码是 `tcuser`。 88 | 89 | 最新版本的 boot2docker 可以设置网络适配器来给容器提供端口访问。 90 | 91 | 如你运行一个暴露内部端口的容器 92 | 93 | docker run --rm -i -t -p 80:80 nginx 94 | 95 | 当你需要使用一个IP地址来访问 Nginx 服务器,你可以使用如下命令来查看 ip。 96 | 97 | $ boot2docker ip 98 | 99 | 通常情况下,是192.168.59.103,但是它可以通过 virtualbox 的 dhcp 来改变。 100 | 101 | 更多细节信息,请查看[Boot2Docker site](http://boot2docker.io/) 102 | 103 | 104 | ###使用PUTTY登陆来代替CMD命令行 105 | 106 | Boot2Docker使用 `%HOMEPATH%\.ssh` 目录来生成你的共有和私有密钥。同样登陆的时候你也需要使用这个目录下的私有密钥。 107 | 108 | 这个私有密钥需要转换成 PuTTY 所需要的格式。 109 | 110 | 你可以使用 [puttygen](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)来生成,具体操作如下: 111 | 112 | 1. 打开 `puttygen.exe` 找到("File"->"Load")按钮来加载 %HOMEPATH%\.ssh\id_boot2docker 私有密钥文件。 113 | 114 | 2. 点击` "Save Private Key"`按钮。 115 | 116 | 3. 在PUTTY中使用刚才保存的文件来登陆 docker@127.0.0.1:2022 117 | 118 | 119 | ##参考 120 | 121 | 如果你已经运行 Docker 主机或者你不希望使用 `Boot2docker` 安装,你可以安装 docker.exe 使用非官方的包管理器 Chocolately。了解更多新,请查看 [Docker package on Chocolatey](https://chocolatey.org/packages/docker)。 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /kitematic/README.md: -------------------------------------------------------------------------------- 1 | Kitematic: 安装 Kitematic 2 | === 3 | 4 | 你可以在 Mac 或者 Windows PC 上像安装其它应用一样来安装 Kitematic:下载安装包,运行安装程序。 5 | 6 | ##下载 Kitematic 7 | 8 | [下载 Kitematic的 zip 文件](https://kitematic.com/download/),双击解压文件,然后双击运行安装程序。您可能还需要将你的应用程序放到您的应用程序文件夹。 9 | 10 | ##初始化设置 11 | 12 | 第一次打开 Kitematic 会为你能够运行 Docker 容器而进行一些必要的设置。如果你没有安装 Virtualbox, Kitematic 会下载和安装最新版本。 13 | 14 | ![安装图片](../images/installing.png) 15 | 16 | 做完这些之后!在一分钟之内,你就可以准备开始运行你的第一个容器。 17 | 18 | ![容器](../images/containers.png) 19 | 20 | ##技术详细信息 21 | 22 | Kitematic 是一个建立在其它应用上的 app,能够处理异常: 23 | 24 | - 如果 Virtualbox 没有安装,它将会安装它。 25 | 26 | ## 为什么 Kitematic 需要 root 密码 27 | 28 | 为什么 Kitematic 需要你的 root 密码,这里有两个原因: 29 | 30 | - 安装 Virtualbox 需要 root 权限,因为安装的时候需要对 Mac OS X 内核进行扩展。 31 | - 如果你在安装 Kitematic 之前更改了默认的目录权限,当你复制 `docker` 和 `docker-machine` 到 ` /usr/local/bin` 是需要 root 权限的。 32 | 33 | ##下一步 34 | 35 | 有关使用 Kitematic 的信息,请查看[用户指南](userguide.md)。 -------------------------------------------------------------------------------- /machine/install-machine.md: -------------------------------------------------------------------------------- 1 | 安装 Docker Machine 2 | === 3 | 4 | Docker Machine 支持 Windows ,OS X ,和 Linux,并且被安装为一个独立的二进制文件。用于各平台架构的二进制文件链接如下: 5 | 6 | - [Windows - 32bit](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_windows-386.exe) 7 | - [Windows - 64bit](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_windows-amd64.exe) 8 | - [OSX - x86_64](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_darwin-amd64) 9 | - [OSX - (老款 macs)](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_darwin-386) 10 | - [Linux - x86_64](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_linux-amd64) 11 | - [Linux - i386](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_linux-386) 12 | 13 | ## OS X 和 Linux 14 | 15 | 在 Linux 或者 OSX 上安装,你需要下载二进制文件到你的 `PATH` 路径中( 例如: `/usr/local/bin`),并且给与可执行权限。例如,在大多数的 OSX 系统上使用如下命令就可以完成安装了: 16 | 17 | $ curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_darwin-amd64 > /usr/local/bin/docker-machine 18 | $ chmod +x /usr/local/bin/docker-machine 19 | 20 | 对于Linux,只是将上边的二进制名称中的 "darwin" 替换成 "linux"。 21 | 22 | 现在你可以使用 `docker-machine -v` 命令来查看版本信息。 23 | 24 | $ docker-machine -v 25 | machine version 0.3.0 26 | 27 | 为了在您的机器上避免使用 ssh 来运行 Docker 命令,请确保您已经安装好了 Docker 客户端。 28 | 29 | $ curl -L https://get.docker.com/builds/Darwin/x86_64/docker-latest > /usr/local/bin/docker 30 | 31 | ##Windows 32 | 33 | 目前,Docker 建议你在 Windows 上通过 [msysgit](https://msysgit.github.io/) 安装使用 Docker Machine,这将为 Docker Machine 提供一些依赖的程序,如 ssh ,还有 shell 功能。 34 | 35 | 当你安装好 msysgit ,启动终端命令提示行,并运行如下命令。这里假设你是在 64 位的 Windows 下安装,如果你使用 32 位系统安装,请将 URL 中的 "x86_64" 替换成 "i386"。 36 | 37 | 首先,安装 Docker clent 二进制文件 : 38 | 39 | $ curl -L https://get.docker.com/builds/Windows/x86_64/docker-latest.exe > /bin/docker 40 | 41 | 下一步,安装 Docker Machine 二进制文件: 42 | 43 | $ curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_windows-amd64.exe > /bin/docker-machine 44 | 45 | 现在,检查 `docker-machine` 是否工作 : 46 | 47 | $ docker-machine -v 48 | machine version 0.3.0 -------------------------------------------------------------------------------- /swarm/install-w-machine.md: -------------------------------------------------------------------------------- 1 | 安装和创建 Docker Swarm 2 | === 3 | 4 | 你可以在你的主机上使用 Docker Swarm 来管理 Docker 容器集群。本节向您展示 Docker Swarm ,并教你如何在本地主机上使用 Docker Machine 和 Virtualbox 来创建一个 swarm。 5 | 6 | 谨记, Docker Swarm 当前版本还是 BETA 阶段,所以很多事情可能会改变。我们建议您不要在生产环境中使用。 7 | 8 | ##系统必备组建 9 | 10 | 确认你的主机上已经安装了 Virtualbox。如果你使用的是 Mac OS X 或者 Windows 来安装 Docker,你要确保在这之前你已经安装好了 Virtualbox。 11 | 12 | 参考指南来安装适合您系统的 [Docker Machine](../machine/install-machine.md)。 13 | 14 | ##创建 Docker Swarm 15 | 16 | -------------------------------------------------------------------------------- /terms/image.md: -------------------------------------------------------------------------------- 1 | # 镜像 2 | ====== 3 | 4 | ### 介绍 5 | 6 | ![基础镜像](images/docker-filesystems-debian.png) 7 | 8 | 在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。 9 | 10 | 由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 11 | 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不 12 | 可写,所以镜像是无状态的。 13 | 14 | ![镜像可写层](images/docker-filesystems-debianrw.png) 15 | 16 | 17 | ### 父镜像 18 | 19 | ![镜像层次](images/docker-filesystems-multilayer.png) 20 | 21 | 每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。我们有时说,下层那个 22 | 镜像是上层镜像的父镜像。 23 | 24 | 25 | ### 基础镜像 26 | 27 | 一个没有任何父镜像的镜像,谓之基础镜像。 28 | 29 | 30 | ### 镜像ID 31 | 32 | 所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 33 | 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的 34 | 碰撞机率,所以服务器总是返回长ID。 35 | -------------------------------------------------------------------------------- /terms/images/docker-filesystems-debian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/terms/images/docker-filesystems-debian.png -------------------------------------------------------------------------------- /terms/images/docker-filesystems-debianrw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/terms/images/docker-filesystems-debianrw.png -------------------------------------------------------------------------------- /terms/images/docker-filesystems-multilayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/widuu/chinese_docker/b26bc040aae00f12b6833a0e312f0a6b54ccfe3a/terms/images/docker-filesystems-multilayer.png -------------------------------------------------------------------------------- /userguide/README.md: -------------------------------------------------------------------------------- 1 | 欢迎来到docker用户指南 2 | === 3 | 4 | 通过这个介绍,你可以了解到 Docker 是什么,以及它是如何工作的。在本章节中,我们将 Docker 集成到你的环境中,并且通过使用 Docker 来了解一些基础知识。 5 | 6 | 我们教你如何使用docker: 7 | 8 | - docker中运行你的应用程序。 9 | - 运行你自己的容器。 10 | - 创建docker镜像。 11 | - 分享你的docker镜像。 12 | - 和更多的信息! 13 | 14 | 我们已经将本指南分为几个主要部分: 15 | 16 | ### 开始使用Docker Hub 17 | 18 | 如何使用Docker Hub? 19 | 20 | Docker Hub是docker的中心仓库。Docker Hub里存储了公共的 Docker 镜像,并且提供服务来帮助你构建和管理你的 Docker 环境。了解解更多。 21 | 22 | 阅读使用[Docker Hub](dockerhub.md). 23 | 24 | ### 在Docker中运行“hello Word”应用 25 | 26 | 如何在容器内运行应用程序? 27 | 28 | Docker 为你将要运行的应用程序提供了一个基于容器的虚拟化平台。学习如何使用 `Dockerize` 应用程序来运行他们。 29 | 30 | 阅读[Dockerize应用程序](dockerizing.md) 31 | 32 | ### 使用容器 33 | 34 | 如何管理我们的容器? 35 | 36 | 当你在docker容器中运行和管理你的应用程序,我们会展示如何管理这些容器。了解如何检查、监控和管理容器。 37 | 38 | 阅读[使用容器](usingdocker.md) 39 | 40 | ### 使用docker镜像 41 | 42 | 我是如何创建、访问和分享我自己的容器呢? 43 | 44 | 当你学会如何使用docker的时候,是时候进行下一步来学习如何在 Docker 中构建你自己应用程序镜像。 45 | 46 | 阅读[使用docker镜像](dockerimages.md) 47 | 48 | ### 容器连接 49 | 50 | 到这里我们学会了如何在 Docker 容器中构建一个单独的应用程序。而现在我们要学习如何将多个容器连接在一起构建一个完整的应用程序。 51 | 52 | 阅读[容器连接](dockerlinks.md) 53 | 54 | ### 管理容器数据 55 | 56 | 现在我们知道如何连接 Docker 容器,下一步,我们学习如何管理容器数据,如何将卷挂载到我们的容器中。 57 | 58 | 阅读[管理容器数据](dockervolumes.md) 59 | 60 | ### 使用Docker Hub 61 | 62 | 现在我们应该学习更多关于使用 Docker 的知识。例如通过 Docker Hub 提供的服务来构建私有仓库。 63 | 64 | 阅读[使用Docker Hub](dockerrepos.md) 65 | 66 | ### Docker Compose 67 | 68 | Docker Compose 你只需要一个简单的配置文件就可以自定义你所需要的应用组件,包括容器、配置、网络链接和挂载卷。只需要一个简单的命令就可以启动和运行你的应用程序。 69 | 70 | 阅读[Docker Compose 用户指南.](../compose/README.md) 71 | 72 | ### Docker Machine 73 | 74 | Docker Machine 可以帮助你快速的启动和运行 Docker 引擎。 Machine 可以帮助你配置本地电脑、云服务商和你的个人数据中心上的 Docker 引擎主机,并且通过配置 Docker 客户端来让它们进行安全的通信。 75 | 76 | 查阅 [Go to Docker Machine user guide.](../machine/README.md) 77 | 78 | ### Docker 集群 79 | 80 | Docker 集群是将多个 Docker 引擎池连接在一起组合成一个独立的主机来提供给外界。它是以 Docker API 作为服务标准的,所以任何已经在Docker上工作的工具,现在都可以透明地扩展到多个主机上。 81 | 82 | 阅读 [Go to Docker Swarm user guide.](../swarm/) 83 | -------------------------------------------------------------------------------- /userguide/artchitecture.md: -------------------------------------------------------------------------------- 1 | 理解架构 2 | === 3 | 4 | 什么是Docker? 5 | 6 | Docker 是一个开发、畅游、运行应用的开放平台。Docker设计为更快的发布你的应用。 -------------------------------------------------------------------------------- /userguide/dockerhub.md: -------------------------------------------------------------------------------- 1 | 开始使用 Docker Hub 2 | === 3 | 4 | 本节讲述了 Docker Hub 的快速入门,包括如何创建一个账户。 5 | 6 | Docker Hub 存放着 Docker 及其组件的所有资源。Docker Hub 可以帮助你与同事之间协作,并获得功能完整的 Docker。为此,它提供的服务有: 7 | 8 | - Docker 镜像主机 9 | - 用户认证 10 | - 自动镜像构建和工作流程工具,如构建触发器和 web hooks 11 | - 整合了 GitHub 和 BitBucket 12 | 13 | 为了使用 Docker Hub ,首先需要注册创建一个账户。别担心,创建一个账户很简单并且是免费的。 14 | 15 | ##创建 Docker Hub 账户 16 | 17 | 这里有两种访问可以创建和注册一个 Docker Hub 账户: 18 | 19 | - 1.通过网站,或者 20 | - 2.通过命令行 21 | 22 | ###通过网站注册 23 | 24 | 填写[注册表单](https://hub.docker.com/account/signup/),选择您的用户名和密码并指定您的电子邮箱。你也可以报名参加 Docker 邮件列表,会有很多关于 Docker 的信息。 25 | 26 | ![](../images/register-web.png) 27 | 28 | ### 通过命令行 29 | 30 | 你可以通过使用命令行输入 `docker login` 命令来创建一个 Docker Hub 账号 31 | 32 | $ sudo docker login 33 | 34 | ### 邮箱确认 35 | 36 | 一旦你填写完毕表格,请查看你的电子邮件,通过点击欢迎信息中的链接来激活您的账户。 37 | 38 | ![](../images/register-confirm.png) 39 | 40 | ### 登陆 41 | 42 | 在完成确认过程之后,您可以使用web控制台登陆 43 | 44 | ![](../images/login-web.png) 45 | 46 | 或者通过在命令行中输入 `docker login` 命令来登录: 47 | 48 | $ sudo docker login 49 | 50 | 你的 Docker 账户现在已经生效,并随时可以使用。 51 | 52 | ###下一步 53 | 54 | 下一步,让我们开始学习如何在 Docker 中运行 "hello word" 的应用。 55 | 56 | 阅读[Docker中运行应用](dockerizing.md) 57 | 58 | -------------------------------------------------------------------------------- /userguide/dockerimages.md: -------------------------------------------------------------------------------- 1 | 使用 Docker 镜像 2 | === 3 | 4 | 在[了解Docker]()这部分中,我们知道了 Docker 镜像是容器的基础。在[前面的部分](dockerizing.md)我们使用的是已经构建好的 Docker 镜像,例如: `ubuntu` 镜像和 `training/webapp` 镜像。 5 | 6 | 我们还了解了从 Docker 商店下载镜像到本地的 Docker 主机上。如果一个镜像不存在,他就会自动从 Docker 镜像仓库去下载,默认是从 `Docker Hub` 公共镜像源下载。 7 | 8 | 在这一节中,我们将探讨更多的关于 Docker 镜像的东西: 9 | 10 | 11 | * 管理和使用本地 Docker 主机镜像。 12 | * 创建基本镜像 13 | * 上传 Docker 镜像到 [Docker Hub Registry](https://registry.hub.docker.com/)。 14 | 15 | ### 在主机上列出镜像列表 16 | 17 | 让我们列出本地主机上的镜像。你可以使用 `docker images` 来完成这项任务: 18 | 19 | $ sudo docker images 20 | REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 21 | training/webapp latest fc77f57ad303 3 weeks ago 280.5 MB 22 | ubuntu 13.10 5e019ab7bf6d 4 weeks ago 180 MB 23 | ubuntu saucy 5e019ab7bf6d 4 weeks ago 180 MB 24 | ubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MB 25 | ubuntu precise 74fe38d11401 4 weeks ago 209.6 MB 26 | ubuntu 12.10 a7cf8ae4e998 4 weeks ago 171.3 MB 27 | ubuntu quantal a7cf8ae4e998 4 weeks ago 171.3 MB 28 | ubuntu 14.04 99ec81b80c55 4 weeks ago 266 MB 29 | ubuntu latest 99ec81b80c55 4 weeks ago 266 MB 30 | ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB 31 | ubuntu 13.04 316b678ddf48 4 weeks ago 169.4 MB 32 | ubuntu raring 316b678ddf48 4 weeks ago 169.4 MB 33 | ubuntu 10.04 3db9c44f4520 4 weeks ago 183 MB 34 | ubuntu lucid 3db9c44f4520 4 weeks ago 183 MB 35 | 36 | 我们可以看到之前使用的镜像。当我们每次要使用镜像来启动一个新容器的时候都会从 [Docker Hub](https://hub.docker.com/) 下载对应的镜像。 37 | 38 | 我们在镜像列表中看到三个至关重要的东西。 39 | 40 | * 来自什么镜像源,例如 `ubuntu` 41 | * 每个镜像都有标签(tags),例如 `14.04` 42 | * 每个镜像都有镜像ID 43 | 44 | 镜像源中可能存储着一个镜像源的多个版本。我们会看到 `Ubuntu` 的多个版本:10.04, 12.04, 12.10, 13.04, 13.10 and 14.04。每个容器有一个唯一的标签(tag),让我们来识别为不同的镜像,例如: 45 | 46 | ubuntu:14.04 47 | 48 | 所以我们可以运行一个带标签镜像的容器: 49 | 50 | $ sudo docker run -t -i ubuntu:14.04 /bin/bash 51 | 52 | 如果我们想要使用 `Ubuntu 12.04` 的镜像来构建,我们可以这样做 53 | 54 | $ sudo docker run -t -i ubuntu:12.04 /bin/bash 55 | 56 | 如果你不指定一个镜像的版本标签,例如你只使用 `Ubuntu`,Docker 将默认使用 `Ubuntu:latest` 镜像。 57 | 58 | >提示:我们建议使用镜像时指定一个标签,例如 `ubuntu:12.04` 。这样你知道你使用的是一个什么版本的镜像。 59 | 60 | ### 获取一个新的镜像 61 | 62 | 现在如何获取一个新的镜像?当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。但是这需要一段时间来下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 `docker pull` 命令来下载它。这里我们下载 `centos` 镜像。 63 | 64 | $ sudo docker pull centos 65 | Pulling repository centos 66 | b7de3133ff98: Pulling dependent layers 67 | 5cc9e91966f7: Pulling fs layer 68 | 511136ea3c5a: Download complete 69 | ef52fb1fe610: Download complete 70 | . . . 71 | 72 | 我们看到镜像的每一层都被下载下来了,现在我们可以直接使用这个镜像来运行容器,而不需要在下载这个镜像了。 73 | 74 | $ sudo docker run -t -i centos /bin/bash 75 | bash-4.1# 76 | 77 | ### 查找镜像 78 | 79 | Docker 的特点之一是人们创建了各种各样的 Docker 镜像。而且这些镜像已经被上传到了 `Docker Hub` 。我们可以从 `Docker Hub` 网站来搜索镜像。 80 | 81 | ![](../images/search.png) 82 | 83 | 我们也可以使用 `docker search` 命令来搜索镜像。譬如说我们的团队需要一个安装了 Ruby 和 Sinatra 的镜像来做我们的 web 应用程序开发。我们可以通过 `docker search` 命令搜索 `sinatra` 来寻找适合我们的镜像 84 | 85 | $ sudo docker search sinatra 86 | NAME DESCRIPTION STARS OFFICIAL AUTOMATED 87 | training/sinatra Sinatra training image 0 [OK] 88 | marceldegraaf/sinatra Sinatra test app 0 89 | mattwarren/docker-sinatra-demo 0 [OK] 90 | luisbebop/docker-sinatra-hello-world 0 [OK] 91 | bmorearty/handson-sinatra handson-ruby + Sinatra for Hands on with D... 0 92 | subwiz/sinatra 0 93 | bmorearty/sinatra 0 94 | . . . 95 | 96 | 我们看到返回了大量的 `sinatra `镜像。而列表中有镜像名称、描述、Stars(衡量镜像的流行程度-如果用户喜欢这个镜像他就会点击 stars )和 是否是正式版以及构建状态。[官方镜像仓库](https://docs.docker.com/docker-hub/official_repos/) 是官方精心整理出来服务 Docker 的 Docker 镜像库。自动化构建的镜像仓库是允许你验证镜像的内容和来源。 97 | 98 | 通过检索镜像,我们决定使用 `training/sinatra` 镜像。到目前为止,我们已经看到了两种类型的镜像,像`ubuntu` 镜像,我们称它为基础镜像或者根镜像。这些镜像是由 Docker 官方提供构建、验证和支持。这些镜像都可以通过用自己的名字来标记。 99 | 100 | 我们也可以查找其它用户的公开镜像,像我们选择使用的 `training/sinatra` 镜像,这属于个人镜像。个人镜像是由 Docker 社区的成员创建和维护的。你可以用用户名称来识别这些镜像,因为这些镜像的前缀都是以用户名来标记的 ,像 `training` ,就是由 `training` 用户创建的镜像。 101 | 102 | ###拖取镜像(Pull our image) 103 | 104 | 我们已经确定了要使用的镜像, `training/sinatra` , 现在我们使用 `docker pull` 命令来下载这个镜像。 105 | 106 | $ sudo docker pull training/sinatra 107 | 108 | 现在团队成员可以在自己的容器内使用这个镜像了。 109 | 110 | $ sudo docker run -t -i training/sinatra /bin/bash 111 | root@a8cb6ce02d85:/# 112 | 113 | ###创建我们自己的镜像 114 | 115 | 团队成员发现 `training/sinatra` 镜像对于我们来说是非常有用的,但是它不能满足我们的需求,我们需要针对这个镜像做出更改。这里我们有两种方法,更新镜像或者创建一个新的镜像。 116 | 117 | * 1.我们可以从已经创建的容器中更新镜像,并且提交这个镜像。 118 | * 2.我们可以使用 `Dockerfile` 指令来创建一个新的镜像。 119 | 120 | ###更新并且提交更改 121 | 122 | 更新镜像之前,我们需要使用镜像来创建一个容器。 123 | 124 | $ sudo docker run -t -i training/sinatra /bin/bash 125 | root@0b2616b0e5a8:/# 126 | 127 | >注意:已创建容器ID `0b2616b0e5a8`,我们在后边还需要使用它。 128 | 129 | 在运行的容器内使用 gem 来安装 `json` 130 | 131 | root@0b2616b0e5a8:/# gem install json 132 | 133 | 在完成操作之后,输入 `exit `命令来退出这个容器。 134 | 135 | 现在我们有一个根据我们需求做出更改的容器。我们可以使用 `docker commit` 来提交容器副本。 136 | 137 | $ sudo docker commit -m="Added json gem" -a="Kate Smith" \ 138 | 0b2616b0e5a8 ouruser/sinatra:v2 139 | 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c 140 | 141 | 这里我们使用了 `docker commit` 命令。这里我们指定了两个标识(flags) `-m` 和 `-a` 。`-m` 标识我们指定提交的信息,就像你提交一个版本控制。`-a` 标识允许对我们的更新来指定一个作者。 142 | 143 | 我们也指定了想要创建的新镜像容器来源 (我们先前记录的ID) `0b2616b0e5a8` 和 我们指定要创建的目标镜像: 144 | 145 | ouruser/sinatra:v2 146 | 147 | 我们分解一下前边的步骤。我们先给这个镜像分配了一个新用户名字 `ouruser`,接着,未修改镜像名称,保留了原有镜像名称` sinatra`;最后为镜像指定了标签(tag) `v2`。 148 | 149 | 我们可以使用 `docker images` 命令来查看我们的新镜像 `ouruser/sinatra`。 150 | 151 | $ sudo docker images 152 | REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 153 | training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB 154 | ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB 155 | ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB 156 | 157 | 使用我们的新镜像来创建一个容器: 158 | 159 | $ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash 160 | root@78e82f680994:/# 161 | 162 | ### 使用 `Dockerfile` 构建镜像 163 | 164 | 使用 `docker commit` 命令能够非常简单的扩展镜像。但是它有点麻烦,并且在一个团队中也不能够轻易的共享它的开发过程。为解决这个问题,我们使用一个新的命令 `docker build` , 从零开始来创建一个新的镜像。 165 | 166 | 为此,我们需要创建一个 `Dockerfile` 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。 167 | 168 | 现在创建一个目录,并且创建一个 `Dockerfile` 169 | 170 | $ mkdir sinatra 171 | $ cd sinatra 172 | $ touch Dockerfile 173 | 174 | 如果你是在 Windows 上使用的 Boot2Docker,你可以通过使用 `cd` 命令来访问你的本地主机目录 `/c/Users/your_user_name` 175 | 176 | 每一个指令都会在镜像上创建一个新的层,来看一个简单的例子,我们的开发团建来构建一个自己的 `Sinatra `镜像: 177 | 178 | # This is a comment 179 | FROM ubuntu:14.04 180 | MAINTAINER Kate Smith 181 | RUN apt-get update && apt-get install -y ruby ruby-dev 182 | RUN gem install sinatra 183 | 184 | 让我们看一下我们的 `Dockerfile` 做了什么。每一个指令的前缀都必须是大写的。 185 | 186 | INSTRUCTION statement 187 | 188 | >提示:我们可以使用 **#** 来注释 189 | 190 | 第一个指令 `FROM` 是告诉 Docker 使用的哪个镜像源,在这个案例中,我们使用的是 Ubuntu 14.04 基础镜像。 191 | 192 | 下一步,我们使用 `MAINTAINER ` 指令来指定谁在维护这个新镜像。 193 | 194 | 最后,我们指定了两个 `RUN` 指令。 `RUN` 指令在镜像内执行一条命令,例如:安装一个包。这里我们更新了 APT 的缓存,并且安装 Ruby 和 RubyGems ,然后使用 gem 安装 Sinatra 。 195 | 196 | 197 | >注意:我们还提供了更多的 Dockerfile 指令参数。 198 | 199 | 现在,我们使用 `Dockerfile` 文件,通过 `docker build` 命令来构建一个镜像。 200 | 201 | $ docker build -t ouruser/sinatra:v2 . 202 | Sending build context to Docker daemon 2.048 kB 203 | Sending build context to Docker daemon 204 | Step 0 : FROM ubuntu:14.04 205 | ---> e54ca5efa2e9 206 | Step 1 : MAINTAINER Kate Smith 207 | ---> Using cache 208 | ---> 851baf55332b 209 | Step 2 : RUN apt-get update && apt-get install -y ruby ruby-dev 210 | ---> Running in 3a2558904e9b 211 | Selecting previously unselected package libasan0:amd64. 212 | (Reading database ... 11518 files and directories currently installed.) 213 | Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ... 214 | Unpacking libasan0:amd64 (4.8.2-19ubuntu1) ... 215 | Selecting previously unselected package libatomic1:amd64. 216 | Preparing to unpack .../libatomic1_4.8.2-19ubuntu1_amd64.deb ... 217 | Unpacking libatomic1:amd64 (4.8.2-19ubuntu1) ... 218 | Selecting previously unselected package libgmp10:amd64. 219 | Preparing to unpack .../libgmp10_2%3a5.1.3+dfsg-1ubuntu1_amd64.deb ... 220 | Unpacking libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ... 221 | Selecting previously unselected package libisl10:amd64. 222 | Preparing to unpack .../libisl10_0.12.2-1_amd64.deb ... 223 | Unpacking libisl10:amd64 (0.12.2-1) ... 224 | Selecting previously unselected package libcloog-isl4:amd64. 225 | Preparing to unpack .../libcloog-isl4_0.18.2-1_amd64.deb ... 226 | Unpacking libcloog-isl4:amd64 (0.18.2-1) ... 227 | Selecting previously unselected package libgomp1:amd64. 228 | Preparing to unpack .../libgomp1_4.8.2-19ubuntu1_amd64.deb ... 229 | Unpacking libgomp1:amd64 (4.8.2-19ubuntu1) ... 230 | Selecting previously unselected package libitm1:amd64. 231 | Preparing to unpack .../libitm1_4.8.2-19ubuntu1_amd64.deb ... 232 | Unpacking libitm1:amd64 (4.8.2-19ubuntu1) ... 233 | Selecting previously unselected package libmpfr4:amd64. 234 | Preparing to unpack .../libmpfr4_3.1.2-1_amd64.deb ... 235 | Unpacking libmpfr4:amd64 (3.1.2-1) ... 236 | Selecting previously unselected package libquadmath0:amd64. 237 | Preparing to unpack .../libquadmath0_4.8.2-19ubuntu1_amd64.deb ... 238 | Unpacking libquadmath0:amd64 (4.8.2-19ubuntu1) ... 239 | Selecting previously unselected package libtsan0:amd64. 240 | Preparing to unpack .../libtsan0_4.8.2-19ubuntu1_amd64.deb ... 241 | Unpacking libtsan0:amd64 (4.8.2-19ubuntu1) ... 242 | Selecting previously unselected package libyaml-0-2:amd64. 243 | Preparing to unpack .../libyaml-0-2_0.1.4-3ubuntu3_amd64.deb ... 244 | Unpacking libyaml-0-2:amd64 (0.1.4-3ubuntu3) ... 245 | Selecting previously unselected package libmpc3:amd64. 246 | Preparing to unpack .../libmpc3_1.0.1-1ubuntu1_amd64.deb ... 247 | Unpacking libmpc3:amd64 (1.0.1-1ubuntu1) ... 248 | Selecting previously unselected package openssl. 249 | Preparing to unpack .../openssl_1.0.1f-1ubuntu2.4_amd64.deb ... 250 | Unpacking openssl (1.0.1f-1ubuntu2.4) ... 251 | Selecting previously unselected package ca-certificates. 252 | Preparing to unpack .../ca-certificates_20130906ubuntu2_all.deb ... 253 | Unpacking ca-certificates (20130906ubuntu2) ... 254 | Selecting previously unselected package manpages. 255 | Preparing to unpack .../manpages_3.54-1ubuntu1_all.deb ... 256 | Unpacking manpages (3.54-1ubuntu1) ... 257 | Selecting previously unselected package binutils. 258 | Preparing to unpack .../binutils_2.24-5ubuntu3_amd64.deb ... 259 | Unpacking binutils (2.24-5ubuntu3) ... 260 | Selecting previously unselected package cpp-4.8. 261 | Preparing to unpack .../cpp-4.8_4.8.2-19ubuntu1_amd64.deb ... 262 | Unpacking cpp-4.8 (4.8.2-19ubuntu1) ... 263 | Selecting previously unselected package cpp. 264 | Preparing to unpack .../cpp_4%3a4.8.2-1ubuntu6_amd64.deb ... 265 | Unpacking cpp (4:4.8.2-1ubuntu6) ... 266 | Selecting previously unselected package libgcc-4.8-dev:amd64. 267 | Preparing to unpack .../libgcc-4.8-dev_4.8.2-19ubuntu1_amd64.deb ... 268 | Unpacking libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ... 269 | Selecting previously unselected package gcc-4.8. 270 | Preparing to unpack .../gcc-4.8_4.8.2-19ubuntu1_amd64.deb ... 271 | Unpacking gcc-4.8 (4.8.2-19ubuntu1) ... 272 | Selecting previously unselected package gcc. 273 | Preparing to unpack .../gcc_4%3a4.8.2-1ubuntu6_amd64.deb ... 274 | Unpacking gcc (4:4.8.2-1ubuntu6) ... 275 | Selecting previously unselected package libc-dev-bin. 276 | Preparing to unpack .../libc-dev-bin_2.19-0ubuntu6_amd64.deb ... 277 | Unpacking libc-dev-bin (2.19-0ubuntu6) ... 278 | Selecting previously unselected package linux-libc-dev:amd64. 279 | Preparing to unpack .../linux-libc-dev_3.13.0-30.55_amd64.deb ... 280 | Unpacking linux-libc-dev:amd64 (3.13.0-30.55) ... 281 | Selecting previously unselected package libc6-dev:amd64. 282 | Preparing to unpack .../libc6-dev_2.19-0ubuntu6_amd64.deb ... 283 | Unpacking libc6-dev:amd64 (2.19-0ubuntu6) ... 284 | Selecting previously unselected package ruby. 285 | Preparing to unpack .../ruby_1%3a1.9.3.4_all.deb ... 286 | Unpacking ruby (1:1.9.3.4) ... 287 | Selecting previously unselected package ruby1.9.1. 288 | Preparing to unpack .../ruby1.9.1_1.9.3.484-2ubuntu1_amd64.deb ... 289 | Unpacking ruby1.9.1 (1.9.3.484-2ubuntu1) ... 290 | Selecting previously unselected package libruby1.9.1. 291 | Preparing to unpack .../libruby1.9.1_1.9.3.484-2ubuntu1_amd64.deb ... 292 | Unpacking libruby1.9.1 (1.9.3.484-2ubuntu1) ... 293 | Selecting previously unselected package manpages-dev. 294 | Preparing to unpack .../manpages-dev_3.54-1ubuntu1_all.deb ... 295 | Unpacking manpages-dev (3.54-1ubuntu1) ... 296 | Selecting previously unselected package ruby1.9.1-dev. 297 | Preparing to unpack .../ruby1.9.1-dev_1.9.3.484-2ubuntu1_amd64.deb ... 298 | Unpacking ruby1.9.1-dev (1.9.3.484-2ubuntu1) ... 299 | Selecting previously unselected package ruby-dev. 300 | Preparing to unpack .../ruby-dev_1%3a1.9.3.4_all.deb ... 301 | Unpacking ruby-dev (1:1.9.3.4) ... 302 | Setting up libasan0:amd64 (4.8.2-19ubuntu1) ... 303 | Setting up libatomic1:amd64 (4.8.2-19ubuntu1) ... 304 | Setting up libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ... 305 | Setting up libisl10:amd64 (0.12.2-1) ... 306 | Setting up libcloog-isl4:amd64 (0.18.2-1) ... 307 | Setting up libgomp1:amd64 (4.8.2-19ubuntu1) ... 308 | Setting up libitm1:amd64 (4.8.2-19ubuntu1) ... 309 | Setting up libmpfr4:amd64 (3.1.2-1) ... 310 | Setting up libquadmath0:amd64 (4.8.2-19ubuntu1) ... 311 | Setting up libtsan0:amd64 (4.8.2-19ubuntu1) ... 312 | Setting up libyaml-0-2:amd64 (0.1.4-3ubuntu3) ... 313 | Setting up libmpc3:amd64 (1.0.1-1ubuntu1) ... 314 | Setting up openssl (1.0.1f-1ubuntu2.4) ... 315 | Setting up ca-certificates (20130906ubuntu2) ... 316 | debconf: unable to initialize frontend: Dialog 317 | debconf: (TERM is not set, so the dialog frontend is not usable.) 318 | debconf: falling back to frontend: Readline 319 | debconf: unable to initialize frontend: Readline 320 | debconf: (This frontend requires a controlling tty.) 321 | debconf: falling back to frontend: Teletype 322 | Setting up manpages (3.54-1ubuntu1) ... 323 | Setting up binutils (2.24-5ubuntu3) ... 324 | Setting up cpp-4.8 (4.8.2-19ubuntu1) ... 325 | Setting up cpp (4:4.8.2-1ubuntu6) ... 326 | Setting up libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ... 327 | Setting up gcc-4.8 (4.8.2-19ubuntu1) ... 328 | Setting up gcc (4:4.8.2-1ubuntu6) ... 329 | Setting up libc-dev-bin (2.19-0ubuntu6) ... 330 | Setting up linux-libc-dev:amd64 (3.13.0-30.55) ... 331 | Setting up libc6-dev:amd64 (2.19-0ubuntu6) ... 332 | Setting up manpages-dev (3.54-1ubuntu1) ... 333 | Setting up libruby1.9.1 (1.9.3.484-2ubuntu1) ... 334 | Setting up ruby1.9.1-dev (1.9.3.484-2ubuntu1) ... 335 | Setting up ruby-dev (1:1.9.3.4) ... 336 | Setting up ruby (1:1.9.3.4) ... 337 | Setting up ruby1.9.1 (1.9.3.484-2ubuntu1) ... 338 | Processing triggers for libc-bin (2.19-0ubuntu6) ... 339 | Processing triggers for ca-certificates (20130906ubuntu2) ... 340 | Updating certificates in /etc/ssl/certs... 164 added, 0 removed; done. 341 | Running hooks in /etc/ca-certificates/update.d....done. 342 | ---> c55c31703134 343 | Removing intermediate container 3a2558904e9b 344 | Step 3 : RUN gem install sinatra 345 | ---> Running in 6b81cb6313e5 346 | unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping 347 | unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping 348 | Successfully installed rack-1.5.2 349 | Successfully installed tilt-1.4.1 350 | Successfully installed rack-protection-1.5.3 351 | Successfully installed sinatra-1.4.5 352 | 4 gems installed 353 | Installing ri documentation for rack-1.5.2... 354 | Installing ri documentation for tilt-1.4.1... 355 | Installing ri documentation for rack-protection-1.5.3... 356 | Installing ri documentation for sinatra-1.4.5... 357 | Installing RDoc documentation for rack-1.5.2... 358 | Installing RDoc documentation for tilt-1.4.1... 359 | Installing RDoc documentation for rack-protection-1.5.3... 360 | Installing RDoc documentation for sinatra-1.4.5... 361 | ---> 97feabe5d2ed 362 | Removing intermediate container 6b81cb6313e5 363 | Successfully built 97feabe5d2ed 364 | 365 | 366 | 我们使用 `docker build` 命令并指定 `-t` 标识(flag)来标示属于 `ouruser` ,镜像名称为 `sinatra `,标签是 `v2`。 367 | 368 | 如果 `Dockerfile` 在我们当前目录下,我们可以使用 `.` 来指定 `Dockerfile` 369 | 370 | >提示:你也可以指定 `Dockerfile` 路径 371 | 372 | 373 | 现在我们可以看到构建过程。Docker 做的第一件事是通过你的上下文进行构建,基本上是目录的内容构建。这样做是因为 Docker 进程构建镜像是实时构建的,并且是需要本地的上下文来做这些工作的。(这里上下文是指Context) 374 | 375 | 下一步,`Dockerfile` 中的每一条命令都一步一步的被执行。我们会看到每一步都会创建一个新的容器,在容器内部运行指令并且提交更改 - 就像我们之前使用的 `docker commit` 一样。当所有的指令执行完成之后,我们会得到`97feabe5d2ed ` 镜像(也帮助标记为 `ouruser/sinatra:v2`), 然后所有中间容器会被清除。 376 | 377 | >注意:与存储程序驱动无关,镜像不能超过127层。这是一种全局设置,为了是从整体上来优化镜像的大小。 378 | 379 | 我们可以使用新的镜像来创建容器: 380 | 381 | $ docker run -t -i ouruser/sinatra:v2 /bin/bash 382 | root@8196968dac35:/# 383 | 384 | >注意:这里只是简单的介绍一下如何创建镜像。我们跳过了很多你可以使用的其它指令。你会从后边的章节看到更多的指令或者你可以参考 `Dockerfile` 的详细说明和每一条指令的例子。为了帮助你编写清晰、易读、易维护的 `Dockerfile` ,我们也编写了 `Dockerfile` [最佳实践指南](../articles/dockerfile_best-practices.md) 385 | 386 | ###更多 387 | 388 | 学习更多,请查看 [ Dockerfile 教程](https://docs.docker.com/userguide/level1/) 389 | 390 | ###设置镜像标签 391 | 392 | 你可以在提交更改和构建之后为镜像来添加标签(tag)。我们可以使用 `docker tag` 命令。为我们的 `ouruser/sinatra` 镜像添加一个新的标签。 393 | 394 | $ docker tag 5db5f8471261 ouruser/sinatra:devel 395 | 396 | `docker tag` 需要使用镜像ID,这里是 `5db5f8471261` ,用户名称、镜像源名(repository name)和新的标签名(tag)。 397 | 398 | $ docker images ouruser/sinatra 399 | REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 400 | ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 MB 401 | ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB 402 | ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB 403 | 404 | ###Image Digests 405 | 406 | v2 或后续版本格式的镜像会有内容定位标示符叫做 `digest`。只要用于生成镜像的镜像源不更改, digests 值就是可以预料的。使用 ` --digests` 标识来列出镜像 digests 的值 407 | 408 | $ docker images --digests | head 409 | REPOSITORY TAG DIGEST IMAGE ID CREATED VIRTUAL SIZE 410 | ouruser/sinatra latest sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 5db5f8471261 11 hours ago 446.7 MB 411 | 412 | 当我们从 v2 版本的镜像仓库来推送或者拉取镜像的时候,`pull` 和 `push` 命令包含了镜像 digests 。 你可以使用 `digests` 值来拉取镜像。 413 | 414 | $ docker pull ouruser/sinatra@cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 415 | 416 | 你可以参考 digest 的 `create`、`run` 和 `rmi` 命令,以及 `Dockerfile` 中的 `FROM` 镜像。 417 | 418 | ###推送镜像到 Docker Hub 419 | 420 | 一旦你构建或创建了一个新的镜像,你可以使用 `docker push` 命令将镜像推送到 Docker Hub 。这样你就可以分享你的镜像了,镜像可以是公开的,或者你可以把镜像添加到你的私有仓库中。 421 | 422 | $ docker push ouruser/sinatra 423 | The push refers to a repository [ouruser/sinatra] (len: 1) 424 | Sending image list 425 | Pushing repository ouruser/sinatra (3 tags) 426 | . . . 427 | 428 | ###主机中移除镜像 429 | 430 | 你可以删除你主机上的镜像,类似于删处容器的方法,这里我们使用 `docker rmi` 命令。 431 | 432 | 让我们删除这个不需要使用的镜像:`training/sinatra`。 433 | 434 | $ docker rmi training/sinatra 435 | Untagged: training/sinatra:latest 436 | Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d 437 | Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f 438 | Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0 439 | 440 | >提示:为了能够从主机上删除镜像,请确保没有基于此镜像的容器。 441 | 442 | ###下一步 443 | 444 | 现在,我们已经看到如何在容器中构建单独的应用程序。接下来,我们要学习如何把多个 Docker 容器连接在一起构建一个完整的应用程序。 445 | 446 | 请阅读[连接容器](dockerlinks.md) 447 | -------------------------------------------------------------------------------- /userguide/dockerizing.md: -------------------------------------------------------------------------------- 1 | Docker 应用 "hello World" 2 | === 3 | 4 | Docker 允许你在容器内运行应用程序, 使用 `docker run` 命令来在容器内运行一个应用程序。 5 | 6 | ##Hello world 7 | 8 | 现在让我们来试试 9 | 10 | $ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' 11 | Hello world 12 | 13 | 刚才你启动了你的第一个容器! 14 | 15 | 那么刚才发生了什么? 我们逐步来分析 `docker run` 命令做了哪些事情。 16 | 17 | 首先,我们指定了 `docker` 二进制执行文件和我们想要执行的命令 `run`。`docker run` 组合会运行容器。 18 | 19 | 接下来,我们指定一个镜像: `ubuntu 14.04` 。这是我们运行容器的来源。 Docker 称此为镜像。在本例中,我们使用一个 `Ubuntu 14.04` 操作系统镜像。 20 | 21 | 当你指定一个镜像,Docker 首先会先从你的 Docker 本地主机上查看镜像是否存在,如果没有,Docker 就会从镜像仓库 [Docker Hub](https://hub.docker.com/) 下载公共镜像。 22 | 23 | 接下来,我们告诉 Docker 在容器内我们需要运行什么命令: 24 | 25 | /bin/echo 'Hello world' 26 | 27 | 当我们的容器启动了 Docker 创建的新的 Ubuntu 14.04 环境,并在容器内执行 `/bin/echo` 命令后。我们会在命令行看到如下结果: 28 | 29 | hello world 30 | 31 | 那么,我们创建容器之后会发生什么呢? 当命令状态状态处于激活状态的时候 Docker 容器就会一直运行。这里只要 "hello world" 被输出,容器就会停止。 32 | 33 | ## 一个交互式的容器 34 | 35 | 让我们尝试再次运行 `docker run`,这次我们指定一个新的命令来运行我们的容器。 36 | 37 | $ sudo docker run -t -i ubuntu:14.04 /bin/bash 38 | root@af8bae53bdd3:/# 39 | 40 | 我们继续指定了 `docker run` 命令,并启动了 `ubuntu:14.04` 镜像。但是我们添加了两个新的标识(参数flags): `-t` 和 `-i` 。`-t` 表示在新容器内指定一个伪终端或终端,`-i`表示允许我们对容器内的 (`STDIN`) 进行交互。 41 | 42 | 我们在容器内还指定了一个新的命令: `/bin/bash` 。这将在容器内启动 `bash shell` 43 | 44 | 所以当容器(container)启动之后,我们会获取到一个命令提示符: 45 | 46 | root@af8bae53bdd3:/# 47 | 48 | 我们尝试在容器内运行一些命令: 49 | 50 | root@af8bae53bdd3:/# pwd 51 | / 52 | root@af8bae53bdd3:/# ls 53 | bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var 54 | 55 | 你可以看到我们运行 `pwd` 来显示当前目录,这时候显示的是我们的根目录。我们还列出了根目录的文件列表,通过目录列表我们看出来这是一个典型的 Linux 文件系统。 56 | 57 | 你可以在容器内随便的玩耍,你可以使用 `exit` 命令或者使用 CTRL-D 来退出容器。 58 | 59 | root@af8bae53bdd3:/# exit 60 | 61 | 与我们之前的容器一样,一旦你的 Bash shell 退出之后,你的容器就停止了。 62 | 63 | 64 | ### Hello world 守护进程 65 | 66 | 现在当一个容器运行完一个命令后就会退出,但是这样看起来有时候并不好。让我们创建一个容器以进程的方式运行,就像大多数我们运行在 Docker 中的应用程序一样,这里我们可以使用 `docker run` 命令: 67 | 68 | $ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 69 | 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147 70 | 71 | 等等,怎么回事?我们的 “hello world” 输出呢?让我们看看它是怎么运行的。这个命令看起来应该很熟悉.我们运行`docker run` ,但是我们指定了一个 `-d` 标识。`-d` 标识告诉 docker 在容器内以后台进程模式运行。 72 | 73 | 我们也指定了一个相同的镜像: `ubuntu:14.04` 74 | 75 | 最终,我们指定命令行运行: 76 | 77 | /bin/sh -c "while true; do echo hello world; sleep 1; done" 78 | 79 | 这是一个忠实的 hello world 进程:一个脚本会一直输出 "hello world" 80 | 81 | 为什么我们看不到的一大堆的 "hello world" ? 而是docker返回的一个很长的字符串: 82 | 83 | 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147 84 | 85 | 这个长的字符串叫做容器ID(container ID)。它对于每一个容器来说都是唯一的,所以我们可以使用它。 86 | 87 | >注意:容器 ID 是有点长并且非常的笨拙,稍后我们会看到一个短点的 ID,某些方面来说它是容器 ID 的简化版。 88 | 89 | 我们可以根据容器 ID 查看 "hello world" 进程发生了什么 90 | 91 | 首先,我们要确保容器正在运行。我们可以使用 `docker ps` 命令来查看。`docker ps` 命令可以查询 docker 进程的所有容器。 92 | 93 | $ sudo docker ps 94 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 95 | 1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage 96 | 97 | 这里我们看到了以进程模式运行的容器。`docker ps` 命令会返回一些有用的信息,这里包括一个短的容器 ID:`1e5535038e28`。 98 | 99 | 我们还可以查看到构建容器时使用的镜像, `ubuntu:14.04`,当命令运行之后,容器的状态随之改变并且被系统自动分配了名称 `insane_babbage`。 100 | 101 | >注意:当容器启动的时候 Docker 会自动给这些容器命名,稍后我们可以看到我们如何给容器指定名称。 102 | 103 | 好了,现在我们知道它正在运行。但是我们能要求它做什么呢?做到这,我们需要在我们容器内使用 `docker logs` 命令。让我们使用容器的名称来填充 `docker logs` 命令。 104 | 105 | $ sudo docker logs insane_babbage 106 | hello world 107 | hello world 108 | hello world 109 | . . . 110 | 111 | `docker logs` 命令会查看容器内的标准输出:这个例子里输出的是我们的命令 `hello world` 112 | 113 | 太棒了!我们的 docker 进程是工作的,并且我们创建了我们第一个 docker 应用。 114 | 115 | 现在我们已经可以创建我们自己的容器了,让我们处理正在运行的进程容器并停止它。我们使用 `docker stop` 命令来停止容器 。 116 | 117 | $ sudo docker stop insane_babbage 118 | insane_babbage 119 | 120 | `docker stop` 命令会通知 Docker 停止正在运行的容器。如果它成功了,它将返回刚刚停止的容器名称。 121 | 122 | 让我们通过 `docker ps` 命令来检查它是否还工作。 123 | 124 | $ sudo docker ps 125 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 126 | 127 | 太好了,我们的容器停止了。 128 | 129 | ###下一步 130 | 131 | 现在我们看到了Docker 是多么简单,让我们学习如何做一些更高级的任务。 132 | 133 | 去阅读[使用容器](usingdocker.md) 134 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /userguide/dockerlinks.md: -------------------------------------------------------------------------------- 1 | 连接容器 2 | === 3 | 4 | 在使用[ Docker 部分](usingdocker.md), 我们谈到了如何通过网络端口来访问运行在 Docker 容器内的服务。这是与docker容器内运行应用程序交互的一种方法。在本节中,我们打算通过端口连接到一个docker容器,并向您介绍容器连接概念。 5 | 6 | ###网络端口映射 7 | 8 | 在[使用docker](usingdocker.md)部分,我们创建了一个python应用的容器。 9 | 10 | $ sudo docker run -d -P training/webapp python app.py 11 | 12 | >注:容器有一个内部网络和IP地址(在使用Docker部分我们使用`docker inspect`命令显示容器的IP地址)。Docker可以有各种网络配置方式。你可以再这里学到更多docker网络信息。 13 | 14 | 我们使用`-P`标记创建一个容器,将容器的内部端口随机映射到主机的高端口49000到49900。这时我们可以使用`docker ps`来看到端口5000绑定主机端口49155。 15 | 16 | $ sudo docker ps nostalgic_morse 17 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 18 | bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse 19 | 20 | 我们也可以使用`-p`标识来指定容器端口绑定到主机端口 21 | 22 | $ sudo docker run -d -p 5000:5000 training/webapp python app.py 23 | 24 | 我们看这为什么不是一个好的主意呢?因为它限制了我们容器的一个端口。 25 | 26 | 我们还有很多设置`-p`标识的方法。默认`-p`标识会绑定本地主机上的指定端口。并且我们可以指定绑定的网络地址。举例设置`localhost` 27 | 28 | $ sudo docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py 29 | 30 | 这将绑定容器内部5002端口到主机的`localhost`或者`127.0.0.1`的5001端口。 31 | 32 | 如果要绑定容器端口5002到宿主机动态端口,并且让`localhost`访问,我们可以这样做: 33 | 34 | $ sudo docker run -d -p 127.0.0.1::5002 training/webapp python app.py 35 | 36 | 我们也可以绑定UDP端口,我们可以在后面添加`/udp`,举例: 37 | 38 | $ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 39 | 40 | 我们可以使用`docker port`快捷方式来绑定我们的端口,这有助于向我们展示特定的端口。例如我们绑定`localhost`,如下是`docker port`输出: 41 | 42 | $ docker port nostalgic_morse 5000 43 | 127.0.0.1:49155 44 | 45 | >注:`-p`可以使用多次配置多个端口。 46 | 47 | ###Docker容器连接 48 | 49 | 端口映射并不是唯一把docker连接到另一个容器的方法。docker有一个连接系统允许将多个容器连接在一起,共享连接信息。docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。 50 | 51 | ###容器命名 52 | 53 | 执行此连接需要依靠你的docker的名字,这里我们可以看到当我们创建每一个容器的时候,它都会自动被命名。事实上我们已经熟悉了老的`nostalgic_morse`指南。你也可以自己命名容器。这种命名提供了两个有用的功能: 54 | 55 | - 1.给容器特定的名字使你更容易记住他们,例如:命名web应用程序为web容器。 56 | - 2.它为docker提供一个参考,允许其他容器引用,举例连接web容器到db容器。 57 | 58 | 你可以使用`--name`标识来命名容器,举例: 59 | 60 | $ sudo docker run -d -P --name web training/webapp python app.py 61 | 62 | 我们可以看到我们启动了的容器,就是我们使用`--name`标识命名为`web`的容器。我们可以使用`docker ps`命令来查看容器名称。 63 | 64 | $ sudo docker ps -l 65 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 66 | aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web 67 | 68 | 我们也可以使用`docker inspect`来返回容器名字。 69 | 70 | $ sudo docker inspect -f "{{ .Name }}" aed84ee21bde 71 | /web 72 | 73 | >注:容器的名称必须是唯一的。这意味着你只能调用一个web容器。如果你想使用重复的名称来命名容器,你需要使用`docker rm`命令删除以前的容器。在容器停止后删除。 74 | 75 | ###容器连接 76 | 77 | 连接允许容器之间可见并且安全地进行通信。使用`--link`创建连接。我们创建一个新容器,这个容器是数据库。 78 | 79 | $ sudo docker run -d --name db training/postgres 80 | 81 | 这里我们使用`training/postgres`容器创建一个新的容器。容器是PostgreSQL数据库。 82 | 83 | 现在我们创建一个`web`容器来连接`db`容器。 84 | 85 | $ sudo docker run -d -P --name web --link db:db training/webapp python app.py 86 | 87 | 这将使我们的web容器和db容器连接起来。`--link`的形式 88 | 89 | --link name:alias 90 | 91 | `name`是我们连接容器的名字,`alias`是link的别名。让我们看如何使用alias。 92 | 93 | 让我们使用`docker ps`来查看容器连接. 94 | 95 | $ docker ps 96 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 97 | 349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db 98 | aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp db/web,web 99 | 100 | 我们可以看到我们命名的容器,`db`和`web`,我们还在名字列中可以看到web容器也显示`db/web`。这告诉我们web容器和db容器是父/子关系。 101 | 102 | 我们连接容器做什么?我们发现连接的两个容器是父子关系。这里的父容器是`db`可以访问子容器`web`。为此docker在容器之间打开一个安全连接隧道不需要暴露任何端口在容器外部。你会注意到当你启动db容器的时候我们没有使用`-P`或者`-p`标识。我们连接容器的时候我们不需要通过网络给PostgreSQL数据库开放端口。 103 | 104 | Docker在父容器中开放子容器连接信息有两种方法: 105 | 106 | - 环境变量 107 | - 更新`/etc/hosts`文件。 108 | 109 | 让我们先看看docker的环境变量。我们运行`env`命令来查看列表容器的环境变量。 110 | 111 | $ sudo docker run --rm --name web2 --link db:db training/webapp env 112 | . . . 113 | DB_NAME=/web2/db 114 | DB_PORT=tcp://172.17.0.5:5432 115 | DB_PORT_5000_TCP=tcp://172.17.0.5:5432 116 | DB_PORT_5000_TCP_PROTO=tcp 117 | DB_PORT_5000_TCP_PORT=5432 118 | DB_PORT_5000_TCP_ADDR=172.17.0.5 119 | . . . 120 | 121 | >注:这些环境变量只设置顶一个进程的容器。同样,一些守护进程(例如sshd)进行shell连接时就会去除。 122 | 123 | 我们可以看到docker为我们的数据库容器创建了一系列环境变量。每个前缀变量是`DB_`填充我们指定的别名。如果我们的别名是`db1`,前缀别名就是`DB1_`。您可以使用这些环境变量来配置您的应用程序连接到你的数据库db容器。该连接时安全、私有的,只能在web容器和db容器之间通信。 124 | 125 | docker除了环境变量,可以添加信息到父主机的`/etc/hosts` 126 | 127 | root@aed84ee21bde:/opt/webapp# cat /etc/hosts 128 | 172.17.0.7 aed84ee21bde 129 | . . . 130 | 172.17.0.5 db 131 | 132 | 这里我们可以看到两个主机项。第一项是web容器用容器ID作为主机名字。第二项是使用别名引用IP地址连接数据库容器。现在我们试试ping这个主机: 133 | 134 | root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping 135 | root@aed84ee21bde:/opt/webapp# ping db 136 | PING db (172.17.0.5): 48 data bytes 137 | 56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms 138 | 56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms 139 | 56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms 140 | 141 | >注:我们不得不安装`ping`,因为容器内没有它。 142 | 143 | 我们使用`ping`命令来ping`db`容器,使用它解析到`127.17.0.5`主机。我们可以利用这个主机项配置应用程序来使用我们的`db`容器。 144 | 145 | >注:你可以使用一个父容器连接多个子容器。例如,我们可以有多个web容器连接到我们的db数据库容器。 146 | 147 | ###下一步 148 | 149 | 现在我们已经学会如何连接容器了,下一步我们学习融合管理数据、卷标和如果在容器内挂载。 150 | 151 | 阅读[管理容器数据](dockervolumes.md) 152 | -------------------------------------------------------------------------------- /userguide/dockerrepos.md: -------------------------------------------------------------------------------- 1 | 使用Docker Hub 2 | === 3 | 4 | 现在你已经学习了如何利用命令行在本地运行Docker,还学习了如何[拉取镜像](usingdocker.md)用于从现成的镜像中构建容器,并且还学习了如何[创建自己的镜像](dockerimages.md)。 5 | 6 | 接下来,你将会学到如何利用[Docker Hub](https://hub.docker.com)简化和提高你的Docker工作流程。 7 | 8 | [Docker Hub](https://hub.docker.com)是一个由Docker公司负责维护的公共注册中心,它包含了超过15,000个可用来下载和构建容器的镜像,并且还提供认证、工作组结构、工作流工具(比如webhooks)、构建触发器以及私有工具(比如私有仓库可用于存储你并不想公开分享的镜像)。 9 | 10 | ###Docker命令和Docker Hub 11 | 12 | Docker通过`docer search`、`pull`、`login`和`push`等命令提供了连接Docker Hub服务的功能,本页将展示这些命令如何工作的。 13 | 14 | ###账号注册和登陆 15 | 16 | 一般,你需要先在docker中心创建一个账户(如果您尚未有)。你可以直接在[Docker Hub](https://hub.docker.com)创建你的账户,或通过运行: 17 | 18 | $ sudo docker login 19 | 20 | 这将提示您输入用户名,这个用户名将成为你的公共存储库的命名空间名称。如果你的名字可用,docker会提示您输入一个密码和你的邮箱,然后会自动登录到Docker Hub,你现在可以提交和推送镜像到Docker Hub的你的存储库。 21 | 22 | >注:你的身份验证凭证将被存储在你本地目录的`.dockercfg`文件中。 23 | 24 | ###搜索镜像 25 | 26 | 你可以通过使用搜索接口或者通过使用命令行接口在Docker Hub中搜索,可对镜像名称、用户名或者描述等进行搜索: 27 | 28 | $ sudo docker search centos 29 | NAME DESCRIPTION STARS OFFICIAL TRUSTED 30 | centos Official CentOS 6 Image as of 12 April 2014 88 31 | tianon/centos CentOS 5 and 6, created using rinse instea... 21 32 | ... 33 | 34 | 这里你可以看到两个搜索的示例结果:`centos`和`tianon/centos`。第二个结果是从名为`tianon/`的用户仓储库搜索到的,而第一个结果`centos`没有用户空间这就意味着它是可信的顶级命名空间。`/`字符分割用户镜像和存储库的名称。 35 | 36 | 当你发现你想要的镜像时,便可以用`docker pull `来下载它。 37 | 38 | $ sudo docker pull centos 39 | Pulling repository centos 40 | 0b443ba03958: Download complete 41 | 539c0211cd76: Download complete 42 | 511136ea3c5a: Download complete 43 | 7064731afe90: Download complete 44 | 45 | 现在你有一个镜像,基于它你可以运行容器。 46 | 47 | ###向Docker Hub贡献 48 | 49 | 任何人都可以从`Docker Hub`仓库下载镜像,但是如果你想要分享你的镜像,你就必须先注册,就像你在[第一部分的docker用户指南](dockerhub.md)看到的一样。 50 | 51 | ###推送镜像到Docker Hub 52 | 53 | 为了推送到仓库的公共注册库中,你需要一个命名的镜像或者将你的容器提到为一个命名的镜像,正像[这里](docerimages.md)我们所看到的。 54 | 55 | 你可以将此仓库推送到公共注册库中,并以镜像名字或者标签来对其进行标记。 56 | 57 | $ sudo docker push yourname/newimage 58 | 59 | 镜像上传之后你的团队或者社区的人都可以使用它。 60 | 61 | ###Docker Hub特征 62 | 63 | 让我们再进一步看看Docker Hub的特色,[这里](http://docs.docker.com/docker-hub/)你可以看到更多的信息。 64 | 65 | * 私有仓库 66 | * 组织和团队 67 | * 自动构建 68 | * Webhooks 69 | 70 | ###私有仓库 71 | 72 | 有时候你不想公开或者分享你的镜像,所以Docker Hub允许你有私有仓库,你可以在[这里](https://registry.hub.docker.com/plans/)登录设置它。 73 | 74 | ###组织和机构 75 | 76 | 私人仓库一个较有用的地方在于你可以将仓库分享给你团队或者你的组织。Docker Hub支持创建组织,这样你可以和你的同事来管理你的私有仓库,在[这里](https://registry.hub.docker.com/account/organizations/)你可以学到如何创建和管理一个组织。 77 | 78 | ###自动构建 79 | 80 | 自动构建功能会自动从[Github](https://www.github.com/)和[BitBucket](http://bitbucket.com/)直接将镜像构建或更新至Docker Hub,通过为Github或Bitbucket的仓库添加一个提交的hook来实现,当你推送提交的时候就会触发构建和更新。 81 | 82 | 设置一个自动化构建你需要: 83 | 84 | * 1.创建一个[Docker Hub](https://hub.docker.com/)账户并且登陆 85 | * 2.通过[Link Accounts](https://registry.hub.docker.com/account/accounts/)菜单连接你的GitHub或者BitBucket 86 | * 3.[配置自动化构建](https://registry.hub.docker.com/builds/add/) 87 | * 4.选择一个包含`Dockerfile`的Github或BitBucket项目 88 | * 5.选择你想用于构建的分支(默认是`master`分支) 89 | * 6.给自动构建创建一个名称 90 | * 7.指定一个Docker标签来构建 91 | * 8.指定`Dockerfile`的路径,默认是`/`。 92 | 93 | 一旦配置好自动构建,在几分钟内就会自动触发构建,你就会在[Docker Hub](https://hub.docker.com/)仓库源看到你新的构建,并且它将会和你的Github或者BitBucket保持同步更新直到你解除自动构建。 94 | 95 | 如果你想看到你自动化构建的状态,你可以去你的Docker Hub[自动化构建页面](https://registry.hub.docker.com/builds/),它将会想你展示你构建的状态和构建历史。 96 | 97 | 一旦你创建了一个自动化构建,你可以禁用或删除它。但是,你不能通过`docker push`推送一个自动化构建,而只能通过在Github或者BitBucket提交你的代码来管理它。 98 | 99 | 你可以在一个仓库中创建多个自动构建,配置它们只指定的`Dockerfile`或Git 分支。 100 | 101 | ###构建触发器 102 | 103 | 自动构建也可以通过Docker Hub的Url来触发,这样你就可以通过命令重构自动构建镜像。 104 | 105 | ###Webhooks 106 | 107 | webhooks属于你的存储库的一部分,当一个镜像更新或者推送到你的存储库时允许你触发一个事件。当你的镜像被推送的时候,webhook可以根据你指定的url和一个有效的Json来递送。 108 | 109 | ###下一步 110 | 111 | 去使用Docker! 112 | 113 | 114 | -------------------------------------------------------------------------------- /userguide/dockervolumes.md: -------------------------------------------------------------------------------- 1 | 管理容器数据 2 | === 3 | 4 | 到目前为止,我们已经介绍了docker的一些基本概念,了解了如何使用docker镜像,以及容器之间如何通过网络连接。本节,我们来讨论如何管理容器和容器间的共享数据。 5 | 6 | 7 | 接下来,我们将主要介绍Docker管理数据的两种主要的方法: 8 | 9 | - 数据卷 10 | - 数据卷容器 11 | 12 | ###数据卷 13 | 14 | 数据卷是指在存在于一个或多个容器中的特定目录,此目录能够绕过[Union File System](http://docs.docker.com/terms/layer/#ufs-def)提供一些用于持续存储或共享数据的特性。 15 | 16 | - 数据卷可在容器之间共享或重用 17 | - 数据卷中的更改可以直接生效 18 | - 数据卷中的更改不会包含在镜像的更新中 19 | - 数据卷的生命周期一直持续到没有容器使用它为止 20 | 21 | ###添加一个数据卷 22 | 23 | 你可以在`docker run`命令中使用`-v`标识来给容器内添加一个数据卷,你也可以在一次`docker run`命令中多次使用`-v`标识挂载多个数据卷。现在我们在web容器应用中创建单个数据卷。 24 | 25 | $ sudo docker run -d -P --name web -v /webapp training/webapp python app.py 26 | 27 | 这会在容器内部创建一个新的卷`/webapp` 28 | 29 | >注:类似的,你可以在`Dockerfile`中使用`VOLUME`指令来给创建的镜像添加一个或多个数据卷。 30 | 31 | ###挂载一个主机目录作为卷 32 | 33 | 使用`-v`,除了可以创建一个数据卷,还可以挂载本地主机目录到容器中: 34 | 35 | $ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py 36 | 37 | 这将会把本地目录`/src/webapp`挂载到容器的`/opt/webapp`目录。这在做测试时是非常有用的,例如我们可以挂载宿主机的源代码到容器内部,这样我们就可以看到改变源代码时的应用时如何工作的。宿主机上的目录必须是绝对路径,如果目录不存在docker会自动创建它。 38 | 39 | >注:出于可移植和分享的考虑,这种方法不能够直接在`Dockerfile`中实现。作为宿主机目录——其性质——是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。 40 | 41 | docker默认情况下是对数据卷有读写权限,但是我们通过这样的方式让数据卷只读: 42 | 43 | $ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py 44 | 45 | 这里我们同样挂载了`/src/webapp`目录,只是添加了`ro`选项来限制它只读。 46 | 47 | ### 将宿主机上的特定文件挂载为数据卷 48 | 49 | 除了能挂载目录外,`-v`标识还可以将宿主机的一个特定文件挂载为数据卷: 50 | 51 | $ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash 52 | 53 | 上述命令会在容器中运行一个bash shell,当你退出此容器时在主机上也能够看到容器中bash的命令历史。 54 | 55 | >注:很多文件编辑工具如`vi`和`sed --in-place`会导致inode change。Docker v1.1.0之后的版本,会产生一个错误:“sed cannot rename ./sedKdJ9Dy: Device or resource busy”。这种情况下如果想要更改挂载的文件,最好是直接挂载它的父目录。 56 | 57 | ###创建、挂载数据卷容器 58 | 59 | 如果你想要容器之间数据共享,或者从非持久化容器中使用一些持久化数据,最好创建一个指定名称的数据卷容器,然后用它来挂载数据。 60 | 61 | 让我们创建一个指定名称的数据卷容器: 62 | 63 | $ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres 64 | 65 | 你可以在另外一个容器使用`--volumes-from`标识,通过刚刚创建的数据卷容器来挂载对应的数据卷。 66 | 67 | $ sudo docker run -d --volumes-from dbdata --name db1 training/postgres 68 | 69 | 可以将对应的数据卷挂载到更多的容器中: 70 | 71 | $ sudo docker run -d --volumes-from dbdata --name db2 training/postgres 72 | 73 | 当然,您也可以对一个容器使用多个`--volumes-from`标识,来将多个数据卷桥接到这个容器中。 74 | 75 | 数据卷容器是可以进行链式扩展的,之前的`dbdata`数据卷依次挂载到了dbdata 、db1和db2容器,我们还可以使用这样的方式来将数据卷挂载到新的容器db3: 76 | 77 | $ sudo docker run -d --name db3 --volumes-from db1 training/postgres 78 | 79 | 即使你删除所有de 挂载了数据卷dbdata的容器(包括最初的`dbdata`容器和后续的`db1`和`db2`),数据卷本身也不会被删除。要删在磁盘上删除这个数据卷,只能针对最后一个挂载了数据卷的容器显式地调用`docker rm -v`命令。这种方式可使你在容器之间方便的更新和迁移数据。 80 | 81 | ###备份、恢复或者迁移数据卷 82 | 83 | 数据卷还可以用来备份、恢复或迁移数据。为此我们使用`--volumes-from`参数来创建一个挂载数据卷的容器,像这样: 84 | 85 | $ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata 86 | 87 | 这里我们启动了一个挂载`dbdata`卷的新容器,并且挂载了一个本地目录作为`/backup`卷。最后,我们通过使用tar命令将`dbdata`卷的内容备份到容器中的`/backup`目录下的`backup.tar`文件中。当命令完成或者容器停止,我们会留下我们的`dbdata`卷的备份。 88 | 89 | 然后,你可以在同一容器或在另外的容器中恢复此数据。创建一个新的容器 90 | 91 | $ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash 92 | 93 | 然后在新的容器中的数据卷里un-tar此备份文件。 94 | 95 | $ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar 96 | 97 | 你可以对熟悉的目录应用此技术,来测试自动备份、迁移和恢复。 98 | 99 | ###下一步 100 | 101 | 本小节中,我们学习了关于数据卷和数据卷容器使用方法。接下来,我们要看看如何使用Docker Hub服务,包括自动化构建和私人仓库。 102 | 103 | 阅读[使用Docker Hub](dockerrepos.md) 104 | -------------------------------------------------------------------------------- /userguide/usingdocker.md: -------------------------------------------------------------------------------- 1 | 使用容器工作 2 | === 3 | 4 | 在上一节的 Docker 用户指南中,我们启动了我们的第一个容器。而后边的例子中我们使用 `docker run` 命令启动了两个容器 5 | 6 | + 与前台进行交互的容器 7 | 8 | + 以进程方式在后台运行的容器 9 | 10 | 在这个过程中,我们学习到了几个 Docker 命令: 11 | 12 | - `docker ps` 列出容器 13 | - `docker logs` 显示容器的标准输出 14 | - `docker stop` 停止正在运行的容器 15 | 16 | >提示:另一种学习 `docker` 命令的方式就是查看我们的 [交互式教程页面。](https://www.docker.com/tryit/) 17 | 18 | `docker` 客户端非常简单 。Docker 的每一项操作都是通过命令行来实现的,而每一条命令行都可以使用一系列的标识(flags)和参数。 19 | 20 | # Usage: [sudo] docker [flags] [command] [arguments] .. 21 | # Example: 22 | $ docker run -i -t ubuntu /bin/bash 23 | 24 | 让我们看看这个使用 `docker version` 命令的操作,它将返回当前安装的 Docker 客户端和进程的版本信息。 25 | 26 | $ sudo docker version 27 | 28 | 这个命令不仅返回了您使用的 Docker 客户端和进程的版本信息,还返回了 GO 语言的版本信息( Docker的编程语言 )。 29 | 30 | Client version: 0.8.0 31 | Go version (client): go1.2 32 | 33 | Git commit (client): cc3a8c8 34 | Server version: 0.8.0 35 | 36 | Git commit (server): cc3a8c8 37 | Go version (server): go1.2 38 | 39 | Last stable version: 0.8.0 40 | 41 | ## 查看一下 Docker 客户端都能做什么 42 | 43 | 我们可以通过只输入不附加任何参数的 `docker` 命令来运行 docker 二进制文件,这样我们就会查看到 Docker 客户端的所有命令选项。 44 | 45 | $ sudo docker 46 | 47 | 会看到当前可用的所有命令行列表: 48 | 49 | Commands: 50 | attach Attach to a running container 51 | build Build an image from a Dockerfile 52 | commit Create a new image from a container's changes 53 | . . . 54 | 55 | ## 查看 Docker 命令用法 56 | 57 | 你可以更深入的去了解指定的 Docker 命令使用方法。 58 | 59 | 试着输入 Docker `[command]`,这里会看到 docker 命令的使用方法: 60 | 61 | $ sudo docker attach 62 | Help output . . . 63 | 64 | 或者你可以通过在 docker 命令中使用 `--help` 标识(flags) 65 | 66 | $ sudo docker images --help 67 | 68 | 这将返回所有的帮助信息和可用的标识(flags): 69 | 70 | Usage: docker attach [OPTIONS] CONTAINER 71 | 72 | Attach to a running container 73 | 74 | --no-stdin=false: Do not attach stdin 75 | --sig-proxy=true: Proxify all received signal to the process (even in non-tty mode) 76 | 77 | >注意:你可以点击[这里](https://docs.docker.com/reference/commandline/cli/) 来查看完整的 Docker 命令行列表和使用方法。 78 | 79 | ## 在Docker中运行一个web应用 80 | 81 | 到这里我们了解了更多关于 docker 客户端的知识,而现在我们需要将学习的焦点转移到重要的部分:运行多个容器。到目前为止我们发现运行的容器并没有一些什么特别的用处。让我们通过使用 docker 构建一个 web 应用程序来运行一个web应用程序来体验一下。 82 | 83 | 在这个 web 应用中,我们将运行一个 Python Flask 应用。使用 `docker run` 命令。 84 | 85 | $ sudo docker run -d -P training/webapp python app.py 86 | 87 | 让我们来回顾一下我们的命令都做了什么。我们指定两个标识(flags) `-d` 和 `-P` 。我们已知是 `-d` 标识是让 docker 容器在后台运行。新的 `-P` 标识通知 Docker 将容器内部使用的网络端口映射到我们使用的主机上。现在让我们看看我们的 web 应用。 88 | 89 | This image is a pre-built image we've created that contains a simple Python Flask web application. 90 | 91 | 我们指定了 `training/web` 镜像。我们创建容器的时候使用的是这个预先构建好的镜像,并且这个镜像已经包含了简单的 Python Flask web 应用程序。 92 | 93 | 最后,我们指定了我们容器要运行的命令: `python app.py`。这样我们的 web 应用就启动了。 94 | 95 | >注意:你可以在[命令参考](http://docs.docker.com/reference/commandline/cli/#run)和[Docker run参考](http://docs.docker.com/reference/run/)查看更多 `docker run` 命令细节 96 | 97 | ## 查看 WEB 应用容器 98 | 99 | 现在我们使用 `docker ps` 来查看我们正在运行的容器。 100 | 101 | $ sudo docker ps -l 102 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 103 | bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse 104 | 105 | 你可以看到我们在 `docker ps` 命令中指定了新的标识 `-l`。这样组合的 `docker ps` 命令会返回最后启动容器的详细信息。 106 | 107 | >注意:默认情况下,`docker ps` 命令只显示运行中的容器。如果你还想看已经停止的容器,请加上 `-a` 标示。 108 | 109 | 110 | 我们这里可以看到一些细节,与我们第一次运行 `docker ps` 命令的时候相比,这里多了一个 `PORTS` 列。 111 | 112 | PORTS 113 | 0.0.0.0:49155->5000/tcp 114 | 115 | 我们通过在 `docker run` 中使用 `-P` 标示(flags) 来将我们 Docker 镜像内部容器端口暴露给主机。 116 | 117 | >提示:当我们学习[如何构建镜像的时候](./dockerimages.md),我们将了解更多关于如何开放 Docker 镜像端口。 118 | 119 | 在这种情况下,Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 49155 上。 120 | 121 | Docker 能够很容易的配置和绑定网络端口。在最后一个例子中 `-P` 标识(flags)是 `-p 5000` 的缩写,它将会把容器内部的 5000 端口映射到本地 Docker 主机的高位端口上(这个端口的通常范围是 32768 至 61000)。我们也可以指定 `-p` 标识来绑定指定端口。举例: 122 | 123 | $ sudo docker run -d -p 5000:5000 training/webapp python app.py 124 | 125 | 126 | 这将会把容器内部的 5000 端口映射到我们本地主机的 5000 端口上。你可能现在会问:为什么我们只使用 1对1端口映射的方式将端口映射到 Docker 容器, 而不是采用自动映射高位端口的方式?这里 1:1 映射方式能够保证映射到本地主机端口的唯一性。假设你想要测试两个 Python 应用程序,两个容器内部都绑定了端口5000,这样就没有足够的 Docker 的端口映射,你只能访问其中一个。 127 | 128 | 所以,现在我们打开浏览器访问端口49155。 129 | 130 | ![应用访问](../images/webapp1.png) 131 | 132 | 我们的应用程序可以访问了! 133 | 134 | >注意:如果你在 OS X windows或者Linux上使用 boot2docker 虚拟机,你需要获取虚拟机的 ip 来代替localhost 使用,你可以通过运行 boot2docker shell 来获取 ip。 135 | 136 | $ boot2docker ip 137 | The VM's Host only interface IP address is: 192.168.59.103 138 | 139 | >在这种情况下,你可以通过输入 http://192.168.59.103:49155 来访问上面的例子。 140 | 141 | ### 查看网络端口快捷方式 142 | 143 | 使用 `docker ps` 命令来会返回端口的映射是一种比较笨拙的方法。为此,Docker 提供了一种快捷方式: `docker port` ,使用 `docker port` 可以查看指定 (ID或者名字的)容器的某个确定端口映射到宿主机的端口号。 144 | 145 | $ sudo docker port nostalgic_morse 5000 146 | 0.0.0.0:49155 147 | 148 | 149 | 在这种情况下,我们看到容器的 5000 端口映射到了宿主机的的 49155 端口。 150 | 151 | 152 | ###查看WEB应用程序日志 153 | 154 | 让我们看看我们的容器中的应用程序都发生了什么,这里我们使用学习到的另一个命令 `docker logs` 来查看。 155 | 156 | $ sudo docker logs -f nostalgic_morse 157 | * Running on http://0.0.0.0:5000/ 158 | 10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 - 159 | 10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 - 160 | 161 | 这次我们添加了一个 `-f` 标识。 `docker log` 命令就像使用 `tail -f` 一样来输出容器内部的标准输出。这里我们从显示屏上可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。 162 | 163 | ### 查看WEB应用程序容器的进程 164 | 165 | 我们除了可以查看容器日志,我们还可以使用 `docker top` 来查看容器内部运行的进程: 166 | 167 | $ sudo docker top nostalgic_morse 168 | PID USER COMMAND 169 | 854 root python app.py 170 | 171 | 这里我们可以看到 `python app.py` 在容器里唯一进程。 172 | 173 | ###检查WEB应用程序 174 | 175 | 最后,我们可以使用 `docker inspect ` 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 176 | 177 | $ sudo docker inspect nostalgic_morse 178 | 179 | 来让我们看下JSON的输出。 180 | 181 | [{ 182 | "ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20", 183 | "Created": "2014-05-26T05:52:40.808952951Z", 184 | "Path": "python", 185 | "Args": [ 186 | "app.py" 187 | ], 188 | "Config": { 189 | "Hostname": "bc533791f3f5", 190 | "Domainname": "", 191 | "User": "", 192 | . . . 193 | 194 | 我们也可以针对我们想要的信息进行过滤,例如,返回容器的 IP 地址,如下: 195 | 196 | $ sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' nostalgic_morse 197 | 172.17.0.5 198 | 199 | ###停止WEB应用容器 200 | 201 | 现在,我们的WEB应用程序处于工作状态。现在我们通过使用 `docker stop` 命令来停止名为 `nostalgic_morse` 的容器: 202 | 203 | $ sudo docker stop nostalgic_morse 204 | nostalgic_morse 205 | 206 | 现在我们使用 `docker ps` 命令来检查容器是否停止了。 207 | 208 | $ sudo docker ps -l 209 | 210 | ###重启WEB应用容器 211 | 212 | 哎呀!刚才你停止了另一个开发人员所使用的容器。这里你现在有两个选择:您可以创建一个新的容器或者重新启动旧的。让我们启动我们之前的容器: 213 | 214 | $ sudo docker start nostalgic_morse 215 | nostalgic_morse 216 | 217 | 现在再次运行 `docker ps -l` 来查看正在运行的容器,或者通过URL访问来查看我们的应用程序是否响应。 218 | 219 | >注意:也可以使用 `docker restart` 命令来停止容器然后再启动容器。 220 | 221 | ###移除WEB应用容器 222 | 223 | 你的同事告诉你他们已经完成了在容器上的工作,不在需要容器了。让我们使用 `docker rm` 命令来删除它: 224 | 225 | $ sudo docker rm nostalgic_morse 226 | Error: Impossible to remove a running container, please stop it first or use -f 227 | 2014/05/24 08:12:56 Error: failed to remove one or more containers 228 | 229 | 发生了什么?实际上,我们不能删除正在运行的容器。这避免你意外删除了正在使用并且运行中的容器。让我们先停止容器,然后再试一试删除容器。 230 | 231 | $ sudo docker stop nostalgic_morse 232 | nostalgic_morse 233 | $ sudo docker rm nostalgic_morse 234 | nostalgic_morse 235 | 236 | 现在我们停止并删除了容器。 237 | 238 | >注意:删除容器是最后一步! 239 | 240 | ###下一步 241 | 242 | 直到现在,我们使用的镜像都是从Docker Hub下载的。接下来,我们学习创建和分享镜像。 243 | 244 | 阅读[使用镜像](dockerimages.md) 245 | --------------------------------------------------------------------------------