docker几个基础命令及nodejs容器

原文链接: https://juejin.im/post/5c4828fd51882525927901a1

最近在了解docker使用,在网上找资料发现很少有可以系统的了解某一个操作目的的大部分细节的参考,学起来非常吃力、耗时。
这里整理了一下自己在入门摸索过程中的几个入门级的操作,可以连贯的对实现一个nodejs容器基础操作有个清晰的了解,下面进入正文。
网上很容易找到关于docker的container运行、镜像拉取、容器查看等操作,这里不多说

// 拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST] // 同 docker image pull

// 拉取官方的nodejs的镜像
docker pull node
复制代码

使用nodejs镜像创建一个新的nodejs容器,命名为my-node

docker run -itd --name my-node node /bin/bash
复制代码

当然还可以使用docker create创建一个新容器,但不马上运行。下面带着一系列问题来了解相关命令:

如何查看创建的容器?

创建并运行完成后,可以这样查看正在运行的容器

docker ps // 或 docker container ls
复制代码

结果如下,最后NAMES为容器名,很多操作都可以使用容器名来制定该容器,跟ID类似

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a2e2c6b8360f        node                "/bin/bash"         5 days ago          Up 5 days                               my-node
复制代码

也可以使用docker container ls -a来查看所有已经创建的容器(包括没有运行的)

如何查看容器里面运行的软件版本?

这也是我开始学习docker时遇到的问题之一,关键就是exec命令,它的作用就是在运行的容器中执行命令。格式为:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
复制代码

简单的查看nodejs版本的方式为:

docker exec my-node node --version
// 结果
v11.6.0
复制代码

my-node 为容器名即CONTAINER, node 为COMMAND,--version为ARG 即在my-node 容器里执行node --version 命令,这是使用exec执行命令的基本方式,缺点是只能执行一次,而且不能进行后续的交互。更好的方式是

docker exec -it my-node /bin/bash
复制代码

-it 选项的功能跟run命令的-it类似,打开可以进行交互的终端,/bin/bash就是运行容器的bash程序,这个效果跟使用run命令才不多,这样就进入到容器里面,容器拥有简单的linux命令,比如ls、shell等因为是nodejs的容器,所以可以执行node命令,如:node -v,就像在linux系统里面一样:

root@a2e2c6b8360f:/# node -v
v11.6.0
root@a2e2c6b8360f:/#
复制代码

除此之外,当然也可以执行js代码,运行node cli命令。这是容器运行的常用方式,在后文会有用到。

现在终端交互为容器的终端,如何退出容器呢?

有两个方法,可以使用ctrl + d,也可敲入exit命令,两种方法等效。

注: 还可以使用attach命令进入容器,但是这样退出容器终端的同时也会stop容器,这是不希望看到的(经测试加--sig-proxy=false不行)

知道如何在容器里运行js代码了,那如何把js代码或文件放进容器里面,或者说

如何利用容器执行我们在容器外编辑的js文件呢(在不打包镜像的情况下)?

要解决这问题,就需要用到挂载或volume(数据卷)的功能。docker可以通过-v、--mount选项来挂载宿主机与容器的共享目录。以windows下面的docker为例,另外再创建一个名为node-a的容器来实现挂载:

docker run -itd --name node-a -v $pwd/test:/test node /bin/bash
复制代码

在这行命令中,-v之后的参数为 宿主目录:容器目录,意即把宿主机的$pwd/test($pwd为当前工作目录)目录挂载到容器的/test目录(根目录下的test文件夹)。

绑定成功后,在宿主机的 $pwd/test 目录下的任何文件变动,都会实时同步到容器的/test文件夹下。 例如在宿主机$pwd/test 目录下新建一个文件foo.js,里面一行js代码console.log('this is a test!'),然后进入到容器,可以看到test目录,并在文件夹下有foo.js

docker exec -it my-node /bin/bash
root@a4562d3e28da:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var  vol
root@a4562d3e28da:/# cd test && ls
foo.js
root@a4562d3e28da:/# node foo.js
this is a test
复制代码

这样,就可以通过在容器外面编辑文件,而在容器里面运行。可以很方便的进行测试。 通过inspect命令可以查看当前的挂载信息:

docker inspect -f "{{json .Mounts}}" node-a
[{
    "Type":"bind",
    "Source":"/host_mnt/c/**/桌面/**/my-docker/test", // 宿主机目录
    "Destination":"/test",   // 容器目录
    "Mode":"",
    "RW":true,
    "Propagation":"rprivate"
}]
复制代码

当容器多了,忘了对应的挂载目录,这个就非常有用,关于inspect命令的使用,点击。关于-v选项的更多细节可以参考

当然也可以使用--mount来进行挂载(官方推荐),或者使用volume来共享数据(但在windows、mac下,由于docker是跑在虚拟机里面,所以获取docker volume在本地的目录会比较麻烦),有兴趣可以深入了解。当然也可以通过dockerfile配置image来配置,但这不属于本文范围。

转载于:https://juejin.im/post/5c4828fd51882525927901a1


更多精彩内容