Docker基础

命令

docker pull

docker pull主要用于从Docker registry中拉取image或repository。

docker pull ubuntu

docker run

docker run命令用来基于特定的镜像创建一个容器,并依据选项来控制该容器。利用docker run命令新建一个容器时,Docker将自动为每个新容器分配唯一的ID作为标识。

docker run -it ubuntu /bin/bash

  • -i: 交互式操作
  • -t: 终端
  • -d: 后台运行
  • -p:将容器内部使用的网络端口绑定到指定的主机端口。

要退出终端,直接输入 exit。

docker start/stop/restart

可以通过docker start/stop/restart命令来启动、停止和重启。docker start/stop/restart命令一般利用容器ID标识确定具体容器,也可以使用容器名来确定容器。

docker start/stop/restart container_id

docker attach

docker attach命令可以连接到正在运行的容器。如果从这个容器退出,会导致容器的停止。

docker attach container_id

docker exec

docker exec命令可以在正在运行的容器上执行命令。如果从这个容器退出,不会导致容器的停止。

docker exec -it container_id /bin/bash

docker export

可以使用 docker export 命令将容器到处到本地

docker export container_id > container.tar

docker import

可以使用 docker import 从容器快照文件中再导入为镜像

docker import container.tar ex/container:v1

docker rm

使用 docker rm 命令删除容器

docker rm container_id

下面的命令可以清理掉所有处于终止状态的容器

docker container prune

Dockerfile

Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式。可以通过docker build命令从Dockerfile中构建镜像。

除了FROM指令,其他每一条指令都会在上一条指令所生成镜像的基础上执行,执行完后会生成一个新的镜像层,新的镜像层覆盖在原来的镜像之上从而形成了新的镜像。Dockerfile所生成的最终镜像就是在基础镜像上面叠加一层层的镜像层组建的。

在Dockerfile中,指令不区分大小写,但是为了与参数区分,推荐大写。以#开头的行是注释,而在其他位置出现的#会被当成参数。

ENV

格式: ENV <key> <value> 或者 ENV <key>=<value>

ENV指令可以为镜像创建出来的容器声名环境变量。其他指令使用环境变量时,使用格式为$variable_value或者${variable_value}

FROM

格式: FROM <image>FROM <image>:<tag>

FROM指令的功能是为后面的指令提供基础镜像,因此一个有效的Dockerfile必须以FROM指令作为第一条非注释指令。FROM指令可以出现多次,这样会构建多个镜像。

COPY

格式: COPY <src> <dest>

COPY指令复制所指向的文件或目录,将它添加到新镜像中,复制的文件或目录在镜像中的路径是所指定的源可以有多个,但必须是上下文根目录的相对路径。

可以是文件或目录,但必须是目标镜像中的绝对路径或者相对于WORKDIR的相对路径。

ADD

格式: ADD <src> <dest>

ADD与COPY指令在功能上很相似,都支持复制本地文件到镜像的功能,可以是一个指向网络文件的URL,还可以是指向一个本地压缩归档文件,该文件在复制到容器中时会被解压提取。

RUN

格式:RUN <command>RUN ["executable", "param1", "param2"]

RUN指令会在前一条命令创建出的镜像的基础上创建一个容器,并在容器中运行命令,在命令结束运行后提交容器为新镜像,新镜像杯Dockerfile中的下一条指令使用。

当使用shell格式时,命令通过/bin/sh -c运行;当使用exec格式时,命令是直接运行的,容器不调用shell程序;exec格式中的参数会被当成JSON数组被Docker解析,故必须使用双引号而不能使用单引号。exec格式不会在shell中执行,所以环境变量的参数不会被替换。

&& 符号连接命令,这样执行后,只会创建 1 层镜像。

CMD

格式: CMD <command>CMD ["executable", "param1", "param2"]CMD ["param1", "param2"]

CMD指令在构建镜像时并不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令。只有最后一条CMD指令有效。CMD指令中的参数会添加到ENTRYPOINT指令中。

CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

ENTRYPOINT

格式:ENTRYPOINT <command>ENTRYPOINT ["executeable", "param1", "param2"]

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。

ONBUILD

格式:ONBUILD [INSTRUCTION]

ONBUILD指令的功能是添加一个将来执行的触发器指令到镜像中。当该镜像作为FROM指令的参数时,这些触发器指令就会在FROM指令执行时加入到构建过程中。

VOLUME

格式:VOLUME /dataVOLUME ["/data1", "/data2"]

使用VOLUME指令向容器添加volume。与使用docker run -v不同的是,VOLUME指令不能挂载主机中指定的目录。

数据卷

volume时存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并未数据的共享与持久化提供以下便利。

  • volume在容器创建时就会初始化,在容器运行时就可以使用其中的文件
  • volume能在不同的容器之间共享和重用
  • 对volume中数据的操作会马上生效
  • 对volume中数据的操作不会影响到镜像本身
  • volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除。

创建volume

docker volume create --name vol_simple

在使用docker run或者docker create创建新容器时,也可以使用-v标签为容器添加volume。volume名称未指定将随机命名。

docker run -d -v /data centos /bin/bash

docker run -d -v vol_simple:/data centos /bin/bash

挂载volume

在使用docker run或docker create创建新容器时,可以使用-v标签为容器添加volume。用户可以将自行创建或者由Docker创建的volume挂载到容器中,也可以将宿主机上的目录或者文件作为volume挂载到容器中。

docker run -v /host/dir:/container/dir centos /bin/bash

注意:如果镜像中原本存在/container/dir目录,该目录下原有的内容将被隐藏,以保持与宿主机中的目录一致。

将主机上的文件或目录作为volume挂载时,可以使用:ro指定该volume为只读。

docker run -v /host/dir:/container/dir:ro centos /bin/bash

共享volume

可以使用--volumes-from标签使得容器与已有的容器共享volume。

docker run --rm -it --name vol_use --volumes-from vol_simple centos /bin/bash

一个容器挂载了一个volume,即使这个容器停止运行,该volume仍然存在,其他容器也可以使用--volumes-from与这个容器共享volume。

删除volume

使用docker rm删除容器并不会删除与volume对应的目录。如果volume是在创建容器时从宿主机中挂载的,无论对容器进行任何操作都不会导致其在宿主机中被删除。

docker volume rm volume_name

docker rm -v container_name

docker run --rm container_name

--rm标签会在容器停止运行时删除容器及其容器所挂载的volume。

备份、恢复或迁移volume

方法一

使用dokcer inspect命令查找到/data在宿主机上对应的目录位置,然后复制其中的内容或是使用tar进行打包;同样地,如果需要恢复某个volume中的数据,可以查找到volume对应目录,将数据复制进这个目录或是使用tar从归档文件中恢复。

方法二

启动一个容器挂载两个volume,一个是原始卷,另一个是备份卷,然后将目录打包。

docker run --rm --volumes-from vol_simple -v ${pwd}:/backup centos tar cvf /backup/data.tar /data

运行一个新容器作为数据恢复的目标。

docker run -it --name vol_bak -v /data centos /bin/bash

启动一个临时容器,这个容器挂载两个volume,第一个volume与要恢复的volume共享,第二个volume将宿主机的当前目录挂载到容器的/backup下。由于以前备份的data.tar在当前目录下,那么它在容器中的/backup也能访问到,容器启动后将这个存档文件中的/data恢复到根目录下,然后删除容器,恢复的数据就在col_bak的volume中了。

docker run --rm --volumes-from vol_bak -v ${pwd}:/backup centos tar xvf /backup/data.tar -C /

results matching ""

    No results matching ""