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 \
https://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": ["https://****.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
Welcome to nginx!
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
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 #镜像作者信息
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 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 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: 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: 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: 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: 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: 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: 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: 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