Docker笔记一
容器的基本结构
镜像(images)就是一堆只读层的统一视角。
从上向下可以看到多个只读层,他们从叠在一起。上层有指针指向本层,并且这些只读层可以在主机访问。docker 的统一文件系统(Aufs)技术将不同的层整合成一个文件系统,为这些层提供了统一的视角,在用户角度来看,只存在一个文件系统。
容器
容器就是在镜像的统一视角上加可读可写的一层。
容器: 镜像 + 读写层。
使用dockerfile文件定制镜像
首先看一张docker文件系统图:
dockerfile常用指令有:
- FROM 指定基础镜像。
FROM ubuntu:16.04
- RUN 执行命令行命令。用来执行shell命令:
RUN apt-get update
- COPY 复制文件。将构建上下文目录中的文件/目录复制到新的一层镜像内。
COPY app/* /usr/src/app
- ADD 更高级的复制文件。性质和COPY 基本一致,但是可以以url作为源路经。并且如果目标文件是tar压缩文件,ADD 命令会自动解压到目标路径。
- ENV 设置环境变量
ENV VERSION=1.0 EMAIL="xxx.gmail.xom"
- VOLUME 定义匿名卷
VOLUME /data
。 - EXPOSE 暴露端口,但这只是声明,并不会在运行时因此声明而开启端口,不过在运行时指定随机映射端口(docker run -P)时会使用该声明的端口
EXPOSE 80
。 - WORKDIR 指定工作目录,该层后的各层都以该目录为当前目录
WOEKDIR /app
。 - USER 指定当前用户,和WOEKDIR相似改变本层环境状态影响后面各层。
由上图和下图可以看出–每一条dockerfile命令都会创建一层新镜像(重复的执行 1.create和start 2.修改 3.commit),而aufs文件系统对镜像层数有限制,所以如何编写最佳dockerfile文件值得深思。
构建镜像
docker build -t [tag] [镜像构建上下文]
Docker 基本操作图解
挂载卷
可以在dickerfile中使用
VOLUME [“<路径一>”,<路径二>]
也可以在启动时使用
docker run -v <本地路径>:<容器路径> 来挂载 ... #(会覆盖dockerfile中挂载设置)
数据卷:
docker提供一种高级的用法– 数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录。数据卷的使用,类似于Linux下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷。
docker volume create my-vol # 创建数据卷
docker volume ls # 查看所有的数据卷
docker volume inspect my-vol # 查看制定数据卷的详细信息
# 容器启动时 可以使用 -v my-vol:/data 或 --mount source=my-vol,target=/data 来挂载数据卷
数据容器(已不使用):“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。
docker run -v /home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash
# 创建一个普通的容器。用--name给他指定了一个名(不指定的话会生成一个随机的名子)。
# 再创建一个新的容器,来使用这个数据容器。
docker run -it --volumes-from dataVol ubuntu64 /bin/bash
# --volumes-from用来指定要从哪个数据容器来挂载数据。
docker 网络管理
单个Docker容器是默认地与其他容器和外部网络隔离的。Docker提供了bridge接口,名为docker0,这其实是在Docker Engine安装时就建立好的。
它通过Docker的bridge接口作为网关可以让容器间以及容器和主机之间进行通信。
ifconfig docker0 # 查看宿主机上的docker bridge
➜ ~ ifconfig docker0
docker0 Link encap:Ethernet HWaddr 02:42:f0:6e:e5:47
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:f0ff:fe6e:e547/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:56272 errors:0 dropped:0 overruns:0 frame:0
TX packets:72764 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4101518 (4.1 MB) TX bytes:106931650 (106.9 MB)
一、外部访问容器内某些应用
启动时 使用 -P 和 -p 参数指定端口映射。
使用 -P 时docker会随机映射一个 49000~49900 的端口 到 容器内部开放的网络端口。
使用 -p 时 (可以多次使用来绑定多个端口)
- ‘ -p 80:80 ’ 即 映射容器的80端口到主机所有地址的80端口
- ‘-p 127.0.0.1:80:80’ 映射容器借口到指定地址的接口
- ‘-p 127.0.0.1::80’ 映射到指定地址的任意接口
- ‘-p 127.0.0.1:80:80/udp’ 使用udp标记指定udp端口
新建一个桥接网络
docker network create -d bridge one-net
➜ ~ ifconfig # 新的桥接网络创建好后 通过ifconfig打印可以看出 网关为172.18.0.1
br-410e7c6dcd3c Link encap:Ethernet HWaddr 02:42:bf:21:46:ce
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:bfff:fe21:46ce/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:108 errors:0 dropped:0 overruns:0 frame:0
TX packets:338 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6768 (6.7 KB) TX bytes:47071 (47.0 KB)
在容器启动时通过 –network参数设置加入那个网络:
docker run -it --rm --name="c1" --network one-net ubuntu:16.04 bash
DNS配置
docker 默认使用宿主机的dns信息。如果主机的resolv.conf改变,而容器的状态为stoped,则立即更新。如果状态为running等到变为stoped后更新。
可以在启动时使用:
- –dns=‘IP_ADDEESS’将DNS服务器添加到容器的/etc/resolv.conf
- -h HOSTNAME | –hostname=HOSTNAME 可以将hostname设置到容器的/etc/hosts、/etc/hostname、bash中
- –link=CONTAINER or ID:ALIAS 可以将ALIAS和CONTAINER_NAME/ID对应的容器IP添加到容器的/etc/hosts中。
docker run
命令是 docker create
和 docker start
命令的组合