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 可以通过定制应⽤镜像来实现持续集成、持续交付、部署。开发⼈员可以通过 来进
⾏镜像构建,并结合 系统进⾏集成测试,⽽运维⼈员则可以直接在⽣产环境中快速部署该镜像,
甚⾄结合 系统进⾏⾃动部署。
⽽且使⽤ 使镜像构建透明化,不仅仅开发团队可以理解应⽤运⾏环境,也⽅便运维团队理解应⽤
运⾏所需条件,帮助更好的⽣产环境中部署该镜像。
更轻松的迁移
由于 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/multi-
user.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@hello:~# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
1fe172e4850f: Pull complete
35c195f487df: Pull complete
213b9b16f495: Pull complete
a8172d9e19b9: Pull complete
f5eee2cb2150: Pull complete
93e404ba8667: Pull complete
Digest:
sha256:859ab6768a6f26a79bc42b231664111317d095a4f04e4bfe79ce37b3d199097
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
查看本地镜像
root@hello:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest fa5269854a5e 2 weeks ago 142MB
root@hello:~
给镜像打标签
[root@docker ~]# docker tag fa5269854a5e docker.io/xmfree/alpine:v3.12.3
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 3 weeks ago 141MB alpine latest c059bfaa849c 2 months ago 5.59MB xmfree/alpine v3.12.3 389fef711851 13 months ago 5.58MB alpine 3.12.3 389fef711851 13 months ago 5.58MB
删除镜像
root@hello:~# docker images
还有
下载指定版本镜像
root@hello:~# docker pull nginx:1.20.1
1.20.1: Pulling from library/nginx
b380bbd43752: Pull complete
83acae5e2daa: Pull complete
33715b419f9b: Pull complete
eb08b4d557d8: Pull complete
74d5bdecd955: Pull complete
0820d7f25141: Pull complete
Digest:
sha256:a98c2360dcfe44e9987ed09d59421bb654cb6c4abe50a92ec9c912f252461483
Status: Downloaded newer image for nginx:1.20.1
docker.io/library/nginx:1.20.1
root@hello:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.20.1 c8d03f6b8b91 5 weeks ago 133MB
root@hello:~#
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@hello:~# 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@hello:~#
root@hello:~# curl -I 127.0.0.1:88
HTTP/1.1 200 OK
Server: nginx/1.21.6
Date: Fri, 06 May 2022 07:45:00 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT
Connection: keep-alive
ETag: "61f01158-267"
Accept-Ranges: bytes
root@hello:~#
查看当前运行的容器
root@hello:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
15db0ba492cf nginx "/docker-entrypoint.…" About a minute ago Up
About a minute 0.0.0.0:88->80/tcp, :::88->80/tcp myningx
root@hello:~#
根据启动的容器创建新的镜像
[root@docker ~]# docker commit -a "cool" -m "this is test" 8f2b5344e019 nginx:1.0
sha256:1536d2d700c9860db023536a90f43a820bcdfbcb920366e7e83221f5250f3993
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.0 1536d2d700c9 11seconds ago 142MB
xmfree/alpine v3.12.3 fa52698545e 2weeks ago 142MB
nginx latest fa5269854a5e 2 weeks ago 142MB
nginx 1.20.1 c8d03f6b8b91 6 months ago 133MB
docker commit : 从容器创建⼀个新的镜像
-a:提交的镜像作者;
-c:使⽤Dockerfile指令来创建镜像;
-m:提交时的说明⽂字;
-p:在commit时,将容器暂停
停止容器
root@hello:~# docker stop 8f2b5344e019
8f2b5344e019
root@hello:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@hello:~#
查看所有容器
root@hello:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
8f2b5344e019 nginx "/docker-entrypoint.…" 3 minutes ago Exited
(0) 13 seconds ago myningx
root@hello:~#
启动容器
root@hello:~# docker start 8f2b5344e019
8f2b5344e019
root@hello:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
15db0ba492cf nginx "/docker-entrypoint.…" 3 minutes ago Up 16
seconds 0.0.0.0:88->80/tcp, :::88->80/tcp myningx
root@hello:~#
进入容器操作容器
root@hello:~# docker exec -it 735502fdd7f1 /bin/bash
root@735502fdd7f1:/#
root@735502fdd7f1:/#exit
root@hello:~#
修改容器内容
root@hello:~# docker exec -it 735502fdd7f1 /bin/bash
root@b1d72657b272:/# echo "123" > /usr/share/nginx/html/index.html
root@b1d72657b272:/#
root@b1d72657b272:/# echo "cby" > /usr/share/nginx/html/index.html
root@hello:~# curl 127.0.0.1:88
123
root@hello:~#
root@hello:~# docker exec -it b1d72657b /bin/bash
root@b1d72657b272:/# echo "cby" > /usr/share/nginx/html/index.html
root@hello:~# curl 127.0.0.1:88
cby
root@hello:~#
将运行中的容器构建为镜像
root@hello:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
735502fdd7f1 nginx "/docker-entrypoint.…" 2 minutes ago Up 2
minutes 0.0.0.0:88->80/tcp, :::88->80/tcp myningx
root@hello:~#
root@hello:~# docker commit -a "cby" -m "my app" 735502fdd7f1 myapp:v1.0
sha256:07a7b54c914c79dfbd402029a3d144201235eca72a4f26c92e2ec7780c485226
root@hello:~#
root@hello:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myapp v1.0 0681073d2d8f 9 seconds ago 142MB
nginx 1.0 1536d2d700c9 10 minutes ago 142MB
nginx latest fa5269854a5e 2 weeks ago 142MB
xmfree/alpine v3.12.3 fa5269854a5e 2 weeks ago 142MB
nginx 1.20.1 c8d03f6b8b91 6 months ago 133MB
root@hello:~#
镜像保存与导入
root@hello:~# docker save -o cby.tar myapp:v1.0
root@hello:~# docker save 0681073d2d8f > cby.tar
root@hello:~# ll cby.tar
-rw------- 1 root root 145910784 5 6 15:59 cby.tar
root@hello:~#
root@hello:~# docker load -i cby.tar
root@hello:~# docker load < cby.tar
Loaded image: myapp:v1.0
root@hello:~#
root@hello:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myapp v1.0 0681073d2d8f 2 minutes ago 142MB
nginx 1.0 1536d2d700c9 12 minutes ago 142MB
nginx latest fa5269854a5e 2 weeks ago 142B
xmfree/alpine v3.12.3 fa5269854a5e 2 weeks ago 142MB
nginx 1.20.1 c8d03f6b8b91 6 monthsago 133MB
root@hello:~#
容器导出和导入
容器导出
#这样将导出容器快照到本地⽂件
docker export [CONTAINER ID] > [tar file]
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
735502fdd7f1 nginx "/docker-entrypoint.…" 6 minutes ago Up
About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp nginx1.0
[root@docker ~]# docker export 735502fdd7f1 > nginx.1.0.tar
[root@docker ~]# ls
nginx.1.0.tar
容器导⼊
#从容器快照⽂件中再导⼊为镜像
cat [tar file] | docker import - [name:tag]
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myapp v1.0 0681073d2d8f 2 minutes ago 142MB
nginx 1.0 1536d2d700c9 12 minutes ago 142MB
nginx latest fa5269854a5e 2 weeks ago 142B
xmfree/alpine v3.12.3 fa5269854a5e 2 weeks ago 142MB
nginx 1.20.1 c8d03f6b8b91 6 monthsago 133MB
[root@docker ~]# docker import nginx.1.0.tar nginx:1.0.1 [root@docker ~]# cat nginx.1.0.tar | docker import - nginx:1.0.1 sha256:c925a06f0e319d3364a34d3bb178443fb1bb225779abec1d03a381808670aad6 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.0.1 c925a06f0e31 50 seconds ago 140MB nginx 1.0 1932a3786901 8 minutes ago 141MB nginx latest 605c77e624dd 3 weeks ago 141MB alpine latest c059bfaa849c 2 months ago 5.59MB
镜像和容器导出和导入的区别:
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 /data #创建⽬录
[root@docker ~]# echo "test" > /data/test.txt #创建⼀个test⽂件
[root@docker ~]# docker run -dti --name test1 -v /data/:/data/ nginx #
启动⼀个容器,挂载数据卷
da07ba3665c847ee0a943795dbcc9695e8c3a13bd5e6ba353ea525ea16aa07a6
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
735502fdd7f1 nginx "/docker-entrypoint.…" 9 minutes ago Up 9
minutes 80/tcp test1
[root@docker ~]# docker exec -it735502fdd7f1 /bin/bash
root@da07ba3665c8:/# cat /data/test.txt
test
注意:
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 /data1 --name v-data1 nginx 0b9f4131a3a6a60f570241bbe3c9f0a01aee7ff23ca39f17499d6995cbc1e36a [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3777a807370 nginx "/docker-entrypoint.…" 8 seconds ago Created v-data1 aa5864e28e30 nginx "/docker-entrypoint.…" 5 minutes ago Up 2 minutes 80/tcp test1 创建两个容器,同时挂载数据卷容器 docker run --volumes-from [数据卷容器id/name] -dti --name [容器名字] [镜像名 称] [命令(可选)] 创建v01容器: [root@docker ~]# docker run --volumes-from v-data1 -dti --name v01 nginx 548b59bd97a07872c159eb7d699053b82b5bb8c32f51cadb9a1331188c6f8423 创建v02容器 [root@docker ~]# docker run --volumes-from v-data1 -dti --name v02 nginx 1ddba5648abf7af78a403e84f0ef5a06613da17ca237891bd44979d3c79b9420 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8a143a3e481d nginx "/docker-entrypoint.…" 17 seconds ago Up 16 seconds 80/tcp v02 dba9ad1d78f8 nginx "/docker-entrypoint.…" 33 seconds ago Up 32 seconds 80/tcp v01 a3777a807370 nginx "/docker-entrypoint.…" About a minute ago Created v-data1 aa6864e28e30 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp test1 确认卷容器共享 进⼊v01,操作数据卷容器: [root@docker ~]# docker exec -it 548b59bd97a0 /bin/bash root@dba9ad1d78f8:/# ls /data1/ root@dba9ad1d78f8:/# echo 'v01'>/data1/v01.txt
root@dba9ad1d78f8:/# exit exit 进⼊v02,确认数据卷: [root@docker ~]# docker exec -it 1ddba5648abf /bin/bash root@1ddba5648abf:/# echo 'v02'>/data1/v02.txt root@1ddba5648abf:/# ls /data1/ v01.txt v02.txt root@1ddba5648abf:/# exit exit
推送到 DockerHub , 并在其他主机上可拉去该镜像
root@hello:~# docker tag myapp:v1.0 chenbuyun/myapp:v1.0
root@hello:~#
root@hello:~# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you
don't have a Docker ID, head over to https://hub.docker.com to create
one.
Username: chenbuyun
Password:
WARNING! Your password will be stored unencrypted in
/root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-
store
Login Succeeded
root@hello:~# docker push chenbuyun/myapp:v1.0
The push refers to repository [docker.io/chenbuyun/myapp]
799aefeaf6b1: Pushed
fd688ba2259e: Mounted from library/nginx
c731fe3d8126: Mounted from library/nginx
3b1690d8cd86: Mounted from library/nginx
03f105433dc8: Mounted from library/nginx
bd7b2912e0ab: Mounted from library/nginx
e8b689711f21: Mounted from library/nginx
v1.0: digest:
sha256:f085a533e36cccd27a21fe4de7c87f652fe9346e1ed86e3d82856d5d4434c0a0
size: 1777
root@hello:~#
root@hello:~# docker logout
Removing login credentials for https://index.docker.io/v1/
root@hello:~#
root@hello:~# docker pull chenbuyun/myapp:v1.0
v1.0: Pulling from chenbuyun/myapp
Digest:
sha256:f085a533e36cccd27a21fe4de7c87f652fe9346e1ed86e3d82856d5d4434c0a0
Status: Downloaded newer image for chenbuyun/myapp:v1.0
docker.io/chenbuyun/myapp:v1.0
root@hello:~#
root@hello:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chenbuyun/myapp v1.0 07a7b54c914c 9 minutes ago 141MB
myapp v1.0 07a7b54c914c 9 minutes ago 141MB
nginx latest e9ce56a96f8e 8 hours ago 141MB
nginx 1.20.1 c8d03f6b8b91 5 weeks ago 133MB
root@hello:~#
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
/ #
host 模式
如果启动容器的时候使⽤host模式,那么这个容器将不会获得⼀个独⽴的Network
Namespace,⽽是和宿主机共⽤⼀个Network Namespace。容器将不会虚拟出⾃⼰的⽹卡,配置
⾃⼰的IP等,⽽是使⽤宿主机的IP和端⼝。但是,容器的其他⽅⾯,如⽂件系统、进程列表等还是
和宿主机隔离的。
使⽤host模式的容器可以直接使⽤宿主机的IP地址与外界通信,容器内部的服务端⼝也可以使
⽤宿主机的端⼝,不需要进⾏NAT,host最⼤的优势就是⽹络性能⽐较好,但是docker host上已
经使⽤的端⼝就不能再⽤了,⽹络的隔离性不好。
创建⼀个host网络的容器
[root@docker ~]# docker run -it --network host busybox
/ # ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:FE:82:C6:28
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:feff:fe82:c628/64 Scope:Link
UP BROADCAST RUNNING 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)
eth0 Link encap:Ethernet HWaddr 7A:DA:E5:DD:58:04
inet addr:10.24.196.149 Bcast:10.24.196.255
Mask:255.255.255.0
inet6 addr: fe80::78da:e5ff:fedd:5804/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:76924 errors:0 dropped:0 overruns:0 frame:0
TX packets:60548 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:202775692 (193.3 MiB) TX bytes:5027218 (4.7 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:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:416 (416.0 B) TX bytes:416 (416.0 B)
veth0064dae Link encap:Ethernet HWaddr B2:D2:7E:8E:47:F6
inet6 addr: fe80::b0d2:7eff:fe8e:47f6/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)
veth3f70f12 Link encap:Ethernet HWaddr C6:80:C7:2E:5D:AC
inet6 addr: fe80::c480:c7ff:fe2e:5dac/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)
veth8c45e76 Link encap:Ethernet HWaddr 92:5B:8C:95:CC:29
inet6 addr: fe80::905b:8cff:fe95:cc29/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模式,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⽹络中避免密码被窃取。
⾃定义⽹络模式
创建my_net⽹络,系统默认IP地址段⾃动向后递增
[root@docker ~]# docker network create --driver bridge my_net
31f5b8cddc73d43f416856c7389df439380dc734657c678536e4b8c6623bdd2b
[root@docker ~]# ifconfig
br-31f5b8cddc73: 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:4f:be:12:f5 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:feff:fe82:c628 prefixlen 64 scopeid 0x20<link>
ether 02:42:fe:82:c6:28 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5 bytes 438 (438.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.24.196.149 netmask 255.255.255.0 broadcast
10.24.196.255
inet6 fe80::78da:e5ff:fedd:5804 prefixlen 64 scopeid 0x20<link>
ether 7a:da:e5:dd:58:04 txqueuelen 1000 (Ethernet)
RX packets 77120 bytes 202789980 (193.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 60644 bytes 5039994 (4.8 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 6 bytes 416 (416.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6 bytes 416 (416.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth0064dae: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::b0d2:7eff:fe8e:47f6 prefixlen 64 scopeid 0x20<link>
ether b2:d2:7e:8e:47:f6 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
veth3f70f12: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::c480:c7ff:fe2e:5dac prefixlen 64 scopeid 0x20<link>
ether c6:80:c7:2e:5d:ac 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
veth8c45e76: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::905b:8cff:fe95:cc29 prefixlen 64 scopeid 0x20<link>
ether 92:5b:8c:95:cc:29 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 my_net -it busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:12:00:02
inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 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:1016 (1016.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 热点速览」