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