《第一本Docker书》读书笔记 ========================================================================================================================== 1、LXC:LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术, 为Linux内核容器功能的一个用户空间接口。Docker就是基于LXC实现。 2、Docker定义 Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境。 跨平台 可移植 3、发展历史 2013年Docker在Github正式发布 2014年6月Docker 1.0版本正式发布 2015年6月成立容器标准化组织 OCP (Open Container Project) 4、Docker优势 1、持续部署与测试 2、跨平台支持 3、环境标准化和版本控制:可以使用Git工具对Docker进行灵活的版本控制,一旦出现故障可以快速进行回滚操作 ========================================================================================================================== 第一章 基础介绍 1、Docker的虚拟化也被称为“操作系统虚拟化”,容器中只能运行与宿主操作系统相同或类似的操作系统。 2、Docker是采用客户端/服务器端的C/S架构程序,服 务器端Docker守护进程也就是Docker引擎。Docker提供了一个命令行工具docker或API与服务器 端Docker守护进程进行通信。可以使用本地的Docker客户端与Docker守护进程连接,也可以远程连接Docker守护进程。 3、相关概念理解 1、镜像 Docker容器的运行基于镜像,镜像是容器运行的基石。 Docker镜像是由文件系统叠加而成的。 2、容器 Docker容器一个镜像运行及假装一层可读写的层组成的一个运行示例。容器是基于镜像启动的。 3、只读层(read-only layer) 统一文件系统(union file system),将不同的层联合,形成一个统一的视角,以达到在用户看来一个文件系统的目的。 ========================================================================================================================== 第二章 Docker安装 官方文档安装帮助:https://docs.docker.com/engine/installation/linux/docker-ce/centos/ # 查看官方仓库docker版本 $ yum list docker-ce --showduplicates | sort -r 1、安装前提 1、CentOS 6以上版本 2、内核为3.10版本及更高。 3、DeviceMapper,非Ubuntu发行版,比如CentOS使用的Docker存储驱动。 查看是否安装:grep device-mapper /proc/devices 安装DeviceMapper:yum install device-mapper 加载内核模块:modprobe md_mod 4、不支持32位CPU 2、安装(2种安装方式) 使用yum安装 yum install docke-ce-17.09.0.ce 使用安装脚本安装 wget https://get.docker.com 3、查看Docker是否正常运行及状态信息 docker info 4、docker守护进程监听/var/run/docker.sock这个Unix套接字文件。 5、docker守护进程的配置 启动docker进程可以使用-H选项监听端口及套接字文件。 示例: docker daemon -H tcp://0.0.0.0:2374 -H unix://home/docker/unix.sock 如果要配置永久生效,则需要在/lib/systemd/system/docker.service文件内ExecStart选项后添加相应参数。 6、使用web界面管理docker 工具:Shipyard、DockerUI、Kitematic 7、查看Docker版本信息 docker version ========================================================================================================================== 第三章 (Docker命令)容器操作 1、docker run命令:启动容器 格式:docker run [options] IMAGE_NAME COMMAND [ARG....] 选项: -d=false|true # 后台运行docker容器 -t # 是的docker非配一个伪终端,并绑定到标准输入 -i # 标准输入打开 --name NAME # 指定容器名称,如果未指定,则随机生成字符串UUID --log-driver="syslog|none" # 使用syslog进程记录日志或者禁用日志功能 --restart=always|on-failure:N # always表示无论退出码什么,都重新启动容器;on-failure:N ,表示退出码为非0时重启, N表示重启参数 2、查看docker容器列表 docker ps # 查看正在运行的容器 docker ps -a # 查看所有容器 3、容器命令 docker -i -t --name CONTAINER_NAME IMAGE_NAME /bin/bash 4、启动|重启一个暂停的容器 docker start|restart CONTAINER_NAME|CONTAINER_ID 5、进入容器(启动之后,但没进入容器的容器,可以使用attach进入容器) docker attach CONTAINER_NAME|CONTAINER_ID 6、守护式进程 守护式进程适合长期运行容器,大多数时候以守护式进程方式运行容器。 docker run --name deamon—name -d centos /bin/sh "while true;do echo heelo world;slee p 1;done" 7、获取容器日志 docker logs CONTAINER_NAME docker logs -f CONTAINER_NAME # 跟踪日志 docker logs -ft CONTAINER_NAME # 跟踪日志,并打印日志时间戳 docker logs --tail 10 CONTAINER_NAME # 打印最后10行的日志 8、查看容器内部的进程 docker top CONTAINER_NAME 9、一个容器的生命周期 检测本地是否存在制定镜像,若不存在则从远程仓库下载 使用镜像创建并启动容器 分配可读写的文件层 网络桥接,宿主机和容器之间,并从地址池非配IP地址 执行制定程序 容器终止 10、查看docker容器状态信息 docker stats CONTAINER_NAME 11、在容器内运行进程 容器内运行的进程类型:后台任务和交互式任务 docker exec -d CONTAINER_NAME COMMAND # 容器首先得是启动状态 12、停止守护式容器 docker stop CONTAINER_NAME 13、查看容器的详细信息 docker inspect CONTAINER_NAME docker inspect --format='{{.Name}}' xuekaixin # 指定查看的键值 # 查找容器进程ID docker inspect --format='{{.State.Pid}}' 68437ea9110a 14、删除容器 docker rm CONTAINER_NAME # -f 选项可以强制删除运行中的容器 删除所有容器 docker rm `docker ps -a -q` 15、进入容器 nsenter --target PID --mount --uts --ipc --net --pid 使用脚本: #!/bin/bash # container=$1 PID=$(docker inspect --format "{{.State.Pid}}" $container) nsenter --target "$PID" --mount --uts --ipc --net --pid ========================================================================================================================== 第四章 镜像和仓库 1、理解镜像 1、当docker启动时,会在镜像的最顶层加载一个可读写的文件系统,容器内的程序就是在这个读写层中执行的。 2、容器启动后,镜像最顶层的可读写层是空的,当有文件被修改时,文件会被从可读写层的底部的只读层复制 到读写层,并将修改后的文件版本保存到最顶层的可读写层。底部只读层的文件依然存在,只是被隐藏掉。 这种机制叫写时复制(copy on write)。 2、镜像相关操作 1、查看本地镜像 docker images 2、下载镜像到本地 docker pull IMAGE_NAME:TAG 3、镜像搜索 docker search IMAGE_NAME # 将在Docker Hub站点查找相关的镜像信息 搜索stars数为N以上的镜像 docker search --filter=stars=10 centos 3、本地的镜像文件保存位置:/var/lib/docker/devicemapper目录下 4、删除镜像 docker rmi IMAGE_ID 5、镜像私有仓库 docker-registry是官方提供的工具,用于构建私有的镜像仓库。 ################### Docker私有仓库registry搭建 1、pull到registry镜像作为一个容器启动 docker pull registry ========================================================================================================================== 网络访问 1、端口映射 随机映射 docker run -P 示例:docker run -d -P --name nginx1 c246cd3dd41d 指定映射 示例:docker run -d -p 80:80 --name nginx2 nginx Docker数据管理 1、启动容器时,使用-v选项并指明路径,即可在容器内创建文件或者目录 示例: 1、在容器创建一个目录: docker run -d --name test -h nginx -v /data centos 2、将物理机的root目录挂载到容器data目录,还可以挂载时指定权限,比如-v /root:/data:rw : docker run -d --name test2 -h nginx -v /root:/data nginx 3、查看目录数据卷的映射: docker inspect -f {{.Volumes}} CONTAINER_NAME docker1.8版本之后:docker inspect -f {{.Mounts}} centos-1 或者:docker inspect centos-1 | grep -C 20 "Mounts" 2、数据卷容器 --volumes-from CONTAINER_ID 3、数据管理 1、数据卷:Data volumes 理解: 可供容器使用的目录。containers使用数据卷类似于挂载某个目录到容器内。数据卷的生命周期独立于容器。 特点: 多个容器可以共享数据卷 对数据卷的修改可以立刻生效 数据卷会永久存在下载,除非手动删除数据卷 删除数据卷: 在删除容器的时候,可以指定-v选项同时删除容器相关的数据卷 2、数据卷容器:Data volumes containers 理解: 数据卷容器事实上也是一个正常的容器,只是其功能是专门提供数据的容器,数据卷容器并不需要保持运行状态。 还可以从已经挂载的数据卷容器的容器上关联并挂载其上的数据卷。 创建数据卷容器: docker run -d -v /dbcontainer --name dbcontainer centos 挂载使用数据卷容器: --volumes-from 数据卷名称 # 将数据卷容器dbcontainer挂载到centos-2容器上 docker run -d --volumes-from dbcontainer --name centos-2 centos # 查看数据卷挂载信息 docker inspect -f {{.Mounts}} centos-2 删除数据卷容器: 前提:如果数据卷容器被其他容器所挂载,则数据卷容器不能被删除,在删除最后一个挂载了数据卷容器的容器时, 使用docker rm -v选项删除,即可删除数据卷。 删除数据卷容器,但并不会删除数据卷。 3、数据卷的备份、恢复、迁移 备份示例: # 创建数据卷容器 docker run -d -i -t -v /data --name db centos /bin/bash # 新启动其他容器挂载数据卷容器的数据卷 docker run -d -i -t --volumes-from db --name centos-0 centos /bin/bash # 目的:是将数据卷容器中的data目录进行备份,进而保存到本地 方法:启动一个新容器并在这个新容器上挂载数据卷容器的数据卷,同时将本地的一个目录映射到 新启动的这个容器上,最后在这个容器上执行备份命令,将挂载之后的数据卷目录内文件打 包备份到容器内被映射到本地的那个目录内,就此完成数据卷的备份工作。 docker run --volumes-from db -v $(pwd):/backup --name backup centos tar cvf /backup/backup.tar /db 注意: 在备份的时候,可能会遇到权限问题,此时需要关闭SElinux。 恢复示例: # 创建一个带有空数据卷的容器 docker run -v /data1 --name db1 centos /bin/bash ========================================================================================================================== 手动构建镜像 1、启动一个镜像并进入shell环境 docker run -it --name centos-nginx centos 2、手动制作镜像 docker commit -m "nginx" COMMAND_ID xuekaixin/centos-nginx:v1 3、Dockerfile构建镜像 Docker原理 1、Linux基于namespace的机制进行资源隔离; 基于cgroup的机制进行资源限制; chroot机制实现文件系统的隔离; 使用aufs实现分层文件系统的管理; 2、PID:容器有自己独立的进程表和1号进程; NET:有独立的网络 ipc:在ipc通信时,需要加入额外的信息来标识进程 mnt:每个容器都有自己唯一的目录挂载 utc:每个容器都有自己独立的hostname和domain 3、Dockerfile中每一个指令执行完毕之后,都会提交一个image,保证指令之间不会影响。 FROM base镜像 # 必须放在第一行,表示基于哪一个镜像开始构建 RUN 指令 5、Repository:注册服务器,管理仓库的具体服务器 ==========================================================================================================================