您的位置:首页 > 运维架构 > Docker

Docker笔记

2016-07-26 18:51 405 查看

docker 镜像

启动docker instance: sudo docker run -t -i training/sinatra /bin/bash

:)

导出镜像

docker save -o ubuntu.tar ubuntu:14.04

载入镜像

docker load –input ubuntu.tar

移除本地镜像

docker rmi training/sinatra 注意 docker rm 是移除容器.

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

docker images 可以列出本定所有的镜像

移除未打标签的本地镜像

docker rmi $(docker images -q -f "dangling=true")


q,f都是缩写

完整的是:

docker rmi $(docker images --quiet --filter "dangling=true")


容器

启动容器

两种方式:

1. 基于镜像的方式新建一个容器并启动。

2. 终止的容器中重启。

由于docker的轻量,很多时候用户都是随时删除和新创建容器。

docker run ubuntu:14.04 /bin/echo 'Hello world'


下面的命令则启动一个bash终端,允许用户进行交互。

docker run -t -i ubuntu:14.04 /bin/bash


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

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

- 检查本地是否存在指定的镜像,不存在就从公有仓库下载

- 利用镜像创建并启动一个容器

- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层

- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

- 从地址池配置一个 ip 地址给容器

- 执行用户指定的应用程序

- 执行完毕后容器被终止

启动已终止的容器

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

后台运行(background)

可以通过添加参数 -d 来实现。

如果没有-d 则会打印到标准的输出。(STDOUT)

如果使用的是-d参数运行容器。

docker run -d ubuntu:14.04 /bin/sh -c “while true;do echo hello world;sleep 1;done”

此时,容器会打印结果到docker logs中去。

可以用
docker ps
来查看该进程

可以用
docker logs [container ID OR Names]
来查看输出。

终止容器

终止

docker stop
命令终止。

docker ps -a
命令来看到终止的容器。

处于终止状态的容器可以使用docker start|restart 来启动。

进入容器

docker attach

nsenter

back容器

导出容器

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

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


docker export 7691a814370e


导入

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

也可以通过指定URL或者目录来导入,例如:

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


删除容器

docker rm id

仓库

仓库(Repository)是集中存放镜像的地方。

一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 dl.dockerpool.com/ubuntu 来说,dl.dockerpool.com 是注册服务器地址,ubuntu 是仓库名。

Docker Hub 目前Docker 官方维护了一个公共的Docker Hub,其中已经包含了超过15000个镜像。

搜索镜像

$ sudo docker search centos


下载直接:

$ sudo docker pull centos


私有仓库

公共的仓库可能不是太安全。所以新建私有仓库。

docker-registry是官方的工具。

安装docker-registry

容器运行

在安装了Docker后,可以通过获取官方registry镜像来运行。

docker run -d -p 5000:5000 registry


数据管理

数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

- 数据卷可以在容器之间共享和重用

- 对数据卷的修改会立马生效

- 对数据卷的更新,不会影响镜像

- 数据卷默认会一直存在,即使容器被删除

*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

创建一个数据卷

在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。

删除数据卷

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。无主的数据卷可能会占据很多空间,要清理会很麻烦。Docker官方正在试图解决这个问题,相关工作的进度可以查看这个。

挂载一个主机目录作为数据卷

使用
-v
标记也可以指定挂载一个本地主机的目录到容器中去。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py


上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。

*注意:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。

Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro

training/webapp python app.py


挂载一个本地文件作为数据卷

-v 标记也可以从主机挂载单个文件到容器中

sudo docker run –rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

这样可以记录在容器中输入过的命令了。

Docker 网络功能

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P或者-p参数来指定端口映射。

当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

使用
docker ps
可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。

如果不使用
-P
的话,者不会分配端口。

sudo docker run -d -P training/webapp python app.py


sudo docker ps -l
CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse


同样可以使用docker logs 来查看相关信息。

docker logs -f nostalgic_morse


ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort


映射所有接口地址

使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行+

$ sudo docker run -d -p 5000:5000 training/webapp python app.py


映射到指定地址的指定端口

可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1

docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py


查看端口映射配置

docker port nostalgic_morse 5000

注意:

容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)

-p 标记可以多次使用来绑定多个端口

docker run -d -p 5000:5000  -p 3000:80 training/webapp python app.py


容器连接

容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。

该系统会在源和接受容器之间创建一个隧道,接受容器可以看到源头容器指定的信息。

自定义容器命名。

连接系统一句容器的名称来执行。因此首先需要自定义一个好记的容器名字。

虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:

- 自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叫web

- 当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器

使用
--name
标记可以为容器自定义命名

$ sudo docker run -d -P --name web training/webapp python app.py


使用
docker ps
来验证设定的命名。

容器互联

使用
--link
参数可以让容器之间安全的进行交互。

可以先创建一个新的数据库容器。

$ sudo docker run -d --name db training/postgres


高级网络配置

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Docker instance