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
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。

Docker初识的更多相关文章

  1. docker --- 初识

    Docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).ba ...

  2. docker 初识之二(简单发布ASP.NET Core 网站)

    在发布ASP.NET Core网站以前,先介绍一下DaoCloud 一个免费的docker云容器服务平台.登陆官方网站,创建一台docker主机,这台主机有120分钟的使用时间,对于鄙人学习使用正好合 ...

  3. 1021 docker初识

    docker与虚拟机相比,没有虚拟化内核,转而使用宿主机的内核.因此docker更轻更快 docker缺点:后端兼容性测试需求.把软件安装在不同的操作系统上进行测试,观察软件运行是否良好. 不能用do ...

  4. Docker初识笔记

    Docker docker说白了就是:环境打包 我们能用docker什么? 1.如果配置好本地的linux环境交接给其他人,很麻烦,交接时要告诉他,装这个装那个,还可能出现问题,那我直接把这个环境放到 ...

  5. Docker 初识之路

    一. 安装配置 1.安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2   2.设置阿里云镜像源 sudo yu ...

  6. Docker学习のDocker初识

    一.Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...

  7. docker 初识1

    学习网址 https://git.oschina.net/yangllsdev/docker-training https://docs.docker.com/engine/installation/ ...

  8. docker初识-docker安装、基于docker安装mysql及tomcat、基本命令

    一.docker是什么 用go语言开发,开源的应用容器引擎,容器性能开销极低 二.整体架构图 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 r ...

  9. Docker 学习应用篇之一: 初识Docker

    Docker 自从2013年以来就非常的火热,无论是从github上的代码活跃度,还是Redhat在RHE6.5中集成对Docker的支持,等等.第一次接触Docker,还是老师给我们介绍的. 1.初 ...

随机推荐

  1. Python核心编程--学习笔记--9--文件和输入输出

    本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数.内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块. 1 ...

  2. rails笔记

    rake -T 列出全部taskconfig.active_record.schema_format = :sql #remove the old db/schema.rb file, create ...

  3. 刀哥多线程全局队列gcd-09-global_queue

    全局队列 是系统为了方便程序员开发提供的,其工作表现与并发队列一致 全局队列 & 并发队列的区别 全局队列 没有名称 无论 MRC & ARC 都不需要考虑释放 日常开发中,建议使用& ...

  4. L2-015. 互评成绩

    学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩.系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩.本题就要求你编写这个互评系统的算分模块. ...

  5. Redo日志

    undo日志有一个潜在的问题,即我们在将书屋改变的所有数据写到磁盘前不能提交该事务.有时,如果让数据库修改暂时只存在于主存中,我们可以节省磁盘IO;只要在崩溃发生时有日志可以恢复,这样做就是安全的. ...

  6. Linux后门入侵检测

    蛋疼啊,服务器被入侵成肉鸡了,发出大量SYN请求到某个网站!(瞬间有种被OOXX(强)(奸)的赶脚) 泪奔ING... 源起: Linux服务器日常检查,#ps aux 发现大量httpd进程,和往常 ...

  7. MVC 中的@Html.DropDownList下拉框的使用

    MVC 中的下拉框 实现方式,下面为大家介绍一个我自己认为比较好用的实现方式,而二话不说直接上代码: 第一步: 后台代码 //公共的方法 //在每次需要展示下拉框的时候,需要调用一下这个方法 [数据源 ...

  8. 思维认知-读mindhacks杂记

    1. 导语 无意中浏览知乎,搜索到了mindhacks.cn这个个人geek的网址.mindhacks博主本人是牛人程序员一枚,但他的博客主题涵盖的主要内容确是思维改变生活. 博客链接地址:http: ...

  9. 启动级别:init 0,1,2,3,4,5,6

    这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下.. 0:停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system 3:完全多用户 5:图形化 ...

  10. 【Permutations II】cpp

    题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...