Linux Docker基础学习

news2025/1/10 10:47:15

Linux Docker基础学习

      • Linux指令
      • Linux安装Docker
        • 检查是否安装成功
      • 容器
        • 容器的创建删除运行停止
        • 容器端口转发
          • 查看容器提供的端口号
        • Docker交互模式
      • 镜像
        • 镜像的拉取删除
        • 镜像的导入导出
        • Dockerfile制作镜像
        • 上传镜像到Dockerhub
        • Dockerfile文件详解
          • FROM
          • RUN指令
          • 镜像中添加文件(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

再检测版本
在这里插入图片描述

容器

容器的创建删除运行停止

  1. 创建并运行一个容器

    # 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+端口号即可访问

  2. 停止运行

    docker container stop <Name or ID>
    
  3. 查看容器

    #正在运行的容器
    docker container ls
    #全部容器
    docker container ls -a
    

    在这里插入图片描述

    #查看正在运行的容器ID
    docker container ls -q
    #查看所有容器ID
    docker container ls -aq
    

    在这里插入图片描述

  4. 删除容器

    #删除单个容器
    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
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

  5. 后台运行转前台运行

    docker attach <Name or ID>
    

    在这里插入图片描述

  6. 后台运行模式下查看日志

    #只打印一次
    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模式就不能满足要求了。需要使用交互模式。

  1. 直接启动镜像并开启交互模式

    docker container run -it ubuntu sh
    

    -it代表启用交互模式,sh代表可以使用Shell脚本。当你输入玩这个脚本后,Docker就会进入到交互模式。可以使用ls来得到目录下的文件,也可以使用hostname来查看计算机名称。
    可以使用exit退出交互模式,以这种方式开启,执行退出命令后容器也会停止运行。

  2. 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

在这里插入图片描述

镜像的拉取删除

  1. 拉取
docker image pull <ImageName>
  1. 删除
docker image rm <Image ID>
# 批量删除没有使用的容器
docker image prune -a
  1. 查看
#查看镜像列表
docker image ls
#查看镜像具体信息
docker image  inspect <IMAGE ID>

在这里插入图片描述

在这里插入图片描述

镜像的导入导出

  1. 导出

    docker image save ubuntu:latest -o myubuntu.image
    

    解读上面的命令,save是导出/保存的意思,ubuntu:latest是镜像名称+版本号, -o代表输出,myubuntu.image是导出后镜像的名字。

  2. 导入

    docker image load -i <LocalImageName>
    

    在这里插入图片描述

Dockerfile制作镜像

  1. 完成一个dockerfile脚本

    在这里插入图片描述在这里插入图片描述

  2. 通过Dockerfile构建镜像

    docker image build -f /root/docker-test/dockerfile1 -t cyt/cytcentos:1.0 .
    

    在这里插入图片描述
    (注意命令最后是有一个.的)

  3. 运行镜像

    docker run <ImageId or ImageName>
    

    在这里插入图片描述

上传镜像到Dockerhub

  1. 构建镜像

    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>
    
  2. 推送到Dockerhub
    先登录Dockerhub账户

    docker login
    

    接着按照要求输入用户名密码
    然后推送

    docker image push Name[:TAG]
    

    在这里插入图片描述
    在这里插入图片描述

Dockerfile文件详解

FROM

意思是选择一个基础镜像,选择基础镜像有三个原则

  1. 官方镜像优于非官方的镜像;
  2. 固定版本的Tag,而不是每次都使用latest;
  3. 功能满足,选择体积小的镜像;
RUN指令

有多个run指令是尽量都写一个run然后将指令连接
不建议的写法

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y wget
RUN wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz
RUN tar zxf ipinfo_2.0.1_linux_amd64.tar.gz
RUN mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo
RUN rm -rf ipinfo_2.0.1_linux_amd64.tar.gz

在这里插入图片描述

建议的写法

FROM ubuntu:latest
RUN 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文件包时回自动解包

  1. 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.14
    COPY index.js  /app/index.js
    

    构建镜像

    docker image build -f dockerfilecopynode -t hello-copy .
    

    在这里插入图片描述

    启动容器以及node服务

    docker container run -it -p 3000:3000 hello-copy sh
    

    在这里插入图片描述
    访问
    在这里插入图片描述

  2. 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.14
    COPY 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:latest
ENV VERSION=2.0.1
RUN 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:latest
ARG VERSION=2.0.1
RUN 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 .

在这里插入图片描述
两种方式声明变量制作的镜像大小相同
在这里插入图片描述
在这里插入图片描述
不同点

  1. ARG是构建环境 , ENV可带到镜像中
    进入镜像内部查看配置信息时发现,ENV声明的版本信息被带到镜像内部了,而ARG声明没有被带入。

  2. 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:latest
ENV VERSION=2.0.1
RUN 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:latest
ENV VERSION=2.0.1
RUN 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
CMD ["ipinfo","version"]

运行后可以看出也没有进入shell模式,而是直接执行了dockerfile中的cmd命令,打印出版本
在这里插入图片描述

ENTRYPOINT

参考内容:Dockerfile 中 CMD 、RUN 和 ENTRYPOINT的区别和使用时机

  • CMD设置的命令,可以在 docker container run 时传入其它命令,覆盖掉 CMD 的命令,但是ENTRYPOINT所设置的命令时一定会被执行的。
  • ENTRYPOINTCMD 可以联合使用, ENTRYPOINT 设置执行的命令,CMD传递参数。

dockerfilecmd

FROM ubuntu:21.04
CMD ["echo","hello docker"]

dockerentrypoint

FROM ubuntu:21.04
ENTRYPOINT ["echo","hello docker"]

dockerfileboth

FROM ubuntu:21.04
CMD ["dockerfile中的cmd命令"]
ENTRYPOINT [ "echo"]

cmd使用

# 直接启动,应该会看到打印出dockerfile中cmd输出的内容
docker container run --rm -it cysky/demo-cmd
# run时后面加入指令,会覆盖掉dockerfile中的cmd
docker 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 NGINX
VOLUME ["/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 update
apt-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 sh
cd 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 create

networks: # 可选,相当于 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
在这里插入图片描述

  1. 可以在创建容器时添加参数

    docker compose -p sky up -d
    

    在这里插入图片描述
    这种方式创建的容器在列表中不显示,但可以访问到
    在这里插入图片描述

  2. 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:latest
CMD []

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和主机进行通信,也形成了内部局域网。

示例:

  1. 查看主机中的所有网卡

    ip addr
    

    在这里插入图片描述

  2. 运行busybox容器并查看网络信息

    docker container run -it --name busybox01 busybox
    ip addr
    

    在这里插入图片描述

  3. 再查看本机中网卡信息

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

查看本机网卡
在这里插入图片描述
对比发现本机网卡多出一条,两个容器中一条网卡相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运维监控系统PIGOSS BSM 对“实时数据复制”系统的监控管理

前言 随着应用信息化程度的不断深入&#xff0c;长期积累的业务数据变得价值连城。业务数据备份安全是业务连续性的重要保障&#xff1b; 而同时&#xff0c;业务数据也指导成为企业进行业务分析最有价值的科学依据。 所以&#xff0c;人们纷纷为业务系统建设容灾备份系统&…

【性能|优化】TB级flink任务报错分析:Could not compute the container Resource

文章目录一. 问题引入1. 场景描述2. 日志简析二. 初级问题分析与解决1. 问题分析1.1. yarn的调度器设置1.2. 程序设置2. 问题解决三. &#xff08;性能&#xff09;新的问题1. 问题描述2. 理想化的最优方案3. "PlanB"的解决方案四. 反思与迭代一. 问题引入 1. 场景描…

2022年工业与电力物联网技术现状分析

主要内容22年工业与电力物联网技术现状分析10大科技趋势达摩院 2022 十大科技趋势腾讯 融合2022年十大数字科技前沿应用趋势艾瑞咨询 2022年中国科技与IT十大趋势物联网技术物联网架构体系结构简介应用层2022年整体情况物联网平台及相关能力平台2022年整体情况物联网网络2022年…

Python学习:json对象与string相互转换教程

首先要明确&#xff0c;python里有json这个库&#xff0c;但并没有json这个类&#xff0c;所以所谓的json对象本质上就是一个dict&#xff1b;而json这个库&#xff0c;用于实现dict到string、string到dict的互转。 更具体一点&#xff0c;json对象&#xff08;dict&#xff0…

鼠标监视 | 拖拽方块 | Vue

title: 拖拽功能 tags: Vue categories: JavaScript abbrlink: 18a433ce date: 2022-11-26 21:14:19 效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" co…

使用 KubeSphere 部署高可用 RocketMQ 集群

作者&#xff1a;老Z&#xff0c;云原生爱好者&#xff0c;目前专注于云原生运维&#xff0c;KubeSphere Ambassador。 Spring Cloud Alibaba 全家桶之 RocketMQ 是一款典型的分布式架构下的消息中间件产品&#xff0c;使用异步通信方式和发布订阅的消息传输模型。 很多基于 S…

红色荧光染料AF 594活性酯,Alexa Fluor 594 NHS ester,CAS:295348-87-7

一&#xff1a;产品描述 1、名称 英文&#xff1a; AF 594 NHS Ester AF 594 Succinimidyl Ester Alexa Fluor 594 NHS Ester 中文&#xff1a;AF 594活性酯 2、CAS编号&#xff1a;295348-87-7 3、分子式&#xff1a;C39H37N3O13S2 4、分子量&#xff1a;819.85 5、…

【人工智能 机器学习 深度学习】基础选择题1~30题 练习

目录 一、1~10题1.1 题目1.2 答案二、11~20题2.1 题目2.2 答案三、21~30题3.1 题目3.2 答案写在前面:适用于对 人工智能&机器学习&深度学习 进行复习的同学,同时,也可以通过基础题目的练习,加深理解。 一、1~10题 均是先给出10道题目,而后给出 10道题目的答案。 …

(十二)Java算法:桶排序(详细图解)

目录一、前言1.1、概念1.2、算法步骤二、maven依赖三、流程解析3.1、桶编号计算3.2、桶元素排序四、编码实现一、前言 1.1、概念 计数排序&#xff1a;的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序&#xff0c;计数排序要求输入…

SpringCloud全系列知识(2)—— Nacos配置和集群

Nacos配置和集群 一 统一配置管理 Nacos官方文档 1.配置热更新 1.新建配置文件 在Nacos的配置列表中新建一个配置文件。 注意事项&#xff1a; Data ID 命名规则&#xff1a;一般情况下使用使用 “微服务名称运行环境” 作为DataID&#xff0c;后缀名建议使用文件后缀全…

集成一个以官网(微信,QQ,微博)为标准的登录分享功能

Hello&#xff0c;各位老铁&#xff0c;今天要分享的是一个老生常谈的一个功能&#xff0c;也是网上一搜一大片的技术点&#xff0c;没什么技术含量&#xff0c;就是整合一下&#xff0c;提供一下方便&#xff0c;相对于友盟&#xff0c;ShareSdk中夹杂着一些别的功能&#xff…

Python编程 集合

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.集合 1.集合介绍(掌握) 2.集合创建(掌握) 3.添加元素(熟悉) 4.集合…

区域治理杂志区域治理杂志社区域治理编辑部2022年第40期目录

政策 乡村振兴人才发展战略分析 (1) 高庸江 声音《区域治理》投稿&#xff1a;cnqikantg126.com 迈向智能党建&#xff1a;智能媒体在党建工作中的创新运用 (5) 申娟 经验 北京市昌平区节水问题及水资源利用对策研究 (9) 彭聪 重庆市低碳创新政策优化研究 (13) 林芳 …

怎么把Word翻译成中文?建议收藏这些方法

相信不少小伙伴在撰写论文的时候&#xff0c;都有查阅大量的国内外文献吧。有时由于国外文献里面会含有大量的深奥词汇&#xff0c;我们一时半会儿没法马上理解文献的内容。其实我们可以使用软件直接翻译Word文档&#xff0c;那你们知道Word文档怎么翻译吗&#xff1f;有需要对…

【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 与传统的影视行业相比&#xff0c;诞生于移动互联网时代的短视频是个全新行业&#xff0c;它制作方便又容易传播&#xff0c;一出现就成为大街小巷的时髦潮流。 各行各业的人们均可通过短视频展示自己&#xff0c;短小精悍的视频…

网络面试-0x12 UDP和TCP的区别以及应用场景

一、 UDP &#xff08;user datagram protocol&#xff09;用户数据报协议 ①&#xff1a; 一种简单的面向数据报的通讯协议&#xff0c;即&#xff1a;应用层传下来的报文&#xff0c;不合并&#xff0c;不拆分&#xff0c;只是在其上面加上首部后就交给了下面的网络层。无论应…

Github优秀项目-使用Python基于CPM文本自动生成

基于CPM模型的中文文本生成项目,可用于作文、小说、新闻、古诗等中文生成任务。 虽然说开源的,但是实际部署应用的过程中很多小伙伴还遇见了不少的问题,这里我用自己的方式部署应用,如果还没有实现该功能的小伙伴可以跟我一起来操作。 如果有不了解的小伙伴先来看一下实验…

【多目标进化优化】多目标进化算法的收敛性

0 前言 \quad\quad对 MOEAMOEAMOEA 收敛性的研究是 MOEAMOEAMOEA 研究的重要内容&#xff0c;但目前这方面的研究结果比较少。 一个 MOEAMOEAMOEA 的收敛性可以从两个方面考虑&#xff1b;一是有限时间内的收敛&#xff1b;二是当时间趋向于无穷大时的收敛。第一类收敛是最理想…

Kotlin高仿微信-第9篇-单聊-文本

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

麦芽糖-阿奇霉素 maltose-Azithromycin 阿奇霉素-PEG-麦芽糖

麦芽糖-阿奇霉素 maltose-Azithromycin 阿奇霉素-PEG-麦芽糖 中文名称&#xff1a;麦芽糖-阿奇霉素 英文名称&#xff1a;maltose-Azithromycin 别称&#xff1a;阿奇霉素修饰麦芽糖&#xff0c;阿奇霉素-麦芽糖 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c…