centos安装docker: yum install docker
查看docker容器: docker ps -a
查看docker镜像: docker images
新建容器:docker run -ti 镜像名 命令如/bash/bin
运行已有容器:docker start containID
停止已有容器:docker stop containID
挂载主机文件到容器: 新建容器时 -v 主机文件夹:容器文件夹
主机上查看容器ip: docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID
提交容器生成新镜像: docker commit containerID 镜像名
载入镜像:docker load 镜像文件(一般为.tar文件)
打包镜像:docker save 镜像名 > /root/debian02.tar
若新建容器时运行了/bin/bash,则退出容器会话后可使用,docker attach containerID重新回到bash命令行
nsenter
从util-linux版本2.23开始,nsenter工具就包含在其中。它用来访问另一个进程的名字空间。nsenter要正常工作需要有 root权限。很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安装最新版本的util-linux(2.24)版,请按照以下步骤:
1
2
|
cd
/tmp
curl https:
//www
.kernel.org
/pub/linux/utils/util-linux/v2
.24
/util-linux-2
.24.
tar
.gz |
tar
-zxf-
cd
util-linux-2.24.
/configure
--without-ncursesmake nsentercp nsenter
/usr/local/bin
|
为了连接到容器,你还需要找到容器的第一个进程的PID。
1
|
docker inspect --
format
"{{ .State.Pid }}"
<container-
id
>
|
通过这个PID,你就可以连接到这个容器:
1
|
nsenter --target $PID --
mount
--uts --ipc --net --pid
|
nsinit
从0.9版本开始,Docker自身就具有一个管理容器的库,名字为 libcontainer。libcontainer中的nsinit工具允许用户直接访问linux名字空间和cgroup内核。在安装nsinit之前,你首先需要安装Go运行时环境:
1
2
3
4
|
apt-get
install
git golang-go
mkdir
-p $HOME
/go-dev/binmkdir
-p $HOME
/go-dev/src
echo
"export GOPATH=\$HOME/go-dev"
>> ~/.profileecho
"PATH=\$PATH:\$GOPATH/bin"
>> ~/.profile
source
~/.profile
|
接下来才安装nsinit:
1
2
3
|
mkdir
-p $GOPATH
/src/github
.com
/dotcloudcd
$GOPATH
/src/github
.com
/dotcloud
git clone https:
//github
.com
/dotcloud/docker
.gitcd $GOPATH
/src/github
.com
/dotcloud/docker
/usr/bin/go
get -
v
github.com
/dotcloud/docker/vendor/src/github
.com
/docker/libcontainer/nsinit
|
nsinit 读取的是位于/var/lib/docer/execdriver/native/<container-id>容器目录下的配置数据。要运 行nsinit,你需要切换到容器目录下。由于/var/lib/docker目录对于root用户是只读权限,因此你还需要root权限。通过 docker的ps命令,你可以确定容器ID。一旦你进入/var/lib/docker目录,你就可以连接容器了:
1
|
nsinit
exec
/bin/bash
|
lxc(-attach)
直到Docker 0.8.1版本为止,LXC一直是管理容器的基本工具,Docker一直支持这个工具。但是从0.9.0版本开始,Docker默认使用libcontainer管理容器,不再依赖LXC了。因此默认情况下,你不能使用lxc-attach了。
如果你仍然希望使用lxc-attach,那么你需要使用-e lxc选项来重新启动Docker服务进程。使用这个选项,Docker的内部将再次使用LXC管理容器了。完成这个任务最简单的做法就是创建/etc /default/docker文件(如果这个文件仍然不存在),并添加以下内容:
DOCKER_OPTS=" -e lxc"
现在你可以重新启动Docker服务了。要连接容器,你需要知道完整的容器ID:
1
|
docker
ps
--no-trunc
|
接下来,你就可以连接这个容器了。要完成下面工作,你还需要root权限:
1
|
lxc-attach -n <container-
id
> --
/bin/bash
|
sshd
上面所有三种方法都要求具有主机系统的root权限。为了不采用root权限,通过ssh访问容器将是一个很好的选择。
要做到这一点,你需要构建一个支持SSH服务的基础映像。此时,我们可能遇到这样的问题:我们是不是用Docker CMD或者ENTRYPOINT运行一条命令就可以了?如果此时有sshd进程运行,那么我们就不要再运行其他进程了。接下来的工作是创建一个脚本或者使 用像supervisord这样的进程管理工具来启动其它所有需要启动的进程。有关如何使用supervisord的 优秀的文档可以在Docker的web站点上找到。一旦你启动了具有sshd进程的容器,你就可以像以往一样通过ssh客户端了连接这个容器了。
结论
sshd方法可能是最简单的连接容器的方法,而且大多数用户习惯通过ssh连接虚拟机。另外,连接容器时你也不需要一定使用root权限。不过,对 于是否一个容器是否应当管理不止一个进程仍然存在许多争议。这种方法最终使得每个容器了多了一个sshd进程,这从根本上来说不是进程虚拟化的所提倡的。
另外三种方法都需要root权限。到0.8.1版本为止,Docker都是使用LXC来管理容器的。正是由于这个原因,使用lxc-attach连 接容器就非常容易。不过从版本0.9.0开始Docker服务就必须使用 -e lxc选项启动才能在内部支持LXC管理容器。不过,由于设置了这个选项,Docker将再次依赖LXC,而LXC可能随着发布或者安装的不同可能被剔 除。
nsenter和nsinit总的来说是相同的。这两个工具的主要区别是nsinit在本身的容器了建立了一个新的进程,而nsenter只是访问了名字空间。