Docker基本使用
Docker基本使用
1.什么是docker
Docker 最初是 dotCloud 公司创始⼈ 在法国期间发起的⼀个公司内部项⽬,它是基于 dotCloud 公司多年云服务技术的⼀次⾰新,并于 ,主要项⽬代码在 上进⾏维护。Docker 项⽬后来还加⼊ 了 Linux 基⾦会,并成⽴推动 。 Docker ⾃开源后受到⼴泛的关注和讨论,⾄今其 已经超过 5 万 7 千个星标和⼀万多个 fork。甚 ⾄由于 Docker 项⽬的⽕爆,在 2013 年底,。Docker 最初是在 Ubuntu 12.04 上开发实现的; Red Hat 则从 RHEL 6.5 开始对 Docker 进⾏⽀持;Google 也在其 PaaS 产品中⼴泛应⽤ Docker。
2.为什么要用Docker
作为⼀种新兴的虚拟化⽅式,Docker 跟传统的虚拟化⽅式相⽐具有众多的优势
更⾼效的利⽤系统资源
由于容器不需要进⾏硬件虚拟以及运⾏完整操作系统等额外开销,Docker 对系统资源的利⽤率更 ⾼。⽆论是应⽤执⾏速度、内存损耗或者⽂件存储速度,都要⽐传统虚拟机技术更⾼效。因此,相 ⽐虚拟机技术,⼀个相同配置的主机,往往可以运⾏更多数量的应⽤。
更快速的启动时间
传统的虚拟机技术启动应⽤服务往往需要数分钟,⽽ Docker 容器应⽤,由于直接运⾏于宿主内 核,⽆需启动完整的操作系统,因此可以做到秒级、甚⾄毫秒级的启动时间。⼤⼤的节约了开发、 测试、部署的时间。
⼀致的运⾏环境
开发过程中⼀个常⻅的问题是环境⼀致性问题。由于开发环境、测试环境、⽣产环境不⼀致,导致 有些 bug 并未在开发过程中被发现。⽽ Docker 的镜像提供了除内核外完整的运⾏时环境,确保 了应⽤运⾏环境⼀致性,从⽽不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维()⼈员来说,最希望的就是⼀次创建或配置,可以在任意地⽅正常运⾏。 为什么要⽤ Docker 4 使⽤ Docker 可以通过定制应⽤镜像来实现持续集成、持续交付、部署。开发⼈员可以通过 来进 ⾏镜像构建,并结合 系统进⾏集成测试,⽽运维⼈员则可以直接在⽣产环境中快速部署该镜像, 甚⾄结合 系统进⾏⾃动部署。 ⽽且使⽤ 使镜像构建透明化,不仅仅开发团队可以理解应⽤运⾏环境,也⽅便运维团队理解应⽤ 运⾏所需条件,帮助更好的⽣产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执⾏环境的⼀致性,使得应⽤的迁移更加容易。Docker 可以在很多平台上运 ⾏,⽆论是物理机、虚拟机、公有云、私有云,甚⾄是笔记本,其运⾏结果是⼀致的。因此⽤户可 以很轻易的将在⼀个平台上运⾏的应⽤,迁移到另⼀个平台上,⽽不⽤担⼼运⾏环境的变化导致应 ⽤⽆法正常运⾏的情况。
更轻松的维护和扩展
Docker 使⽤的分层存储以及镜像的技术,使得应⽤重复部分的复⽤更为容易,也使得应⽤的维护 更新更加简单,基于基础镜像进⼀步扩展镜像也变得⾮常简单。此外,Docker 团队同各个开源项 ⽬团队⼀起维护了⼀⼤批⾼质量的 ,既可以直接在⽣产环境使⽤,⼜可以作为基础进⼀步定制, ⼤⼤的降低了应⽤服务的镜像制作成本。
docker安装
关闭firewalld [root@docker ~]# systemctl stop firewalld [root@docker ~]# systemctl disable firewalld 关闭selinux [root@docker ~]# setenforce 0 [root@docker ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
安装docker
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 添加软件源信息。 [root@docker ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新并安装 Docker-CE。 [root@docker ~]# yum makecache fast [root@docker ~]# yum list docker-ce --showduplicates | sort -r [root@docker ~]# yum -y install docker-ce 安装docker最新版 开启docker服务。 [root@docker ~]# systemctl daemon-reload [root@docker ~]# systemctl restart docker [root@docker ~]# systemctl enable docker Created symlink from /etc/systemd/system/multiuser.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
docker⼀键安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
Docker命令实战
1、镜像 下载最新版镜像
[root@docker ~]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx 7d63c13d9b9b: Pull complete 5cb019b641b5: Pull complete d477de77abf8: Pull complete c60e7d4c1c30: Pull complete 365a49996569: Pull complete 039c6e901970: Pull complete Digest: sha256:168a6a2be5c65d4aafa7a78ca98ff8b110fe44c6ca41e7ccb4314ed481e32288 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest
查看本地镜像
[root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.0.1 2800fc93554b 2 days ago 140MB registry.cn-hangzhou.aliyuncs.com/vm1/test 1.0.1 2800fc93554b 2 days ago 140MB myapp v1.0 607dc55bb1c0 2 days ago
给镜像打标签
[root@docker ~]# docker tag 2800fc93554b docke.io/xmfree/alpine:v3.12.2 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docke.io/xmfree/alpine v3.12.2 2800fc93554b 2 days ago 140MB nginx 1.0.1 2800fc93554b 2 days ago 140MB registry.cn-hangzhou.aliyuncs.com/vm1/test 1.0.1 2800fc93554b 2 days ago 140MB myapp v1.0 607dc55bb1c0 2 days ago 142MB
容器类命令
拉取和运行
docker pull centos #拉取镜像,有镜像才能运行容器 docker run [可选参数] images #参数说明 --name="Name" 容器名称,nginx,tomcat1。 -d 后台运行 -it 使用交互方式运行/进入容器查看内容 -p 指定容器端口, 80:80 -P 随机指定端口 docker run -it centos /bin/bash #以前台交互的模式启动并进入容器 docker run -d centos #以后台守护式启动 Ctrl + P + Q #退出容器并在后台运行
列出运行的容器
docker ps #列出当前正在运行的容器 -a #列出全部容器 -n [数字] #列出最近的n个容器 -q #只显示容器的编号
退出容器
exit #退出容器 ctrl+P+Q #退出并继续运行容器
删除容器
docker rmi 容器id #删除指定容器,但无法删除正在运行的容器 docker rmi -rf 容器id #强制删除 docker rmi -f $(docker ps -aq) #递归删除所有启动/启动过的容器 docker ps -a|xargs docker rmi #递归删除所有容器
启动和停止容器
docker start|restart|stop|kill 容器id #启动|重启|停止|杀掉 容器
查看日志
docker logs 容器ID #查看容器日志 docker logs -tf --tail 10 容器ID #查看容器前10行的日志 --tail number #显示日志条数
查看容器的进程信息
docker top 容器ID
进入当前正在运行的容器
docker exec -it 容器ID /bin/bash #以交互形式进入容器,类似新开一个界面 #exec 使用exit进入退出不会停止 docker attach -it 5d8e48e4b792 #进入正在运行的容器命令行 #attach 退出了会停止容器
镜像的保存与导入
docker save -o test.tar myapp:v0.1 #保存镜像 docker save fe8c52043b39 > test.tar #保存镜像 #此时就会创建一个tar包,其中就是镜像文件 docker load < test.tar #导入镜像 docker load -i test.tar #导入镜像 #将tar包导入,就可以运行使用了。
容器文件拷贝到主机上
#在主机上输入该命令 docker cp 容器ID:文件路径 目的主机路径
容器备份与解压
备份运行时的容器镜像
docker export 517d619c4d55 > test.tar #将你的整个容器做成tar备份 cat test.tar | docker import - test/redis:0.1 #将tar备份文件转换为可用镜像
下载指定版本镜像
[root@docker ~]# docker pull nginx:1.20.2 1.20.2: Pulling from library/nginx 1fe172e4850f: Already exists c02d3377f583: Pull complete 786a9523d165: Pull complete 10fc07fe64d1: Pull complete 2f1ad5471016: Pull complete 040415d7474c: Pull complete Digest: sha256:7dfea820d4c89037c6475c36567fcd439d54fe3810f459cbf580061c659b0dd6 Status: Downloaded newer image for nginx:1.20.2 docker.io/library/nginx:1.20.2
容器
启动nginx容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
【docker run 设置项 镜像名 】 镜像启动运⾏的命令(镜像⾥⾯默认有的,⼀般不会写)
- -i:交互式操作
- -t:终端;
- d:容器在后台运⾏;
- -p:端⼝映射;
- --restart=always: 开机⾃启
- --name:为容器指定⼀个名称;
指明了-d运⾏镜像,会返回容器id;如果不指明-d运⾏镜像,会打印出catalina.out的⽇志,在 [crtl+c]后,容器即停⽌运⾏。
[root@docker ~]# docker run --name=myningx -d --restart=always -p 88:80 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx 7d63c13d9b9b: Pull complete 5cb019b641b5: Pull complete d477de77abf8: Pull complete c60e7d4c1c30: Pull complete 365a49996569: Pull complete 039c6e901970: Pull complete Digest: sha256:168a6a2be5c65d4aafa7a78ca98ff8b110fe44c6ca41e7ccb4314ed481e32288 Status: Downloaded newer image for nginx:latest 15db0ba492cf2b86714e3e29723d413b97e64cc2ee361d4109f4216b2e0cba60 [root@docker ~]# curl -I 127.0.0.1:88 HTTP/1.1 200 OK Server: nginx/1.21.6 Date: Fri, 06 May 2022 10:24:37 GMT Content-Type: text/html Content-Length: 4 Last-Modified: Wed, 04 May 2022 08:36:54 GMT Connection: keep-alive ETag: "62723b26-4" Accept-Ranges: bytes
查看当前运行的容器
[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba7518c38bd5 nginx "/docker-entrypoint.…" 2 days ago Up 2 hours 0.0.0.0:88->80/tcp, :::88->80/tcp myningx
根据启动的容器创建新的镜像
[root@docker ~]# docker commit -a "cool" -m "this is test" ba7518c38bd5 nginx:1.1 sha256:b9d5e0d36529cc9e778e6273e53bd470c73338002828ed8e4b426687ba647a71
docker commit : 从容器创建⼀个新的镜像
- a:提交的镜像作者;
- -c:使⽤Dockerfile指令来创建镜像;
- m:提交时的说明⽂字;
- p:在commit时,将容器暂停。
进入容器操作容器
[root@docker ~]# docker exec -it ba7518c38bd5 /bin/bash root@ba7518c38bd5:/# echo "123" > /usr/share/nginx/html/index.html [root@docker ~]# curl 127.0.0.1:88 123
将运行中的容器构建为镜像
[root@docker ~]# docker commit -a "cby" -m "my app" ba7518c38bd5 meapp:v1.0 sha256:c92b8d5a695971d7b3b73bc90fa8d3bcd297c17a4f78798aa1238b5fbda181c3 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE meapp v1.0 c92b8d5a6959 7 seconds ago 142MB nginx 1.1 b9d5e0d36529 8 minutes ago 142MB test/redis 0.1 1c011895a942 25 minutes ago 140MB docke.io/xmfree/alpine v3.12.2 2800fc93554b 2 days ago 140MB nginx 1.0.1 2800fc93554b 2 days ago 140MB
镜像保存与导入
[root@docker ~]# docker save -o cby.tar meapp:v1.0 [root@docker ~]# docker save c92b8d5a6959 > cby.tar [root@docker ~]# ll cby.tar -rw-------. 1 root root 145967616 5月 6 18:39 cby.tar [root@docker ~]# docker load -i cby.tar Loaded image ID: sha256:c92b8d5a695971d7b3b73bc90fa8d3bcd297c17a4f78798aa1238b5fbda181c3 [root@docker ~]# docker load < cby.tar Loaded image ID: sha256:c92b8d5a695971d7b3b73bc90fa8d3bcd297c17a4f78798aa1238b5fbda181c3
容器导出和导入
容器导出
#这样将导出容器快照到本地⽂件
docker export [CONTAINER ID] > [tar file]
[root@docker ~]# docker export ba7518c38bd5 > nginx.1.0.tar [root@docker ~]# ls anaconda-ks.cfg cby.tar nginx.1.0.tar test.tar
容器导入
#从容器快照⽂件中再导⼊为镜像
cat [tar file] | docker import - [name:tag]、
[root@docker ~]# docker import nginx.1.0.tar nginx:1.0.2 sha256:18e19572d1b4f384950dfa3cc78abbc18993c5332a40853ef30861cef31027b5 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.0.2 18e19572d1b4 9 seconds ago 140MB meapp v1.0 c92b8d5a6959 2 hours ago 142MB nginx 1.1 b9d5e0d36529 2 hours ago 142MB
镜像和容器 导出和导入的区别
1.镜像导⼊ 是复制的过程
2.容器导⼊ 是将当前容器 变成⼀个新的镜像
save 和 export区别:
1)save 保存镜像所有的信息-包含历史
2)export 只导出当前的信息
容器数据管理
⽣产环境使⽤Docker的过程中,往往需要对数据进⾏持久化保存,或者需要更多容器之间进⾏数 据共享,此时运⽤到数据卷(Data Volumes)和数据卷容器(Data Volume Contain)
数据卷
数据卷就是将宿主机的某个⽬录,映射到容器中,作为数据存储的⽬录,我们就可以在宿主机对数 据进⾏存储。
数据卷(Data Volumes):容器内数据映射到本地主机环境。
1.数据卷可以在容器之间共享和重⽤,本地与容器间传递数据更搞笑;
2.对数据卷的修改会⽴⻢有效,容器内部与本地⽬录均可;
3.对数据卷的更新,不会影响镜像,对数据与应⽤进⾏了解耦操作;
4.数据卷默认会⼀直存在,即使容器被删除。
命令格式: docker run -dti --name [容器名字] -v [宿主机⽬录]:[容器⽬录] [镜像名称] [命令(可 选)]
[root@docker ~]# mkdir /date [root@docker ~]# echo "test" > /date/test.txt #创建一个test文件 [root@docker ~]# docker run -dti --name test -v /date/:/date/ nginx #启动⼀个容器,挂载数据卷 e9f4095f8b2577d6d293cbf3e677d1b8b00132e410142173b00767642cc27007 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e9f4095f8b25 nginx "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 80/tcp test ba7518c38bd5 nginx "/docker-entrypoint.…" 2 days ago Up 4 hours 0.0.0.0:88->80/tcp, :::88->80/tcp myningx [root@docker ~]# docker exec -it e9f4095f8b25 /bin/bash root@e9f4095f8b25:/# cat /date/test.txt test root@e9f4095f8b25:/#
注意:
1、Docker挂载数据卷的默认读写权限(rw),⽤户可以通过ro设置为只读,格式:[宿主机⽂件]: [容器⽂件]:ro
2、如果直接挂载⼀个⽂件到容器,使⽤⽂件⼯具进⾏编辑,可能会造成⽂件的改变,从 Docker1.1.0起,这会导致报错误信息。所以推荐的⽅式是直接挂载⽂件所在的⽬录。
数据卷容器
数据卷容器需要再多个容器之间共享⼀些持续更新的数据,最简单的⽅式是使⽤数据卷容器。数据 卷容器也是⼀个容器,但是它的⽬的是专⻔⽤来提供数据卷供其他容器挂载。 数据卷容器(Data Volume Containers):使⽤特定容器维护数据卷。 简单点:数据卷容器就是为其他容器提供数据交互存储的容器。
命令格式:
- Docker run --help
- -v,--volumes-from list
数据卷容器操作流程:
如果使⽤数据卷容器,在多个容器间共享数据,并永久保存这些数据,需要有⼀个规范的流程才能做 的到:
1、创卷数据卷容器
2、其他容器挂载数据卷容器
注意:数据卷容器⾃身并不需要启动,但是启动的时候仍然可以进⾏数据卷容器的⼯作。
创建⼀个数据卷容器
命令格式:
docker create -v [容器数据卷⽬录] --name [容器名字] [镜像名称
执⾏效果:
[root@docker ~]# docker create -v /date1 --name v-date1 nginx 37b54805ba9597c9a6c2cf64661462f2b1c5af364087c5c1dbd634b277d9dc88 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37b54805ba95 nginx "/docker-entrypoint.…" 8 seconds ago Created v-date1 e9f4095f8b25 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 80/tcp test
创建两个容器,同时挂载数据卷容器
docker run --volumes-from [数据卷容器id/name] -dti --name [容器名字] [镜像名 称] [命令(可选)]
创建v03容器:
[root@docker ~]# docker run --volumes-from v-date1 -dti --name v03 nginx 6edec4ae2d5eeac0cf71e1e5034c1f6fc4541446ea26df6d224e45c3df66b7f3
创建v04容器:
[root@docker ~]# docker run --volumes-from v-date1 -dti --name v04 nginx 3e8becf8bd83c37ca3d3137c9dbe3230dcdd196d37973acbc48fe7887ac29349
列出全部容器:
[root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e8becf8bd83 nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 80/tcp v04 6edec4ae2d5e nginx "/docker-entrypoint.…" 48 seconds ago Up 47 seconds 80/tcp v03 37b54805ba95 nginx "/docker-entrypoint.…" 5 minutes ago Created v-date1 e9f4095f8b25 nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 80/tcp test
确认卷容器共享
进入v03,操作数据卷容器:
[root@docker ~]# docker exec -it 6edec4ae2d5e /bin/bash root@6edec4ae2d5e:/# ls /date1/ root@6edec4ae2d5e:/# echo 'v03' >/date1/v03.txt root@6edec4ae2d5e:/# exit exit
进入v04,确认数据卷:
[root@docker ~]# docker exec -it 3e8becf8bd83 /bin/bash root@3e8becf8bd83:/# echo 'v04' >/date1/v04.txt root@3e8becf8bd83:/# ls /date1/ v03.txt v04.txt
Docker 镜像仓库
本地镜像发布到阿里云
创建自己的docker镜像容器,并且添加到阿里云。将阿里云当成了镜像仓库。
容器镜像服务 (aliyun.com)
创建个人实例
创建命名空间
命名空间可以自己随便输入,但是不能和别人重名,并且一个账号最多创建三个。
创建镜像仓库
创建镜像仓库,前面创建的命名空间就起作用了。
名称和摘要自定义。
添加镜像
创建成功后,按照阿里云上面的教程复制粘贴即可。就比如将镜像推动到Registry。按照要求输入即可。
注意:此处让输入的密码是设置的docker镜像密码,而不是阿里云密码。
将镜像推送到Registry
[root@docker ~]# docker tag c92b8d5a6959 registry.cn-hangzhou.aliyuncs.com/vm1/test:v1.0 [root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/vm1/test:v1.0 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/vm1/test] 60e4517c593c: Pushed b6812e8d56d6: Pushed 7046505147d7: Pushed c876aa251c80: Pushed f5ab86d69014: Pushed 4b7fffa0f0a4: Pushed 9c1b6dd6c1e6: Pushed v1.0: digest: sha256:4d324d698806a04832b706987cc3b923ca625c3d2ced062624ddc23f24dbb8cd size: 1778 [root@docker ~]#
docker网络
bridge模式
当Docker进程启动时,会在主机上创建⼀个名为docker0的虚拟⽹桥,此主机上启动的 Docker容器会连接到这个虚拟⽹桥上。虚拟⽹桥的⼯作⽅式和物理交换机类似,这样主机上的所 有容器就通过交换机连在了⼀个⼆层⽹络中。
从docker0⼦⽹中分配⼀个IP给容器使⽤,并设置docker0的IP地址为容器的默认⽹关。在主 机上创建⼀对虚拟⽹卡veth pair设备,Docker将veth pair设备的⼀端放在新创建的容器中,并命 名为eth0(容器的⽹卡),另⼀端放在主机中,以vethxxx这样类似的名字命名,并将这个⽹络设 备加⼊到docker0⽹桥中。可以通过brctl show命令查看。
bridge模式是docker的默认⽹络模式,不写--net参数,就是bridge模式。使⽤docker run -p 时,docker实际是在iptables做了DNAT规则,实现端⼝转发功能。可以使⽤iptables -t nat -vnL 查看。
创建⼀个bridge⽹络的容器
[root@docker ~]# docker run -it busybox Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 5cc84ad355aa: Pull complete Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678 Status: Downloaded newer image for busybox:latest / #
如果出现问题报错
WARNING: IPv4 forwarding is disabled. Networking will not work.
- 问题原因
是没有开启转发,docker网桥配置完后,需要开启转发,不然容器启动后,就会没有网络,配置/etc/sysctl.conf,添加net.ipv4.ip_forward=1 - 问题解决:
修改文件
# vim /etc/sysctl.conf net.ipv4.ip_forward=1 #添加此行配置
也可修改此文件:/usr/lib/sysctl.d/00-system.conf
重启network和docker服务
# systemctl restart network && systemctl restart docker
查看是否修改成功
# sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示修改成功
再次执行查看,使用docker不再报错
host模式
如果启动容器的时候使⽤host模式,那么这个容器将不会获得⼀个独⽴的Network Namespace,⽽是和宿主机共⽤⼀个Network Namespace。容器将不会虚拟出⾃⼰的⽹卡,配置 ⾃⼰的IP等,⽽是使⽤宿主机的IP和端⼝。但是,容器的其他⽅⾯,如⽂件系统、进程列表等还是 和宿主机隔离的。
使⽤host模式的容器可以直接使⽤宿主机的IP地址与外界通信,容器内部的服务端⼝也可以使 ⽤宿主机的端⼝,不需要进⾏NAT,host最⼤的优势就是⽹络性能⽐较好,但是docker host上已经使⽤的端⼝就不能再⽤了,⽹络的隔离性不好。 创建⼀个host⽹络的容器
[root@docker ~]# docker run -it --network host busybox / # ifconfig br-1362f3863208 Link encap:Ethernet HWaddr 02:42:C9:2B:0D:49 inet addr:172.19.0.1 Bcast:172.19.255.255 Mask:255.255.0.0 inet6 addr: fe80::42:c9ff:fe2b:d49/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:5 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:438 (438.0 B) br-d5b01d78427c Link encap:Ethernet HWaddr 02:42:A5:43:A6:02 inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) docker0 Link encap:Ethernet HWaddr 02:42:82:72:DA:52 inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0 inet6 addr: fe80::42:82ff:fe72:da52/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:46 errors:0 dropped:0 overruns:0 frame:0 TX packets:67 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4140 (4.0 KiB) TX bytes:4989 (4.8 KiB) eth0 Link encap:Ethernet HWaddr 00:0C:29:74:DC:0D inet addr:192.168.200.11 Bcast:192.168.200.255 Mask:255.255.255.0 inet6 addr: fe80::4e6f:f9e8:b32:518c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:340658 errors:0 dropped:0 overruns:0 frame:0 TX packets:128366 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:353243567 (336.8 MiB) TX bytes:225649848 (215.1 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:90 errors:0 dropped:0 overruns:0 frame:0 TX packets:90 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:7459 (7.2 KiB) TX bytes:7459 (7.2 KiB) veth500604c Link encap:Ethernet HWaddr 4E:AC:27:0E:9D:F0 inet6 addr: fe80::4cac:27ff:fe0e:9df0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:648 (648.0 B) veth694d133 Link encap:Ethernet HWaddr 4E:D8:94:2C:B2:5C inet6 addr: fe80::4cd8:94ff:fe2c:b25c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:648 (648.0 B) veth96651b8 Link encap:Ethernet HWaddr A6:E8:D8:6A:9A:51 inet6 addr: fe80::a4e8:d8ff:fe6a:9a51/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:19 errors:0 dropped:0 overruns:0 frame:0 TX packets:33 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1868 (1.8 KiB) TX bytes:2431 (2.3 KiB) vethb09c007 Link encap:Ethernet HWaddr 9A:F4:67:10:EE:68 inet6 addr: fe80::98f4:67ff:fe10:ee68/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:648 (648.0 B) / #
通过以上实验得知,该容器的⽹络与宿主机⼀样,直接使⽤Docker host的⽹络,最⼤的好处 就是性能,如果容器对⽹络传输效率有较⾼要求,则可以选择host⽹络。当然不变之处就是牺牲 ⼀些灵活性,⽐如要考虑端⼝冲突⻛问题,Docker host上已经使⽤的端⼝就不能再⽤了。
none模式
使⽤none模式,Docker容器拥有⾃⼰的Network Namespace,但是,并不为Docker容器进 ⾏任何⽹络配置。也就是说,这个Docker容器没有⽹卡、IP、路由等信息。需要我们⾃⼰为 Docker容器添加⽹卡、配置IP等。
这种⽹络模式下容器只有lo回环⽹络,没有其他⽹卡。none模式可以在容器创建时通过-- network=none来指定。这种类型的⽹络没有办法联⽹,封闭的⽹络能很好的保证容器的安全性。 创建⼀个none⽹络的容器
[root@docker ~]# docker run -it --network none busybox / # ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
⽐如某个容器的唯⼀⽤途是⽣产随机密码,就可以放到none⽹络中避免密码被窃取。
自定义网络模式
创建me_net⽹络,系统默认IP地址段⾃动向后递增
[root@docker ~]# docker network create --driver bridge me_net 04bcfda0226c8ce6c91d66ca8966986b92ffda64f1e147eb926af559beca1715 [root@docker ~]# ifconfig br-04bcfda0226c: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.20.0.1 netmask 255.255.0.0 broadcast 172.20.255.255 ether 02:42:6a:19:29:8d txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 br-1362f3863208: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255 inet6 fe80::42:c9ff:fe2b:d49 prefixlen 64 scopeid 0x20<link> ether 02:42:c9:2b:0d:49 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 br-d5b01d78427c: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255 ether 02:42:a5:43:a6:02 txqueuelen 0 (Ethernet) 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 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:82ff:fe72:da52 prefixlen 64 scopeid 0x20<link> ether 02:42:82:72:da:52 txqueuelen 0 (Ethernet) RX packets 46 bytes 4140 (4.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 67 bytes 4989 (4.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.200.11 netmask 255.255.255.0 broadcast 192.168.200.255 inet6 fe80::4e6f:f9e8:b32:518c prefixlen 64 scopeid 0x20<link> ether 00:0c:29:74:dc:0d txqueuelen 1000 (Ethernet) RX packets 340771 bytes 353251717 (336.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 128428 bytes 225661146 (215.2 MiB) 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 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 90 bytes 7459 (7.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 90 bytes 7459 (7.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 veth500604c: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::4cac:27ff:fe0e:9df0 prefixlen 64 scopeid 0x20<link> ether 4e:ac:27:0e:9d:f0 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 veth694d133: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::4cd8:94ff:fe2c:b25c prefixlen 64 scopeid 0x20<link> ether 4e:d8:94:2c:b2:5c txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 veth96651b8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::a4e8:d8ff:fe6a:9a51 prefixlen 64 scopeid 0x20<link> ether a6:e8:d8:6a:9a:51 txqueuelen 0 (Ethernet) RX packets 19 bytes 1868 (1.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 33 bytes 2431 (2.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 vethb09c007: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::98f4:67ff:fe10:ee68 prefixlen 64 scopeid 0x20<link> ether 9a:f4:67:10:ee:68 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用自定义网络创建容器
[root@docker ~]# docker run --network me_net -it busybox / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:14:00:02 inet addr:172.20.0.2 Bcast:172.20.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:11 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:946 (946.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / #
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」