docker的一些介绍

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老在不同的容器中共享环境变量,
但是,你可以使用其他机制的方式来实现环境变量的共享,例如使用共享卷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值