docker

#代码

是什么

Docker的核心底层技术是LXC(Linux Container),Docker在其上面加了薄薄的一层,添加了许多有用的功能。

它与lxc的区别在于:

  • Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行;
  • Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主要是聚焦于如何机器启动地更快和耗更少的内存;
  • Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等;
  • Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并;
  • Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展;
  • Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image;
  • Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS平台的支持等;

Container & Images

img

Docker使用了一种叫AUFS的文件系统,这种文件系统可以让你一层一层地叠加修改你的文件,最底下的文件系统是只读的,如果需要修改文件,AUFS会增加一个可写的层(Layer),这样有很多好处,例如不同的Container可以共享底层的只读文件系统(同一个Kernel),使得你可以跑N多个Container而不至于你的硬盘被挤爆了!这个只读的层就是Image!而如你所看到的,一个可写的层就是Container。

区别

区别仅仅是一个是只读的层,一个是可写的层,你可以使用docker commit 命令,将你的Container变成一个Image,也就是提交你所运行的Container的修改内容,变成一个新的只读的Image,这非常类似于git commit命令

上下层的关系

##Container 进入:

docker attach NAME
docker ps -a 查看name

Dockerfile

在基础的Image(base)为不同的开发环境配置

示例:

FROM ubuntu:14.10 
RUN apt-get update 
RUN apt-get install -y ruby ruby-dev gem 
RUN gem install bundler 

构建:

docker build --rm -t dev:base . 

-t 选项构建的base image的tag

Dockerfile的每一行指令都会创建一个临时的Container,也就是docker的一层

运行:

docker run -i -t --name ruby dev:base irb 

这里我们使用dev:base这个Image运行了一个irb解释器,在构建完base之后,可以依样画葫芦构建rails环境,很简单,只需要FROM dev:base,然后RUN安装rails组件就可以了

指定Image入口

1、示例:

docker run -i -t --name REPOSITORY REPOSITORY:TAG /bin/bash
example//docker run -i -t --name shell dev:base /bin/bash 

2、运行服务(修改dockerfile):

FROM ubuntu:14.10 
RUN apt-get install -y mysql CMD mysql -u root -p 3360

3、bulid images:

docker build -t dev:mysql . 

4、run as container:

docker run --name mysql_service -d dev:mysql 

命令模式

短暂方式

docker ps -a
docker start container_id
docker logs container_id ### 交互方式
docker run -i -t image_name /bin/bash

daemon方式

-d参数

连接上容器实时查看

docker attach $CONTAINER_ID

终止容器

docker stop $CONTAINER_ID

删除容器

主要是每一步都会产生容器,产生很大的干扰,所以要干掉他们:

sudo docker rm `sudo docker ps -a -q`

移除镜像

docker rmi

docker rm 是移除容器

数据管理

数据卷

类似于linux下地mount

  • 可以在容器之间共享和重用
  • 修改立马生效
  • 更新不影响镜像
  • 一直存在,直到没有容器使用

    docker run -P -d –name web -v /webapp yixiaojia:python python a.py

也可以挂在本地的文件作为数据卷

镜像管理

停止所有的container

docker stop $(docker ps -a -q)

删除所有container

docker rm $(docker ps -a -q)

删除untagged images,也就是那些id为None的image的话

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

要删除全部image的话

docker rmi $(docker images -q)	

container共享数据

docker 的 containers之间共享目录是通过 volume

可以将本地文件夹或者其他container的文件夹挂载到container中