Docker初识

Docker--从入门到实践》是Docker技术的入门教程,学习时长两天,现整理关键点如下:

1. 什么是Docker?

轻量级操作系统虚拟化解决方案;Go语言实现;下图很好地说明了Docker共享kernel的特性:

2. 三个基本概念。

镜像Image:只读模板,可理解为预设的开发平台

仓库Repository:集中存放Image,可push可pull

容器Container:运行应用,是Image的实例

3. 安装。

Docker是基于Linux内核的,因此在类Linux系统下安装较容易,各平台安装过程戳这里。微软出来说将提供原生支持Docker的windows server,但近几年估计是看不到了,因此使用集成了Docker客户端、VirtualBox、MSYS-git、boot2docker等组件的安装器进行安装,安装后Docker实际上是跑在运行着Linux内核系统的虚拟机上,如下图所示:

安装完之后,在系统环境变量PATH中添加如下值:

C:\Program Files (x86)\Git\bin

打开cmd,使用如下命令启动Docker

boot2docker start

从上图中可以看出Docker要求设置DOCKER_HOST、DOCKER_GERT_PATH、DOCKER_TLS_VERIFY三个环境变量,将这三个set复制粘贴下来运行即可。此后即可以在cmd中使用docker的各种命令了。

但是,如果IP地址发生了变化,或者有时boot2docker重启时,输入docker命令后会出现如下错误:

意思是之前生成的证书对于当前的IP地址是无效的,因此无法使用。在Github的讨论帖中给出了一个解决方案:

boot2docker ssh
sudo ntpclient -s -h pool.ntp.org

亲测可用,如下图所示:

4. sudo docker pull ubuntu:14.04

pull命令是从Docker Hub等仓库中下载镜像的命令,如上面这条命令执行时会先在本地中查找是否有ubuntu:14.04的Image,如果没有,则默认登录到Docker Hub中下载该镜像。

5. sudo docker images

显示本地镜像,其中每个镜像的IMAGE ID是唯一的。

6. sudo docker run -t -i ubuntu:14.04 /bin/bash

 创建并运行一个容器:run表示运行;-t 表示分配一个伪终端并绑定到容器的标准输入上;-i 表示让容器的标准输入保持打开;ubuntu:14.04表示容器基于该镜像;/bin/bash 表示在容器中运行bash应用;-d 表示以守护态运行,此时可通过 docker logs <容器名> 的方式来查看容器的输出信息,通过docker attach <容器名>的方式进入容器进行操作。

docker run在后台运行的标准操作包括:

1)检查本地是否存在指定镜像,不存在则从公有仓库下载

2)利用镜像创建并启动一个容器

3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层

4)从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中

5)从地址池配置一个IP地址给容器

6)执行用户指定的应用程序

7)程序执行完毕后容器被终止

7. Dockerfile

新建目录dirA,在该目录下新建文件Dockerfile,Dockerfile内容类似下文:

#This is a docker file created by openxxs
FROM ubuntu:14.04
MAINTAINER openxxs <openxxs@gmail.com>

RUN apt-get -qq update
RUN bash -c 'echo "Hello Docker"'

RUN groupadd -r girlfriend && useradd -r -g girlfriend Lily
USER Lily
EXPOSE
5900 CMD /bin/bash CMD ["/bin/ls", "-a"] ADD mylocalpath/myfile /usr/www

此时即可使用 sudo docker build -t myImage:v1 mypath/dirA 来创建自己的镜像了。

常用命令:

FROM <image>:<tag> Dockerfile第一条命令

MAINTAINER <name>

RUN <cmd> 等价于 /bin/sh -c;RUN ["executable", "param1", "param2"] 等价于exec

CMD 容器启动时执行,只能有一条有效,如上文的Dockerfile中仅 CMD ["/bin/ls", "-a"]有效 而 CMD /bin/bash 无效

EXPOSE <port> 容器暴露给外界的端口号

ENV <key> <value> 指定环境变量

ADD <src> <dest> 将本地目录(相对Dockerfile所在目录的相对路径)或网络目录或tar文件复制到容器的指定目录中;COPY与之类似,但只能复制本地目录

ENTRYPOINT 容器启动后执行,只能有一条有效

VOLUME ["/data"] 创建可以从本地主机或其他容器挂载的挂载点

USER daemon 指定运行容器时的用户名或UID

WORKDIR workdir 指定后续命名的工作目录

ONBUILD [上面列出的指令均可] 该镜像作为其它新创建镜像的基础镜像时,所执行的指令,即相当于FROM之后再执行ONBUILD指定的指令

8. 镜像管理

使用openvz下载的模板从本地导入镜像 sudo cat ubuntu-14.04.tar.gz | docker import - ubuntu:14.04

上传镜像 sudo docker push ubuntu:openxxs

存出镜像 docker save -o ubuntu_openxxs.tar ubuntu:openxxs

载入镜像 docker load --input ubuntu_openxxs.tar

9. 移除

docker rm 移除容器;docker rmi 移除镜像

在移除镜像前先要移除依赖于该镜像的所有容器

10. Union FS

每个镜像由很多层次构成,Docker使用Union FS将这些不同层结合到一个镜像中,实现增量的修改与维护。

Union FS可以实现不借助LVM、RAID将多个disk挂到同一目录下;可将一个只读分支和一个可写分支联合到一起。

Union FS将不同的文件系统差异屏蔽,统一成唯一的文件系统,不同文件系统的相同路径下的内容会被合并成一个新的、虚拟的文件系统。

The different branches may be either read-only and read-write file systems, so that writes to the virtual, merged copy are directed to a specific real file system. This allows a file system to appear as writable, but without actually allowing writes to change the file system, also known as copy-on-write. This may be desirable when the media is physically read-only, such as in the case of Live CDs.

11. docker ps

查看正在运行的容器;-a 将列出所有运行过的容器信息;-l 参数列出最近一次运行的容器信息。

12. 容器的导入导出

docker export <容器ID> > ubuntu.tar

cat ubuntu.tar | docker import - ubuntu:openxxs

 13. 数据卷 Data Volumes

是一个可供多个容器使用的特殊目录,具有如下特性:

1)数据卷可在容器之间共享和重用

2)对数据卷的修改会立即生效

3)对数据卷的更新不会影响镜像

4)卷会一直存在,直到没有容器使用

docker run -v /webapp ubuntu:openxxs python app.py 创建并加载一个数据卷到容器的 /webapp 目录下。

docker run -v /src/webapp:/opt/webapp ubuntu:openxxs python app.py 加载主机的/src/webapp目录到容器的/opt/webapp目录下。“-v /src/webapp:/opt/webapp:ro”,默认权限为读写,加了ro可挂载为只读。

14. 数据卷容器 Data Volume Container

数据卷容器是专门用来提供数据卷供其它容器挂载的正常容器,以实现在容器之间共享持续更新的数据。

sudo docker run -d -v /data --name dbdata ubuntu:openxxs 创建数据卷容器 dbdata。

sudo docker run -d --volumes-from dbdata --name db1 ubuntu:openxxs 容器db1挂载dbdata中的数据卷。

如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 来指定同时删除关联的容器。

15. docker inspect <容器名>

查看容器的所有变量信息。

16. 端口映射

-P 随机映射一个49000~49900端口到内部容器开放的网络端口。

-p 5000:5000 本地的5000端口映射到容器的5000端口。

-p 127.0.0.1:5000:5000 绑定localhost的5000端口到容器的5000端口。

-p 127.0.0.1::5000 绑定localhost的任意一个端口到容器的5000端口。

-p 127.0.0.1:5000:5000/udp 默认为tcp,使用udp标记来指定udp端口。

docker ps 可以查看到映射情况,docker port <容器名> <容器端口号> 也可以查看到映射情况。一条docker run中可使用多个-p。

17. 容器互联

在源容器与接收容器之间创建一个隧道,接收容器可以看到源容器中指定的信息。

sudo docker run --name web --link db:dblink ubuntu:openxxs python app.py 创建从容器名为web的接收容器到容器名为db的源容器之间的连接名为dblink的连接。

18. 网络配置

当Docker启动时,自动在主机上创建一个docker0虚拟网桥,并随机分配一个本地未占用的私有网段中的一个地址给docker0接口。

创建容器时,会生成一对连接容器与docker0的 veth 接口。当数据包发送到一个接口时,另一个接口也能收到相同的数据包。

默认情况下,容器可以主动访问到外部网络的连接,但在未设置-p或-P时外部网络无法访问到容器。容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址,这是使用iptables的源地址伪装操作实现的。

19. 底层实现核心技术

1)命名空间namespace:每个容具有自己单独的命名空间,保证了容器间互不影响。命名空间包括pid(隔离不同用户的进程), net(隔离容器的网络), ipc(Interprocess Communication,进程间交互方式,隔离IPC资源申请), mnt(隔离每个命名空间中的进程所看到的文件目录结构), uts(UNIX Time-sharing System,允许每个容器拥有独立的host name和domain name,使其在网络上可被视为一个独立的节点而不是主机的一个进程), user(可以在容器内使用容器内的用户执行程序而不用使用主机上的用户)等。

2)控制组control groups:对共享资源进行隔离、限制和审计。

3)Union FS:Docker中使用AUFS(AnotherUnionFileSystem)。

4)容器格式container format。

posted on 2015-07-13 12:13  openxxs  阅读(525)  评论(0编辑  收藏  举报

导航