docker容器的學習筆記


目錄

Docker入門學習筆記(一)

  1. 什么是Docker?
  2. Docke的目標
  3. Docker通常應用場景
  4. Docker的基本組成
  5. Docker基本操作
  6. 守護式容器
  7. 在容器中部署靜態網站

1. 什么是Docker?

  • 將應用程序自動部署到容器

2. Docke的目標

  • 提供簡單輕量的建模方式
  • 職責的邏輯分離
  • 快速高效的開發周期
  • 鼓勵面向服務的架構

3. Docker通常應用場景

  • 使用Docker容器開發、測試、部署服務
  • 創建隔離的運行環境
  • 搭建多用戶的平台即服務(PaaS)基礎設施
  • 提供軟件即服務(SaaS)應用程序
  • 高性能、超大規模的宿主機部署

4. Docker的基本組成

  • Docker Client 客戶端
  • Docker Daemon 守護進程(c/s架構,守護進程是服務器,可以是本地,也可以是遠程)
  • Docker Image 鏡像(一些只讀層,root文件只有只讀權限)
  • Docker Container 容器(通過鏡像啟動,在只讀層上增加一個可寫層)
  • Docker Registey 倉庫(倉庫存儲鏡像,公有和私有2種,公有的有Docker Hub,可以下載各種鏡像)

補:Docker容器相關技術簡介

Docker依賴的Linux內核特性

  • Namespaces命名空間
  • Control groups(cgroups)控制組

Namespaces命名空間(5種)

  • PID(Process ID)進程隔離
  • NET(Network)管理網絡接口
  • IPC(InterProcess Communication)管理跨進程通信的訪問
  • MNT(Mount)管理掛載點
  • UTS(Unix Timesharing System)隔離內核和版本標識

Control groups控制組

用來分配資源
來源於google
linux kernel 2.6.24@2007

  • 資源限制
  • 優先級設定
  • 資源計量
  • 資源控制

Docker容器的能力

  • 文件系統隔離:每個容器都有自己的root文件系統
  • 進程隔離:每個容器都運行在自己的進程環境中
  • 網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的
  • 資源隔離和分組:使用cgroups將cpu和內存之類的資源獨立分配給每個Docker容器

安裝Docker

菜鳥教程
我在虛擬機使用的是:

sudo apt-get install docker.io
sudo systemctl start docker
sudo systemctl enable docker
docker version

增加docker用戶組使之不需要sudo即可運行docker

sudo groupadd docker
sudo gpasswd -a zg docker
sudo service docker restart
sudo init 6   //或者注銷用戶在進系統

5. Docker基本操作

啟動一個容器(第一次啟動ubuntu容器時會從網上下載它的鏡像)
這是表示載入容器后運行bash,docker中必須要保持一個進程的運行,要不然整個容器就會退出。這個就表示啟動容器后啟動bash。此時ubuntu就是下面的IMAGE。

docker run -i -t ubuntu /bin/bash

運行容器

docker run IMAGE [COMMAND] [ARG…]
    run 在新容器中執行命令

啟動交互式容器:

# docker run -i -t IMAGE /bin/bash
    -i  --interactive=true|false 默認為false(告訴守護進程,為容器始終打開標准輸入)
    -t  --tty=true|false 默認為false(為創建的容器提供一個偽tty終端,類似於terminal終端)

查看容器:

# docker ps [-a] [-l]  (-a 所有的容器,-l 最新的容器)
# docker inspect 容器名/id (返回詳細的容器信息)

自定義容器名:

# docker run --name=自定義名 -i -t  IMAGE  /bin/bash

重新啟動已經停止的容器:

# docker start [-i] 容器名/id

刪除停止的容器:(不能用於刪除運行中的容器)

# docker rm 容器名/id

6. 守護式容器

  • 能夠長期運行
  • 沒有交互式會話
  • 適合運行應用程序和服務

以守護形式運行容器

# docker run -i -t IMAGE /bin/bash
Ctrl+P+Q

附加到運行中的容器(重新進入正在運行的容器)

# docker attach 容器名/id

啟動守護式容器(最重要的方式)

docker 容器默認會把容器內部第一個進程,也就是pid=1的程序作為docker容器是否正在運行的依據,如果docker 容器pid掛了,那么docker容器便會直接退出。

# docker run -d 鏡像名 [COMMAND] [ARG…]
    -d  以后台運行方式啟動

查看容器日志(可以看到容器運行的情況)

# docker logs [-f] [-t] [--tail] 容器名/id
    -f --follows=true|false 默認為false 
        一直跟蹤日志變化並返回結果,Ctrl+C停止
    -t --timestamps=true|false 默認為false
        返回的結果后附加時間戳
    --tail ="all"
        返回結尾處日志,未指定則返回所有日志,--tail 10 最新的10條日志,--tail 0 最新的一條日志

查看運行中容器的進程情況

# docker top 容器名/id

在運行中的容器內啟動新進程

# docker exec [-d][-i][-t] 容器名/id [COMMAND] [ARG…]

停止守護容器

# docker stop 容器名/id     發送信號后等待容器停止
# docker kill 容器名/id     直接終止

使用docker幫助文檔

man docker-run
man docker-logs
man docker-exec

7. 在容器中部署靜態網站

設置容器的端口映射

run [-P] [-p]
    -P --publish-all=true | false 默認為false
        # docker run -P -i -t ubuntu /bin/bash
        映射所有端口
    -p --publish=[]     指定映射端口
        containerPort            只指定容器端口
            # docker run -p 80 -i -t ubuntu /bin/bash
        hostPort:containerPort   指定宿主機端口和容器端口
            # docker run -p 8080:80 -i -t ubuntu /bin/bash
        ip:containerPort        ip和容器的端口
            # docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
        ip:hostPort:containerPort    ip,宿主機,容器端口
            # docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

Nginx部署靜態網頁流程

  • 創建映射80端口的交互式容器
  • 安裝Nginx
  • 安裝文本編輯器vim
  • 創建靜態頁面
  • 修改Nginx配置文件
  • 運行Nginx
  • 驗證網站訪問
# docker run -p 80 --name web -i -t ubuntu /bin/bash
apt-get update
apt-get install -y nginx
apt-get install -y vim

mkdir -p /var/www/html
cd /var/www/html
vim index.html
    <html>
        <head>
            <title>Nginx in Docker</title>
        </head>
        <body>
            <h1>hello, I'm website in docker!</h1>
        </body>
    </html>

whereis nginx
vim /etc/nginx/sites-enabled/default(配置nginx的文件)
    修改 root 的值為 /var/www/html

cd /
nginx
ps -ef
Ctrl+P Ctrl+Q 退出,后台運行

# docker ps     查看運行的容器
# docker port web       查看端口映射情況
# docker top web        查看容器進程情況

# curl http://127.0.0.1:32768     以映射的端口為准,返回的是寫的html代碼(32768是映射到宿主機的端口號)
在瀏覽器中查看這個頁面:網址:http://127.0.0.1:32768

# docekr inspect web        查看容器對應的IPAddress
# curl 172.17.0.2(這個地址是容器的IP地址,在宿主機上運行,默認是80端口,可以省略)

# 關閉容器
# docker stop web
# docker start -i web
# ps -ef
# nignx並未啟動

# docker exec web nginx
# 重新啟動Nginx
# 映射的端口和IP地址均已改變

Docker入門學習筆記(二)

  1. 鏡像的相關操作
  2. Docker的C/S模式
  3. Docker守護進程的配置和操作

8. 鏡像的相關操作

Docker鏡像:

    容器的基石
    層疊的只讀文件系統
    聯合加載(union mount)

    # docker info
    查看docker配置的相關信息

列出鏡像:

# docker images [OPTIONS] [REPOSITORY]
    -a  --all=False 顯示所有鏡像(默認不顯示中間層的鏡像)
    -f  --filter=[] 顯示時的過濾條件
    --no-trunc=false    不使用截斷的形式顯示命令
    -q  --quiet=false   只顯示鏡像的v-id
返回的結果中,repository倉庫的意思代表一個鏡像名,tag代表這個鏡像的標簽

查看鏡像

# docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE……]

刪除鏡像

# docker rmi [OPTIONS] IMAGE [IMAGE…]
-f  --force=false   強制刪除鏡像
--no-prune=false    保留刪除鏡像中未打標簽的父鏡像
刪除多個鏡像,docker rmi ubuntu:12.04 ubuntu:14.04
沒有直接刪除所以鏡像的選項,可以使用docker rmi $(docker images ubunru -q)刪除所有鏡像

查找鏡像

方法一:
Docker Hub  訪問https://hub.docker.com/
方法二:
# docker search [OPTIONS] TERM
    --automated=false   只顯示自動化構建的選項
    --no-trunc=false    以截斷方式顯示image id
    -s  --stars=0   設置顯示結果的最低星級
    一次最多返回25個結果

拉取鏡像

# docker pull [OPTIONS] NAME[:TAG]
    -a  --all-tags=false    下載倉庫中所有標簽鏡像
例子:docker pull ubuntu:14.04

提速
    使用--registry-mirror選項
        1.修改:vim /etc/default/docker
        2.添加:DOCKER_OPTS = "--registry-mirror=http://MIRROR-ADDR"
            https://www.daocloud.io

推送鏡像

# docker push NAME[:TAG]

構建鏡像

保存對容器的修改,並再次使用
自定義鏡像的能力
以軟件的形式打包並分發服務及其運行環境

方法1.使用commit構建鏡像(通過對容器的操作來保存的鏡像)
    # docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    -a  --author="" 指定鏡像作者,一般:name@email
    -m  --message=""    提交信息
    -p  --pause=true    在commit過程中不暫停容器

    ********************demo***************
    # docker run -it -p 80 --name commit_test_one ubuntu /bin/bash
    # apt-get update
    # apt-get install -y nginx
    下載vim並新建一個html,運行nginx服務成功
    # exit
    # docker ps -l
    生成鏡像
    # docker commit -a "clearloveu" -m "nginx" commit_test_one myimage_one
    # docker images
    用生成的鏡像創建一個容器,並執行nginx服務
    可以百度搜索docker運行nginx為什么要使用 daemon off
    # docker run -d --name nginx_web -p 80 myimage_one nginx -g "daemon off;"
    # docker ps
    # curl http://127.0.0.1:32770
    ***************************************

方法2.使用dockerfile構建鏡像(文件名為Dockerfile,路徑不包括文件名)

    # docker build [OPTIONS] PATH|URL|-
        --force-rm=false
        --no-cache=false
        --pull=false
        -q  --quiet=false     可以設置,表示在構建過程中不會出現中間鏡像
        --rm=true
        -t  --tag=""         設置標簽

    創建一個Dockerfile
        # first dockerfile
        FROM ubuntu:14.04
        MAINTAINER  name "name@email"
        RUN apt-get update
        RUN apt-get install -y nginx
        EXPOSE 80                    代表暴露的端口號為80

    ********************demo***************
    # mkdir -p dockerfile/df_test1
    # cd dockerfile/df_test1
    # vim Dockerfile
        # first dockerfile
        FROM ubuntu:14.04
        MAINTAINER  name "name@email"
        RUN apt-get update
        RUN apt-get install -y nginx
        EXPOSE 80
    # docker build -t='clearloveu/dockerfile_test1' .
    # docker run -d --name nginx_web3 -p 80 clearloveu/dockerfile_test1 nginx -g "daemon off;"
    # docker ps
    # curl http://127.0.0.1:32770
    ***************************************

9. Docker守護進程的配置和操作

查看守護進程

方法一:
# ps -ef | grep docker
方法二:
# status docker     (ubuntu18.04沒有,14.04有)

使用service命令管理

# service docker start|stop|restart

Docker的啟動選項(守護進程即服務器的啟動選項,詳細的選項)

這里是docker守護進程的啟動選項,而不是docker客戶端的啟動選項,所以有些選項不通過命令行來執行,而是在Docker的啟動配置文件中添加選項信息,增加一行DOCKER_OPTS="label_name=docker_server1 -H tcp://0.0.0.0:2375"

# docker -d [OPTIONS]
    -d 表示以守護進程形式運行

    運行相關:
    -D  --debug=false
    -e  --exec-drive="native"
    -g  --graph="/var/lib/docker"
    --icc=true
    -l  --log-level="info"
    --label=[]
    =p  --pidfile="/var/run/docker.pid"

    Docker服務器連接相關:
    -G,--group="docker"
    -H,--host=[]
    --tls=false            和安全相關
    --tlscacert="/home/sven/.docker/ca.pem"
    --tlscert="/home/sven/.docker/cert.pem"
    --tlskey="/home/sven/.docker/key.pem"
    --tlsverify=false

    RemoteAPI相關:
    --api-enable-cors=false

    存儲相關:
    -s,--storage-drive=""
    --selinux-enabled=false
    --storage-opt=[]

    Registry相關:
    --insecure-registry=[]
    --registry-mirror=[]

    網絡設置相關:
    -b,--bridge=""
    --bip=""
    --fixed-cidr=""
    --fixed-cidr-v6=""
    --dns=[]
    --dns-search=[]
    --ip=0.0.0.0
    --ip-forward=true
    --ip-masq=true
    --iptables=true
    --ipv6=false
    --mtu=0

docker啟動配置文件:/etc/default/docker

ubuntu18.04使用apt-get下載的docker的啟動配置文件不在/etc/default/docker處
在啟動配置文件中添加啟動選項:DOCKER_OPTS="label_name=docker_server1"

Docker入門學習筆記(三)

  1. Docker的遠程訪問
  2. Dockerfile指令
  3. Dockerfile構建過程

10. Docker的遠程訪問

環境准備:

第二台安裝Docker的服務器
修改Docker守護進程啟動選項,添加label選項,區別服務器
保證Client API和Server API版本一致

# docker version
    查看版本API是否一致

修改服務器端配置以使服務器支持遠程訪問

修改Docker守護進程啟動項
-H  tcp://host:port
    unix:///path/to/socket
    fd://* or fd://socketfd
守護進程默認配置:
-H  unix:///var/run/docker.sock

修改配置文件
vim /etc/default/docker
    DOCKER_OPTS = "-H tcp://0.0.0.0:2375"
    # 一般選擇2375端口
重啟服務
service docker restart
ifconfig    獲取本機IP地址(本機即宿主機就是Docker守護進程即服務器,本機ip地址即docker服務器的ip地址)

遠程訪問

curl http://服務器IP:配置port/info(返回的是docker服務器的info信息)
例子:curl http://10.211.55.5:2375/info

docker客戶端遠程訪問

修改客戶端配置
使用Docker客戶端命令選項
-H  tcp://host:port
    unix:///path/to/socket
    fd://* or fd://socketfd
客戶端默認配置:
-H  unix:///var/run/docker.sock

客戶端遠程訪問(返回的是docker服務器的info信息)
# docker -H tcp://ip:port info
例子:docker -H tcp://10.211.55.5:2375 info

使用環境變量簡化操作DOCKER_HOST(不需要每次連接遠程的docker服務器都需要打-H tcp://ip:port info)
export DOCKER_HOST="tcp://ip:port"
例子:
export DOCKER_HOST="tcp://10.211.55.5:2375"
docker info(自動連接上遠程的docker服務器,並返回遠程服務器的info信息)


將環境變量置空則返回本機服務
export DOCKER_HOST=""

設置了遠程訪問模式后的服務端不再支持本機連接

方法一:
將本機作為遠程客戶端,設置環境變量DOCKER_HOST或者通過-H選項模擬遠程客戶端進行連接
方法二:
再次修改本機的Docker守護進程啟動配置文件,添加默認配置,-H可以指定多個連接選項,這里加上默認的socket連接方式-H  unix:///var/run/docker.sock,即可支持本地連接
vim /etc/default/docker
    DOCKER_OPTS = "-H tcp://0.0.0.0:2375 -H  unix:///var/run/docker.sock"

11. Dockerfile指令

指令格式

格式
# Comment(注釋)
INSTRUCTION argument(INSTRUCTION大寫代表指令,argument小寫代表指令參數)

例子:

# first dockerfile
FROM ubuntu:14.04
MAINTAINER  name "name@email"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

FROM

FROM [: ]

已經存在的鏡像
基礎鏡像
必須是第一條非注釋指令

MAINTAINER

MAINTAINER

指定鏡像的作者信息,包含鏡像的所有者和聯系信息

RUN

RUN(鏡像構建時運行的命令)

指定當前鏡像中運行的命令
shell模式
    RUN <command>
    默認shell   /bin/sh -c command
    可以將多個命令一起執行:RUN apt-get update && apt-get install -y nginx
exec模式
    RUN [ "executable", "param1", "param2"]
    可以指定其他shell   RUN ["/bin/bash", "-c", "echo hello"]

EXPOSE

EXPOSE [ …]

指定運行該鏡像的容器使用的端口:EXPOSE 80
在使用鏡像創建或運行容器時仍需指定端口:docker run -p 80 myimage_one

CMD

CMD(容器運行時運行的默認命令)

提供容器運行時的命令,作為默認設置,會被啟動容器時的docker run中的命令覆蓋掉
CMD [ "executable", "param1", "param2"] (exec模式)
CMD command param1 param2   (shell模式)
CMD ["param1", "param2"]    (作為ENTRYPOINT指令的默認參數)

ENTRYPOINT

ENTRYPOINT

ENTRYPOINT [ "executable", "param1", "param2"] (exec模式)
ENTRYPOINT command param1 param2   (shell模式)
默認不會被docker run中命令覆蓋
可以使用 docker run entrypoint 覆蓋:docker run myimage_one entrypoint /bin/bash

可以組合使用,用ENTRYPOINT指定命令,CMD指定命令的參數,在docker run中添加命令參數覆蓋CMD的默認參數,這可以解釋CMD的第3種用法:作為ENTRYPOINT指令的默認參數

ADD、COPY

ADD、COPY

將文件/目錄復制到Dockerfile構建的文件中,源地址(宿主機的相對地址,不推薦使用遠程url作為源地址),目標地址(鏡像中的絕對地址)
ADD <src>…<dest>
ADD ["<src>"…"<dest>"]  (使用於文件路徑中有空格的情況)

COPY <src>…<dest>
COPY ["<src>"…"<dest>"]  (使用於文件路徑中有空格的情況)

ADD vs COPY
    ADD包含類似tar的解壓功能
    如果單純復制文件,Docker推薦使用COPY

VOLUME

VOLUME ["/data"]

用於向基於鏡像創建的容器添加數據卷,共享數據/數據持久化

WORKDIR

WORKDIR /path/to/workdir

在鏡像創建新容器時,指定工作目錄,一般使用絕對路徑,相對路徑會持續傳遞
例子:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd        --->    /a/b/c

ENV

ENV
ENV =

用戶設置環境變量

USER

USER daemon

指定鏡像運行的用戶,默認為root
可以使用user uid group gid的4種組合
例如:USER user;USER uid;USER user:group;USER uid:gid;USER user:gid;USER uid:group

ONBUILD

ONBUILD [INSTRUCTION]

鏡像觸發器(ONBUILD指定的命令不會在第一次構建鏡像時執行)
當一個鏡像被其他鏡像作為基礎鏡像時執行(在FROM后面加有ONBUILD指定的命令的鏡像,把它作為基礎鏡像),此時在構建其他鏡像時會在構建過程中插入指令

12. Dockerfile構建過程

構建過程

  • 從基礎鏡像運行一個容器
  • 執行一條指令,對容器做出修改
  • 執行類似docker commit的操作,提交一個新的鏡像層
  • 基於剛提交的鏡像運行一個新容器
  • 執行Dockefile中的下一條指令,直至所有指令執行完畢
  • 中間層鏡像不會被刪除,中間層容器會被刪除
  • 可以使用中間層鏡像調試,用來查找錯誤

有一個好處是構建過程中會有構建緩存,對同一個Dockerfile文件進行構建時,會使用上一次構建的緩存的中間鏡像,這樣再次構建效率比較高
然而有些時候並不希望使用上次緩沖的中間鏡像,有一個選項可以不使用構建緩存

不使用構建緩存

方法一:
# docker build --no-cache
方法二:
在Dockerfile中設置緩存刷新時間(相當於修改了Dockerfile文件,會在設置緩存刷新時間步驟后構建新的中間鏡像)
ENV REFRESH_DATE 2019-8-2

查看鏡像構建的過程

# docker history [image]

Docker入門學習筆記(四)

  1. Docker容器的網絡連接

13. Docker容器的網絡連接

Docker容器的網絡基礎

Host代表Docker守護進程的宿主機,docker0是宿主機上的網卡

docker0——Linux虛擬網橋

docker0——Linux虛擬網橋

    Linux虛擬網橋:
        可以設置IP地址
        相當於擁有一個隱藏的虛擬網卡

    docker0 地址划分
        IP:172.17.42.1  子網掩碼:255.255.0.0
        MAC:02:42:ac:11:00:00到02:42:ac:11:ff:ff
        總共提供了65534個地址
    
    安裝網橋管理程序
        yum -y install bridge-utils
        sudo apt-get install bridge-utils
    查看網橋設備
        sudo brctl show
        
    當運行一個容器時,在使用sudo brctl show查看網橋時,docker0的interfaces接口出現一個veth的接口

自定義Docker0

自定義Docker0

    修改docker0地址(不使用默認的172.17.0.0網段)
    sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0
    此時重啟docker服務后再運行容器,則容器中的ip地址發生了改變

自定義虛擬網橋


自定義虛擬網橋

    步驟一:在宿主機中添加虛擬網橋
        sudo brctl addbr br0
        sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
    步驟二:更改docker守護進程的啟動配置
        /etc/default/docker 中添加DOCKER_OPTS值
        -b=br0

Docker容器的互聯

環境准備

用於測試的Docker鏡像Dockerfile:
    # ./cct/Dockerfile
    # container connection test
    FROM ubuntu:14.04
    RUN apt-get install -y ping
    RUN apt-get update
    RUN apt-get install -y nginx
    RUN apt-get install -y curl
    EXPOSE 80
    CMD /bin/bash

    # docker build -t summer258/cct .

允許所有容器間互聯

互聯方式:ip地址,--link參數掛載,docker network

默認設置
--icc=true  默認允許所有容器間互聯  

演示:
啟動第一個容器
# docker run -it --name cct1 summer258/cct
/# nginx
Ctrl+P Ctrl+Q

啟動第二個容器
# docker run -it --name cct2 summer258/cct
/# ifconfig
Ctrl+P Ctrl+Q

inet addr:172.17.0.3

連接到第一個容器cct1
# docker attach cct1
/# ifconfig

inet addr:172.17.0.2

測試連接:ping 172.0.3

連接到第二個容器cct2
# docker attach cct2
測試連接:curl http://172.17.0.2

重啟容器
docker restart cct1
發現IP地址已改變,說明容器的ip地址是不可靠的連接,提供另一種機制來實現容器之間的互聯,在容器啟動時添加--link選項

--link
    # docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]
    其中ALIAS是CONTAINER_NAME的別名

目前官方已不推薦使用--link參數掛載容器與其他容器互聯,使用docker network來實現容器之間的互聯,在使用時用docker network --help查看


啟動第三個容器
# docker run -it --name cct3 --link=cct1:webtest summer258/cct(此時webtest是cct1的別名)
/# ping webtest
/# env      查看容器的環境變量,發現增加了很多關於webtest的變量
/# vim /etc/hosts    查看文件發現添加了webtest容器的地址映射

重啟docker服務
    # systemctl restart docker  (centos)
    # sudo service docker restart
    # docker restart cct1 cct2 cct3
    # docker attach cct3
    /# ping webtest
    /# vim /etc/hosts    查看文件發現webtest地址映射中的ip地址發生了變化
    即重啟docker服務,--link參數掛載方式並不影響docker容器之間的互聯

拒絕所有容器間互聯

Docker守護進程的啟動選項
    DOCKER_OPTS= " --icc=false"

# ubuntu
$ sudo vim /etc/default/docker
    DOCKER_OPTS = "--icc=false"
# centos
$ sudo vim /etc/docker/daemon.json
    {
        …
        “icc”:false,
        …
    }


# systemctl restart docker  (centos)
# sudo service docker restart
# ps -ef | grep docker
# sudo docker restart cct1 cct2 cct3
# sudo docker attach cct3
/# curl webtest
/# ping webtest   發現ping不通,容器連接被阻斷

允許特定容器間的連接

步驟一:
Docker守護進程的啟動選項
    --icc=false --iptables=true
步驟二:
docker容器啟動時使用--link參數掛載

# sudo iptables -F         iptables設置清空(清空后,可以實現允許特定容器間的連接,不清空好像有問題,docker的bug,不知道現在有沒有)
# sudo iptables -L -n      顯示iptables內容

Docker容器與外部網絡的連接

ip_forward

--ip-forward=true(默認是true)
    決定系統是否會轉發流量

# sudo sysctl net.ipv4.conf.all.forwarding   當返回結果是1,則系統會轉發流量

iptables

iptables是與Linux內核集成的包過濾防火牆系統,幾乎所有的Linux發行版本都會包含iptables的功能

  • 表table
  • 鏈chain
  • 規則rule:ACCEPT,REJECT,DROP
filter表中包含的鏈:
    INPUT
    FORWARD
    OUTPUT
    DOCKER

# sudo iptables -t filter -L -n  查看filter表
# sudo iptables -L -n  查看filter表(iptables默認查詢的是filter表)

端口映射訪問

# docker run -it -p 80 --name cct5 myimages_one
/# nginx
/# Ctrl+Q+P
# docker port cct5
# curl 127.0.0.1:49153
# ifconfig             宿主機的ip為10.128.3.162

換另一台能ping通10.128.3.162的linux機器
# curl 10.128.3.162:49153        能顯示網頁html代碼

查看iptables可以看到DOCKER鏈中多了一條0.0.0.0(宿主機)到容器cct5的規則,代表可以轉發包

限制IP訪問容器

操作iptables可以實現限制IP訪問容器,只要增加相應的規則即可
可實現特定ip對特定容器的限制性訪問

$ sudo iptables -I DOCKER -s 10.128.3.162 -d 172.17.0.7 -p TCP --dport 80 -j DROP
-s源地址,-d目的地址,-p協議,-dport目的端口,-j操作

Docker入門學習筆記(五)

  1. Docker容器的數據管理

14. Docker容器的數據管理

Docker容器的數據卷

什么是數據卷?(Data Volume)

  • 數據卷是經過特殊設計的目錄,可以繞過聯合文件系統(UFS),為一個或多個容器提供訪問
  • 數據卷設計的目的,在於數據的永久化,它完全獨立於容器的生存周期,因此,Docker不會在容器刪除時刪除其掛載的數據卷,也不會存在類似的垃圾收集機制,對容器引用的數據卷進行處理。

數據卷(Data Volume)的特點

  • 數據卷在容器啟動時初始化,如果容器使用的鏡像在掛載點包含了數據,這些數據會拷貝到新初始化的數據卷中。
  • 數據卷可以在容器之間共享和重用。
  • 可以對數據卷里的內容直接進行修改(即時性的)
  • 數據卷的變化不會影響鏡像的更新
  • 卷會一直存在,即使掛載數據卷的容器已經被刪除

為容器添加數據卷

可以實現宿主機和容器之間的數據共享

  # sudo docker run -it -v ~/container_data:/data ubuntu /bin/bash
  :前面是宿主機的文件夾路徑,如果沒有,則自動會創建這個文件夾,:后面是容器中添加的文件夾位置
  /# ls

為數據卷添加訪問權限

  # sudo docker run -it -v ~/datavolume:/data:ro ubuntu /bin/bash
  ro:只讀
  wr: 讀寫權限

可以查看容器Volume目錄信息和數據卷的讀寫權限

  # sudo docker inspect 容器名/id
  可以查看容器Volume目錄信息和數據卷的讀寫權限

使用Dockerfile構建包含數據卷的鏡像

  Dockerfile指令:VOLUME["/datavolume",["/otherdatavolume"]]
  可以同時添加多個數據卷
  不能像上面-v選項一樣可以指明宿主機的文件路徑,這里容器中/datavolume文件夾對應的宿主機的文件夾路徑是由系統默認創建的,可以通過sudo docker inspect 容器名/id查看

Docker的數據卷容器

什么是數據卷容器

命名的容器掛載數據卷,其他容器通過掛載這個容器實現數據共享,掛載數據卷的容器,就叫做數據卷容器。
所有掛載數據卷容器的容器和數據卷容器都可以互相實現數據共享。

好處:可以不用暴露數據卷容器的信息,sudo docker inspect 容器名/id 返回的是數據卷容器在宿主機上掛載的路徑,在多租戶的使用環境很安全。
數據卷容器的作用僅僅是將數據卷的配置傳遞給掛載這個數據卷容器的容器中。

掛載數據卷容器的方法

  # docker run --volumes-from 數據卷容器名或id
  例子:
  # docker run -it --name dvt2 --volumes-from dvt1 ubuntu /bin/bash
  
  將數據卷容器刪除,並不影響已經掛載數據卷容器的容器對數據卷的使用,這是因為數據卷的特點的第5點:
  卷會一直存在,即使掛載數據卷的容器已經被刪除
  
  # docker rm -v dvt1  即使-v選項刪除數據卷容器,只要這個數據卷被其他容器使用,數據卷就不會被刪除
  

Docker數據卷的備份和還原

數據備份方法

  # sudo docker run --volumes-from [container name] -v $(pwd):/backup[:wr] ubuntu tar cvf /backup/backup.tar [container data volume]
  解析:創建並運行一個新的docker容器,通過2種方式掛載數據卷,第一種是數據卷容器,
  第2種是-v選項指明宿主機和容器的文件路徑,$(pwd)代表的是宿主機的文件路徑,如:~/backup
  wr代表數據卷的訪問權限是讀寫,執行tar命令,第一個參數/backup/backup.tar是壓縮后文件存放的位置和名字,
  第二個參數[container data volume]代表將要壓縮的文件目錄,可以是數據卷容器的數據卷路徑
  可以通過宿主機的路徑訪問到壓縮后的數據文件:ls $(pwd)

數據還原方法

  $ sudo docker run --volumes-from [container name] -v $(pwd):/backup[:wr] ubuntu tar xvf /backup/backup.tar [container data volume]

Docker入門學習筆記(六)

  1. Docker容器的跨主機連接

15. Docker容器的跨主機連接

使用網橋實現跨主機連接

原理:
網絡拓撲

環境准備

  Mac OS X 
  兩台Ubuntu 14.04 虛擬機
  安裝網橋管理工具:
      apt-get install bridge-utils
  IP地址:Host1:10.211.55.3
          Host2:10.211.55.5

等價於將2個宿主機連接在同一個交換機上,Mac OS X等同於交換機,宿主機和容器都使用同一個網段中的ip地址,只要ip地址不重復。
如果是不同網段,ping不通,因為不同網段需要查找路由表來確定不同網段的網絡地址。

虛擬機網絡配置

為了永久保存配置
宿主機的物理網卡eth0綁定在br0網橋上了

  修改/etc/network/interfaces 文件
  auto br0
  iface br0 inet static
  address 10.211.55.3
  netmask 255.255.255.0
  gateway 10.211.55.1
  bridge_ports eth0

Docker設置

  修改/etc/default/docker文件
  -b 指定使用自定義網橋
      -b=br0          (此時重啟計算機后,ifconfig將不再有docker0網卡)
  --fixed-cidr限制IP地址分配范圍
      IP地址划分:
      Host1:10.211.55.64/26
          地址范圍:10.211.55.65~10.211.55.126
      Host2: 10.211.55.128/26
          地址范圍:10.211.55.129~10.211.55.190

此時虛擬機中的docker容器可以訪問外網了,比如:ping www.baidu.com可以ping通,也可以訪問其他外網的容器

優點

配置簡單,不依賴第三方軟件

缺點

與主機在同網段,需要小心划分IP地址
需要有網段控制權,在生產環境中不易實現
不容易管理
兼容性不佳

使用Open vSwitch實現跨主機容器連接

Open vSwitch是什么?

Open vSwitch(ovs)是一個高質量、多層虛擬交換機,使用開源Apache2.0許可協議,由Nicira Networks開發,主要實現代碼為可移植的C代碼。它的目的是讓大規模網絡自動化可以通過編程擴展,同時仍然支持標准的管理接口和協議(例如NetFlow,sFlow,SPAN,RSPAN,CLI,LACP,8022.lag)

原理:

什么是GRE隧道?

GRE:通用路由協議封裝

隧道技術(Tunneling)是一種通過使用互聯網絡的基礎設施在網絡之間傳遞數據的方式。使用隧道傳遞的數據(或負載)可以是不同協議的數據幀或包。隧道協議將其它協議的數據幀或包重新封裝然后通過隧道發送。新的幀頭提供路由信息,以便通過互聯網傳遞被封裝的負載數據。

環境准備

  Mac OS X + Virtualbox
  兩台Ubuntu14.04虛擬機
  雙網卡,Host-Only&NAT
  安裝Open vSwitch:
      apt-get install openvswitch-switch
  安裝網橋管理工具:
      apt-get install bridge-utils
  IP地址:Host1:192.168.59.103
          Host2:192.168.59.104

操作

建立ovs網橋
添加gre連接
配置docker容器虛擬網橋
為虛擬網橋添加ovs接口
添加不同Docker容器網段路由

  主機:192.168.59.103
  查看ovs狀態
  $ sudo ovs-vsctl show
  建立ovs網橋
  $ sudo ovs-vsctl add-br obr0
  添加gre接口
  $ sudo ovs-vsctl add-port obr0 gre0
  $ sudo ovs-vsctl set interface gre0 type=gre options:remote_ip=192.168.59.104
  $ sudo ovs-vsctl show

  建立本機docker容器需要使用的虛擬網橋
  新建網橋
  $ sudo brctl addbr br0
  設置網絡地址
  $ sudo ifconfig br0 192.168.1.1 netmask 255.255.255.0
  為br0網橋添加ovs網橋的連接
  $ sudo brctl addif br0 obr0
  查看當前網橋的狀態
  $ sudo brctl show

  配置docker,用新建的網橋代替docker0
  $ sudo vim /etc/default/docker
      DOCKER_OPTS="obr0 "  / DOCKER_OPTS="-b=br0  "   (不知道是哪一個,可能有誤)
  $ sudo service docker restart

  新建一個docker容器
  $ docker run -it ubuntu /bin/bash
  /# ifconfig
      inet addr:192.168.1.2
  /# ping 192.168.59.104    (另一台遠程linux宿主機ip地址)




  切換主機:192.168.59.104
  $ ifconfig
      br0網橋 addr:192.168.2.1(這是docker容器所在的網段:192.168.2.0)
  啟動一個docker容器
  $ sudo docker run -it ubuntu /bin/bash
  /# ifconfig
      inet addr:192.168.2.4
  /# ping 192.168.59.104




  切回主機:192.168.59.103
  /# ping 192.168.2.4
      ping不通,因為不同網段需要查找路由表來確定不同網段的網絡地址
      
  查看路由表信息
  $ route
  添加路由表項
  $ sudo ip route add 192.168.2.0/24 via 192.168.59.104 dev eth0

  $ sudo docker run -it ubuntu /bin/bash
  /# ping 192.168.2.4
        可以ping通了

使用weave實現跨主機容器連接(推薦)

weave是什么?

語義:編織
建立一個虛擬的網絡,用於將運行在不同主機的Docker容器連接起來
https://www.weave.works/
https://github.com/weaveworks/weave#readme

環境准備

  Mac OS X + Virtualbox
  兩台Ubuntu14.04虛擬機
  雙網卡,Host-Only&NAT
  IP地址:Host1:192.168.59.103
          Host2: 192.168.59.104

操作

安裝weave
啟動weave: $ weave launch
連接不同主機
通過weave啟動容器



  主機:192.168.59.103
  $ sudo wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
  $ sudo chmod a+x /usr/bin/weave
  $ weave launch
  $ sudo docker ps -l
  
  

  切換主機:192.168.59.104
  重復安裝操作
  $ sudo wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
  $ sudo chmod a+x /usr/bin/weave
  
  啟動weave,加上第一個主機的ip地址
  $ weave launch 192.168.59.103
  weave的命令類似於docker的命令,啟動一個容器,分配一個ip地址,這里是192.168.1.2/24,
  然后將這條weave命令執行后的返回值賦給c2,這里的返回值是啟動容器的容器id
  $ c2=$(weave run 192.168.1.2/24 -it ubuntu /bin/bash)
  $ echo $c2
  利用docker attach進入到這個容器
  $ docker attach $c2   (也可以用weave --name 給這個容器賦個名字,然后操作名字:docker attach weave_name)
  /# ifconfig
  多了一個網絡設備ethwe,inet addr:192.168.1.2

  切換Host1:192.168.59.103
  $ weave run 192.168.1.10/24 -it --name wc1 ubuntu /bin/bash
  相同網段的IP地址
  $ sudo docker aatach wc1
  /# ifconfig
  增加wthwe,inet addr:192.168.1.10
  /# ping 192.168.1.2
  能夠ping通


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM