2016-7-10 初版释出
Docker的主要优点:
轻量级资源使用:容器在进程级别隔离并使用宿主机的内核,而不需要虚拟化整个操作系统。
可移植性:一个容器应用所需要的依赖都在容器中,这就让它可以在任意一台Docker主机上运行。
可预测性:宿主机不需要关心容器内运行的是什么,同样,容器也不需要关心是在哪个宿主机上运行。所需要的接口都是标准化的,并且交互也都是可预测的。
通常在用Docker来设计应用或者服务时,最好的方法是打破面向服务架构的设计,而采用独立容器的设计。这让使用者在以后的使用中更容易的独立扩展或者升级组件。拥有如此的灵活性是人们对用Docker开发和部署感兴趣的原因之一。
服务发现
etcd:服务发现/全局分布式键值对存储
consul:服务发现/全局分布式键值对存储
zookeeper:服务发现/全局分布式键值对存储
crypt:加密etcd条目的项目
confd:观测键值对存储变更和新值的触发器重新配置服务
调度和集群管理工具
fleet: 调度器和集群管理工具
marathon:调度器和集群管理工具
Swarm:调度器和集群管理工具
mesos:宿主机抽象服务,用于为调度器联合宿主机资源
kubernetes:一个管理容器组的工具,具有先进的调度能力
compose:一个用于创建容器组的容器编排工具
内核升级 CentOS 7.2.1511 (Core)
1.升级内核需要使用 elrepo 的yum 源首先我们导入 elrepo 的key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
2. 安装 elrepo 源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
3. 在yum的ELRepo源中,mainline 为最新版本的内核
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
4. 修改内核启动顺序,默认启动的顺序应该为1,升级以后内核是往前面插入,为0
grub2-set-default 0
5. 重启系统
reboot
6. 查看 内核版本
uname -r
Docker 使用
https://docs.docker.com/engine/installation/linux/centos
[root@master ~]# yum install -y yum-utils
[root@master ~]# sudo yum-config-manager \
--add-repo \
https://docs.docker.com/engine/installation/linux/repo_files/centos/docker.repo
[root@master ~]# yum -y check-update
[root@master ~]# yum -y install docker-engine
加速器:
# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://df4b377c.m.daocloud.io
开启守护进程[本地和网络]
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
# systemctl enable docker
# systemctl start docker
# docker version
Client:
Version: 1.13.0
API version: 1.25
Go version: go1.7.3
Git commit: 49bf474
Built: Tue Jan 17 09:55:28 2017
OS/Arch: linux/amd64
Server:
Version: 1.13.0
API version: 1.25 (minimum version 1.12)
Go version: go1.7.3
Git commit: 49bf474
Built: Tue Jan 17 09:55:28 2017
OS/Arch: linux/amd64
Experimental: false
基础操作(有些命令已经废弃不建议使用)
[root@docker ~]# docker pull centos 下载镜像
[root@docker ~]# docker info
[root@docker ~]# docker version
[root@docker ~]# docker --help
[root@docker ~]# docker images 查看镜像
[root@docker ~]# docker search [images name] 搜索镜像
[root@docker ~]# docker history [images name] 查看镜像历史版本
# 管理命令
# docker --help
.....
Management Commands:
container Manage containers
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
volume Manage volumes
....
-i:交互式 -t: 打开一个终端 -d 后台运行 [不可同时使用] --rm 终止后立刻删除
-h hostname 指定主机名
“--restart=always” 容器自动启动参数
[root@docker ~]# docker run [--rm] [-d] -i -t centos7 /bin/bash 进入docker镜像
[root@docker ~]# docker ps -l
[root@docker ~]# docker stop id
[root@docker ~]# docker start id
[root@docker ~]# docker inspect mytest 【检查容器运行状态信息】
[root@docker ~]# docker inspect -f {{ }} ID
[root@docker ~]# docker stats testssh 【实时查看Container负载】
[root@docker ~]# docker logs -f mysql
[root@docker ~]# docker exec -it id /bin/bash 【exit退出后,容器依旧运行】
[root@docker ~]# docker rm id 删除容器
[root@docker ~]# docker rmi images 删除容器
[root@docker ~]# docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
[root@docker ~]# docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
Docker提供了一个非常强大的命令diff,它可以列出容器内发生变化的文件和目录。
这些变化包括添加(A-add)、删除(D-delete)、修改(C-change)。
该命令便于Debug,并支持快速的共享环境。
[root@docker ~]# docker diff container
save 【持久化镜像】导入导出:
[root@docker ~]# docker save centos:7 > /home/save.tar
[root@docker ~]# docker load < /home/save.tar
export【持久化容器】导入导出:
[root@docker ~]# docker export [id] > [imagesname.tar] 导出镜像
[root@docker ~]# cat /home/export.tar | docker import - busybox-1-export:latest
远程路径导入:
[root@docker ~]# docker import http://example.com/test.tar
保存对容器的修改(commit)
当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。
不建议使用此命令来构建镜像,里面的操作无法进行查看[黑箱操作],构建镜像请使用Dockerfile
-a, --author="" Author; -m, --message="" Commit message
docker ps -l 查看ID
[root@docker ~]# docker commit ID new_image_name
Note:image相当于类,container相当于实例,不过可以动态给实例安装新软件,然后把这个container用commit命令固化成一个image
将容器中的文件拷贝到主机上
Usage: docker cp CONTAINER:PATH HOSTPATH
[root@docker ~]# docker cp testip:/tmp/testaa /tmp
-p:指定容器启动后docker上运行的端口映射,第一个为主机端口第二个为容器里的端口
[root@docker ~]# docker run -d -p 80:80 -p 8022:22 -p 2000-3000:2000-3000 lnmp
docker数据卷
创建一个数据卷挂载到容器的/webapp目录:
# docker run -it -d --name test -v /webapp docker.io/centos:7 /bin/bash
挂载一个主机目录作为数据卷[默认读写(rw),可以指定为只读(ro)]:
docker run -it --name=test1 -v /opt/webapp:/opt/webapp centos7:ip /bin/bash
挂载本地主机文件作为数据卷:[记录容器输入的历史]
docker run -rm -d /root/.bash_history:/.bash_history centos7 /bin/bash
数据卷容器:
1.> 创建数据卷容器:
# docker run -itd -v /mydata --name=volumes1 centos:6.8
2.> 创建容器,并从volumes1容器中挂载数据卷
# docker run -itd --volumes-from=volumes1 --volume-driver=/mydata --name votest1 centos:6.8
# docker run -itd --volumes-from=volumes1 --volume-driver=/mydata --name votest2 centos:6.8
3.>> 三个容器共享/mydata数据卷,都可以读写
注意:数据卷容器自身(volumes)并不需要保持运行状态!即使删除容器db1,db2,数据卷容器mydata里面的数据依旧存在;
[root@CentOS7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 7.5G 0 part
├─centos-root 253:0 0 6.7G 0 lvm /
└─centos-swap 253:1 0 820M 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk
sr0 11:0 1 1024M 0 rom
[root@CentOS7 ~]# lvs -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- 6.67g
swap centos -wi-ao---- 820.00m
容器互联:(废弃)
<在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主机,避免暴漏数据库端口到外部网络上>
--link
docker run -d -P --name=name --link container_name:alias images_name <Command>
docker run -d -P --name=web --link mysql:db centos:7 /bin/bash
存储驱动
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,
同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。
AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念,
对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker 目前支持的联合文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper。
Ubuntu
升级内核:
$ sudo apt-get install -y --install-recommends linux-generic-lts-xenial
$ reboot
$ sudo apt-get update
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the list directory
原因:刚装好的Ubantu系统,内部缺少很多软件源,这时,系统会自动启动软件源更新进程“apt-get”,并且它会一直存活。
由于它在运行时,会占用软件源更新时的系统锁(以下称“系统更新锁”,此锁文件在“/var/lib/apt/lists/”目录下),
而当有新的apt-get进程生成时,就会因为得不到系统更新锁而出现"E: 无法获得锁 /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)"错误提示!
因此,我们只要将原先的apt-get进程杀死,从新激活新的apt-get进程,就可以让软件管理器正常工作了!
# rm /var/lib/dpkg/lock
安装docker
https://docs.docker.com/engine/installation/linux/ubuntu/
Ubuntu:
$ cat /etc/default/docker|egrep -v "^$|^#"
DOCKER_OPTS="-H unix:///var/run/docker.sock -H 0.0.0.0:2375"
Compose
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` \
>/usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
https://docs.docker.com/compose/compose-file/#versioning
https://docs.docker.com/compose/networking/#using-a-pre-existing-network // 扩展网络设置