Docker

1 安装软件

从官网 https://download.docker.com/ 下载与操作系统版本相符的 docker ,检查安装成功与否。

sudo docker info

docker 命令必须由超级用户执行,建议赋予 docker 超级用户的权限以免今后频繁输入 sudo,或直接使用根用户。

sudo usermod -aG docker username

username 为当前登录用户的用户名。重启生效。

2 编写文档

dockerfile 语法简单,依葫芦画瓢即可。

FROM ubuntu:16.04

LABEL chittleskuny <chittleskuny@gmail.com>

ENV DEBIAN_FRONTEND=noninteractive \
    DEBCONF_NONINTERACTIVE_SEEN=true

RUN apt-get update

RUN apt-get -yq install tzdata && \
    ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    dpkg-reconfigure -f noninteractive tzdata

RUN apt-get -yq install build-essential && \
    apt-get -yq install vim && \
    apt-get -yq install git

RUN mkdir -p /home/sources/ /home/workspace/

WORKDIR /home/workspace/

EXPOSE 3023

CMD ["/bin/bash"]
  • ADD 命令会自动解压加塞的压缩包文件,而 COPY 命令不会自动解压。
  • source /etc/profile 一类的命令交由 ENV 处理,参数引用的变量必须在前镜像中存在。
  • 时间默认本初子午线 UTC/GMT +0 ,有多种方法改成当地时间,示例中的方法是最简洁的一种。

3 构建镜像

运行命令查看本地是否存在 dockerfile 的基础镜像。如果本地没有, docker 将在构建过程中从 DockerHub 远程服务器下载。该命令也用于获取镜像 id (输出结果的第 3 列)。

docker images

docker pull centos:7.4

运行命令构建指定项目的运行环境的镜像。 xxxxxx:xx.xx 分别是项目名称和镜像版本号。

docker build --tag=xxxxxx:xx.xx PATH_TO_Dockerfile

构建镜像默认的网络模式是桥接,它可能导致内网访问受限,可以尝试追加选项 --network=host 解决。

在构建之初, docker 会分析新 dockerfile 与已经运行过的 dockerfile 的差别,相同部分将基于缓存构建,但该分析过程不考据命令所涉及的脚本文件。添加选项 --no-cache 即可忽略既有缓存,从头构建镜像。

"docker build" requires exactly 1 argument
docker build 命令后面必须跟一个路径,该路径包含必要的源文件,当 Dockerfile 已被绝对路径指定,没有其它必要的源文件时,不妨直接使用当前目录 .

4 生成容器

镜像是个类,容器是个实例,容器基于镜像生成。

运行命令生成容器。

docker create -it xxxxxx:xx.xx

如有主机目录想挂载到容器上,只能在这一步指定。冒号前面为主机路径,后面为容器路径,路径都是绝对路径。

docker create -v .../repo/:/home/workspace/repo/ -v .../data/:/home/workspace/data/ -it xxxxxx:xx.xx

对于权限错误 ls: cannot open directory .: Permission denied 还需追加选项:

docker create --privileged=true -v .../repo/:/home/workspace/repo/ -v .../data/:/home/workspace/data/ -it xxxxxx:xx.xx

不妨给容器起个直白的名字。

docker rename old_name new_name

获取容器 id (输出结果的第 1 列),运行命令导出容器的镜像文件作为备份。

docker ps -a
docker export ba0987654321 > xxxxxx_xx.xx.tar

导出命令 export 与保存命令 save 的差别
导出命令只保留了容器的当前状态,而保存命令还保留了容器的历史状态。因此,保存命令的镜像文件往往比导出命令的镜像文件体积大。

镜像文件可以转存到其他主机,运行命令导入成为其它主机的镜像。

docker import xxxxxx_xx.xx.tar xxxxxx:xx.xx
docker images

5 使用容器

开启容器并观察,默认 root 用户。

docker start ba0987654321
docker attach ba0987654321

docker exec --interactive --tty /bin/bash

主机与容器互相传输文件,注意命令均在主机上运行。

docker cp .../repo/ ba0987654321:/home/workspace/repo/
docker cp ba0987654321:/home/workspace/repo/ .../repo/

在容器内运行命令 exit 可关闭容器。如内有程序仍在运行,只想暂时停止观察,使用热键 Ctrl+P+Q 离开容器回到主机。

6 销毁容器

运行命令销毁容器,支持同时销毁多个。

docker rm ba0987654321 cba098765432

或批量删除所有不在运行状态的容器。

docker rm $(docker ps -a -q)

7 删除镜像

删除镜像之前,务必销毁所有基于该镜像生成的容器。

可以根据标签删除镜像,也可以根据镜像 id 删除镜像,支持同时删除多个。若镜像拥有多重标签,则需要 -f 强制删除。

docker rmi xxxxxx:xx.xx yyyyyy:yy.yy
docker rmi ba0987654321 cba098765432