一.基本理念
1.Linux Namespace
pid 容器有自己独立的进程表和1号进程
net 容器有自己独立的network info
ipc 在ipc通信的时候,需要加入额外的信息来标识进程
mnt 每个容器有自己唯一的目录挂载
utc 每个容器有独立的hostname,domain
2.cgroup
3.chroot
隔离根文件系统
二.
1.dotcloud docker
dotCloud 是docker的前身,专注于PaaS云计算
docker 是用go语言写的
docker也是container技术的实现,最早使用LXC作为container的引擎,最新版docker使用libcontainer替换lxc
采用 aufs文件系统管理Image和container
基于C/S架构实现,server使用unixSocket,也可切换到Tcp Protocol
aufs文件系统
可以把多个不同目录内容合并到一起
docker hub 方便image管理
dockerfile
2。安装docker
安装Docker使用apt-get命令:
apt-get install docker.io 启动服务和守护进程 service docker.io status $ service docker.io start 创建软连接
ln -sf /usr/bin/docker.io /usr/local/bin/docker
三.
Linux FS :bootfs(Kernel和bootloader) rootfs(和kernel无关,和不同的Linux分发版本有关)
传统的LInux启动时,将rootfs设置为readonly并检查完整性,然后设置成read_write
Docker在启动container的时候,也是把rootfs设置为readonly,然后通过aufs把一个readwrite的文件系统挂载到rootfs之上,并且把下层文件系统设置成readonly,这样构成一个完整的操作系统
对于底层的readonly的FS,在docker中成为image
对于顶上read_write的FS,称为container
对于readonly中内容的修改,采用的是COW(写时复制技术)的技术,把文件复制到read_only层并改写,实际用户看到的是当前container层中的文件,image中的文件不会被影响。
Image
除了base image之外,每一层Image都有一个parent image
基于COW技术,image部分是不会被修改的,因此container可以共享image层的FS,提高了存储的效率.
Storage driver
除了默认的aufs之外,docker通过对于storage的抽象,可以支持一些其他的storage driver,eg:vfs,devicemapper,btrfs
修改docker启动时的参数设置,增加-storage-driver={storage plugin} 在配置文件中
docker hub
官方提供的image平台
Automated Builds Image,通过和Github集成,自动监控github项目中的变化,构建新的Image然后自动发布到docker hub
https://hub.docker.com/
镜像命名和版本管理
普通镜像命名规范{namespace}/{repository name}:{tag}
respository,类似于github项目,mysql,ubuntu
tag:版本信息
search image
docker search
pull image
docker pull 如果不指定tag的话,会pull所有版本的镜像
上传镜像
docker login ,登录到docker hub中
把container 通过docker commit 的命令转化成一个image
通过docker tag 来命名新的image
docker push到docker hub中
Docker基本命令:
1docker search busybox 查找busy box的image
2 docker pull busybox:ubuntu-12.04 下载busybox 的image
root@djhllpf123-All-Series:~# docker pull busybox:ubuntu-12.04 (分层次下载)
Pulling repository busybox
492dad4279ba: Download complete
511136ea3c5a: Download complete
df7546f9f060: Download complete
2982ec56c8d9: Download complete
3 docker images 查看当前已下载的image
root@djhllpf123-All-Series:~# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
busybox ubuntu-12.04 492dad4279ba 9 days ago 5.455 MB
4 docker images -- no-trunc 显示完整的Image ID
root@djhllpf123-All-Series:~# docker images --no-trunc
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
busybox ubuntu-12.04 492dad4279bae5bb73648efe9bf467b2cfa8bab1d593595226e3e7a95d9f6c35 9 days ago 5.455 MB
5.push docker 上传docker
docker login 登录docker 登录一次就会记录密码,哟哈珀登录只要输入用户名
docker info 查看docker信息
docker run -t 制作container
root@djhllpf123-All-Series:~# docker run -t busybox:ubuntu-12.04 echo "hello world"
hello world
docker ps 查看是否有docker container
root@djhllpf123-All-Series:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
743ed69954ba busybox:ubuntu-12.04 echo 'hello world' 21 seconds ago Exited (0) 21 seconds ago romantic_fermat
root@djhllpf123-All-Series:~# docker commit 743ed69954ba 返回临时的镜像ID
0a202fef0a790e3d4e24642c2200f7414475ab64be563806dddfe54a70c7b160
root@djhllpf123-All-Series:~# docker images 可以看到现在生成了没有repository ,tag的image
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> 0a202fef0a79 21 seconds ago 5.455 MB
生成tag
root@djhllpf123-All-Series:~# docker tag 0a202fef0a790e3d4e24642c2200f7414475ab64be563806dddfe54a70c7b160 centrald/busybox:osforce
现在继续查看image,可以看到:
root@djhllpf123-All-Series:~# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centrald/busybox osforce 0a202fef0a79 4 minutes ago 5.455 MB
busybox ubuntu-12.04 492dad4279ba 9 days ago 5.455 MB
上传:
docker push centrald/busybox
四.使用docker run 运行container
运行一个container必须要指定一个image。
对于不存在的Image,Docker 会自己去下载
COMMAND
Command 标志的是在container中实际运行的首进程
如果Image里面包含了CMD的指令,那么在启动container的时候,不需要指定Command,否则用指定的Command来覆盖Image中的CMD.
前台运行与后台运行
默认的Container是在前台运行的,会绑定Command 进程的STDIN,STDOUT,STDERR到console上
可以通过 -d 的选项让Container运行在后台
如果是在前台运行,也可以通过指定-a{STDOUT,STDIN,STDERR}选择需要绑定的IO
通过attach命令可以重新attach一个后台运行的containter
Container Identification
在后台运行的情况下,RUN命令会返回一个UUID,唯一标示Container
可以通过docker ps 来查看container的UID和运行信息
可以通过指定-name 的方式来指定container的名字,name必须唯一
Inspect
通过docker inspect {Container ID} 来获取container的更多信息,包括网络,Volume,实际在Host上的进程ID等信息
Log
通过Logs命令可以看到Container中的Command所指向的进程的STDOUT,STDERR数据
环境变量
通过 -e 参数,可以在运行container的时候添加系统环境变量
demo:
docker rm xxx 删除一个container
运行一个循环程序,每隔2秒输出hello world
root@djhllpf123-All-Series:~# docker run -dt busybox:ubuntu-14.04 sh -c "while true;do echo hello world;sleep 2;done"
6a47ee3b269abd13dfdc2a16787f8e7bc545da2f0f0fde3a2f72e48bb3035a70
查看日志报错
root@djhllpf123-All-Series:~# docker logs e43b5e161f88272e7bde601e04bb7683c921818d3b144b34caccc9933ef0bbdb
sh: can't open 'while ture;do echo hello world;sleep 2;done'
root@djhllpf123-All-Series:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a47ee3b269a busybox:ubuntu-14.04 sh -c 'while true;do 18 seconds ago Up 18 seconds thirsty_thompson
324368395e0d busybox:ubuntu-14.04 sh -c 'while ture;do 2 minutes ago Exited (0) 2 minutes ago silly_wilson
e43b5e161f88 busybox:ubuntu-14.04 sh -x 'while ture;do 6 minutes ago Exited (2) 6 minutes ago tender_hawking
docker attach 583b6aaf50cd 让其前台运行