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)

/ #

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