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老在不同的容器中共享環境變量,
但是,你可以使用其他機制的方式來實現環境變量的共享,例如使用共享卷。

搭建自己的鏡像庫

後面補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章