Docker简单入门
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
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中