Docker容器将软件以及它运行安装所需的一切文件(代码、运行时、系统工具、系统库)打包到一起,这就保证了不管是在什么样的运行环境,总是能以相同的方式运行。就好像Java虚拟机一样,“一次编写,到处运行(Write once, run anywhere)”,而Docker是“一次构建,到处运行(Build once,run anywhere)”。docker其实就是运行在linux下的一个进程,这个进程可以管理很多个“容器”。安装Docker:curl –sSL https://get.docker.com/ | sh

0、
很明显,这是一只鲸鱼,它托着许多集装箱。我们可以把宿主机当做这只鲸鱼,把相互隔离的容器可看成集装箱,每个集装箱中都包含自己的应用程序。

1、docker的核心概念为什么是“容器”而不是“镜像”?
因为“镜像”是无状态的,对同一个镜像docker run两次,将会产生2个“容器”。而“容器”之间是相互隔离的。也即是说,第一次docker run centos,得到容器A,然后bash shell进入。mkdir /app/myDir后退出。第二次docker run centos,得到容器B,再bash shell进入后,/app/myDir是不存在的。因此A和B是相互隔离的。
2、如何从“无状态”到“有状态” ?
docker利用一个叫Dockerfile的文件来描述,从一个“纯净”的镜像,执行哪些步骤(类似脚本的方式),最后产生一个“有状态”的镜像。这样,每个人的Dockerfile都不一样,因此,就泛化出来了,很多“实例镜像”。再docker run实例镜像,那么就是有状态的了。


Docker进程使用的是Linux内核特性,所以你不能在原生的OS X中安装Docker,如果你需要安装Docker,你必须安装Boot2Docker。这个程序中包含了VirtualBox虚拟主机(VM), Docker和Boot2Docker管理工具。

3、不用官方的dockhub了,转而使用国内的仓库daocloud。

1
2
$ echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io\"" | sudo tee -a /etc/default/docker
$ sudo service docker restart

4、
5、Docker利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
7、Dockerfile中每一条指令都创建镜像的一层,注意一个镜像不能超过127层。在删除镜像之前要先用docker rm删掉依赖于这个镜像的所有容器。
8、
9、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ docker-machine create --driver virtualbox default
Running pre-create checks...
Creating machine...
(staging) Copying /Users/ripley/.docker/machine/cache/boot2docker.iso to /Users/ripley/.docker/machine/machines/default/boot2docker.iso...
(staging) Creating VirtualBox VM...
(staging) Creating SSH key...
(staging) Starting the VM...
(staging) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env default

a、This command downloads a lightweight Linux distribution (boot2docker) with the Docker daemon installed, and creates and starts a VirtualBox VM with Docker running.
b、Boot2Docker:Boot2Docker is a lightweight Linux distribution made specifically to run Docker containers. It runs completely from RAM, is a small ~38MB download and boots in ~5s (YMMV).
c、Boot2Docker is used via Docker Machine (installed as part of Docker Toolbox) which leverages VirtualBox’s VBoxManage to initialise, start, stop and delete the VM right from the command line.
d、Boot2Docker是被作为开发工具而设计的,不适用于生产环境中。
10、
$ docker-machine start

$ docker-machine stop

11、docker引擎使用的是Linux内核的特性,所以我们需要在Windows上使用一个轻量级的虚拟机(vm)来运行docker。
12、创建一个容器,让其中运行bash。

1
2
3
  $ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
//运行docker run,将在容器内启动bash shell。-t表示在新容器内指定一个伪终端或终端,-i表示允许我们对容器内的STDIN进行交互。

13、docker logs -f这将使docker logs命令中使用tail -f来查看容器标准输出。
14、现在如何获取一个新的镜像?当我们在本地主机上使用一个不存在的镜像时Docker就会自动下载这个镜像。但是这需要一段时间下载这个镜像。如果我们想预先加载这个镜像,我们可以使用docker pull命令来下载它。
15、-P标记创建一个容器,将容器的内部端口随机映射到主机的高端口49000到49900。
16、docker有一个连接系统允许将多个容器连接在一起,共享连接信息。docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。
17、自动构建:自动构建功能会自动从Github和BitBucket直接将镜像构建或更新至Docker Hub,通过为Github或Bitbucket的仓库添加一个提交的hook来实现,当你推送提交的时候就会触发构建和更新。
18、存出和载入镜像:如果要导出镜像到本地文件,可以使用docker save命令。可以使用docker load从导出的本地文件中再导入到本地镜像库。
19、

20、如果想到Container里执行命令,docker exec -i -t xxxx /bin/bash
21、容器本质上是进程,容器中推荐只运行一个服务。
22、总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
23、Docker是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。
24、Docker是服务器–客户端架构。命令行运行docker命令的时候,需要本机有Docker服务。如果这项服务没有启动,可以用下面的命令启动:sudo service docker start 或 sudo systemctl start docker
25、Docker把应用程序及其依赖,打包在image文件里面。只有通过这个文件,才能生成Docker容器。image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
26、image是二进制文件。实际开发中,一个image文件往往通过继承另一个image文件,加上一些个性化设置而生成。举例来说,你可以在Ubuntu的image基础上,往里面加入Apache服务器,形成你的image。
27、有些容器不会自动终止,因为提供的是服务。对于那些不会自动终止的容器,必须使用docker container kill命令手动终止。
28、注意,docker container run命令具有自动抓取image文件的功能。如果发现本地没有指定的image文件,就会从仓库自动抓取。-it参数:容器的Shell映射到当前的Shell,然后你在本机窗口输入的命令,就会传入容器。
29、image文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
30、列出本机所有容器,包括终止运行的容器:docker container ls –all。容器停止运行之后,并不会消失,用下面的命令删除容器文件:docker container rm [containerID]
31、RUN命令与CMD命令的区别在哪里?简单说,RUN命令在image文件的构建阶段执行,执行结果都会打包进入image文件;CMD命令则是在容器启动后执行。另外,一个Dockerfile可以包含多个RUN命令,但是只能有一个CMD命令。 注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。
32、docker container logs命令用来查看docker容器的输出,即容器里面Shell的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。使用docker container run命令的–rm参数,在容器终止运行后自动删除容器文件。
33、docker container exec命令用于进入一个正在运行的docker容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的Shell执行命令了。(提示符也变了)
34、docker container cp命令用于从正在运行的Docker容器里面,将文件拷贝到本机。
35、对比理解:虚拟机的ISO文件相当于docker的image文件,虚拟机的vdi文件相当于docker的container文件。
36、站在Docker的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储存容器、队列容器……Docker使得软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来。微服务很适合用Docker容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。

37、Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。 docker-compose up //启动所有服务 docker-compose stop //关闭所有服务
38、Docker Compose的另外一个好处就是能够帮我们处理容器的依赖关系,在每个容器中会将容器的IP和服务的名称使用hosts的方式绑定,这样我们就能在容器中直接使用服务名称来接入对应的容器了。
39、注:千万不要在容器实例中存储内容,实例销毁时实例内的所有内容都会被销毁,下次启动的时候又是全新的实例,内容不会保存下来。如果需要存储服务需要使用挂载卷或者外部存储服务。

Comments

去留言
2017-02-14

⬆︎TOP