Docker笔记 基础理解

版权声明:可以胡乱转载。 https://blog.csdn.net/hunyxv/article/details/80735135

Docker笔记一

容器的基本结构

容器分层

镜像(images)就是一堆只读层的统一视角。

镜像
从上向下可以看到多个只读层,他们从叠在一起。上层有指针指向本层,并且这些只读层可以在主机访问。docker 的统一文件系统(Aufs)技术将不同的层整合成一个文件系统,为这些层提供了统一的视角,在用户角度来看,只存在一个文件系统。

容器

容器
容器就是在镜像的统一视角上加可读可写的一层。
容器: 镜像 + 读写层。

使用dockerfile文件定制镜像

首先看一张docker文件系统图:
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 命令执行过程


构建镜像

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 createdocker start 命令的组合

猜你喜欢

转载自blog.csdn.net/hunyxv/article/details/80735135
今日推荐