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-compose

docker-compose.yml文件是一个 YAML 文件,用于定义 Docker 容器在生产中的行为方式。
将 Compose 文件设置为 version:”3”。本质上,这会使其兼容 swarm mode。我们可以使用 docker stack deploy 命令(仅在 Compose 文件版本 3.x 及更高版本上受支持)运行此文件。您可以使用 docker-compose up 运行具有非 swarm 配置的版本 3 文件。

技术栈

技术栈是一组相关的服务,它们共享依赖项并且可以一起进行编排和扩展。单个技术栈能够定义和协调整个应用的功能(虽然很复杂的应用程序可能需要使用多个技术栈)。

特点

1、单个主机上多个隔离环境
2、创建容器时保留数据卷
3、仅创建已经修改的容器
4、通过变量来定制环境变量

docker-compose中的一些指令

1、build

build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    - buildno: 1
    - password=secret
  cache_from:
    - alpine:latest
    - corp/web_app:3.14
  labels:
    com.example.description: "Accounting webapp"
    com.example.department: "Finance"

context:说明dockerfile的路径
dockerfile:备用dockerfile,还必须指定构建路径
args:添加的构建参数
cache_from:所列出的镜像将被引擎用来缓存
labels:使用Docker标签将元数据添加到生成的图像中。您可以使用数组或字典

2、cap_add、cap_drop
添加或删除容器功能

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

3、command
覆盖默认command命令

command: bundle exec thin -p 3000

4、configs
在每个服务中使用configs为每个服务授予config权限,支持两种语法变体。

  • SHORT SYNTAX
    短语法变体仅指定配置名称。这将授予容器对配置的访问权限并将其挂载在容器的/的目录下。源名称和目标安装点都设置为配置名称。
version: "3.3"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

my_other_config被定义为外部资源,这意味着它已经在Docker中定义,可以通过运行docker config create命令或通过其他堆栈部署来定义。如果外部配置不存在,则堆栈部署将失败,并显示config not found错误

  • LONG SYNTAX
    长语法提供了在服务的任务容器中如何创建配置的更多粒度。
version: "3.3"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - source: my_config
        target: /redis_config
        uid: '103'
        gid: '103'
        mode: 0440
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

数字UID或GID,它将在服务的任务容器中拥有已安装的配置文件。如果未指定,则在Linux上默认为0。 Windows不支持。
mode:将以八进制表示法在服务的任务容器中装入的文件的权限。例如,0444表示世界可读。默认值为0444
5、cgroup_parent
为容器指定可选的父cgroup。

cgroup_parent: m-executor-abcd

6、container_name
指定自定义容器名称,而不是生成的默认名称。容器名应该唯一,不然无法扩展到外面去。

container_name: my-web-container

7、credential_spec
配置托管服务帐户的凭据规范(仅限Windows)

credential_spec:
  file: c:/WINDOWS/my-credential-spec.txt

credential_spec:
  registry: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs

8、deploy
指定与部署和运行服务相关的配置。这仅在部署到具有docker堆栈部署的群集时生效,并且被docker-compose up和docker-compose run忽略。

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      mode: global
      replicas: 6
      placement:
        constraints:
          - node.role == manager
          - engine.labels.operatingsystem == ubuntu 14.04
      update_config:
        parallelism: 2
        delay: 10s
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      labels:
        com.example.description: "This label will appear on the web service"
  • MODE
    global(每个群集节点恰好一个容器)或replicated(指定数量的容器)。默认值global。

  • REPLICAS
    如果mode是replicated,指定在任何给定时间应该运行的容器数。

  • PLACEMENT
    指定放置约束。

  • UPDATE_CONFIG
    配置服务应如何更新。用于配置滚动更新。

parallelism:一次更新的容器数。
delay:更新一组容器之间的等待时间。
failure_action:如果更新失败怎么办。继续或暂停之一(默认值:暂停)。
monitor:每次更新任务后的持续时间以监视失败(ns | us | ms | s | m | h)(默认为0)。
max_failure_ratio:更新期间容忍的失败率。
  • RESOURCES
    配置资源限制。这将替换版本3之前的Compose文件中的旧资源约束选项(cpu_shares,cpu_quota,cpuset,mem_limit,memswap_limit,mem_swappiness)

  • RESTART_POLICY
    配置是否以及如何在容器退出时重新启动容器。替换restart.

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
condition:noneon-failure或any(默认值:any)之一。
delay:重新启动尝试之间等待的时间,指定为持续时间(默认值:0)。
max_attempts:在放弃之前尝试重启容器的次数(默认值:never give up)。
window:在判断重启是否成功之前等待多长时间,指定为持续时间(默认值:立即决定)。
  • LABELS
    指定服务的标签。这些标签只能在服务上设置,而不能在服务的任何容器上设置。

9、下面选项仅支持docker compose up 和 docker compose run不支持docker stack deploy 或者 deploy key。

build
cgroup_parent
container_name
devices
dns
dns_search
tmpfs
external_links
links
network_mode
security_opt
stop_signal
sysctls
userns_mode

10、devices
设备映射列表。使用与–device docker client create选项相同的格式。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

11、depends_on
服务之间的快速依赖关系,有两个影响:

  • docker-compose up将按依赖顺序启动服务。在以下示例中,db和redis将在web之前启动。
  • docker-compose up SERVICE将自动包含SERVICE的依赖项。在以下示例中,docker-compose up web还将创建并启动db和redis。
version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

11、dns
自定义DNS服务器。可以是单个值或列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

12、dns_search
自定义DNS搜索域。可以是单个值或列表。

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

13、tmpfs
在容器内安装临时文件系统。可以是单个值或列表。

tmpfs: /run
tmpfs:
  - /run
  - /tmp

14、entrypoint
覆盖默认的entrypoint。可以是个列表

entrypoint: /code/entrypoint.sh
entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

15、env_file
从文件添加环境变量。可以是单个值或列表。
如果已使用docker-compose -f FILE指定了Compose文件,则env_file中的路径相对于该文件所在的目录。
环境中指定的环境变量会覆盖这些值

env_file: .env
env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

如果您的服务指定了构建选项,则在构建期间,环境文件中定义的变量将不会自动显示。使用build的args子选项来定义构建时环境变量。
环境文件的顺序非常重要,当放在下面的文件中定义的变量在上面文件中已经定义过时,则下面的则会覆盖上面的。
16、environment
添加环境变量。您可以使用数组或字典。任何布尔值; true,false,yes no,需要用引号括起来,以确保YML解析器不会将它们转换为True或False。
仅具有键的环境变量将解析为计算机正在运行的计算机上的值,这对于特定于机密或特定于主机的值很有用。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

如果您的服务指定了构建选项,则在构建期间,环境中定义的变量将不会自动显示。使用build的args子选项来定义构建时环境变量。

17、expose
暴露端口而不将它们发布到主机 - 它们只能被链接服务访问。只能指定内部端口。
18、ports
暴露端口

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"

19、external_links
链接到此docker-compose.yml之外或甚至在Compose之外的容器,尤其是对于提供共享或公共服务的容器。在指定容器名称和链接别名(CONTAINER:ALIAS)时,external_links遵循类似于遗留选项链接的语义。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

20、healthcheck
配置运行的检查以确定此服务的容器是否“健康”。

21、image
22、isolation
指定容器的隔离技术。在Linux上,唯一受支持的值是default。在Windows上,可接受的值是default,process和hyperv。有关详细信息
23、labels
使用Docker标签向容器添加元数据。您可以使用数组或字典。
24、links
链接到另一个服务中的容器。指定服务名称和链接别名(SERVICE:ALIAS),或仅指定服务名称。

web:
  links:
   - db
   - db:database
   - redis

25、logging

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"
    max-size: "200k"
    max-file: "10"

其中默认driver是json-file

driver: "json-file"
driver: "syslog"
driver: "none"

26、network_mode

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

27、networks
要加入的网络,引用顶级网络密钥下的条目。必须在全局的networks下有定义。
- ALIASES
网络上此服务的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器。
- IPV4_ADDRESS, IPV6_ADDRESS
在加入网络时为此服务指定容器的静态IP地址。

version: '2.1'

services:
  app:
    image: busybox
    command: ifconfig
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  app_net:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.238.0/24
      -
        subnet: 2001:3984:3989::/64

28、extra_hosts

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

将在此服务的容器内的/ etc / hosts中创建具有ip地址和主机名的条目,例如:

162.242.195.82  somehost
50.31.209.229   otherhost

29、volumes
在全局volumes选项中定义了命名卷并且被其他服务卷列表所参考。命名卷必须在全局中有定义

version: '2'

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:
    external: true
      name: actual-name-of-volume
  • driver
    指定应为此卷使用哪个卷驱动程序。默认为Docker Engine配置使用的任何驱动程序,在大多数情况下是本地的。如果驱动程序不可用,则当docker-compose尝试创建卷时,Engine将返回错误。

  • driver_opts
    将选项列表指定为键值对,以传递给此卷的驱动程序。

 driver_opts:
    foo: "bar"
    baz: 1
  • external

如果设置为true,则指定已在Compose之外创建此卷。 docker-compose up不会尝试创建它,如果它不存在则会引发错误。
external不能与其他卷配置键(driver,driver_opts)一起使用。
在下面的示例中,Compose不会尝试创建名为[projectname] _data的卷,而是查找仅称为数据的现有卷,并将其挂载到db服务的容器中。

version: '2'

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:
    external: true

您还可以在Compose文件中与用于引用它的名称分别指定卷的名称:

volumes:
  data:
    external:
      name: actual-name-of-volume
  • labels
    使用Docker标签向容器添加元数据。您可以使用数组或字典。
    建议您使用反向DNS表示法来防止标签与其他软件使用的标签冲突。

30、domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir
每个都是单个值,类似于docker run对应物。

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

privileged: true


read_only: true
shm_size: 64M
stdin_open: true
tty: true

容器在集群中编排 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:

多服务编排例子

version: "3"
services:
    web:
        image: nginx
        deploy:
             replicas: 5
             resources:
                limits:
                   cpus: "0.1"
                   memory: 50M
             restart_policy:
                  condition: on-failure
        ports:
          - "80:80"
        networks:
          - webnet
    visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
              constraints: [node.role == manager]
        networks:
           - webnet
    redis:
        image: redis
        ports:
           - "6379:6379"
        volumes:
           - /mnt:/data
        deploy:
          placement:
              constraints: [node.role == manager]
        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的数据卷来存放数据,然而有时候一些工作就需要将数据写进容器的可写层,因此就引来了存储驱动

镜像和层

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

搭建自己的镜像库

后面补充

猜你喜欢

转载自blog.csdn.net/qxxhjy/article/details/81534255