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
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初识的更多相关文章
- docker --- 初识
Docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).ba ...
- docker 初识之二(简单发布ASP.NET Core 网站)
在发布ASP.NET Core网站以前,先介绍一下DaoCloud 一个免费的docker云容器服务平台.登陆官方网站,创建一台docker主机,这台主机有120分钟的使用时间,对于鄙人学习使用正好合 ...
- 1021 docker初识
docker与虚拟机相比,没有虚拟化内核,转而使用宿主机的内核.因此docker更轻更快 docker缺点:后端兼容性测试需求.把软件安装在不同的操作系统上进行测试,观察软件运行是否良好. 不能用do ...
- Docker初识笔记
Docker docker说白了就是:环境打包 我们能用docker什么? 1.如果配置好本地的linux环境交接给其他人,很麻烦,交接时要告诉他,装这个装那个,还可能出现问题,那我直接把这个环境放到 ...
- Docker 初识之路
一. 安装配置 1.安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2.设置阿里云镜像源 sudo yu ...
- Docker学习のDocker初识
一.Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...
- docker 初识1
学习网址 https://git.oschina.net/yangllsdev/docker-training https://docs.docker.com/engine/installation/ ...
- docker初识-docker安装、基于docker安装mysql及tomcat、基本命令
一.docker是什么 用go语言开发,开源的应用容器引擎,容器性能开销极低 二.整体架构图 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 r ...
- Docker 学习应用篇之一: 初识Docker
Docker 自从2013年以来就非常的火热,无论是从github上的代码活跃度,还是Redhat在RHE6.5中集成对Docker的支持,等等.第一次接触Docker,还是老师给我们介绍的. 1.初 ...
随机推荐
- sqlalchemy - day2
Relationship Configuration 一.one to many 直接上代码 from sqlalchemy import create_engine engine = create ...
- 11.python中的元组
在学习什么是元组之前,我们先来看看如何创建一个元组对象: a = ('abc',123) b = tuple(('def',456)) print a print b
- 帮朋友 解决一道 LeetCode QJ上问题
引言 对于刷题,自己是没能力的. 最经一个朋友同事考我一道数组题 . 也许能当面试分享吧. 娱乐娱乐. 事情的开始是这样的. 前言 题目 截图 大概意思 是 在一个 数组中,找出其中两个不重复出现的元 ...
- PAT乙级真题1003. 我要通过!(20)(解题)
“答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1 ...
- Effiective C++ (一)
最近在看Effective C++ ,同时将总结一下里边的重要知识点: ########################## module 1 #################### ...
- ubuntu server 14.10 安装 nodejs
apt-get install nodejs 会报错,提示内核版本过低.如果升级,可能遇到提示boot空间不足,要求释放更多空间: sudo aptitude purge ~ilinux-image- ...
- Entity Framework学习笔记(四)----Linq查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...
- FPGA仿真设置步骤
1.FPGA仿真流程图 2.FPGA时序图 3.FPGA开发方式
- C++设计模式——工厂方法模式
本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...
- 子网划分与CIDR(斜杠加数字的表示与IP 的关系)(改进)
子网和CIDR 将常规的子网掩码转换为二进制,将发现子网掩格式为连续的二进制1跟连续0,其中子网掩码中为1的部份表示网络ID,子网掩中为0的表示主机ID.比如255.255.0.0转换为二进制为1 ...