第一本docker书笔记
第一本docker书笔记
笔记是从xmind中导出,看xmind格式会更方便,免费资源地址
1. 简介
1.1 Docker简介
-
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。
-
1.1.1 提供一个简单、轻量的建模方式
-
1.1.2 职责的逻辑分离
- 开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器
- 加强开发人员写代码环境与程序要部署的生产环境的一致性。
-
1.1.3 快速高效的开发生命周期
-
1.1.4 鼓励使用面向服务的组件
- 推荐单个容器只运行一个应用程序或进程。
1.2 Docker组件
-
1.2.1 Docker客户端和服务器
-
1.2.2 Docker镜像
-
镜像是Docker世界的基石,用户基于镜像来运行自己的容器。镜像体积很小,非常便携,易于分享、存储和更新。
-
镜像是Docker生命周期中的构建部分,它是基于联合文件系统的一种层次的结构,由一些列指令一步一步构建出来。
-
公共镜像
- Docker公司运营的公共镜像叫Docker Hub,用户可以注册、分享并保存自己的镜像。
- 也可以保存用户私有的镜像,组织或团队内部可见
-
私有镜像
-
-
1.2.3 Registry
- 保存用户构建的镜像。
- 架设私有Registry,保存在防火墙后面。
-
1.2.4 容器
- 容器是基于镜像启动,容器中可以运行一个或多个进程。
- 容器是Docker启动或者执行阶段。
- 容器就是一个镜像格式、一系列标准的操作,一个执行环境。
- Docker借鉴了标准集装箱的概念,Docker运输软件。每个容器都包含一个软件镜像,并且可以对软件镜像进行一些操作。
1.3 我们能用Docker做什么
- 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构建、运行并分享Docker容器。
- 能够让独立服务或者应用程序在不同的环境中,得到相同的结果。
- 用Docker创建隔离的环境来进行测试。
- 提供软件即服务的应用程序。
- 高性能、超大规模的宿主机部署。
1.4 Docker与配置管理
- Docker和配置管理工具可能都需要部署。
1.5 Docker的技术组件
- Docker可以运行与任何安装现代Linux内核的x64主机上。
- 一个原生的Linux容器格式,libcontainer或者lxc
- Linux内核的命名空间(namespace),用于隔离文件系统、进程和网络。
- 文件系统隔离:每个容器都有自己的root文件系统
- 进程隔离:每个容器都运行在自己的进程环境中。
- 网络隔离:容器间的虚拟网络接口和IP地址都是分开的。
- 资源隔离和分组:使用cgroups将cpu和内存之类的资源独立分配给每个容器。
- 写时复制:文件系统是通过写时复制创建的,这就意味着文件系统是分层的、快速的,而且占用的磁盘空间更小。
- 日志:容器产生的STDOUT、STDERR和STDIN这些IO流都会被收集并记入日志,用来进行日志分析和故障排错。
- 交互式shell:用户可以创建一个伪tty终端,将其连接到STDIN,为容器提供一个交互式shell。
1.6 本书的内容
- 安装Docker、尝试使用Docker容器、构建Docker镜像、管理并共享Docker镜像、运行、管理更复杂的Docker容器、将Docker容器的部署纳入测试流程、构建多容器的应用程序和环境、介绍使用Figer进行Docker编配的基础,探索Docker的API。
1.7 Docker资源
- Hub、官方网站、博客、文档、入门指南、GitHub源代码、Forge、StackOverFlow问答主页。
2. 安装Docker
2.1 安装Docker的先决条件
- 64位CPU架构的计算机、Linux3.8或更高版本内核、内核必须支持一种合适的存储驱动、内核必须支持并开启cgroup和命名空间功能。
2.2 在unbutu中安装Docker
- uname -a 检查内核版本和cpu架构
- DeviceMapper提供了一种将块设备映射到高级虚拟设备的方法,它支持自动精简配置,可以在一个文件系统中存储多台虚拟设备(Docker镜像中的层)。
2.9 Docker守护进程
3. Docker入门
3.1 确保Docker已经就绪
- docker info
3.2 运行我们的第一个容器
-
docker --help
-
docker run创建和启动容器
- docker run -i -t ubuntu /bin/bash
- -i - 保证容器中的STDIN是开启的,标准输入
- -t - 为要创建的Docker容器分配一个伪tty终端
- 首先docker会检查本地是否存在ubuntu镜像,如果本地还没有该镜像的话,那么docker会连接官方维护的Docker Hub Registry,查看是否有镜像。如果有,下载保存到本地。随后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉新容器需要运行/bin/bash命令启动容器内的shell。
3.3 使用第一个容器
-
hostname、cat /etc/hosts、ip a
- exit退出
-
docker ps -a 列出所有容器
-
docker ps列出运行中的容器
- docker ps -l
-
3.4 容器命名
-
–name
- 唯一、docker rm移除同名容器
3.5 重新启动已经停止的容器
- docker start/restart ID/name
3.6 附着到容器上
-
docker attach ID/name
- exit容器也会停止
3.7 创建守护容器
- -d - 容器后台运行
3.8 容器内部都在干些什么
-
docker logs ID/name
-
docker logs -ft ID/name
-
docker logs --tail 10 ID/name
- docker logs --tail 0 -f ID/name
-
-
3.9 查看容器内的进程
- docker top ID/name
3.10 在容器内部运行进程
- docker exec在容器内部额外启动新进程。
- sudo docker exec -d ID/name touch /etc/new_config_file
- sudo docker exec -t -i ID/name /bin/bash
3.11 停止守护式容器
- docker stop ID/name
3.12 自动重启容器
-
docker run --restart=always/–restart=on-failure:5
- 无论如何都重启
- 退出代码为非0是,最多重启5次
3.13 深入容器
-
docker inspect
-
docker inspect -f/-format ID/name
-
docker inspect --format=’’{{.State.Running}}’ ID/name ID/name
- 支持go语言模板
-
-
3.14 删除容器
-
docker rm
-
运行中的容器不能删除,docker stop/kill
- docker rm ‘docker ps -a -q’ 删除所有容器
-
3.15 小结
4. 使用Docker镜像和仓库
4.1 什么是Docker镜像
-
这样的文件系统称为镜像。
-
镜像是由文件系统叠加而成。
-
最底端是一个引导文件系统,即bootfs。
- 启动容器后,引导层被卸载,以备流出更多的内存供initrd磁盘镜像使用。
-
第二层是root文件系统rootfs,它可以是一种或多种操作系统。
- root永远是只读状态。
-
联合加载(并发加载)技术会在root层上加载更多的只读文件系统,最终的文件系统会包含所有的底层文件和目录。
-
-
一个镜像可以放到另一个镜像的顶部,下面的是父镜像(parent image),最底部的镜像称为基础镜像(base image)。
-
当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统,我们想在Docker中运行的程序就是在这个读写层中执行的。
-
写时复制
- 第一次启动容器,读写层是空的,当文件系统发生变化时,所有的变化都会应用到这一层上。如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。
- 每个只读镜像层永远都不会变化,当创建一个容器时,Docker都会构建一个镜像栈,并在栈的最顶端加一个读写层。读写层+下面的镜像层+配置数据=容器。镜像的分层框架,使我们可以快速构建镜像并运行包含我们自己的应用程序和服务的容器。
4.2 列出镜像
-
docker images
-
/var/lib/docker
- /var/lib/docker/containers
-
-
镜像从仓库下载,保存在仓库中,默认的Registry是有Docker提供的Docker Hub。
-
Tag标签
-
为了区分同一个残酷中的不同镜像
-
每个标签对组成特定镜像的一些镜像层进行标记
- 这种机制使得在同一个仓库中可以存储多个镜像。
-
-
-
仓库
-
用户仓库User Repository
-
普通用户贡献
- 用户名/仓库名
-
-
顶层仓库Top-level repository
-
Docker内部的人和由选定的能提供优质基础镜像的厂商管理。
- 仓库名
-
-
4.3 拉取镜像
-
docker pull image
- docker pull image:tag
4.4 查找镜像
-
docker search image
-
仓库名
-
镜像描述
-
用户评价
-
是否官方
- 自动构建
-
-
-
-
4.5 构建镜像
-
4.5.1 创建Docker Hub账号
-
4.5.2 用Docker的commit命令创建镜像
- docker commit -m “提交信息” --author=“creator” newContainerId user/repository:tag
-
4.5.3 用Dockerfile构建镜像
-
构建环境/上下文
-
build context
- 构建是将构建上下文和该上下文中的文件和目录上传到Docker守护进程,这样Docker守护进程就能直接访问你想在镜像中存储的任何代码、文件或者其它数据。
-
-
Dockerfile
···
FROM ubuntu:14.04
MAINTAINER James Turnbull “james@examples.com”
RUN apt-get update
RUN apt-get install -y nginx
RUN echo ‘Hi, I am in your container’ > /usr/share/nginx/html/index.html
EXPOSE 80
···-
指令和参数,指令都必须为大写字母,且后面跟一个参数
-
Docker从基础镜像运行一个容器
-
执行一条指令,对容器做出修改
-
执行类似docker commit的操作,提交一个新的镜像层
-
Docker再基于刚提交的镜像运行一个新的容器
- 执行Dockerfile下一个指令,知道所有的指令的执行完毕。
-
-
-
-
FROM base image
- 基于哪个镜像构建
-
MAINTAINER name email
-
-
-
4.5.4 基于Dockerfile构建新镜像
- docker build -t=“repository/image:tag” .
-
4.5.5 指令失败时会怎样
- 可以基于该可以使用的镜像运行一个具备交互功能的容器,使用最后创建的镜像对为什么指令失败进行调试。
-
4.5.6 Dockerfile和构建缓存
-
每一步的构建过程都会将结果提交为镜像,之前的镜像层看做缓存
-
第4步骤失败,直接从第4步开始
-
如果之前的构建步骤改变了
- docker build --no-cache -t=“repository/image:tag” .
-
-
-
-
4.5.7 基于构建缓存的Dockerfile模板
-
4.5.8 查看新镜像
-
docker images
- docker history ID
-
-
4.5.9 从新镜像启动容器
-
docker run -d -p 80 --name satic_web jamtur01/static_web nginx -g “daemon off;”
-
-d后台启动
-
-P
- 对外公开在Dockerfile中EXPOSE指令中设置的所有端口,并绑定到随机端口上
-
-p 80:80
- 和本地的80端口绑定
-
-p 127.0.0.1::80
- 和本地的127.0.0.1这个ip的随机端口绑定
-
-p 127.0.0.1:8080:80
- 和本地的127.0.0.1这个ip的80端口绑定
-
-p 80
- 随机映射到49153~65535上
-
-
-
4.5.10 Dockerfile指令
-
CMD
-
容器启动时需要运行的指令
-
RUN命令会覆盖CMD指令
-
多条CMD只有最后一条会执行
- CMD ["/bin/true"]
-
-
-
-
ENTRYPOINT
-
ENTRYPOINT+CMD
- 即可以运行默认的命令,也可以支持通过docker run为该命令指定可覆盖的选项或者标志
-
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
-
-
WORKDIR
-
在镜像中创建一个新容器,在容器内部设置一个工作目录,ENTRYPOINT和CMD会在这个目录下执行
- WORKDIR /opt/webapp/db
-
-w
-
指令覆盖工作目录
- docker run -ti -w /var/log ubuntu pwd
-
-
-
ENV
-
在镜像构建过程设置环境变量
-
ENV TARGET_DIR /opt/app
-
-e
-
运行时设置环境变量
- docker run -ti -e “WEB_PORT=8080” unbuntu env
-
-
-
-
-
USER
-
指定该镜像会以什么样的用户去运行。
-
USER UID:GID
- docker run -ti -u
-
-
-
VOLUME
-
用来向基于镜像创建的容器添加卷。一个卷是可以存在于一个或者多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供如下共享或者对数据进行持久化的功能。
-
可以在容器间共享和重用
-
一个容器可以是不是必须和其他容器共享卷
-
对卷的修改是立时生效的
-
对卷的修改不会对更新镜像产生影响
- 卷会一直存在直到没有任何容器再使用它
-
-
-
-
添加到镜像而不是提交到镜像,并且可以共享
- 测试容器和内部的应用程序代码、管理日志、处理容器内部的数据库
-
VOLUME ["/opt/project", “/data"]
- 挂载点
-
-
ADD
-
将构建环境下的文件和目录复制到镜像中。
-
ADD source.lic /opt/dest.lic
- /结尾是目录,非/结尾是文件
-
ADD url /opt/dest.lic
-
目录或文件不存在都会自动创建,模式是0755,UID和GID是0
-
会使得构建缓存失效
-
-
-
COPY
-
只关心在构建上下文中复制本地文件,不会去做提取和解压工作。
-
源路径必须是一个与当前构建环境相对的文件或者目录,本地文件都存放到和Dockerfile同一个目录下。目的位置则必须是容器内部的一个绝对路径。
- UID GID是0
-
-
ONBUILD
-
为镜像添加触发器。
-
会在构建过程中插入新指令,这些指令跟在FROM之后。
- ONBUILD ADD . /app/src
-
-
docker inspect ID
-
只会继承一次,孙子不能执行
-
-
4.6 将镜像推送到Docker Hub
-
docker push 用户ID/imageName
-
自动构建
- 将GitHub或者BitBucket账号连接到Docker Hub
4.7 删除镜像
-
docker rmi userId/imageName userId/imageName2
- docker rmi ‘docker images -a -q’
4.8 运行自己的Docker Registry
-
4.8.1 从容器运行Registry
- sudo docker run -p 5000:5000 registry
-
4.8.2 测试新Registry
-
sudo docker tag id localhost:5000/userId/image
-
docker push localhost:5000/userId/image
- docker run -ti localhost:5000/userId/image /bin/bash
-
-
4.9 其他可选Registry服务
4.10 小结
5. 在测试中使用Docker
5.1 使用Docker测试静态网站
-
5.1.1 Sample网站的初始Dockerfile
-
mkdir sample && cd sample && touch Dockerfile
- cd sample mkdir nginx && cd nginx && wget global.conf && wget nginx.conf && cd …
···- FROM ubuntu:14.04
MAINTAINER geguirong “geguirong@example.com”
ENV REFRESHED_AT 2020-03-30
RUN apt-get update
RUN apt-get -y -q install nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx/conf /etc/nginx/nginx.conf
EXPOSE 80
···
- FROM ubuntu:14.04
- cd sample mkdir nginx && cd nginx && wget global.conf && wget nginx.conf && cd …
-
daemon off阻止nginx进入后台,强制其在前台运行,为了保持Docker容器的活跃状态,需要其中的进程不能中断。默认nginx会以守护进程方式运行,会导致容器只是短暂运行。
-
-
5.1.2 构建Sample网站和Nginx镜像
-
docker build -t geguirong/nginx .
- docker history
-
-
5.1.3 从Sample网站和Nginx镜像构建容器
-
cd sample && mkdir website && cd website && mkdir index.html && cd …
-
docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website geguirong/nginx nginx
-
http://localhost:port
- This is a test website.
-
-
-
-v指令运行我们将宿主机的目录作为卷,挂载到容器里。
- 如果目的目录不存在,Docker会自动创建一个。同时可以加上rw或者ro来指定目录的读写状态。
-
卷是在一个或者多个容器内被选定的目录,可以绕过分层的联合文件系统,为Docker提供持久化数据或者共享数据。
- 希望同时对代码做开发和测试。
- 代码改动频繁,不想在开发过程中重构镜像。
- 希望在多个容器间共享代码。
-
这意味着对卷的修改会直接生效,并绕过镜像。当提交或者创建镜像时,卷不被包含在镜像里,卷可以在容器间共享。
-
-
5.1.4 修改网站
-
vi $PWD/website/index.html直接生效
- 环境是相同的,只是代码不一样。
-
5.2 使用Docker构建并测试Web应用程序
- 5.2.1 构建Sinatra应用程序
- 5.2.2 创建Sinatra容器
- 5.2.3 构建Redis镜像和容器
- 5.2.4 连接到Redis容器
- 5.2.5 连接Redis
- 5.2.6 让Docker容器互连
- 5.2.7 使用容器连接来通信
5.3 Docker用于持续集成
- 5.3.1 构建Jenkins和Docker服务器
- 5.3.2 创建新的Jenkins作业
- 5.3.3 运行Jenkins作业
- 5.3.4 与Jenkins作业有关的下一步
- 5.3.5 Jenkins设置小结
5.4 多配置的Jenkins
- 5.4.1 创建多配置作业
- 5.4.2 测试多配置作业
- 5.4.3 Jenkins多配置作业小结
5.5 其他选择
- 5.5.1 Drone
- 5.5.2 Shippable
5.6 小结
6. 使用Docker构建服务
6.1 构建第一个应用
- 6.1.1 Jekyll基础镜像
- 6.1.2 构建Jekyll基础镜像
- 6.1.3 Apache镜像
- 6.1.4 构建Jekylll Apache镜像
- 6.1.5 启动Jekylll网站
- 6.1.6 更新Jekyll网站
- 6.1.7 备份Jekyll卷
- 6.1.8 扩展Jekyll示例网站
6.2 使用Docker构建一个Java应用服务
- 6.2.1 WAR文件的获取器
- 6.2.2 获取WAR文件
- 6.2.3 Tomecat7应用服务器
- 6.2.4 运行WAR文件
- 6.2.5 基于Tomcat应用服务器的构建服务
6.3 多容器的应用栈
- 6.3.1 Node.js镜像
- 6.3.2 Redis基础镜像
- 6.3.3 Redis主镜像
- 6.3.4 Redis从镜像
- 6.3.5 创建Redis后端集群
- 6.3.6 创建Node容器
- 6.3.7 捕获应用日志
- 6.3.8 Node程序栈的小结
6.4 不使用SSH管理Docker容器
6.5 小结
7. 使用Fig编配Docker
7.1 Fig
- 7.1.1 安装Fig
- 7.1.2 获取示例应用
- 7.1.3 fig.yml文件
- 7.1.4 运行Fig
- 7.1.5 使用Fig
- 7.1.6 Fig小结
7.2 Consul、服务发现和Docker
- 7.2.1 构建Consul镜像
- 7.2.2 在本地测试Consul容器
- 7.2.3 使用Docker运行Consul集群
- 7.2.4 启动具有自启动功能的Consul节点
- 7.2.5 启动其余节点
- 7.2.6 配合Consul,在Docker里运行一个分布式服务
7.3 其他编配工具和组件
- 7.3.1 Fleet和etcd
- 7.3.2 Kubernetes
- 7.3.3 Apache Mesos
- 7.3.4 Helios
- 7.3.5 Centurion
- 7.3.6 Libswarm
7.4 小结
8. 使用Docker API
8.1 DockerAPI
8.2 初识Remote API
8.3 测试Docker Remote API
- 8.3.1 通过API来管理Docker镜像
- 8.3.2 通过API管理Docker容器
8.4 改进TProv应用
8.5 对Docker Remote API进行认证
- 8.5.1 建立证书授权中心
- 8.5.2 创建服务器的证书签名请求和密钥
- 8.5.3 配置Docker守护进程
- 8.5.4 创建客户端证书和秘钥
- 8.5.5 配置Docker客户端开启认证功能
8.6 小结
9. 获得帮助和对Docker进行改进
9.1 获得帮助
- 9.1.1 Docker用户和开发邮件列表
- 9.1.2 IRC上的Docker
- 9.1.3 GitHub上的Docker
9.2 报告Docker的问题
9.3 搭建构建环境
- 9.3.1 安装Docker
- 9.3.2 安装源代码和构建工具
- 9.3.3 检出源代码
- 9.3.4 贡献文档
- 9.3.5 构建开发环境
- 9.3.6 运行测试
- 9.3.7 在开发环境中使用Docker
- 9.3.8 发起pull request
- 9.3.9 批准合并和维护者
9.4 小结
XMind: ZEN - Trial Version