Linux Docker基础学习
Linux指令Linux安装Docker检查是否安装成功 容器容器的创建删除运行停止容器端口转发查看容器提供的端口号 Docker交互模式 镜像镜像的拉取删除镜像的导入导出Dockerfile制作镜像上传镜像到DockerhubDockerfile文件详解FROMRUN指令镜像中添加文件(add copy)声明变量(ARG和ENV)CMD容器启动命令容器启动时默认执行的命令启动容器时指定命令CMD写法 ENTRYPOINT 数据持久化VOLUME将数据保存到本地将数据写入新的镜像 Bind Mount docker-compose安装推荐安装方式Liunx用pip命令安装 yaml文件结构指令命名规则docker compose自定义镜像构建 网络查看所有Docker的网络列表bridge网络模式host网络模式none网络模式container网络模式
Linux指令
liunx文件压缩指令
Linux安装Docker
CentOS环境安装Docker的三种方法
这里是通过脚本安装
curl -fsSL get.docker.com -o get-docker.sh
这个下载命令并没有成功提示,所以下载完成后,可以使用ls命令查看一下。如果已经存在了,就可以使用sh命令,直接执行这个脚本了。
sh get-docker.sh
回车后就开始安装Docker了。这里需要注意,如果你不是root用户,是需要使用sudo命令或者给用户sudo权限。
检查是否安装成功
# 显示docker的版本信息docker version# 显示docker的系统信息(包括镜像和容器数量)docker info# 帮助命令docker 命令 --help
docker version
如果只显示如图只启动了客户端
输入命令
# 开启Docker服务端sudo systemctl start docker
再检测版本
容器
容器的创建删除运行停止
创建并运行一个容器
# container可以省略docker container run -p -d 90:80 nginx
使用的是云服务器记得在控制台中打开对应端口号-p
:第一个端口是映射到服务器本机的端口;第二个端口是Docker容器使用的端口。 比如你想把Docker的80端口,映射到服务器的90端口。
参数说明:-i
:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。-t
:为容器重新分配一个伪输入终端,通常与 -i 同时使用。-d
:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。-it
:创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器-t
:表示容器启动后会进入其命令行。加入-it这两个参数后,容器创建就能登录进去。即分配一个伪终端。v
:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
启动后通过IP+端口号即可访问
停止运行
docker container stop <Name or ID>
查看容器
#正在运行的容器docker container ls#全部容器docker container ls -a
#查看正在运行的容器IDdocker container ls -q#查看所有容器IDdocker container ls -aq
删除容器
#删除单个容器docker container rm <Name or ID>#删除多个容器docker container rm id1 id2 id3 (例举出所有需要删除的容器)docker container stop $(docker container ls -aq)#强制删除容器(当我们直接删除正在运行的容器时会报错)docker container rm <Name or ID> -f#批量删除不再使用的容器(删除的是已经退出的容器)docker system prune -f
后台运行转前台运行
docker attach <Name or ID>
后台运行模式下查看日志
#只打印一次docker container logs <ID or Image name>#动态跟踪日志docker container logs -f <ID or Image name>
容器端口转发
在启动容器时使用-p
进行端口映射
docker container run -d -p 3000:80 wordpress
第一个3000是要映射的端口号,后面的80是镜像提供的端口号,访问时通过公网IP + 端口号访问
注意:如果使用的时云服务器,需要检查映射的端口号是否开放。还有在学习过程中,尝试把镜像端口号改为8080或是其他端口号发现都不能访问,经过百度发现不同镜像默认开放的端口号不一样,如nginx镜像默认开放的端口号只有80和443。
查看容器提供的端口号
docker container inspect --format '{{.Config.ExposedPorts}}' <ContainerID>
--format
是格式化过滤的意思,后边{{ ...}}
里边的是要查看的选项。
如果不筛选可以查看全部信息,找到exposedport就是提供的端口号
docker container inspect <ContainerID>
Docker交互模式
有时候容器的镜像不是简单的一个服务,而是需要交互的操作系统。例如创建一个Ubuntu系统,然后需要到系统里输入各种Shell命令和系统进行交互。这时候attached模式和detached模式就不能满足要求了。需要使用交互模式。
直接启动镜像并开启交互模式
docker container run -it ubuntu sh
-it
代表启用交互模式,sh
代表可以使用Shell脚本。当你输入玩这个脚本后,Docker就会进入到交互模式。可以使用ls
来得到目录下的文件,也可以使用hostname
来查看计算机名称。
可以使用exit
退出交互模式,以这种方式开启,执行退出命令后容器也会停止运行。
detached模式下的交互
先创建并运行容器
docker container run -d -p 80:80 nginx
然后进入交互模式
docker exec -it <ID or Name> sh
exec
是执行的意思,-it
交互模式 , sh
交互的方式,用shell脚本进行交互
可以使用exit
退出交互模式,以这种方式开启,执行退出命令后容器仍然运行。
镜像
获取镜像的三个基本途径
从网络社区(DockerHub 和Quay)拉取从Dockerfile构建镜像(需要联网)从本地文件导入(不需要联网)#查看所有镜像指令docker image
镜像的拉取删除
拉取docker image pull <ImageName>
删除 docker image rm <Image ID># 批量删除没有使用的容器docker image prune -a
查看 #查看镜像列表docker image ls#查看镜像具体信息docker image inspect <IMAGE ID>
镜像的导入导出
导出
docker image save ubuntu:latest -o myubuntu.image
解读上面的命令,save
是导出/保存的意思,ubuntu:latest
是镜像名称+版本号, -o
代表输出,myubuntu.image
是导出后镜像的名字。
导入
docker image load -i <LocalImageName>
Dockerfile制作镜像
完成一个dockerfile脚本
通过Dockerfile构建镜像
docker image build -f /root/docker-test/dockerfile1 -t cyt/cytcentos:1.0 .
(注意命令最后是有一个.的)
运行镜像
docker run <ImageId or ImageName>
上传镜像到Dockerhub
构建镜像
docker image build -f /root/docker-test/dockerfile1 -t cysky/cytcentos:latest .
镜像名的规则必须遵守Dockerhub用户ID+镜像名
的格式。
如果镜像名错误可以通过docker image tag
命令修改
docker image tag <old image name > <new iamge name>
推送到Dockerhub
先登录Dockerhub账户
docker login
接着按照要求输入用户名密码
然后推送
docker image push Name[:TAG]
Dockerfile文件详解
FROM
意思是选择一个基础镜像,选择基础镜像有三个原则
官方镜像优于非官方的镜像;固定版本的Tag,而不是每次都使用latest;功能满足,选择体积小的镜像;RUN指令
有多个run指令是尽量都写一个run然后将指令连接
不建议的写法
FROM ubuntu:latestRUN apt-get updateRUN apt-get install -y wgetRUN wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gzRUN tar zxf ipinfo_2.0.1_linux_amd64.tar.gzRUN mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfoRUN rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
建议的写法
FROM ubuntu:latestRUN apt-get update && \ apt-get install -y wget && \ wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz && \ tar zxf ipinfo_2.0.1_linux_amd64.tar.gz && \ mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo && \ rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
两种写法打包后的对比
使用一个RUN连接多个指令的方法打包得到的镜像体积更小
镜像中添加文件(add copy)
add和copy都可以把本地文件复制到镜像,add复制文件时如果是tar文件包时回自动解包
COPY
本地文件index.js
//1. 导入 http 模块 const http = require('http'); //2. 创建服务器对象 const server = http.createServer(); //3. 开启服务器 server.listen(3000, () => { console.log('Server is running...'); }); //4. 监听浏览器请求并进行处理 server.on('request', (req, res) => { // end方法能够将数据返回给浏览器,浏览器会显示该字符串 res.end('Hello Nodejs'); });
Dockerfile文件
FROM node:alpine3.14COPY index.js /app/index.js
构建镜像
docker image build -f dockerfilecopynode -t hello-copy .
启动容器以及node服务
docker container run -it -p 3000:3000 hello-copy sh
访问
Copy
本地文件index.js
//1. 导入 http 模块 const http = require('http'); //2. 创建服务器对象 const server = http.createServer(); //3. 开启服务器 server.listen(3000, () => { console.log('Server is running...'); }); //4. 监听浏览器请求并进行处理 server.on('request', (req, res) => { // end方法能够将数据返回给浏览器,浏览器会显示该字符串 res.end('Hello Nodejs'); });
打包文件
# 打包tar cvf index.tar index.js(注:tar是打包,不是压缩!)# 解包tar xvf index.tar
Dockerfile文件
FROM node:alpine3.14COPY index.tar /app/index.js
构建镜像
docker image build -f dockerfileaddnode -t hello-copy .
启动容器以及node服务
docker container run -it -p 3000:3000 cysky/hello-add sh
声明变量(ARG和ENV)
Dockerfile文件
env
FROM ubuntu:latestENV VERSION=2.0.1RUN apt-get update && \ apt-get install -y wget && \ wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \ tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \ mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \ rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz
arg
FROM ubuntu:latestARG VERSION=2.0.1RUN apt-get update && \ apt-get install -y wget && \ wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \ tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \ mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \ rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz
分别利用两个Dockefile制作镜像
# env声明的变量制作镜像docker image build -f dockerfileenv -t cysky/ipinfo-env .# arg声明的变量制作镜像docker image build -f dockerfilearg -t cysky/ipinfo-arg .
两种方式声明变量制作的镜像大小相同
不同点
ARG是构建环境 , ENV可带到镜像中
进入镜像内部查看配置信息时发现,ENV声明的版本信息被带到镜像内部了,而ARG声明没有被带入。
ARG可以在构建镜像时改变变量值
在构建时,可以使用--build-arg
参数来更改变量的值,比如现在要把变量VERSION的值进行修改,就可以使用下面的命令。
docker image build -f dockerfilearg -t cysky/ipinfo-arg-2.0.0 --build-arg VERSION=2.0.0 .
然后以交互模式启动后使用ipinfo version
查看版本,可以看到版本不再是dockerfile中的2.0.1而是2.0.0
CMD容器启动命令
CMD命令的三个基本特性
容器启动时默认执行的命令如果docker container run启动容器时指定了其他命令,则CMD命令会被忽略如果定义多个CMD,只有最后一个CMD执行容器启动时默认执行的命令
Dockerfile文件
FROM ubuntu:latestENV VERSION=2.0.1RUN apt-get update && \ apt-get install -y wget && \ wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \ tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \ mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \ rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz
利用上面的dockerfile创建镜像
docker image build -f dockerfileenv -t cysky/ipinfo-cmdtest .
使用交互模式启动镜像
docker container run -it cysky/ipinfo-cmdtest
启动后自动进入shell模式,这是因为unbunt镜像创建时默认使用了CMD命令,可以通过 docker image history cysky/ipinfo-cmdtest
查看
启动容器时指定命令
docker container run -it cysky/ipinfo-cmdtest ipinfo version
可以看出,直接打印出版本号,没有进入shell模式,默认CMD命令被忽略
CMD写法
在原本的dockerfile中加入一行cmd命令,然后重新制作镜像
FROM ubuntu:latestENV VERSION=2.0.1RUN apt-get update && \ apt-get install -y wget && \ wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \ tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \ mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \ rm -rf ipinfo_${VERSION}_linux_amd64.tar.gzCMD ["ipinfo","version"]
运行后可以看出也没有进入shell模式,而是直接执行了dockerfile中的cmd命令,打印出版本
ENTRYPOINT
参考内容:Dockerfile 中 CMD 、RUN 和 ENTRYPOINT的区别和使用时机
CMD
设置的命令,可以在 docker container run
时传入其它命令,覆盖掉 CMD
的命令,但是ENTRYPOINT
所设置的命令时一定会被执行的。ENTRYPOINT
和 CMD
可以联合使用, ENTRYPOINT
设置执行的命令,CMD传递参数。 dockerfilecmd
FROM ubuntu:21.04CMD ["echo","hello docker"]
dockerentrypoint
FROM ubuntu:21.04ENTRYPOINT ["echo","hello docker"]
dockerfileboth
FROM ubuntu:21.04CMD ["dockerfile中的cmd命令"]ENTRYPOINT [ "echo"]
cmd使用
# 直接启动,应该会看到打印出dockerfile中cmd输出的内容docker container run --rm -it cysky/demo-cmd# run时后面加入指令,会覆盖掉dockerfile中的cmddocker container run --rm -it cysky/demo-cmd echo "运行命令时直接输入hello docker"
--rm
在容器退出时就能够自动清理容器内部的文件系统
entrypoint使用
# 直接启动,应该会看到打印出dockerfile中entrypoint输出的内容docker container run --rm -t cysky/demo-entrypoint# run时后面加入指令,不会会覆盖掉dockerfile中的cmd,是把指令后的内容当成参数传入传递进去,两条都打印docker container run --rm -t cysky/demo-entrypoint echo "run时直接输入的hello docker"
entrypoint和cmd配合使用
当dockerfile中两个命令都有时,会把run后面的命令当成参数传入,决定最后输出的内容。
# 会输出dockerfile中cmd传递的内容docker container run --rm -t cysky/demo-both# 会覆盖dockerfile中cmd传递的内容docker container run --rm -t cysky/demo-both "11111"
数据持久化
VOLUME
将数据保存到本地
当我们删除使用完的容器后,容器中的数据也将删除,我们可以再编写dockerfile时使用volume命令设置持久化目录
新建一个Dockerfile
FROM NGINXVOLUME ["/app"]
构建镜像
docker image build -f Dockerfile -t cysky/myimage .
启动镜像容器并且进入交互模式
# 启动容器docker container run -d cysky/myimage# 进入交互模式 docker container exec -it 2d7 sh
查看容器中的目录
存在的app目录就是我们需要持久化的目录,这里面的内容会在本机中保存一份
在容器app目录下新建一个文件测试
注意nginx默认没有vim指令,需要安装
apt-get updateapt-get install vim
安装完成后写入一个文件test.txt
不想安装vim的话也可以使用echo "helloaaa(这部分是文件内容)" > test.txt
写入文件
然后返回查看本地文件中的volume
# 查看本地volume列表docker volume ls# 查看单个volume信息docker volume inspect <VolumeId>
Mountpoint
就是文件的存储路径
转到地址然后可以看到保存到本地的文件
cd <Mountpoint>more text.txt
将数据写入新的镜像
在启动容器时用-v
给volume取一个别名-v
后是别名+路径(dockerfile中写的路径)
docker container run -d -v my-data:/app cysky/myimage
查看本地volume
docker volume ls
此时文件中还是空的,接下来进入容器中创建一个文件
# 进入容器内部docker container exec -it f43 sh# 进入持久化的文件夹app下面cd app# 写入一个测试文件echo "这是容器中写入的文件" > test.txt
查看本地保存的volume
接着删除容器,利用myimage镜像新建一个容器,并写入文件
# 删除原容器后启动一个新的容器(需要加volume名字和文件路径)docker container run -d -v my-data:/app cysky/myimage# 进入容器内部查看文件docker container exec -it 370 shcd app
此时app文件已经写入
Bind Mount
Bind Mount
使用方式和Data VOLUME
类似,也是在启动容器时用到-v
参数
# 把当前目录作为绑定目录(注意不能用中括号{}),/app作为容器中的目录docker container run -it -v $(pwd):/app node# 查看是否被正确创建docker inspect <ContainerId>
在test目录下写入一个文件index.js
console.log('show Time')setInterval(()=>{ console.log(Date())},1000)
进入容器内部
docker container exec -it 3e9 sh
可以查看到存在app目录,并且下面有index.js文件
docker-compose
docker-compose安装
安装
推荐安装方式
# 下载安装包sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 设置权限sudo chmod +x /usr/local/bin/docker-compose# 添加软连接sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose# 查看安装信息docker-compose --version# 卸载数据sudo rm /usr/local/bin/docker-compose
Liunx用pip命令安装
查看是否安装依赖包
sudo yum install epel-release
更新文件库(如果不更改yum源此过程消耗时间很长)
sudo yum -y update
安装pip3
sudo yum install -y python3-pip# 检查是否安装成功pip3 -V
安装docker-compose
pip3 install docker-compose
如果安装过程中出现Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-05ex4t2s/cryptography/
可以执行pip3 install --upgrade pip
然后再安装
如果遇到/usr/local/lib/python3.6/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography and will be removed in a future release.
先卸载 cryptography(37.0.2版本)后重新安装36.0.2版本
# 先卸载pip3 uninstall cryptography# 再安装pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com cryptography==36.0.2
yaml文件结构
version: "3.8"services: # 容器 servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS name image: # 镜像的名字 command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令 environment: # 可选,相当于 docker run里的 --env volumes: # 可选,相当于docker run里的 -v networks: # 可选,相当于 docker run里的 --network ports: # 可选,相当于 docker run里的 -p servicename2:volumes: # 可选,相当于 docker volume createnetworks: # 可选,相当于 docker network create
指令
例子:
在文件夹下创建一个文件docker-compose.yml
version: "3.8"services: my-wordpress: image: wordpress:latest ports: - 80:80
# 开启容器指令(-d是后台模式运行)docker compose up -d# 关闭容器docker compose stop# 删除容器docker compose rm# 容器列表
命名规则
用docker compose
创建的容器,名字都会加入一个对应文件夹的名字,比如我在的文件夹叫做composetest
,而我在yaml文件中起的名字是my-wordpress
。最终容器的名字就是composetest_my-wordpress_1
可以在创建容器时添加参数
docker compose -p sky up -d
这种方式创建的容器在列表中不显示,但可以访问到
yaml文件中添加container_name
version: "3.8"services: my-wordpress: container_name: cysky image: wordpress:latest ports: - 80:80
运行
docker compose up -d
docker compose自定义镜像构建
文件层级
Dockerfile
FROM node:latestCMD []
docker-compose.yml
image是给镜像命名,没有指定的话会以文件夹名+服务名默认命名
version: "3.8"services: my-node: build: ./ image: my-node:latetst
创建容器docker compose up
网络
一台服务器上可以跑很多容器,容器间是相互配合运行的。有配合就需要有网络通讯,就需要设置网络。
比如现在我们启动一个nginx的容器,用detached模式启动,并映射端口到80上。
docekr container run -d -p 80:80 nginx
容器启动后,可以用查看容器的具体信息。命令如下。
docker inspect <Container ID >
输入完成后,你可以看到有很多信息。其中有一项是Networks,这个就是容器的网路设置了。
"Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "bd2fe52b4c98ec5c5a11131a0bec714035ae25c791a518f7302d7f02c0aa8a75", "EndpointID": "2b8e1ff95d9f0f56be7a9f3737a1a695f523c290aefcd8c5f08130b9fb4535df", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } }
信息中是可以看出很多东西的,比如这个网络的连接方式是bridge,也就是桥接。然后IP地址IPAddress是172.17.0.2
这个就是它的内网IP地址。
为了看的更清晰,我们可以再启动一个nginx容器.
docker container run -d -p 8080:80 nginx
这时候再使用docker inspect 可以看到网络信息是下面这样的。
"Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "bd2fe52b4c98ec5c5a11131a0bec714035ae25c791a518f7302d7f02c0aa8a75", "EndpointID": "4686cd198f9e6bbc22b25d1ce2b8e58dbadb60c6b20158a5afaf1bf2856bcdb3", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:03", "DriverOpts": null }}
可以看到这个网络依然是桥接,IP地址变成了172.0.0.3
.
也就是说每一个容器启动后都会有一个IP,并且每个IP是不同,自动变化的。这就是Docker为我们作的默认网络配置。并且虽然容器的启动顺畅,给的IP地址也是递增的。
这种默认的问题就是,如果每次启动的顺序不一样,IP地址就会不同,这样每次都要重新进行配置。这肯定在工作中是行不通的。真实工作中,可能一台服务器就有几十个容器,如果每次修改通讯地址,这个工作将变的混乱不堪,无法继续。
那一般情况下,我们会通过- -name来置顶固定名称,然后再用名称进行通信。这种解决方案的前提就是需要了解网络模式和自定义网络后,才能实现可控状态。
查看所有Docker的网络列表
docker network ls
bridge : 这个是网桥,我习惯性的说成桥接模式。为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为该模式。host :使用主机模式,容器没有IP和网关这些,都是用实体主机的。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。none :就是不创建自己的IP网络。也就是常说的没有网,当然你可以自己进行定义网络模式。容器有独立的Network namespace,但并没有对其继续任何网络设置,如分配veth pair 和网桥连接,IP等。container : 就是利用其它容器的网络,别的容器有网络了,使用其它的容器网络。新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口等。此种方式不是默认网络模式,它需要基于另一个容器。 bridge网络模式
在该模式中,Docker守护进程创建了一个虚拟以太网桥·docker 0
,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。
默认情况下,守护进程会创建一对 对等虚拟设备接口 veth pair, 将其中一个接口设置为容器的eth0
接口(也就是容器的网络/网卡接口),另一个接口放置在主机的命名空间中,以类似vethxxx
这样的名字命名,从而将主机上的所有容器都连接到这个内部网络上。
通过图可以清楚的看到桥接模式,eth0
是主机网卡,docker0
就是桥接网络,每个容器都有自己的teh0
,然后通过docker0
和主机进行通信,也形成了内部局域网。
示例:
查看主机中的所有网卡
ip addr
运行busybox容器并查看网络信息
docker container run -it --name busybox01 busyboxip addr
再查看本机中网卡信息
host网络模式
host网络模式使用主机网络模式,容器没有IP和网关这些,都是用实体主机的。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
host网络模式使用主机网络模式,容器没有IP和网关这些,都是用实体主机的。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。示例
docker container run -it --name nginx1 --network host nginx
访问地址
查看网卡 发现host模式不像bridge模式生成了自己的虚拟对等网络,而是使用本机的etho
none网络模式
none网络模式是指禁用网络功能,只有lo接口local的简写,代表127.0.0.1,既localhost本地环回接口。在创建容器时通过 - - net none或者–network none 指定。
docker container run -it --name busybox02 --network none busybox
容器启动完成后,使用ip addr
可以看到只有一个lo的网络。
none网络模式即不为Docker Container创建任何的网络环境,容器内部只能使用loopback网络设备,不会再有其他的网络资源。可以说none模式为Docker Container做了极少的网络设定,但是俗话说的好“少即是多”。在没有网络配置的情况下,作为Docker 开发者,才能在这基础做其他无限多的可能的网络定制开发。这也体现了Docker设计理念的开发。
container网络模式
Container 网络模式是Docker中一种较为特别的网络模式。在创建时通过参数- - net container : 已运行的网络名称 | ID 或者- - network container : 已运行的容器名称 | ID 指定。
处于这个模式下的Docker容器会共享一个网络栈,这样两个容器之间可以使用localhost高效通信。Container网络模式即新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。
运行一个容器
docker run -it --name busybox01 busybox
以container网络模式运行第二个容器
docker container run -it --name busybox02 --network container:busybox01 busybox
查看本机网卡
对比发现本机网卡多出一条,两个容器中一条网卡相同。