Docker使用

Docker筆記

Docker是一個Client-Server結構的系統,Docker的守護進程運行在主機上,通過Socker從客戶端訪問!Docker Server接收到Docker-Client的指令,就會執行這個指令!

啟動一個容器,Docker的運行流程如下圖:

安裝和配置環境

查看是否安裝

docker version

首先卸載舊Docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#安裝運行所要的環境  
yum install -y yum-utils

# 設置阿里雲的Docker鏡像倉庫
yum-config-manager \
    --add-repo \
    //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum包索引
yum makecache fast

#安裝docker  docker-ce 是社區版,docker-ee 企業版
yum install docker-ce docker-ce-cli containerd.io

#啟動
systemctl start docker
# 查看當前版本號,是否啟動成功
docker version
# 設置開機自啟動
systemctl enable docker
#---------------------------------------------------------------------------------------
# 卸載是使用 1. 卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
# 2. 刪除資源  . /var/lib/docker是docker的默認工作路徑
rm -rf /var/lib/docker

配置阿里雲加速鏡像

去阿里雲控制台申請你自己的加速地址

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["//****.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker的鏡像運行流程

命令

鏡像命令

查看容器中所有的鏡像

docker images

docker version          		#查看docker的版本信息
docker info             		#查看docker的系統信息,包括鏡像和容器的數量
docker 命令 --help       		   #幫助命令(可查看可選的參數)
docker COMMAND --help

實例:

[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED        SIZE
鏡像的倉庫源   鏡像的標籤  鏡像的id    鏡像的創建時間   鏡像的大小

搜索鏡像

docker search mysql

[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11473     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4356      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   848                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   557       [OK]       
phpmyadmin                        phpMyAdmin - A web interface for MySQL and M…   332       [OK]       
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   91     
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   88     
centos/mysql-80-centos7           MySQL 8.0 SQL database server          

下載鏡像

docker pull mysql:版本號

如果不加版本號,默認下載最新版本的鏡像

docker search mysql --filter=STARS=3000   # 容器搜索,並進行字段過濾,例如過濾STARS大於3000的數據

#----------------------------------------------------------------------------------------

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest            #如果不指定版本號默認就是latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete          #分層下載,docker image的核心-聯合文件系統
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #下載來源的真實地址  #docker pull mysql等價於docker pull docker.io/library/mysql:latest

刪除鏡像

docker rmi -f 鏡像id

#1.刪除指定的鏡像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  鏡像id
#2.刪除多個鏡像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  鏡像id 鏡像id 鏡像id
#3.刪除全部的鏡像id    docker images -aq這個命令是查看所有已經存在的鏡像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  $(docker images -aq)

容器命令

啟動容器

docker run [可選擇參數] image

#參數說明
--name="名字"           指定容器名字
-d                     後台方式運行,注意如果
-it                    使用交互方式運行,進入容器查看內容
-p                     指定容器的端口
(
-p ip:主機端口:容器端口  配置主機端口映射到容器端口
-p 主機端口:容器端口
-p 容器端口
)
-P                     隨機指定端口(大寫的P)

#例如:在docker中啟動一個centOS鏡像並進入使用終端
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it centos /bin/bash
[root@bd1b8900c547 /]# ls      
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

#exit 停止並退出容器(後台方式運行則僅退出)
#Ctrl+P+Q  不停止容器退出
[root@bd1b8900c547 /]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]#

查看啟動中的容器

docker ps

注意:常見的坑:docker容器使用後台運行時,就必須要有一個前台進程,docker發現沒有應用在使用時就會自動停止

nginx容器啟動後發現沒有提供服務就會立刻停止,就是因為nginx中沒有進程運行

#docker ps 
     # 列出當前正在運行的容器
-a   # 列出所有容器的運行記錄
-n=? # 顯示最近創建的n個容器
-q   # 只顯示容器的編號

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps -a		#查看最近啟動過的容器
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
bca129320bb5   centos         "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago             optimistic_shtern
bd1b8900c547   centos         "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             cool_tesla
cf6adbf1b506   bf756fb1ae65   "/hello"      5 hours ago     Exited (0) 5 hours ago               optimistic_darwin

刪除容器

docker rm 容器的ID

docker rm 容器id                 #刪除指定的容器,不能刪除正在運行的容器,強制刪除使用 rm -f
docker rm -f $(docker ps -aq)   #刪除所有的容器
docker ps -a -q|xargs docker rm #刪除所有的容器

啟動和停止命令

docker start 容器id          #啟動容器
docker restart 容器id        #重啟容器
docker stop 容器id           #停止當前運行的容器
docker kill 容器id           #強制停止當前容器

常用命令

查看docker日誌

docker logs -tf 容器的ID

#參數說明
-f  #跟蹤日誌輸出
-n  #從日誌末尾顯示的行數(默認為「all」)
-t [數量]  #顯示最新數量的日誌

#實例:
#我們現在先啟動一個centos容器,並編寫sh腳本每隔5秒在控制台輸出,為什麼一直輸出請查看啟動容器的注意實現
[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker run -d centos /bin/bash -c "while true;do echo new docker;sleep 5;done"
1b1fddb565f0515df8a15a306aaa779596b209b63593a2225f907ad3aab8ae42

[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
1b1fddb565f0   centos    "/bin/bash -c 'while…"   3 seconds ago   Up 3 seconds             laughing_brown
[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker logs -f 1b1fddb565f0
new docker
new docker
new docker
new docker
new docker
new docker


查看所有docker運行中的進程

docker top 容器的ID

[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
279416f5f6c4   centos    "/bin/bash"   About a minute ago   Up About a minute             blissful_keldysh
[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker top 279416f5f6c4
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                16992               16973               0                   16:16               pts/0               00:00:00            /bin/bash

查看容器的原啟動數據

docker inspect 容器的ID

這個命令可以查看當前容器啟動時的一下詳情信息,例如容器ID,容器啟動的類型(這個容器數據什麼鏡像)等

進入當前正在運行的容器

方式一:docker exec -it 容器的ID /bin/bash

# 進入容器後開啟一個新的終端,可以在裏面操作
[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker exec -it 279416f5f6c4 /bin/bash
[root@279416f5f6c4 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

方式二:docker attach 容器ID

# 進入容器正在執行的終端,不會啟動新的進程,如果當前控制台在輸出數據將會顯示輸出的數據
[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker attach 279416f5f6c4
[root@279416f5f6c4 /]# 

退出容器但是繼續運行容器:Ctrl+p+q

將docker中的文件拷貝到主機

docker cp 容器ID:容器中文件的路徑 主機的文件路徑

#進入容器
[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker attach 279416f5f6c4
#進入容器創建文件
[root@279416f5f6c4 /]# ls     
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@279416f5f6c4 /]# cd var/
[root@279416f5f6c4 var]# vi new.txt
[root@279416f5f6c4 var]# exit
exit
#可以直接退出,退出後容器因為沒有運行進程會關閉,但是只要容器還在數據就在,可以直接拷貝文件到主機
[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
279416f5f6c4   centos    "/bin/bash"   12 minutes ago   Exited (0) 6 seconds ago             blissful_keldysh
[root@iZuf67yyeeujf4lnsuggp8Z docker]# docker cp 279416f5f6c4:/var/new.txt /home/
[root@iZuf67yyeeujf4lnsuggp8Z docker]# cd /home/
[root@iZuf67yyeeujf4lnsuggp8Z home]# ls
new.txt
[root@iZuf67yyeeujf4lnsuggp8Z home]# cat new.txt 
11111111111111111111111111111111111111111111111

應用部署

nginx

#下載nginx
[root@iZuf67yyeeujf4lnsuggp8Z /]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a330b6cecb98: Already exists 
e0ad2c0621bc: Pull complete 
9e56c3e0e6b7: Pull complete 
09f31c94adc6: Pull complete 
32b26e9cdb83: Pull complete 
20ab512bbb07: Pull complete 
Digest: sha256:1311187059bc3e9f16c0700b054a787743f63a4cb62815d2164f653e517bcaa2
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@iZuf67yyeeujf4lnsuggp8Z /]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   12 days ago   231MB
nginx        latest    ad4c705f24d3   2 weeks ago   133MB
mysql        latest    0716d6ebcc1a   3 weeks ago   514MB
#啟動nginx,並把docker中nginx端口映射到主機的3344端口,可以訪問主句的3344端口進行訪問nginx
[root@iZuf67yyeeujf4lnsuggp8Z /]# docker run -d --name nginx01 -p 3344:80 nginx
f68678a3c7efb83baa6b3087c5f4946bf43ce67fe4de7d98d8f6f9ad8add8f72
[root@iZuf67yyeeujf4lnsuggp8Z /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
f68678a3c7ef   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
#進行訪問
[root@iZuf67yyeeujf4lnsuggp8Z /]# curl 127.0.0.1:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="//nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="//nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

elasticsearch

#因為elasticsearch運行內存過大,所以在啟動的時候需要限制JVM的內存
# -e 修改環境變臉
#elasticsearch自帶有個環境變量是ES_JAVA_OPTS,在裏面修改對應JVM參數
[root@iZuf67yyeeujf4lnsuggp8Z /]# docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch
05de17ecf3dafec4b20c92f0c0c5a6c65bf854e4d1cfda7dbeaeb144820c9b2e
[root@iZuf67yyeeujf4lnsuggp8Z /]# docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
05de17ecf3da   elasticsearch   "/docker-entrypoint.…"   6 seconds ago    Up 6 seconds    0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   elasticsearch01
f68678a3c7ef   nginx           "/docker-entrypoint.…"   37 minutes ago   Up 37 minutes   0.0.0.0:3344->80/tcp, :::3344->80/tcp                                                  nginx01

mysql

#啟動命令 因為如果容器進行了刪除,那麼在容器中的數據就會被刪除,所以使用數據持久化將數據放到實體機中存放
# -d	後台運行
# -v	卷掛載(數據持久化)
# -p	指定實體機端口映射
# -e	環境配置(此時配置數據庫的密碼)
# --name	指定容器的名字
[root@iZuf67yyeeujf4lnsuggp8Z ~]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 mysql
f0f879b1a0102648752873ebcb1412930b13128c14cb40a642589d58a29d73e7
[root@iZuf67yyeeujf4lnsuggp8Z ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS                     PORTS                                                  NAMES
f0f879b1a010   mysql           "docker-entrypoint.s…"   5 seconds ago   Up 4 seconds               0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql03
e68c555396ea   tomcat          "catalina.sh run"        5 hours ago     Up 4 hours                 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              tocmat01
05de17ecf3da   elasticsearch   "/docker-entrypoint.…"   8 days ago      Exited (137) 5 hours ago                                                          elasticsearch01
f68678a3c7ef   nginx           "/docker-entrypoint.…"   8 days ago      Up 8 days                  0.0.0.0:3344->80/tcp, :::3344->80/tcp                  nginx01
279416f5f6c4   centos          "/bin/bash"              8 days ago      Exited (0) 8 days ago                                                             blissful_keldysh
[root@iZuf67yyeeujf4lnsuggp8Z ~]# cd /home/
# 容器的數據被映射到實體機的mysql文件夾中
[root@iZuf67yyeeujf4lnsuggp8Z home]# ls
mysql  new.txt

數據卷

具名&匿名掛載數據

docker volume ls 查看docker的所有使用卷情況

[root@iZuf67yyeeujf4lnsuggp8Z _data]# docker volume ls
#這些都是docker中掛載在實體機中的所有卷
DRIVER    VOLUME NAME
local     6f7e2d7b26ea531931cc810981096243fd67552d65876e6100fec25572d98408
local     43cf97e83c3be606f045e4a2ad79dddb92573a05e1dcfcbfeca1abf6e16d3783
local     815f02cffc8fa0f1b61f067fa98d735639b3e30e42d49d82e2b285eb7b965325
local     dd357634fbe791e688753cf66d06f076bc44fb870fd4fadd67daffb6accee6ea
local     e103e80d81c76ce50e50203b72c711ec4d279f4021fdd2e6b01336ebdb1133d7

docker -v 宿主機路徑:容器內路徑 指定路徑掛載

-v 數據卷名:容器內路徑 具名掛載

-v 容器內路徑 匿名指定目錄掛載

共享數據卷

docker run -d -p –name [自定義鏡像名] –volumes-from [已經存在的容器名稱] [鏡像名稱]

數據卷的生命周期一直持續到沒有容器使用為止,如果數據持久化到本地時,本地數據不會刪除

# 先啟動一個容器作為父類
[root@iZuf67yyeeujf4lnsuggp8Z mysql]# docker run -d -p 3307:3306 --name mysql04 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
1381b5bd5768a57ea3f4773604cbfab7574c77f617dd896c32a6c8c85ff425a7
# 新啟動一個容器,使用--volumes-from 指定它的父類進行共享父類的數據
[root@iZuf67yyeeujf4lnsuggp8Z mysql]# docker run -d -p 3308:3306 --name mysql05 -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql04 mysql:latest
6d7f6552887c1aab2982814d745d4763721f882e5c7f19cf48d3ab5fbc9223b8

DockerFile

docker build -f [腳本文件] -t [鏡像名稱]:[自定義版本號] . (注意這個點一定要有)

dockerFile用來構建docker鏡像的構建文件

通過這個命令可以生成鏡像,鏡像是一層一層,腳本一個個命令,每一行命令都是一層

#DockerFile 文件內容:
#FROM centos

#VOLUME ["volum01","voulum02"]

#CMD echo "---end---"

#CMD /bin/bash

# build 編譯創建對應的鏡像  DockerFile 中編寫要執行的腳本
[root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker build -f /home/docker-file/DockerFile -t zyy/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volum01","voulum02"]
 ---> Running in 5bc63e3b33f6
Removing intermediate container 5bc63e3b33f6
 ---> ef7703caa64e
Step 3/4 : CMD echo "---end---"
 ---> Running in d0df9a64d055
Removing intermediate container d0df9a64d055
 ---> 1e6f05005845
Step 4/4 : CMD /bin/bash
 ---> Running in cde027b53fa4
Removing intermediate container cde027b53fa4
 ---> 782d85a6d6d1
Successfully built 782d85a6d6d1
Successfully tagged zyy/centos:1.0
# zyy/centos 是自定義創建的鏡像
[root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
zyy/centos      1.0       782d85a6d6d1   6 seconds ago   231MB
tomcat01        1.0       c846f5be14e6   5 days ago      684MB
tomcat          latest    c662ee449a7e   12 days ago     680MB
centos          latest    5d0da3dc9764   3 weeks ago     231MB
nginx           latest    ad4c705f24d3   4 weeks ago     133MB
mysql           latest    0716d6ebcc1a   5 weeks ago     514MB
elasticsearch   latest    5acf0e8da90b   3 years ago     486MB
#啟動對應的容器,命令行啟動以後可以看到volume01和voulume02,這兩個被匿名掛載在實體機的對應文件下
[root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker run -it 782d85a6d6d1 /bin/bash
[root@76d06b9a0096 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volum01  voulum02

指令

FROM					#基礎鏡像,一切從這裡開始構建
MAINTAINER					#鏡像是誰寫的,姓名+郵箱
RUN						#鏡像構建的時候需要運行的命令
ADD						#和COPY功能相似,但是會解壓文件
WORKDIR					#鏡像的工作目錄
VOLUME					#掛載的目錄
EXPOSE 					#暴露端口配置
CMD						#指定這個容器啟動的時候要運行的命令,只有最後一個會生效,可被替代
ENTRYPOINT				#指定這個容器啟動的時候要運行的命令,可以追加命令
ONBUILD					#當構建一個被繼承的DockerFIle 這個時候就會運行 ONBUILD指令,觸髮指令
COPY					#類型ADD,將我們的文件拷貝到鏡像中
ENV						#構建的時候設置環境變量(只是當前腳本程序的變量)
#創建dockerfile腳本文件,內容
FROM centos			#使用什麼基礎鏡像

MAINTAINER zyy<[email protected]>		#鏡像作者信息
	
ENV VARIABLE /usr/local				#創建一個環境變量,相當於Java程序的變量

WORKDIR $VARIABLE					#使用環境變量,WORKDIR指定進入容器以後的工作目錄

CMD "----start----"				#CMD執行命令  此時輸出

RUN yum -y install vim			#執行命令  下載vim
RUN yum -y install net-tools	#執行命令  下載net-tools

EXPOSE 80						#指定對外暴露的端口

CMD "-----end------"			#輸出
CMD /bin/bash					#使用的命令行


[root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker build -f mydockerFile -t zyycentos01 .
#-----等待-----
[root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
zyycentos01     latest    f01eb19de938   12 seconds ago   336MB		#剛剛創建的
zyy/centos      1.0       782d85a6d6d1   3 hours ago      231MB
tomcat01        1.0       c846f5be14e6   6 days ago       684MB
tomcat          latest    c662ee449a7e   12 days ago      680MB
centos          latest    5d0da3dc9764   3 weeks ago      231MB
nginx           latest    ad4c705f24d3   4 weeks ago      133MB
mysql           latest    0716d6ebcc1a   5 weeks ago      514MB
elasticsearch   latest    5acf0e8da90b   3 years ago      486MB
#運行
[root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker run -it zyycentos01
#可以看到我們進入容器的默認工作目錄是 /usr/local
[root@bc0281fa62a1 local]# pwd
/usr/local
#可以看到已經有了網絡命令(腳本中下載的net-toole)
[root@bc0281fa62a1 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.6  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:06  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker網絡

docker network ls 查看docker下所有的網絡情況

docker network inspect [網絡的ID] 查看對應網絡的配置

查看網絡

docker中所有的網絡都是虛擬的,只要容器刪除對應的網絡橋接一對就沒了

docker中使用的都是橋接模式,使用的是evth-pair技術

[root@iZuf67yyeeujf4lnsuggp8Z home]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:29:c2:df brd ff:ff:ff:ff:ff:ff
    inet 172.19.145.20/20 brd 172.19.159.255 scope global dynamic eth0
       valid_lft 313874776sec preferred_lft 313874776sec
    inet6 fe80::216:3eff:fe29:c2df/64 scope link 
       valid_lft forever preferred_lft forever
#這裡就是docker的網絡
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:59:d1:6e:c9 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:59ff:fed1:6ec9/64 scope link 
       valid_lft forever preferred_lft forever
#這裡是容器使用的網絡,docker每啟動一個容器都會分配一個網絡地址
23: veth76bafde@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether c2:10:6a:dc:92:25 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::c010:6aff:fedc:9225/64 scope link 
       valid_lft forever preferred_lft forever
35: veth0056592@if34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether ce:5a:91:e3:47:7f brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::cc5a:91ff:fee3:477f/64 scope link 
       valid_lft forever preferred_lft forever
37: veth71c02ee@if36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 22:df:90:13:d2:18 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::20df:90ff:fe13:d218/64 scope link 
       valid_lft forever preferred_lft forever
41: vethffb825c@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 5a:fd:83:0f:6c:43 brd ff:ff:ff:ff:ff:ff link-netnsid 3
    inet6 fe80::58fd:83ff:fe0f:6c43/64 scope link 
       valid_lft forever preferred_lft forever
#我們發現這個容器帶來的網卡都是一對的
#evth-pair就是一對的虛擬設備接口,他們都是成對出現的,一個連着協議,一個彼此相連
#evth-pair充當一個橋樑,連接着各種虛擬網絡設備,我們的wifi使用的就是這種技術

如果我們有一個tomcat02和tomcat03,他們使用的都是同一個路由網關,就是上面代碼的docker0

所有的容器不指定網路的情況下都是使用的docker0的路由,docker會給我們分配一個默認的可用ip

–link命令

docker容器中的每個容器可以ping同實體機,但是不能互相ping通,可以使用–link命令打通

docker run -d -P –name centos02–link [要連接的容器名字或者ID] centos

#我們先創建一個centos01,然後讓centos02打通01的網絡,
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker run -d -P --name centos02 --link centos01 centos
b8b70984086ba7378ebc121609112f159e10483723d45ed9b244c076e82c5b17
#此時可以看到centos02可以ping到centos01的網絡
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos02 ping centos01
PING centos01 (172.17.0.2) 56(84) bytes of data.
64 bytes from centos01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from centos01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.054 ms
#但是centos01不能ping通centos02的網絡
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos01 ping centos02
ping: centos02: Name or service not known
#原因:在hosts文件中我們可以正常的手動代理某個域名到對應的IP中 
#     剛才--link中就在centos02中配置了對應數據,但是centos01中並沒有配置
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos02 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	centos01 3596532c96eb			#這裡的配置
172.17.0.3	0d8f86b398b7

自定義網絡

[root@iZuf67yyeeujf4lnsuggp8Z home]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
4e461c467a25   bridge    bridge    local
139f104f4502   host      host      local
fe899a97a590   none      null      local
#網絡模式
#	bridge:橋接模式 (docker默認)

#	none:不配置網絡

#	host:和宿主機共享網絡

#	containe:容器網絡連接

使用自定義網絡可以補充–link中的缺點

docker network create -d [網絡模式] –subnet [設置子網的數據] –gateway [設置網關地址] [自定義網絡名]

#--subnet		設置子網的數量 192.168.0.0/16 = 255*255   192.168.0.0/24 = 255
#--gateway		網關地址
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
364ea9c24df9f8a1b1dde0bb9832242a3546fbb98ece03b347301cf458b47d80
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
4e461c467a25   bridge    bridge    local
139f104f4502   host      host      local
364ea9c24df9   mynet     bridge    local			#這個就是我們自定義的網絡
fe899a97a590   none      null      local
#我們在mynet網絡路由下創建兩個centos然後互相ping,就可以ping通了
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos04 ping centos04
PING centos04 (192.168.0.3) 56(84) bytes of data.
64 bytes from 1bb9617f0d3f (192.168.0.3): icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from 1bb9617f0d3f (192.168.0.3): icmp_seq=2 ttl=64 time=0.044 ms

優點:

  • 使用這種網路時,可以不用使用 –link 就可以互通

  • 這種網絡可以通過設置subnet 的值進行網絡隔離,例如redis集群保證網絡是安全的

    但是這是兩個網關路由下隔離

connect路由互聯

docker network connect [網絡路由名稱] [要打通的另一個路由中的容器ID]

#我們看到沒有打通之前的
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos04 ping centos02
ping: centos02: Name or service not known
#開始打通
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker network connect mynet centos02
#打通以後在測試ping就可以了
[root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos04 ping centos02
PING centos02 (192.168.0.4) 56(84) bytes of data.
64 bytes from centos02.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from centos02.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from centos02.mynet (192.168.0.4): icmp_seq=3 ttl=64 time=0.074 ms