Docker入門學習筆記(一)
- 什么是Docker?
- Docke的目標
- Docker通常應用場景
- Docker的基本組成
- Docker基本操作
- 守護式容器
- 在容器中部署靜態網站
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入門學習筆記(二)
- 鏡像的相關操作
- Docker的C/S模式
- 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入門學習筆記(三)
- Docker的遠程訪問
- Dockerfile指令
- 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入門學習筆記(四)
- 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入門學習筆記(五)
- 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入門學習筆記(六)
- 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通