给一个正在运行的Docker容器动态添加Volume(转)

之前有人问我Docker容器启动之后还能否再挂载卷,考虑mnt命名空间的工作原理,我一开始认为这很难实现。不过现在我认为是它实现的。

简单来说,要想将磁盘卷挂载到正在运行的容器上,我们需要:

  • 使用nsenter将包含这个磁盘卷的整个文件系统mount到临时挂载点上;
  • 从我们想当作磁盘卷使用的特定文件夹中创建绑定挂载(bind mount)到这个磁盘卷的位置;
  • umount第一步创建的临时挂载点。

Continue reading

利用 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 <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

Dockerfile 基本的语法是 Continue reading

docker安装入门篇

一、下载镜像 image

可以使用 docker pull 命令来从仓库获取所需要的镜像。

下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。

$ sudo docker pull ubuntu:12.04
Pulling repository ubuntu
ab8e2728644c: Pulling dependent layers
511136ea3c5a: Download complete
5f0ffaa9455e: Download complete
a300658979be: Download complete
904483ae0c30: Download complete
ffdaafd1ca50: Download complete
d047ae21eeaf: Download complete

下载过程中,会输出获取镜像的每一层信息。

该命令实际上相当于

$ sudo docker pull registry.hub.docker.com/ubuntu:12.04

命令,即从注册服务器registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。

有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。 从其它仓库下载时需要指定完整的仓库注册服务器地址。例如

$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
Pulling dl.dockerpool.com:5000/ubuntu
ab8e2728644c: Pulling dependent layers
511136ea3c5a: Download complete
5f0ffaa9455e: Download complete
a300658979be: Download complete
904483ae0c30: Download complete
ffdaafd1ca50: Download complete
d047ae21eeaf: Download complete

二、利用镜像image 创建容器

完成后,即可随时使用该镜像了,例如创建一个容器,让其中运行 bash 应用。

$ sudo docker run -t -i ubuntu:12.04 /bin/bash
root@fe7fc4bd8fc9:/#

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

上面命令默认会生成一个随机的 CONTAINER-ID,我们可以使用docker attach  "容器ID|容器名" 命令来进行指定的容器。但由于容器ID和容器名为随机字母,不利于我们记忆 ,这里我们可以使用 --name 参数批量一个命名,这样我们直接使用 "docker attach 容器名" 就可以进入容器内(可通过 docker ps -a查看)

$sudo docker run -it --name server ubuntu /bin/bash

我们通过 ”docker ps -a" 可以看到容器的最后一列names的值为server,以后想进行这个容器直接使用命令 "docker attach server“ 即可,不用再去先查找容器ID,再输入容器ID,省事了很多。

有时候我们为了编码方面,一般是在宿主机器上进行开发,调试在容器里进行,这时候,我们只需要将一个本机目录挂载到容器里即可。

$sudo docker run -it -v /sites/www:/wwwroot/htodcs ubuntu /bin/bash

上面的/sites/www 为本机目录,/wwwroot/htdocs 为容器中挂载的目录,这点像vagrant。

docker常用命令见:http://blog.haohtml.com/archives/16555

docker常用命令

1. 查看docker信息(version、info)

# 查看docker版本
$docker version

# 显示docker系统的信息
$docker info

2. 对image的操作(search、pull、images、rmi、history)

# 检索image(sudo docker pull ubuntu:12.04,该命令实际上相当于 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。)
$docker search image_name[:tag]

# 下载image
$docker pull image_name

# 列出镜像列表; -a, --all=false Show all images; --no-trunc=false Don't truncate output; -q, --quiet=false Only show numeric IDs
$docker images

# 删除一个或者多个镜像; -f, --force=false Force; --no-prune=false Do not delete untagged parents (注意这里是 rmi 命令,不是 rm)
$docker rmi image_name

# 显示一个镜像的历史; --no-trunc=false Don't truncate output; -q, --quiet=false Only show numeric IDs
$docker history image_name

3. 启动容器(run)

docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。

Continue reading

docker与vm之间的最基本的区别

5分钟弄懂Docker!http://www.csdn.net/article/2014-07-02/2820497-what%27s-docker

Docker入门与实践:https://www.gitbook.com/book/yeasy/docker_practice

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

Virtual Machines是由虚拟机管理程序来实现对虚拟机的管理,而docker是用docker Engine来实现对应用的管理。可以理解为一个套硬件的管理,一个是软件的管理。

virtualization

docker

 对比传统虚拟机总结

docker-vs-vm

基本概念

Docker 包括三个基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周期。 Continue reading

windows下使用docker login命令提示403错误的解决办法

windows平台下使用docker,在对image打包上传(https://hub.docker.com/)时 (https://docs.docker.com/windows/step_six/),发现登录docker的时候一直提示403错误

docker login --username=youruser --password=yourpassword --email=youremail

网友分析 是windows和unix仓库提交网址不一致,引起的问题

docker login --username=youruser --password=yourpassword --email=youremail https://index.docker.io/v1/

官方给出的提交url,不过这里用windows的url还是登录失败,一样的错误信息,用unix的url可以登录成功,但在push 的时候,却又提示未认证,暂时未找到解决办法。

具体可以看上面柳月给的网址或者:

https://github.com/docker/hub-feedback/issues/473
https://github.com/docker/docker/issues/18019

http://stackoverflow.com/questions/33748919/why-does-docker-login-fail-in-docker-quickstart-terminal-but-work-from-within

Dev with Vagrant and Docker

前言

为了在团队里搭建统一的本地开发环境,最近花了点时间用了下vagrant和docker,在此做个记录, 这也算一个DevOps的实践。


Vagrant介绍

Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。

我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。

以上介绍直接抄自网络,我觉得介绍的很到位。 Continue reading

Centos下安装Docker

内核要求至少 3.8.0版本或以上. https://docs.docker.com/linux/

第二步要安装epel库

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
sudo rpm -Uvh epel-release-6-8.noarch.rpm

此时,会在/etc/yum.repo.d/目录里生成两个文件epel.repo  epel-testing.repo.

默认情况下epel.repo已经启用了enabled=1.

========================================

这里我用的centos7.0 x64的系统。

安装前需要安装相对应的epel库,我用的 Centos 7.0的系统。

$ wget http://ftp.sjtu.edu.cn/fedora/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm

$ sudo rpm -Uvh epel-release-7-0.2.noarch.rpm

$ ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Sources.repo CentOS-Vault.repo epel.repo epel-testing.repo

Next, let's install the docker-io package which will install Docker on our host.

$ sudo yum install docker-io

Now that it's installed, let's start the Docker daemon.

$ sudo service docker start

[sudo] password for sysadmin:
Redirecting to /bin/systemctl start docker.service

If we want Docker to start at boot, we should also:

$ sudo chkconfig docker on

Note: Forwarding request to 'systemctl enable docker.service'.
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.servic

Now let's verify that Docker is working. First we'll need to get the latest centos image.

$ sudo docker pull centos:latest

Next we'll make sure that we can see the image by running:

$ sudo docker images centos

This should generate some output similar to:

$ sudo docker images centos
REPOSITORY      TAG             IMAGE ID          CREATED             VIRTUAL SIZE
centos          latest          0b443ba039582 hours ago         297.6 MB

Run a simple bash shell to test the image:

$ sudo docker run -i -t centos /bin/bash

bash-4.2#

If everything is working properly, you'll get a simple bash prompt. Type exit to continue.

Done! You can either continue with the Docker User Guide or explore and build on the images yourself.

Issues?

If you have any issues - please report them directly in the CentOS bug tracker.

官方安装文档:http://docs.docker.com/installation/centos/

官方docker使用手册:http://docs.docker.com/userguide/ (中文手册:http://www.docker.org.cn/book/docker.html )