docker架构
docker安装,升级及卸载
docker现在有连个版本,一个是docekr-ce(社区版),另一个是docker-ee(企业版)
Docker 社区版 (CE) 是开发人员和小型团队开始使用 Docker 并尝试使用基于容器的应用的理想之选。
Docker 企业版 (EE) 专为负责在生产环境中大规模构建、交付和运行业务关键型应用程序的企业开发和 IT 团队设计
安装 Docker CE
如需安装 Docker CE,您需要 64 位版本的 CentOS 7。
1、卸载旧版本,Docker 的早期版本称为 docker 或 docker-engine。如果安装了这些版本,请卸载它们及关联的依赖资源。
$ sudo yum remove docker docker-common docker-selinux docker-engine
2、安装 Docker CE
- 安装所需的软件包。yum-utils 提供了 yum-config-manager 实用程序,并且 devicemapper 存储驱动需要 device-mapper-persistent-data 和 lvm2
yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加docker镜像库
yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast 更新yum缓存
- 安装docker-ce
yum install docker-ce
升级 docker-ce
1、每次要升级 Docker 时,您都需要下载一个新文件。转至
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 并下载适用于您要安装的 Docker 版本的 .rpm 文件。
2、安装 Docker CE,并将下面的路径更改为您下载 Docker 软件包的路径。
$ sudo yum install /path/to/package.rpm
3、启动 Docker。
$ sudo systemctl start docker
卸载docke-ce
1、卸载 Docker 软件包:
yum remove docker-ce
2、主机上的镜像、容器、存储卷、或定制配置文件不会自动删除。如需删除所有镜像、容器和存储卷,请运行下列命令:
$ rm -rf /var/lib/docker
构建镜像并运行容器
1、 构建镜像
2、 运行镜像
构建镜像dockerfile
Dockerfile 是一个文本文档,其中包含构建 Docker 镜像时您通常手动执行的所有命令。Docker 可以通过从 Dockerfile 中读取指令来自动构建镜像。对网络接口和磁盘驱动器等资源的访问在此环境内实现虚拟化,这将独立于系统的其余部分,因此您必须将端口映射到外部,并具体说明您要“复制”到该环境的文件。但是,在执行此操作后,您可以期望此 Dockerfile 中定义的应用构建的行为在运行时始终相同。
一个例子:
# 将官方 Python 运行时用作父镜像
FROM python:2.7-slim
# 将工作目录设置为 /app
WORKDIR /app
# 将当前目录内容复制到位于 /app 中的容器中
ADD . /app
# 安装 requirements.txt 中指定的任何所需软件包
RUN pip install -r requirements.txt
# 使端口 80 可供此容器外的环境使用
EXPOSE 80
# 定义环境变量
ENV NAME World
# 在容器启动时运行 app.py
CMD ["python", "app.py"]
构建镜像
docker build -t first-test .
运行镜像
1、查看构建的镜像
docker ls image
REPOSITORY TAG IMAGE ID
first-test latest 326387cea398
2、运行构建的镜像生成一个容器
docker run -d -p 4000:80 first-test
3、查看运行的容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 first-test "python app.py" 28 seconds ago
4、停容器
docker stop 1fa4ab2cf395
5、删除容器
docker rm <hash> # 从此机器中删除指定的容器
docker rm $(docker ps -a -q) # 从此机器中删除所有容器
6、删除镜像
docker images -a # 显示此机器上的所有镜像
docker rmi <imagename> # 从此机器中删除指定的镜像
docker rmi $(docker images -q) # 从此机器中删除所有镜像
共享容器
为了说明我们刚才创建的可移植性,可以上传已构建的镜像并在其他地方运行它。但是,在您要将容器部署到生产环境中时,需要了解如何推送到镜像库。
镜像库是镜像仓库的集合,而镜像仓库是镜像的集合 - 除了代码已构建之外,类似于 GitHub 镜像仓库。镜像库中的一个帐户可以创建很多镜像仓库。默认情况下,docker CLI 使用 Docker 的公用镜像库。
1、登入docker hub
docker login
2、标记镜像
docker tag image username/repository:tag
3、发布镜像
docker push username/repository:tag
4、从远程镜像仓库中拉取并运行镜像
docker run -p 4000:80 username/repository:tag
跟多关于dockerfile的介绍请看这篇博客dockerfile最佳实践
容器在集群中编排 docker swarm
docker swarm模式会将几个主机节点组成一个集群,供容器部署,提供负载均衡,在此处将应用部署到集群,并在多台机器上运行它,可用compose文件对容器进行编排.
swarm 是一组运行 Docker 并且已加入集群中的机器。执行此操作后,您可以继续运行已使用的 Docker 命令,但现在它们在集群上由 swarm 管理节点执行。 swarm 中的机器可以为物理或虚拟机。加入 swarm 后,可以将它们称为节点。
swarm 管理节点可以使用多项策略来运行容器,例如“最空的节点”– 这将使用容器填充使用最少的机器。或“全局”,这将确保每台机器恰好获得指定容器的一个实例。您可以指示 swarm 管理节点使用 Compose 文件中的这些策略,就像您已使用的策略一样。
1、运用swarm模式时需要初始化
docker swarm init //将该节点初始化为swarm管理主节点
2、其他节点加入swarm集群
docker swarm join
3、查看加入swarm的节点
docker node ls
3、在swarm模式下部署容器,需在管理节点运行
docker stack deploy -c docker-compose.yml getstartedlab
4、查看swarm模式下启动的容器
docker stack ps getstartedlab
5、清除应用和 swarm
docker stack rm getstartedlab
单服务例子
version:"3"
services:
web:
# 将 username/repo:tag 替换为您的名称和镜像详细信息
image: username/repository:tag
deploy:
replicas:5
resources:
limits:
cpus:"0.1"
memory:50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:
管理容器中的数据
两种方式管理容器数据
- 数据卷
- 数据卷容器
数据卷
1、添加一个数据卷
在docker create和docker run 结合-v参数在容器内添加一个数据卷
$ docker run -d -P --name web -v /webapp training/webapp python app.py
2、将本地目录挂载进数据卷
docker run -v /Users/<path>:/<container path> ... //linux系统
docker run -v c:\<path>:c:\<container path> //window系统
3、挂载一个共享卷作为数据卷(结合ISCSI,NFS等系统)
4、挂载一个主机文件作为一个数据卷
数据卷容器
1、新建和挂载一个数据卷容器
docker create -v /dbdata --name dbstore training/postgres /bin/true
2、使用–volumes-from挂载数据卷容器
$ docker run -d --volumes-from dbstore --name db1 training/postgres
备份,恢复,迁移数据卷
Another useful function we can perform with volumes is use them for backups, restores or migrations. You do this by using the --volumes-from flag to create a new container that mounts that volume, like so:
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
Then un-tar the backup file in the new container`s data volume.
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
You can use the techniques above to automate backup, migration and restore testing using your preferred tools.
3、列出所有已有卷
$ docker volume ls
DRIVER VOLUME NAME
local ec75c47aa8b8c61fdabcf37f89dad44266841b99dc4b48261a4757e70357ec06
local f73e499de345187639cdf3c865d97f241216c2382fe5fa67555c64f258892128
local tmp_data
4、删除卷
数据卷在容器删除后依旧存在,你可以给卷起名字也可以使用匿名名,卷要手动删除才可以
$ docker run --rm -v /foo -v awesome:/bar busybox top
清除所有的未使用额卷
$ docker volume prune
补充
容器的存储驱动
通常,非常小的数据是写在容器的可写层,然后使用docker的数据卷来存放数据,然而有时候一些工作就需要将数据写进容器的可写层,因此就引来了存储驱动
镜像和层
一个docker镜是由许多层组成的,每一层代表dockerfile中的一个指令,除最后一层外每层都是只读的。例如:
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
这个dockerfile中包含四个指令,就有四层。每个图层只是与之前图层的一组差异,这些层堆叠在彼此之上。创建容器时,可以在基础图层的顶部添加可写层。盖层通常称为“容器层”。对正在运行的容器所做的更改(例如写入文件,删除,修改文件)都将写入此可写容器层。
下图展示了上一个docker所建立的镜像
存储驱动程序处理有关这些层彼此交互方式的详细信息,可以使用不同的存储驱动程序,他们的不同情况下具有优点和缺点。
容器和层
容器和层主要的区别是顶部的可写层,所有对容器添加或修改已存数据的的写操作都存储在这个可写层,当容器被删除时这一层同样被删除,而下面的层依然保持不变。
因为每个容器都有他自己的可写层,所有的变化都存储在这一层,不同的容器可以共享对相同底层金想的访问权限。下图展示了不用容器共享同一个下层镜像
如果想要不同镜像有队额外相同数据的访问权限,使用共享数据卷的方式挂载进容器
docker使用存储驱动来管理镜像层和可写容器层的容器,每个存储驱动以不同的方式处理时限,但所有驱动程序都使用可堆叠图像层和可写时复制策略。
写时复制策略
写时复制是一种共享和复制文件的策略,可实现高效率。如果文件或目录存在于镜像中的较低层,而另一层(包括可写层)需要对其进行访问,则他只使用现有文件。第一次另一个图层需要修改文件时(构建或运行容器时),文件将被复制到该图像层进行修改,这最小化了I/O和每个后续层大小
数据卷和存储驱动
删除容器时,将删除写入容器中未存储在数据卷中的任何数据以及容器。
数据卷是Docker主机文件系统中直接安装到容器中的目录或文件。数据卷不受存储驱动程序控制。对数据卷的读取和写入会绕过存储驱动程序并以本机主机速度运行。您可以将任意数量的数据卷装入容器中。多个容器还可以共享一个或多个数据卷。
下图显示了运行两个容器的单个Docker主机。每个容器都存在于Docker主机本地存储区域(/ var / lib / docker / …)内的自己的地址空间内。 Docker主机上的/ data上还有一个共享数据卷。它直接安装在两个容器中。
存储驱动的类型
对于docker-ce针对不同发行版本的linux有不同的较适合的存储驱动
最好的全能配置是使用具有支持overlay2存储驱动程序的内核的现代Linux发行版,并将Docker卷用于写入繁重的工作负载,而不是依赖于将数据写入容器的可写层。
后备文件系统
关于Docker,后备文件系统是/ var / lib / docker /所在的文件系统。某些存储驱动程序仅适用于特定的后备文件系统。
网络容器
docker通过使用网络驱动来支持网络容器,默认,docker提供四种网络驱动,bridge,host,null和overlay驱动,你也可以自己写一个网络驱动插件来创建自己的网络
1、查看网络类型
[root@node2 docker-compose]# docker network ls
NETWORK ID NAME DRIVER SCOPE
74ff837a3f77 bridge bridge local
4175c532a7df host host local
1547c7a0b60e none null local
h76mj7pyldv4 ingress overlay swarm
da237207d151 pub_net macvlan local
2、查看某网络
docker network inspect bridge
3、新建网络
$ docker network create -d bridge my_bridge
4、将容器加入到某网络
docker run -d --net=my_bridge --name db training/postgres
5、将容器和某网络连接
$ docker network connect my_bridge web
6、将容器从某网络中断开连接
$ docker network disconnect bridge networktest
bridge网络
在此网络中启动的容器必须位于同一个Docker主机上。网络中的每个容器都可以立即与网络中的其他容器通信。但是,网络本身将容器与外部网络隔离开来。
在用户定义的网桥中,不支持链接。您可以在此网络中的容器上公开和发布容器端口。如果要将桥接网络的一部分用于外部网络,这将非常有用。
docker_gwbridge网络
docker_gwbridge是一个本地桥接网络,由Docker在两种不同的情况下自动创建:
- 初始化或加入swarm时,Docker会创建docker_gwbridge网络,并将其用于不同主机上的群集节点之间的通信。
- 当容器的网络都不能提供外部连接时,除了容器的其他网络之外,Docker还将容器连接到docker_gwbridge网络,以便容器可以连接到外部网络或其他群集节点。
如果需要自定义配置,可以提前创建docker_gwbridge网络,否则Docker会根据需要创建它。以下示例使用一些自定义选项创建docker_gwbridge网络。
$ docker network create --subnet 172.30.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
docker_gwbridge
使用overlay网络时,docker_gwbridge网络始终存在。
swarm模型中的overlay网络
可以在以swarm模式运行的管理器节点上创建overlay网络,而无需外部键值存储。swarm使overlay网络仅可用于swarm中需要服务的节点。创建使用overlay网络的服务时,管理器节点会自动将swarm网络扩展到运行服务任务的节点。
如果您未在swarm模式下使用Docker Engine,则overlay网络需要有效的键值存储服务。支持的键值存储包括Consul,Etcd和ZooKeeper(分布式存储)。在以这种方式创建网络之前,您必须安装和配置所选的键值存储服务。 Docker托管您打算建立网络,并且该服务必须能够进行通信。
例子
$ docker network create \
--driver overlay \
--subnet 10.0.9.0/24 \
my-multi-host-network
400g6bwzd68jizzdx5pgyoe95
$ docker service create --replicas 2 --network my-multi-host-network --name my-web nginx
716thylsndqma81j6kkkb5aus
只有swarm 服务可以连接到overlay网络,而不是独立的容器
不在swarm模式的overlay网络
如果使用的容器引擎不在swarm模式,要使用overlay网络则需要有个键值存储服务,支持的键值存储服务有Consul、Etcd和Zookeepr(分布式存储)。键值数据库保存了网络的状态,包括发现,网络,端点,IP地址等。
警告:--link标志是docker旧版本的一个用法,他可能最终被舍弃,除非你真的需要继续使用它,
我们建议使用用户自定义的网络来使不同的容器进行链接,而不是使用--link。
用户自定义的网络不支持使用--link老在不同的容器中共享环境变量,
但是,你可以使用其他机制的方式来实现环境变量的共享,例如使用共享卷。