Docker学习记录

官方文档

1. Docker三个基本概念

  • 镜像 (Image)
  • 容器 (Container)
  • 仓库 (Repository)
1. Docker镜像

操作系统分为内核和用户空间。Linux来说,内核启动后会挂载root文件系统为其提供用户空间支持。而Docker镜像,就相当于一个root文件系统。

2. Docker容器

镜像和容器,就像类和实例。镜像是静态的定义,容器是镜像运行时的实体。容器的本质是进程,但容器进程运行于属于自己的独立的命名空间。DOcker最佳实践要求,容器不应该向其存储层内写入任何数据,文件写入操作应该使用数据卷或者绑定宿主目录。

3. Docker仓库

就像GitHub一样,每个仓库Tag对应Branch,包含一个镜像。

2. 使用Docker镜像

获取镜像
1
2
docker pull [选项] [仓库地址]<仓库名>:标签
docker pull --help
  • 仓库地址默认为官方镜像
运行
1
docker run -it --rm ubuntu:14.04 bash
  • -it 其中-i是交互式操作,-t是终端。
  • --rm 容器退出后立即删除。
  • bash 放在镜像名后的是命令。
  • 最后通过exit退出容器。
列出镜像
1
docker images
  • -f dangling=true 可以看到虚悬镜像。
  • -a 可以看到中间层镜像。
  • ubuntu根据仓库名列出镜像。
  • -f since=mogo:3.2强大的过滤器功能。
  • -q 只显示ID。
  • --format ""只包含镜像ID和仓库名。
commit命令
1
docker run --name webserver -d -p 80:80 nginx
  • --name webserver 命名。
  • -d -p 80:80 端口映射。
1
docker exec -it webserver bash
  • 在里面修改了容器的文件,就是改动了容器的存储层。
1
docker diff webserver
  • 查看两者变化
1
docker commit [选项] <容器ID或容器名> [<仓库名>[:标签]]
  • 实际很多文件改动了,会导致镜像几位臃肿。
  • 意味着黑箱操作,除了制作人指导执行过什么命令,别人无从得知。
定制镜像

如果我们把每一层用到的命令写入一个脚本,用这个脚本来构建、定制镜像,之前commit问题就会解决,脚本就是Dockerfile.

1
2
3
mkdir mynginx
cd mynginx
touch Dockerfile

内容为:

1
2
FROM nginx
RUN echo '<h1>hello, Docker!</h1>' > /usr/share/nginx/html/index.html
  • FROM 指定基础镜像。
  • RUN 执行命令,每个指令会新建一层,应该尽量减少命令行数,行尾添加\换行,然后多个命令用&&
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/r
edis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-component
s=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
构建镜像

Dockerfile文件所在目录执行:

1
docker build -t nginx:v3 .
  • .是当前目录,指定了上下文的目录,build会将其内容打包以帮助构建镜像。所以在Dockerfile中才能写COPY ./package.json,这就将数据传过去了。
多种方式进行构建
1
2
3
4
5
docker build https://github.com/twang2218/gitlab-ce-zh.git\#:8.14
docker build http://server/context.tar.gz
docker build - < Dockerfile
cat Dockerfile | docker build -
docker build - < context.tar.gz

3. Dockerfile指令详解

COPY 复制文件
ADD 更高级的复制文件
CMD 容器启动命令
ENVIRONMENT 入口点
ENV 设置环境变量
ARG 构建参数
VOLUME 定义匿名卷
EXPOSE 声明端口
WORKDIR 指定工作目录
USER 指定当前用户
HEALTHCHECK 健康检查
ONBUILD 为他人做嫁衣裳

4. To be continue…