简单的说,容器是独立运行的一个货一组应用,以及它们的运行态环境。对应的,虚拟机可以理解成模拟运行的一整套操作系统和泡在上面的应用。
所需要的主要命令是docker run
下面的命令输出一个 Hello World
后结束:
$ docker run ubuntu:14.04 /bin/echo 'hello world'
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
324d088ce065: Pull complete
2ab951b6c615: Pull complete
9b01635313e2: Pull complete
04510b914a6c: Pull complete
83ab617df7b4: Pull complete
Digest: sha256:b8855dc848e2622653ab557d1ce2f4c34218a9380cceaa51ced85c5f3c8eb201
Status: Downloaded newer image for ubuntu:14.04
hello world
如果本地没有对应镜像,首先会到仓库中下载的。如果你已经存在该镜像,应该只会打印出hello world
。
就和本地执行 echo 'hello world'
效果是一样的,没有任何区别
下面的命令启动一个bash终端,允许用户进行交互:
$ docker run -t -i ubuntu:14.04 /bin/bash
root@c74c8288ae0b:/#
root@c74c8288ae0b:/# pwd
/
root@c74c8288ae0b:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
docker start 'container id'
可以启动一个已终止容器。
docker restart 'container id'
可以终止一个容器,然后再重启。
容器核心为所执行的应用程序,所需要的资源都是应用程序运行所必须的,除此之外,并没有其他的资源。可以在伪终端中利用ps或tpo来查看进程信息。
root@c74c8288ae0b:/home# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
20 ? 00:00:00 ps
如果需要Docker在后台运行,可以通过添加-d
参数来实现。
如果不适用-d
参数运行容器:
docker run -d ubuntu:17.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
... ...
容器会把输出结果打印到宿主机上面,如果使用-d
参数运行容器:
docker run -d ubuntu:17.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
b1e7c17dcbe29f557f21438339e05d2de88ef486c5decc4492d9cb4e1556414f
此时容器会在后台运行,并不会把输出的结果打印到宿主机上。
可以使用docker log
命令查看打印的结果:
$ docker logs b1e
hello world
hello world
hello world
... ...
docker stop 'container id'
可以启动一个已终止容器。
查看所有容器包括终止的容器,可以使用docker ps -a
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c74c8288ae0b ubuntu:14.04 "/bin/bash" 3 minutes ago Exited (0) 5 seconds ago awesome_goldstine
上文中已经说明了使用-d
参数时,容器启动后会进入后台。
某些时候需要进入容器进行操作,可以使用docker attach
或者docker exec
命令,推荐使用后者。
docker attach
时Docker自带的命令:
$ docker run -dit ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
a48c500ed24e: Pull complete
1e1de00ff7e1: Pull complete
0330ca45a200: Pull complete
471db38bcfbf: Pull complete
0b4aba487617: Pull complete
Digest: sha256:c8c275751219dadad8fa56b3ac41ca6cb22219ff117ca98fe82b42f24e1ba64e
Status: Downloaded newer image for ubuntu:latest
888b1857981ed17fa8cc573411a10a4f2731d0990277594c628223548322e630
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
888b1857981e ubuntu "/bin/bash" 31 seconds ago Up 30 seconds boring_dijkstra
$ docker attach 888
root@888b1857981e:/#
root@888b1857981e:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@888b1857981e:/# cd home/
root@888b1857981e:/home# ls
root@888b1857981e:/home# exit
注意 使用docker attach
进入容器后,使用exit
退出时会导致容器终止。
docker exec
命令:
$ docker run -dit ubuntu
8e847a221af557308aa96de7e9a43633ce05ae95a064c938ee82297408ffc108
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e847a221af5 ubuntu "/bin/bash" 7 seconds ago Up 6 seconds distracted_lalande
$ docker exec -i 8e8 bash
ls
bin
boot
dev
etc
home
lib
lib64
......
使用-i
参数后退出,在使用下面的命令进入容器:
$ docker exec -it 8e8 bash
root@8e847a221af5:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@8e847a221af5:/#
root@8e847a221af5:/#
root@8e847a221af5:/#
root@8e847a221af5:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@8e847a221af5:/# exit
如果使用docker exec
命令进入容器,使用exit
推出容器不会导致容器的停止,这就是为什么推荐大家使用docker exec
的原因。
注意:
- 只使用-i
参数时,由于没有分配伪终端,界面没有我们熟悉的Linux命令提示符,但是命令结果仍然可以返回。
- -i -t
一起使用时,可以看到熟悉的Linux命令提示符