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指令复制
ADD
格式:
ADD <src> <dest>
ADD与COPY指令在功能上很相似,都支持复制本地文件到镜像的功能,
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 /data
或VOLUME ["/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 /