在第一章介绍Docker架构时,我们介绍过Docker中镜像和容器的关系。
我们再复习一遍,镜像是模板,容器是具体实例。用Java语言中的概念来理解就是:镜像是类,容器是对象。
So,当我们创建一个容器时,需要从镜像仓库中选择自己需要的镜像,然后创建容器并使用。当然,如果现有镜像没有能满足我们需求的,我们也可以自己定义镜像,再用自己的镜像创建容器并使用。
首先我们讲,用现有镜像创建容器,并使用它。
使用现有镜像创建容器的命令是:
docker run ubuntu:15.10
docker:是我们刚安装好的docker软件。
run:是docker的指令,表示启动一个容器。
ubuntu:15.10:是镜像名称,表示我们要使用这个镜像来启动容器。Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
注意:docker默认镜像仓库是官方的,在国外速度比较慢。我们可以修改仓库,使用国内的。
修改镜像仓库:
编辑/etc/docker/daemon.json,如果不存在则创建:
vi /etc/docker/daemon.json
内容如下:
{ "registry-mirrors":[ "https://registry.docker-cn.com" ] }
修改保存,之后要重启docker服务:
1 service docker restart
然后可以查看下变化,执行docker info命令,可以看到Registry Mirrors下已经有了我们刚配置的地址。
这里的registry-mirrors是一个数组,可以设置多个url,这里的https://registry.docker-cn.com是docker官方国内地址。还可以设置其他源:
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn
ok,我们来使用现有镜像启动容器:
docker run ubuntu:15.10
不报错就是启动成功了。通过docker ps命令可以看到正在运行的容器:
docker ps
这里会显示一个空列表,因为我们的容器ubuntu:15.10什么都没做,所以进程就结束了,容器则关闭了。
我们可以通过docker ps -a命令看到已经关闭的容器:
docker ps -a
这样就能看到刚才启动过的容器了,在"created"字段可以看到容器创建的时间,“status”可以看到容器目前的状态。
我们可以让容器做点事,让它别那么快结束:
docker run ubuntu:15.10 nohup sleep 10>/dev/null &
这里我们在容器中执行了sleep命令,然后再通过docker ps查看docker进程,就可以看到了:
container id:容器id,每次启动容器时分配。
image:镜像名称。
command:当前运行的进程,一般指主进程,如果该主进程又启动了其他子进程,不会显示。
created:创建时间。
status:当前状态。
ports:容器的端口信息和使用的连接类型(tcp\udp)
names:自动分配的容器名称。
这里我们只sleep了10秒,10秒后在看docker ps就没有了,用docker ps -a可以看到状态是Exited。已停止。
我们也可以进入容器中,进入容器有四种方式:
1、使用docker attach命令进入容器
在容器运行5,通过docker ps查看容器的container id,使用命令进入容器:
docker attach 容器id
这种方式类似于共享屏幕,也就是我们可以看到当前运行容器的程序和输出,但是我们对当前容器的操作也会影响到正在运行的程序。如果多个用户使用docker attach进入同一个容器,那么他们之间的操作是会相互影响的,可以看到其他人的操作。如果其中一个用户运行阻塞操作,那么其他用户就会被阻塞不能操作。
2、容器内部运行ssh服务,外部通过ssh登录进容器
但是不建议这么操作,请参考:https://www.oschina.net/translate/why-you-dont-need-to-run-sshd-in-docker?cmp
3、使用nsenter进入Docker容器
拿到docker容器进程的真实pid,使用nsenter进入进程命名空间。
4、使用docker exec进入容器
这个命令可以使用-it参数打开输入输出交互,然后运行/bin/bash,就启动了一个新shell,可以看到正在运行的程序,进行其他操作也不会影响到其他进入的用户。和ssh效果类似,每个用户都会启动一个shell进程。
docker exec -it 容器id /bin/bash
除了上面这4种,还有一种更加便捷的,就是在启动容器时进入:
docker run -i -t ubuntu:15.10 /bin/bash
这样,就是在启动容器时,直接进入容器中,效果和docker exec类似。
至此,我们就讲完了使用现有镜像创建容器并进入容器查看和交互。
接下来,看如何创建自定义镜像,并启动。