Docker从入门到实践笔记(一)

1. 修改已有镜像

先使用下载的镜像启动容器。

$ sudo docker run -t -i training/sinatra /bin/bash
[email protected]:/#

在容器中添加 json 和 gem 两个应用。

[email protected]:/# gem install json

当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用docker commit命令来提交更新后的副本。

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m来指定提交的说明信息,跟我们使用的版本控制工具一样;-a可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

使用docker images来查看新创建的镜像。

$ sudo docker images
REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
training/sinatra    latest  5bc342fa0b91   10 hours ago  446.7 MB
ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB
ouruser/sinatra     latest  5db5f8471261   10 hours ago  446.7 MB

之后,可以使用新的镜像来启动容器

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
[email protected]:/#

2. 利用 Dockerfile 来创建镜像

使用docker commit来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用docker build来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。

新建一个目录和一个 Dockerfile

$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

Dockerfile 中每一条指令都创建镜像的一层,例如:

# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <[email protected]>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

Dockerfile 基本的语法是

  • 使用#来注释
  • FROM指令告诉 Docker 使用哪个镜像作为基础
  • 接着是维护者的信息
  • RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件

编写完成 Dockerfile 后可以使用docker build来生成镜像。

$ sudo docker build -t="ouruser/sinatra:v2" .

其中-t标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

*注意一个镜像不能超过 127 层

此外,还可以利用ADD命令复制本地文件到镜像;用EXPOSE命令来向外部开放端口;用CMD命令来描述容器启动后运行的程序等。例如

# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

现在可以利用新创建的镜像来启动一个容器。

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
[email protected]:/#

还可以用docker tag命令来修改镜像的标签。

$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
$ sudo docker images ouruser/sinatra
REPOSITORY          TAG     IMAGE ID      CREATED        VIRTUAL SIZE
ouruser/sinatra     latest  5db5f8471261  11 hours ago   446.7 MB
ouruser/sinatra     devel   5db5f8471261  11 hours ago   446.7 MB
ouruser/sinatra     v2      5db5f8471261  11 hours ago   446.7 MB

*注:更多用法,请参考 Dockerfile 章节。

3. 存出镜像

如果要导出镜像到本地文件,可以使用docker save命令。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               c4ff7513909d        5 weeks ago         225.4 MB
...
$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

4. 载入镜像

可以使用docker load从导出的本地文件中再导入到本地镜像库,例如

$ sudo docker load --input ubuntu_14.04.tar

$ sudo docker load < ubuntu_14.04.tar

这将导入镜像以及其相关的元数据信息(包括标签等)。

5. 移除本地镜像

如果要移除本地的镜像,可以使用docker rmi命令。注意docker rm命令是移除容器。

$ sudo docker rmi training/sinatra

*注意:在删除镜像之前要先用docker rm删掉依赖于这个镜像的所有容器。

6. 新建并启动

所需要的命令主要为docker run。

$ sudo docker run -t -i ubuntu:14.04 /bin/bash
[email protected]:/#

其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。

当利用docker run来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

7. 启动已终止容器

可以利用docker start命令,直接将一个已经终止的容器启动运行。

容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用ps或top来查看进程信息。

[email protected]:/# ps
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   11 ?        00:00:00 ps

可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。

8. 守护态运行

更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。

例如下面的命令会在后台运行容器。

$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

容器启动后会返回一个唯一的 id,也可以通过docker ps命令来查看容器信息。

$ sudo docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
1e5535038e28  ubuntu:14.04  /bin/sh -c ‘while tr  2 minutes ago  Up 1 minute        insane_babbage

要获取容器的输出信息,可以通过docker logs命令。

$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .

9. 终止容器

可以使用docker stop来终止一个运行中的容器。

此外,当Docker容器中指定的应用终结时,容器也自动终止。 例如对于上一章节中只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止。

终止状态的容器可以用docker ps -a命令看到。例如

sudo docker ps -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                          PORTS               NAMES
ba267838cc1b        ubuntu:14.04             "/bin/bash"            30 minutes ago      Exited (0) About a minute ago                       trusting_newton
98e5efa7d997        training/webapp:latest   "python app.py"        About an hour ago   Exited (0) 34 minutes ago                           backstabbing_pike

处于终止状态的容器,可以通过docker start命令来重新启动。

此外,docker restart命令会将一个运行态的容器终止,然后再重新启动它。

10. attach 命令进入容器

docker attach是Docker自带的命令。下面示例如何使用该命令。

$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
[email protected]:/#

但是使用attach命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

11. 导出和导入容器

导出容器

如果要导出本地某个容器,可以使用docker export命令。

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
7691a814370e        ubuntu:14.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
$ sudo docker export 7691a814370e > ubuntu.tar

这样将导出容器快照到本地文件。

导入容器快照

可以使用docker import从容器快照文件中再导入为镜像,例如

$ cat ubuntu.tar | sudo docker import - test/buntu:v1.0
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

此外,也可以通过指定 URL 或者某个目录来导入,例如

$sudo docker import http://example.com/exampleimage.tgz example/imagerepo

*注:用户既可以使用docker load来导入镜像存储文件到本地镜像库,也可以使用docker import来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

12. 删除容器

可以使用docker rm来删除一个处于终止状态的容器。 例如

$sudo docker rm  trusting_newton
trusting_newton

如果要删除一个运行中的容器,可以添加-f参数。Docker 会发送SIGKILL信号给容器。

时间: 2024-08-03 15:36:08

Docker从入门到实践笔记(一)的相关文章

Docker从入门到实践笔记(二)

1. 挂载一个主机目录作为数据卷 使用-v标记也可以指定挂载一个本地主机的目录到容器中去. $ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py 上面的命令加载主机的/src/webapp目录到容器的/opt/webapp目录.这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作.本地目录的路径必须是绝对路径,如果目录不存在

Docker —— 从入门到实践

Docker —— 从入门到实践

Python编程入门到实践 - 笔记(1,2章)

自学 Python 有段时间了,总是觉得自己基础不牢,想着把看完的两本基础书写个博客做个笔记啥的. 准备在重新看一遍<Python编程入门到实践>,坚持写博客笔记. Python编程入门到实践的前两章笔记,学习的内容如下: 查看当前环境中的 python 版本 python环境的搭建 变量和变量的命名 字符串的打印 修改字符串的大小写 制表符和换行符 删除空白字符 python的整数运算,计算平方,立方 使用 str() 函数 查看当前环境中的 python 版本 命令行下输入 python 

Docker 入门到实践笔记1

一.简介: Docker的目标是实现轻量级的操作系统虚拟化解决方案.Docker的基础是Linux容器(LXC)等技术. 容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统.而传统方式则是在硬件层面实现 跟传统虚拟化方式相比容器的启动可以在秒级实现,其次Docker对系统资源利用率很高,容器除了运行其中应用外,基本不消耗额外的系统资源.传统虚拟机方式运行10个不同的应用就要起10个虚拟机,而Docker只需要启动10个隔离的应用即可. 二.优势: 更快速的交付和部署:一次创建或配置,可

【转】Docker —— 从入门到实践

http://yeasy.gitbooks.io/docker_practice/content/index.html Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护. Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc.R

Docker技术入门及实践

01 Docker技术介绍 Docker技术简介 Docker,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何支持docker安装的Linux机器上运行.Docker实现了虚拟化,安全隔离,容器是完全沙箱机制,相互之间不会有任何接口. 一个完整的Docker有以下几个部分组成: 1.Docker Client客户端 2.Docker Daemon守护进程 3.Docker Image镜像 4.Docker Container容器 5.Docke

Python编程入门到实践 - 笔记( 3 章)

练习内容包括 创建并访问列表 列表的索引 使用列表中的各个值 修改列表中的元素 在列表中添加元素 append() 在列表中插入元素 insert() 在列表中删除元素 del,pop() 根据值删除列表中的元素 remove() 对列表中的元素进行排列 1)永久性修改 sort(),按字母表正向排列 2)永久性修改 sort(reverse=True),按字母表反向排列 3)临时修改 sorted(),按字母表正向排列 对列表中的元素进行反转打印 reverse() 计算列表长度 len()

Python编程入门到实践 - 笔记( 5 章)

第 5 章练习了以下内容 简单的 if 判断语句 判断字符串是否相等,还是不等 进行数字的大小比较 and,or 比较 检查列表中是否存在指定的元素 if,if-else,if-elif-else 语句写法 if 判断列表是否为空 使用多个列表进行比较判断 这一章的内容也比较简单,感觉和 shell 差不多,但还是多练习吧. 希望路过的大牛指出不足,小弟在此谢过了. 一个简单的 if 判断语句 循环打印 cars 列表中的元素,如果其中的元素等于 bmw,就全部大写打印 否则只是将元素的首字母大

Python编程入门到实践 - 笔记( 8 章)

第 8 章主要练习了各种函数,内容如下 定义一个简单的函数 向函数传递信息 什么是形参 什么是实参 位置参数 多次调用函数 关键字实参 默认值参数 返回值 return 让参数编程可选的 返回字典 结合使用函数和 while 循环 传递列表 在函数中修改列表 传递任意数量的实参 传递任意数量的参数并循环打印 结合使用位置参数和任意数量实参 使用任意数量的关键字实参 导入整个模块 导入特定的函数 使用 as 给函数指定别名 使用 as 给模块指定别名 导入模块中所有的函数 定义一个简单的函数 直接