认识Docker
Docker 是一个开源的应用容器引擎,主要利用 linux 内核 namespace 实现沙盒隔离,用cgroup 实现资源限制。
Docker 支持三种不同的镜像层次存储的 drivers: aufs devicemapper、btrfs ;
AUFS (AnotherUnionFS) 是一种 Union FS, 简单来说就是支持将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统。 Aufsdriver 是 docker 最早支持的 driver,但是 aufs 只是 linux 内核的一个补丁集而且不太可以会被合并加入到 linux内核中。但是由于 aufs 是唯一一个 storage driver 可以实现容器间共享可执行及可共享的运行库, 所以当你跑成千上百个拥有相同程序代码或者运行库时时候,aufs是个相当不错的选择。
Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。Device mapper driver 会创建一个 100G 的简单文件包含你的镜像和容器。每一个容器被限制 在 10G 大 小 的 卷 内 。
Btufs driver 在 docker build 可以很高效。但是跟 devicemapper 一样不支持设备间共享存储(文档里是 does not share executable memory between devices)。在没有 aufs 支持的 linux 发行版本上 (CentOS,opensuse 等 )安装 docker 可能就使用了devicemapper driver。
实验环境:
Redhat enterprise release 7.2 x86_64bit
1、 安装Docker
百度盘地址https://pan.baidu.com/s/1slqgGjF,安装前请先配置好yum源,因为需要安装许多依赖
yum install docker-engine-1.10.3-1.el7.centos.x86_64.rpm -y
Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1/16, 容器启动后都会被桥接到 docker0 上,并自动分配到一个 IP 地址,如果想要修改默认的地址可以进行以下操作:
[root@lockey6 ~]# cp /usr/lib/systemd/system/docker.service /etc/systemd/system/
[root@lockey6 ~]# vim /etc/systemd/system/docker.service
添加以下红线画出内容,只要是符合规范且不和你的物理机处于同一网段的ip都可以
当然以上是永久修改,如果只是想要暂时生效的话可以执行以下操作:
# systemctl stop docker
# ip link set dev docker0 down
# ip addr del 172.17.42.1/24 dev docker0
# ip addr add 192.168.0.1/24 dev dcoker0
# ip link set dev docker0 up
然后应用最新设置:
[root@lockey6 ~]# systemctl daemon-reload
[root@lockey6 ~]# systemctl restart docker
2、容器使用
镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。
# docker search 查询镜像
# docker pull 拉取镜像
# docker push 推送镜像
假设我们已经有一个名为nginx.tar的镜像
[root@lockey6 ~]# docker load -i nginx.tar #导入镜像
[root@lockey6 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest af4b3d7d5401 19 months ago 190.5 MB
以下为一些常用命令解释,不做操作演示:
# docker run -it --name vm1 ubuntu bash创建容器
# docker ps -a查看容器进程
# docker attach vm1连接容器
# docker top vm1查看容器进程
# docker logs vm1 查看容器指令输出 -f 参数可以实时查看
# docker inspect vm1 查看容器详情
# docker stats vm1 查看容器资源使用率
# docker diff vm1 查看容器修改
开启容器
[root@foundation5 ~]# docker start vm1#restart/stop/
vm1
[root@foundation5 ~]# docker attach vm1
# docker pause/unpause vm1暂停/恢复容器
倒入镜像
docker load -i ubuntu.tar
导出镜像
docker save ubuntu > ubuntu.tar
保存对镜像的更改
[root@foundation5 ~]# docker commit -m 'add files' -p vm1 newubuntu
删除镜像
[root@foundation5 ~]# docker rm vm1
vm1
[root@foundation5 ~]# docker rmi newubuntu
查看镜像
docker inspect ubuntu
ctrl+p+q退出镜像
再次进入镜像
[root@foundation5 ~]# docker attach vm1
docker exec vm1 ls /
docker cp /test.py ./#从docker往镜像中拷贝数据
[root@foundation5 ~]# docker cp vm1:/halo.log ./#从镜像中往docker中导出数据
docker history ubuntu查看镜像
[root@foundation5 ~]# docker export vm1 > halo.tar
[root@foundation5 ~]# docker import halo.tar halo
[root@foundation5 ~]# docker load -i game2048.tar
[root@foundation5 ~]# docker run -d -p 8080:80 --name 2048 game2048
1c8d01d0a1baca0e655b4ac41b73c70cb75fc7a51e0bba2fdc0fd22a6d3a905d
3、数据卷管理
[root@foundation5 data2]# docker rm `docker ps -aq`
4eadabad7d9a
ffec847ffc40
Failed to remove container (1c8d01d0a1ba): Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
[root@foundation5 data2]# docker create --name datadir -v /tmp/data1:/data1 -v /tmp/data2:/data2 ubuntu
9fbece05806cda542151ead5d588b47066a80a55a66fee60d6c663da2256dc45
[root@foundation5 data2]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fbece05806c ubuntu "/bin/bash" 9 seconds ago Created datadir
[root@foundation5 data2]#
[root@foundation5 data2]# docker run -it --name vm1 --volumes-from=datadir ubuntu
root@2abd2ace7f15:/# ls
bin boot data1 data2 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@2abd2ace7f15:/# cd data2
root@2abd2ace7f15:/data2# ls
passwd
root@2abd2ace7f15:/data2#
[root@foundation5 data2]# docker run --rm --volumes-from=datadir -v /tmp/backup:/backup ubuntu tar -zcf /backup/test.tgz /data2/
tar: Removing leading `/' from member names
[root@foundation5 tmp]# cd /tmp/backup/
[root@foundation5 backup]# ls
test.tgz
[root@foundation5 backup]#
[root@foundation5 backup]# docker run --rm --volumes-from=datadir -v /tmp/backup:/backup ubuntu rm -f /backup/test.tgz#继续在docker中调用命令删除刚才创建的压缩文件
Docker容器中进程号为1的进程是bash,而不是init,一个运行的Linux竟然没有init进程,简直太不思议了。这其实得益于强大的Linux提供的LXC功能。
[root@foundation5 ~]# docker run -it --name vm1 --net host ubuntu#修改docker的网络模式