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.初 ...
随机推荐
- python中列表和元组的使用方法和区别
一.二者区别 列表: 1.可以增加列表内容 append 2.可以统计某个列表段在整个列表中出现的次数 count 3.可以插入一个字符串,并把整个字符串的每个字母拆分当作一个列表段追加到列表 ...
- 010-python基础-数据类型-字符串操作
1.移除空白 username.strip() 2.分割 names = "alex,jack,rain" names_1 = names.split(",") ...
- SRF之日志和异常
日志: 日志功能采用log4net实现 log4配置文件在站点目录下的log4net.config. 调用log4写日志的代码如下: log4net.ILog logger = log4net.Log ...
- Moses更改权重的命令变化 -d -t -
-l 可以用: weight-l 或者lm (不需要在前面加-) 还是用-weight-overwrite “Distortion0= 0"更保险 reording weight i ...
- 使用Moses中tokenizer.perl无法正常工作:纠结的"<" 和">"(已解决)
发现居然没有输入文本和输出文本,折腾了一晚上,到了半夜终于搞懂了: 官方的Manual上这么写的: The tokenisation can be run as follows: ~/mosesdec ...
- PHP 学习笔记 01
例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...
- oracle 查询谁在用undo
SELECT TO_CHAR(s.sid)||','||TO_CHAR(s.serial#) sid_serial,NVL(s.username, 'None') orauser,s.program, ...
- jquery 源码学习(*)
最近在做日志统计程序,发现对方的程序是在Jquery基础上进行开发的,而公司的网站的框架是prototype.而且我也早就想了解一下Jquery源码,故决定研究Jquery源码,模拟它的方法 Jq ...
- b75,gtx560,I5 安装10.10.2
1.安装变色龙,wowpc.iso,这个是可以让电脑从windows引导 mac 安装的. 2.把黑苹果CDR压到一个硬盘分区里去. 3.安装10.10.2,把安装盘里的extra拷贝到 系统盘里 , ...
- exception -----> Functions
/* current_exception */ exception_ptr current_exception() noexcept; 返回指向当前异常(或其副本)的智能指针[具体返回对象本身还是副本 ...