介绍
镜像是文件系统,容器是运行于镜像文件系统上的一个或多个服务。
通过运行一个镜像来产生一个容器。容器启动的时候,如果通过 docker run IMAGE COMMAND
指定了命令,则执行该命令,否则会执行 Dockerfile 中的 CMD 指定的命令,这些命令是运行于镜像提供的文件系统上的。
镜像本身是只读的,保持不变。从镜像启动一个容器的时候,会在镜像的最上一层创建一个可写层。容器对于环境的写操作只会修改可写层,不会修改镜像,因此多个容器之间相互隔离。即便是基于同一个镜像创建多个容器,某个容器的写操作也只不会影响到其他容器。
容器之间也可以建立通信机制。
状态
使用 docker run
启动容器之后,该容器不一定一直处于 running 状态。容器启动的时候,如果通过 docker run IMAGE COMMAND
指定了命令,则执行该命令,否则会执行 Dockerfile 中的 CMD 指定的命令。如果这个命令很短暂,比如 echo hello
,那么容器在执行完该命令之后状态就变为 exited。即便通过 docker start
或 docker restart
重启这个容器,再次执行完这个短暂的命令之后,容器的状态又变为 exited。如果 COMMAND 或 CMD 中指定了一些持久的命令,比如监听端口提供 web 服务,则容器启动之后会一直处于 running 状态。除非执行 docker stop
来停止容器,将容器的状态变为 exited。通过 docker inspect CONTAINER
可以查看容器的状态。
使用 docker create
命令创建容器,只创建容器,不启动容器,因此不会执行任何命令。创建容器之后,容器的状态为 created
。通过 docker start
或 docker restart
命令来启动容器,这时才执行 COMMAND 或 CMD 命令,如果是短暂的命令,则容器执行完命令之后状态变为 exited,如果是持久的命令,则容器的状态会一直处于 running。
只能对处于 running 状态的容器使用 docker exec
命令,不管是 created 还是 exited 状态的容器都无法使用 docker exec
命令。
命令
docker create
docker run
docker exec
docker start
docker stop
docker restart
docker inspect
docker ps
docker rm
docker logs
docker create
使用 docker create
命令创建容器,只创建容器,不启动容器,因此不会执行任何命令。执行完 docker create
命令之后,容器的状态变为 created。使用 --name
参数可以为容器指定名字,如果不加该参数,则会为容器随机取名。
$ docker create --name web nginx
750e1ab6eb185e11f3f1d26eef74103a67e263dc94f9cb15279c5dd4c7c9be49
docker ps
使用 docker ps
命令查看 running 状态的容器,使用 docker ps -a
命令查看所有状态的容器。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
750e1ab6eb18 nginx "nginx -g 'daemon of…" 19 seconds ago Created web
docker inspect
使用 docker inspect
命令可以查看容器的详细信息,也包括容器的状态。
$ docker inspect web
docker start
使用 docker start
命令启动容器,容器启动之后会执行 COMMAND 或 CMD 命令。执行完 docker start
命令之后,容器的状态可能为 running,也可能为 exited。
$ docker start web
web
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
750e1ab6eb18 nginx "nginx -g 'daemon of…" 15 minutes ago Up 2 seconds 80/tcp web
docker restart
使用 docker restart
命令重启容器,容器重启之后会执行 COMMAND 或 CMD 命令。执行完 docker restart
命令之后,容器的状态可能为 running,也可能为 exited。docker restart
命令相当于先调用 docker stop
再调用 docker start
。
$ docker restart web
web
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
750e1ab6eb18 nginx "nginx -g 'daemon of…" 24 minutes ago Up 6 seconds 80/tcp web
docker stop
使用 docker stop
命令停止容器。执行完 docker stop
命令之后,容器的状态会变为 exited。
$ docker stop web
web
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
750e1ab6eb18 nginx "nginx -g 'daemon of…" 27 minutes ago Exited (0) 2 seconds ago web
docker rm
使用 docker rm
命令删除容器,如果容器的状态为 running,则使用 docker rm -f
命令删除运行中的容器。
$ docker rm web
web
docker logs
使用 docker logs
命令查看容器的输出记录。使用 docker create
命令创建一个容器,由于不执行命令,所以通过 docker logs
命令查看不到任何输出。通过 docker start
启动该容器,由于启动容器的时候会执行 echo 'hello world'
命令,所以通过 docker logs
命令能够查看到输出 hello world。
$ docker create --name server centos echo 'hello world'
bf71659208bb5eb55d4280e65bf551ce3e9704a8943103949d4e8e050a237233
$ docker logs server
$ docker start server
server
$ docker logs server
hello world
docker run
使用 docker run
命令创建容器,同时启动容器。容器启动的时候,会执行 COMMAND 或 CMD 命令。执行完 docker run
命令,容器的状态可能为 running,也可能为 exited。
$ docker run --name hello centos echo 'hello world'
hello world
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22fd5700f4f3 centos "echo hello" 30 seconds ago Exited (0) 29 seconds ago hello
使用 -it
参数可以在启动容器之后进入到容器文件系统的内部,这时候该容器的状态为 running。
$ docker run -it --name server centos
[root@3ffd456db9f1 /]#
再打开一个终端窗口,查看容器的状态。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c80d4a97a29 centos "/bin/bash" 4 seconds ago Up 3 seconds
输入 exit
退出容器文件系统,容器的状态变为 exited。
[root@3ffd456db9f1 /]# exit
exit
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c80d4a97a29 centos "/bin/bash" 14 seconds ago Exited (0) 4 seconds ago server
使用 -d
参数可以在启动容器的同时,在后台执行命令,这样终端就不会处于挂起状态。
$ docker run -d --name web nginx
2538cf30d129a131a1f931123fee3eb015add63594c26b8c9db52b7f56553647
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2538cf30d129 nginx "nginx -g 'daemon of…" 40 seconds ago Up 39 seconds 80/tcp web
docker exec
使用 docker exec
命令,在处于 running 状态的容器上执行 COMMAND 命令。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2538cf30d129 nginx "nginx -g 'daemon of…" 40 seconds ago Up 39 seconds 80/tcp web
$ docker exec web echo 'hello world'
hello world
$ docker exec -it web bash
root@2538cf30d129:/#
网友评论