操作Docker容器

Docker 容器

简单的说,容器是独立运行的一个货一组应用,以及它们的运行态环境。对应的,虚拟机可以理解成模拟运行的一整套操作系统和泡在上面的应用。

启动容器

所需要的主要命令是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 run 内部执行步骤:

  • 检查本地是否村子指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写
  • 丛宿主主机配置的网桥接口中桥接一个虚拟接口到容器中
  • 从地址迟配置一个ip地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

启动已终止容器

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命令提示符

你可能感兴趣的:(Docker)