Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问!Docker Server接收到Docker-Client的指令,就会执行这个指令!
启动一个容器,Docker的运行流程如下图:
docker version
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 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 [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="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
#因为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
#启动命令 因为如果容器进行了删除,那么在容器中的数据就会被删除,所以使用数据持久化将数据放到实体机中存放 # -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
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<wyzyy163mail@163.com> #镜像作者信息 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 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