diff --git a/README_ZH_cn_.md b/README_ZH_cn_.md index 60e2c54..8f7555f 100644 --- a/README_ZH_cn_.md +++ b/README_ZH_cn_.md @@ -10,10 +10,10 @@ Baseimage-docker是一个特殊的[Docker](http://www.docker.io)镜像,在Dock 可以把它作为自己的基础Docker镜像。 Baseimage-docker项目可以直接从Docker的[registry](https://index.docker.io/u/phusion/baseimage/)获取! - + ### 原生的Ubuntu基础镜像有什么问题呢? - + 原生Ubuntu不是为了在Docker内运行而设计的。它的初始化系统Upstart,假定运行的环境要么是真实的硬件,要么是虚拟的硬件,而不是在Docker容器内。但是在一个Docker的容器内,并不需要一个完整的系统,你需要的只是一个很小的系统。但是如果你不是非常熟悉Unix的系统模型,想要在Docker容器内裁减出最小的系统,会碰到很多难以正确解决的陌生的技术坑。这些坑会引起很多莫名其妙的问题。 Baseimage-docker让这一切完美。在"内容"部分描述了所有这些修改。 @@ -22,7 +22,7 @@ Baseimage-docker让这一切完美。在"内容"部分描述了所有这些修 ### 为什么使用baseimage-docker? 你自己可以从Dockerfile配置一个原生`ubuntu`镜像,为什么还要多此一举的使用baseimage-docker呢? - + * 配置一个Docker友好的基础系统并不是一个简单的任务。如前所述,过程中会碰到很多坑。当你搞定这些坑之后,只不过是又重新发明了一个baseimage-docker而已。使用baseimage-docker可以免去你这方面需要做的努力。 * 减少需要正确编写Dockerfile文件的时间。你不用再担心基础系统,可以专注于你自己的技术栈和你的项目。 * 减少需要运行`docker build`的时间,让你更快的迭代Dockerfile。 @@ -123,18 +123,18 @@ Baseimage-docker *鼓励* 通过runit来运行多进程. # 使用phusion/baseimage作为基础镜像,去构建你自己的镜像,需要下载一个明确的版本,千万不要使用`latest`. # 查看https://github.com/phusion/baseimage-docker/blob/master/Changelog.md,可用看到版本的列表. FROM phusion/baseimage: - + # 设置正确的环境变量. ENV HOME /root - + # 生成SSH keys,baseimage-docker不包含任何的key,所以需要你自己生成.你也可以注释掉这句命令,系统在启动过程中,会生成一个. RUN /etc/my_init.d/00_regen_ssh_host_keys.sh - + # 初始化baseimage-docker系统 CMD ["/sbin/my_init"] - + # 这里可以放置你自己需要构建的命令 - + # 当完成后,清除APT. RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* @@ -152,7 +152,7 @@ Baseimage-docker *鼓励* 通过runit来运行多进程. #!/bin/sh # `/sbin/setuser memcache` 指定一个`memcache`用户来运行命令.如果你忽略了这部分,就会使用root用户执行. exec /sbin/setuser memcache /usr/bin/memcached >>/var/log/memcached.log 2>&1 - + ### 在Dockerfile中: RUN mkdir /etc/service/memcached COPY memcached.sh /etc/service/memcached/run @@ -188,7 +188,7 @@ baseimage-docker的初始化脚本 `/sbin/my_init`,在启动的时候进程运 * 在Unix系统中,环境变量都会被子进程给继承.这就意味着,子进程不可能修改环境变量或者修改其他进程的环境变量. * 由于上面提到的一点,这里没有一个可以为所有应用和服务集中定义环境的地方.Debian提供了一个`/etc/environment` 文件,解决一些问题. * 某些服务更改环境变量是为了给子进程使用.Nginx有这样的一个例子:它移除了所有的环境变量,除非你通过`env`进行了配置,明确了某些是保留的.如果你部署了任何应用在Nginx镜像(例如:使用[passenger-docker](https://github.com/phusion/passenger-docker)镜像或者使用Phusion Passenger作为你的镜像.),那么你通过Docker,你不会看到任何环境变量. - + `my_init`提供了一个办法来解决这些问题. @@ -289,7 +289,7 @@ baseimage-docker的初始化脚本 `/sbin/my_init`,在启动的时候进程运 ### 禁用SSH -Baseimage-docker默认是支持SSH的,所以可以[使用SSH](#login_ssh)来[管理你的容器](#container_administration).万一你不想支持SSH,你可以只要禁用它: +Baseimage-docker默认是支持SSH的,所以可以[使用SSH](#login_ssh)来[管理你的容器](#container_administration).万一你不想支持SSH,你只要禁用它就可以: RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh @@ -338,7 +338,7 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, *** Shutting down runit daemon (PID 80)... *** Killing all processes... -你会发现默认的启动的流程太负责.或者你不希望执行启动文件.你可以自定义所有通过给`my_init`增加参数.调用`docker run YOUR_IMAGE /sbin/my_init --help`可以看到帮助信息. +你会发现默认的启动流程太复杂或者你不希望执行启动文件, 你可以自定义这些参数传递给 `my_init`. 调用`docker run YOUR_IMAGE /sbin/my_init --help`可以看到帮助信息. 例如上面运行`ls`命令,同时要求不运行启动脚本,减少信息打印,运行runit所有命令. @@ -348,12 +348,12 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, ### 在一个已经运行的容器中,运行一条命令 -这里有两种办法去在一个已经运行的容器中运行命令. +这里有两种办法, 在一个已经运行的容器内执行命令. - * 通过`nseneter`工具.这个工具用于Linux内核调用在内嵌容器中运行命令.可以查看[通过`nsenter`,登录容器或者在容器内执行命令](#login_nsenter). - * 通过SSH.这种办法需要在容器中运行ssh服务,而且需要你创建自己的sshkey.可以查看[通过`ssh`,登录容器或者在容器内执行命令](#login_ssh). + * 通过`nseneter`工具. 这个工具用于Linux内核调用在内嵌容器中运行命令. 可以查看[通过`nsenter`,登录容器或者在容器内执行命令](#login_nsenter). + * 通过SSH.这种办法需要在容器中运行ssh服务,而且需要你创建自己的sshkey. 可以查看[通过`ssh`,登录容器或者在容器内执行命令](#login_ssh). -两种方法都是他们各自的优点和确定,你可以学习他们各自的章节来了他们. +两种方法都是他们各自的优点和确定, 你可以学习他们各自的章节来了解他们. ### 通过`nsenter`,登录容器或者在容器内执行命令 @@ -387,11 +387,11 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, docker ps -一旦拥有容器的id,找到运行容器的主要进程额`PID`. +一旦得到容器的id, 找到运行容器的主进程`PID`. docker inspect -f "{{ .State.Pid }}" -现在你有的容器的主进程的PID,就可以使用`nsenter`来登录容器,或者在容器里面执行命令: +现在你已得到容器的主进程PID, 就可以使用`nsenter`来登录容器, 或者在容器中执行命令: # 登录容器 nsenter --target
--mount --uts --ipc --net --pid bash -l @@ -401,8 +401,9 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, #### `docker-bash`工具 +目前(2017-03-31), 英文文档没有发现这个命令 -查找一个容器的主要进程的PID和输入这么长的nsenter命令很快会变得乏味无论.幸运的是,我们提供了一个`docker-bash` 工具,它可以自动完成只要的工具.这个工具是运行在*docker主机*上面,不是在docker容器中. +查找一个容器的主要进程的PID和输入这么长的nsenter命令很快会变得乏味无比.幸运的是,我们提供了一个`docker-bash` 工具,它可以自动完成只要的工具.这个工具是运行在*docker主机*上面,不是在docker容器中. 该工具还附带了一个预编译的二进制`nsenter`,这样你不需要自己安装`nsenter`了.`docker-bash`是很简单的使用的. @@ -435,7 +436,7 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, * 不需要docker主机提供root权限. * 运行你让用户登录到容器,而不需要登录到docker主机.然而,默认这是不启用的,因为baseimage-docker默认不是开放ssh服务的. * 缺点 - * 需要设置ssh key.然而,baseimage-docker会提供一中办法,会让key的生成会很容易.阅读更多信息. + * 需要设置ssh key.然而,baseimage-docker会提供一种方法,会让key的生成变得很容易.阅读更多信息. 第一件事情,就是你需要确定你在容器中已经安装设置了ssh key. 默认是不安装任何key的,所以任何人都无法登录.为了方便的原因,我们提供了一个[已经生成的key](https://github.com/phusion/baseimage-docker/blob/master/image/services/sshd/keys/insecure_key) [(PuTTY format)](https://github.com/phusion/baseimage-docker/blob/master/image/services/sshd/keys/insecure_key.ppk),为了让你使用方便.然后,请注意这个key仅仅是为方便.他没有任何安全性,因为它的key是在网络上提供的.**在生产环境,你必须使用你自己的key.** @@ -453,11 +454,13 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, docker ps -一旦你拥有容器的ID,就能找到容器使用的IP地址: +一旦你得到容器的ID,就能找到容器使用的IP地址: docker inspect -f "{{ .NetworkSettings.IPAddress }}" -现在你有得了IP地址,你就看通过SSH来登录容器,或者在容器中执行命令了: +译者注: 类似 `"{{ .NetworkSettings.IPAddress }}"` 是用到了 [Go的模板语法](https://gohugo.io/templates/go-templates/). + +现在你得到了IP地址, 你就可以通过SSH来登录容器,或者在容器中执行命令了: # 下载key curl -o insecure_key -fSL https://github.com/phusion/baseimage-docker/raw/master/image/services/sshd/keys/insecure_key @@ -501,7 +504,7 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, docker inspect -f "{{ .NetworkSettings.IPAddress }}" -现在你有得了IP地址,你就看通过SSH来登录容器,或者在容器中执行命令了: +现在你有得了IP地址,你就可以通过SSH来登录容器,或者在容器中执行命令了: # 登录容器 ssh -i /path-to/your_key root@ @@ -540,7 +543,7 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, git clone https://github.com/phusion/baseimage-docker.git cd baseimage-docker -创建一个包含docker在的虚拟机.你可以使用我们提供的Vagrantfile. +创建一个包含docker在内的虚拟机.你可以使用我们提供的Vagrantfile. vagrant up vagrant ssh @@ -550,7 +553,7 @@ Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令, make build -如果你想把创建的镜像名字,叫其他名字,通过`NAME`变量可以设置: +如果你想修改镜像的名称, 通过`NAME`变量可以设置: make build NAME=joe/baseimage