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)
复制代码

  

posted @   年年哎  阅读(175)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示