Ubuntu中docker部署-----( 在线,离线 )部署------x86架构arm模拟器部署arm版docker

测试说明

本次测试使用环境:

  • 测试方式:win10专业版,在vmware中安装ubuntu22.04版本虚拟机(均为x86架构)
  • 在ubuntu22.04虚拟机中安装x86架构20.10.21版本docker
  • docker中安装22.04版本ubuntu容器
  • 测试arm版本的docker安装aarch64版本的qemu模拟器,并安装aarch64版本ubuntu22.04版本镜像容器

1. docker的安装

1.1 离线安装docker

1.1.1 tgz包离线安装

  1. 下载离线安装包
    使用tgz安装包安装的可以值关注于所要安装的docker的版本,不过需要编写docker.service启动文件
  • 下载地址: https://download.docker.com/linux/static/stable/
    • x86架构:x86_64/ (x86架构的安装包)
    • arm架构:aarch64/ (arm架构的安装包)
  • 这里以安装x86架构docker-20.10.21为例:
    • 进入x86_64/下载文件 docker-20.10.21.tgz
  1. 安装
    • 创建新文件夹 将docker-20.10.21.tgz压缩包复制进去

    • 执行一下命令

      tar zxvf docker-20.10.21.tgz 
      sudo cp docker/* /usr/bin/
      
    • 编写service文件

       (创建配置文件)    sudo vim /etc/systemd/system/docker.service  ------------docker.service 文件内容如下----------------[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1 ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target 
      
    • 启动docker

      sudo chmod +x /etc/systemd/system/docker.service
      sudo systemctl daemon-reload
      sudo systemctl start docker
      sudo systemctl enable docker
      docker --version------------------实操如下---------------------
      [wop@bogon dockeris]$ sudo chmod +x /etc/systemd/system/docker.service
      [wop@bogon dockeris]$ sudo systemctl daemon-reload
      [wop@bogon dockeris]$ sudo systemctl start docker
      [wop@bogon dockeris]$ sudo systemctl enable docker
      Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /etc/systemd/system/docker.service.
      [wop@bogon dockeris]$ docker --version
      Docker version 20.10.21, build baeda1f
      
      • 配置加速器加速下载docker镜像
      sudo vim /etc/docker/daemon.json文件内容
      {"registry-mirrors": ["https://gg3gwnry.mirror.aliyuncs.com"]
      }重启服务:
      sudo systemctl daemon-reload
      sudo systemctl restart docker

1.1.2 deb包离线安装

使用deb安装包的方式安装需要自己确定所安装系统版本所需的deb安装包型号,优点是不用自己编写docker.service

  • 确定linux版本

    cat /etc/lsb-release DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=22.04
    DISTRIB_CODENAME=jammy
    DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS"
    
  • 确定dpkg版本

    sudo dpkg  --print-architectureamd64
    
  • 下载地址

    https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable
    
  • 需要下载以下三个文件

    containerd.io_1.6.9-1_amd64.deb
    docker-ce-cli_20.10.21~3-0~ubuntu-jammy_amd64.deb
    docker-ce_20.10.21~3-0~ubuntu-jammy_amd64.deb
    
  • 安装命令

    sudo dpkg -i containerd.io_1.6.9-1_amd64.deb && apt-get -f install
    sudo dpkg -i docker-ce-cli_20.10.21~3-0~ubuntu-jammy_amd64.deb && apt-get -f install
    sudo dpkg -i docker-ce_20.10.21~3-0~ubuntu-jammy_amd64.deb && apt-get -f install
    
  • 启动docker

    systemctl start docker
    
  • 设置开机自动启动

    systemctl enable docker.service
    

1.2 在线安装docker

1.2.1 官方安装脚本 (推荐使用+方便快捷)

  • 下面以ubuntu系统为例
 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh

1.2.2 手动安装

  • 下面以ubuntu系统为例
  1. 更新软件包列表:使用以下命令更新软件包列表:
sudo apt update
  1. 安装依赖软件包:安装Docker所需的依赖软件包:
    sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common
  1. 添加Docker官方GPG密钥:通过以下命令添加Docker官方的GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 添加Docker官方APT源:添加Docker官方的APT源到Ubuntu的软件包管理器中:
echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 更新软件包列表:再次更新软件包列表以获取Docker:
sudo apt update
  1. 安装Docker引擎:使用以下命令来安装Docker引擎:
sudo apt install docker-ce docker-ce-cli containerd.io
  1. 启动Docker服务:使用以下命令启动Docker服务:
sudo systemctl start docker

至此,已经完成了在线安装Docker的步骤。

1.3 检验docker是否安装成功

要验证Docker是否成功安装,请按照以下步骤执行:

  1. 检查Docker版本:在终端中运行以下命令来检查Docker版本:
docker --version

如果成功安装,将看到Docker的版本信息。

1.4 彻底卸载docker

以下是离线和在线安装Docker的卸载步骤:

在线安装的卸载步骤

  1. 停止Docker服务:使用以下命令停止Docker服务:
sudo systemctl stop docker
  1. 卸载Docker软件包:执行以下命令以卸载Docker软件包:
sudo apt-get autoremove docker docker-ce docker-engine  docker.io  containerd runc
  1. 查看docker是否卸载干净
dpkg -l | grep docker
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P        ## 删除无用的相关的配置文件
  1. 删除没有删除的相关插件
sudo sapt-get autoremove docker-ce-*
  1. 删除docker的相关配置&目录
sudo rm -rf /etc/systemd/system/docker.service.dsudo rm -rf /var/lib/docker
  1. 确定docker卸载完毕
docker --version

离线安装的卸载步骤

  1. 停止Docker服务:执行以下命令停止Docker服务:
sudo systemctl stop docker
  1. 卸载Docker软件包:使用以下命令卸载Docker软件包:
sudo dpkg -r docker-ce
  1. 删除Docker配置和数据:执行以下命令删除Docker的配置文件和数据:
sudo rm -rf /var/lib/docker
  1. 删除Docker用户组(如果没有其他使用该组的进程):使用以下命令删除Docker用户组:
sudo groupdel docker

请注意,在卸载Docker之后,容器、镜像和卷将被删除,并且无法恢复。如果希望保留它们,请先备份。此外,如果在安装过程中使用了不同的方法(如使用脚本或其他自定义方式安装的Docker),卸载步骤可能会有所不同。

1.5 x86下安装arm版docker

1.5.1 安装qemu模拟器

如果想再x86下安装arm版docker,可以借助qemu模拟器模拟arm框架

  1. 获取QEMU
  • 下载地址:https://github.com/multiarch/qemu-user-static/releases
  • 下载网站中: qemu-arm-static:arm架构 , qemu-aarch64-static:aarch64架构
  • 下载: qemu-aarch64-static 文件 (这里以aarch64架构为例)
  1. 安装
sudo cp qemu-aarch64-static /usr/bin/
sudo chmod +x /usr/bin/qemu-aarch64-static
  1. 注册QEMU虚拟机 (每次重启都要重新注册)
sudo docker run --rm --privileged multiarch/qemu-user-static:register

注:安装完qemu的模拟器就可以使用x86版本的docker来安装arm版本的docker镜像,在x86架构下实例化一个arm版本的ubuntu的docker镜像

1.5.2 qemu中安装arm版本ubuntu

注: 安装完qemu的模拟器后确保电脑安装了docker(x86版本)进行一下操作

  1. 在线拉取ubuntu Arm镜像
sudo docker pull arm64v8/ubuntu:22.04

注: 如果是离线的安装ubuntu镜像,请见: 2.2章离线安装ubuntu

  1. 创建Arm容器
   sudo docker run  -it \  --name arm_ub\  -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \  -v /etc/timezone:/etc/timezone:ro \  -v /etc/localtime:/etc/localtime:ro \  arm64v8/ubuntu:22.04 /bin/bash  
  1. 开启这个容器
sudo docker start arm_ub
  1. 进入容器
sudo docker exec -it arm_ub /bin/bash
  1. 测试容器的架构
 uname -m---------返回值为-------------aarch64
  1. 导出容器
sudo docker export arm_ub > arm_ub.tar
  1. 导入容器
sudo docker import arm_ub.tar arm_ub_image

注:这里导入导出容器和 第3章导入导出容器的方式相同

  1. 实例化这个镜像

注: 这里在x86架构下实例化arm架构的容器和直接实例化x86架构的容器不相容需要保证,除指令不同外还需要保证:启动QEMU虚拟机,方法请见: 1.5.1 安装qemu模拟器中 3.注册QEMU虚拟机


sudo docker run -it  --name aaaa -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro  arm_ub_cout  /bin/bash-----------------------如果上面命令有问题运行下面命令---------------------------sudo docker run -it  --name aaaa -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static   arm_ub_cout  /bin/bash
  1. 启动运行容器
sudo docker start aaaasudo docker exec -it aaaa /bin/bash

2. docker安装ubuntu

2.1 在线安装ubuntu

  1. 在线拉取ubuntu镜像
docker pull ubuntu

注:

  1. 运行容器,并且可以通过 exec 命令进入 ubuntu 容器
docker run -itd --name ubuntu-test ubuntu /bin/bash
  1. 启动这个虚拟机
sudo docker exec -it ubuntu-test /bin/bash

2.2 离线安装ubuntu

  1. 从 Docker Hub 或其他镜像仓库下载要导出的 Ubuntu 镜像。可以使用以下命令:

    sudo docker pull ubuntu
    
  2. 导出 Docker 镜像到一个文件中,可以使用以下命令:

    sudo docker save -o ubuntu_image.tar ubuntu
    

    这将把 Ubuntu 镜像保存到 ubuntu_image.tar 文件中。

在没有网络连接的机器上:

  1. ubuntu_image.tar 文件拷贝到没有网络连接的机器上,比如使用 U 盘或其他外部存储设备。

  2. 在没有网络连接的机器上,使用以下命令加载已保存的 Docker 镜像:

    sudo docker load -i ubuntu_image.tar
    

    这将加载 ubuntu_image.tar 文件中的 Docker 镜像到本地 Docker 环境中。

现在,已经将 Ubuntu 镜像成功导入可以在没有网络连接的机器上使用了。请确保文件拷贝过程中保持镜像文件完整性,并确保目标机器上已经安装了 Docker。

需要注意的是,如果有其他依赖项(比如基础镜像或软件包)未被导入的机器上,可能需要手动满足这些依赖关系,以确保镜像的正常运行。

2.21 导入镜像后验证

查看镜像是否存在即ID

wub@wub:~/Downloads$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    01f29b872827   3 weeks ago   77.8MB

然后安装Ubuntu系统

  1. 运行容器,并且可以通过 exec 命令进入 ubuntu 容器
sudo docker run -itd --name docker_ub ubuntu---------
wub@wub:~/Downloads$ sudo docker run -itd --name docker_ub ubuntu
ba84659d5b8e6c3c3ced4f6caf65ff1f6bc5f981028a426955b08bbe50c87676
  1. 启动这个虚拟机
sudo docker exec -it docker_ub /bin/bash---------
wub@wub:~/Downloads$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
ba84659d5b8e   ubuntu    "/bin/bash"   2 minutes ago   Up 2 minutes             docker_ub
wub@wub:~/Downloads$ sudo docker start ba84659d5b8e
ba84659d5b8e
wub@wub:~/Downloads$ sudo docker exec -it docker_ub /bin/bash

3. 导出导入容器

3.1 容器导出

在 Docker 中,可以使用导入(import)和导出(export)操作来迁移和共享容器。

  • 导出容器:使用 docker export 命令将一个正在运行的容器导出为一个可传输的 tar 归档文件。命令格式为 docker export <容器ID或名称> > <输出文件路径>。例如:
sudo docker export mycontainer > mycontainer.tar

这将将容器 mycontainer 导出为 mycontainer.tar 归档文件。导出的文件包含容器的文件系统和元数据,但不包含容器状态或相关的镜像信息。

3.2 容器导入

  • 导入容器:使用 docker import 命令将一个导出的 tar 归档文件导入为一个新的镜像。命令格式为 docker import <输入文件路径> <新镜像名称>:<标签>。例如:
sudo docker import mycontainer.tar aaa

这将导入 mycontainer.tar 归档文件为名为 aaa的新镜像。

  • 可以通过sudo docker images 查看是否有myimage镜像的存在

请注意以下几点:

  • 导出的容器归档文件只包含容器当前的文件系统状态,不包括容器内正在运行的进程、网络配置等状态。
  • 导入后的镜像只包含初始文件系统状态,不包含容器的运行时环境、启动命令等配置。需要在创建容器时自行配置这些信息。
  • 导入导出的操作适用于单个容器,而不是整个容器编排和服务。

如果需要迁移或共享整个应用程序栈,建议使用 Docker Compose 或其他容器编排工具来管理整个应用程序的容器集合。这样可以更方便地管理和迁移整个应用程序。

脑洞

  • docker save和docker export的区别
    docker save保存的是镜像(image),docker export保存的是容器(container);
    docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
    docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
    docker load不能载入容器包。
    docker import虽可以载入镜像包,但是无法启动等价于不能启动改容器

3.3 容器镜像实例化

  • 可以通过sudo docker images 查看是否有 mycontainer.tar包导出的镜像名称如:aaa
wub@wub:~/Downloads$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
aaa          latest    baa55ebfbd94   36 minutes ago   155MB
ubuntu       latest    01f29b872827   3 weeks ago      77.8MB
  • 创建镜像为一个实例容器
sudo docker run -it  --name bbb  aaa  /bin/bash----------------wub@wub:~/Downloads$ sudo docker run -it  --name bbb aaa  /bin/bash
root@e87db5c5413c:/## cd home/docker_test/cout/
root@e87db5c5413c:/home/docker_test/cout## ls
libasan.so.5  libltdl.so.7  libodbc.so.2  libtool_lib_name.a  pro_main
root@e87db5c5413c:/home/docker_test/cout## ./pro_main 
Start tool_class
Hello: 0
Hello: 1
Hello: 2
Hello: 3
^C
root@e87db5c5413c:/home/docker_test/cout## exit
exit
wub@wub:~/Downloads$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                            PORTS                                         NAMES
e87db5c5413c   aaa       "/bin/bash"   31 seconds ago   Exited (130) 3 seconds ago                                                      bbb

3.4 创建容器端口映射

使用 docker run 命令来启动容器并进行端口映射。例如,将容器内部的端口 5000 映射到主机 B 的端口 8081:

sudo docker run -it -p 8081:5000 --name link_ub   ub_sql /bin/bash--------------
wub@wub:~/Downloads$ sudo docker run -it -p 0.0.0.0:8081:5000 --name link_ub   ub_sql /bin/bashroot@e352b1e281f3:/# exitexitwub@wub:~/Downloads$ sudo docker ps -aCONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS                                         NAMESe352b1e281f3   ub_sql    "/bin/bash"   13 seconds ago   Exited (0) 2 seconds ago                                                  link_ube87db5c5413c   aaa       "/bin/bash"   6 hours ago      Up 2 hours                                                                bbbwub@wub:~/Downloads$ sudo docker start e352b1e281f3e352b1e281f3wub@wub:~/Downloads$ sudo docker ps -aCONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS                                         NAMESe352b1e281f3   ub_sql    "/bin/bash"   42 seconds ago   Up 1 second                 0.0.0.0:8081->5000/tcp                        link_ub

数据库密码: Abc.123456

3.4.1 修改容器的端口映射

  1. 查询容器的完整ID

wub@wub:~$ sudo docker inspect silly_utils_1 |grep Id"Id": "e13796630166625b69ee492a2e29176677e3b239668a9b57acdab492d77f917d",
wub@wub:~$ 
  1. 关闭容器和docker
sudo docker stop silly_utils_1
sudo systemctl stop docker.socket 
  1. 进到/var/lib/docker/containers 目录下找到与 Id 相同的目录,修改 hostconfig.json 和 config.v2.json文件:

  2. hostconfig.json文件中添加 "PortBindings": {"8081/tcp": [{"HostIp": "","HostPort": "5001"}],"8085/tcp": [{"HostIp": "","HostPort": "5005"}]},,如下,下面仅hostconfig.json文件部分(8081/tcp:表示容器的端口,“HostPort”: “5001”:表示宿主机的端口)

    "Binds": ["/usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static"],"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {"8081/tcp": [{"HostIp": "","HostPort": "5001"}],"8085/tcp": [{"HostIp": "","HostPort": "5005"}]},"PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},```1. config.v2.json文件中添加`"ExposedPorts": {"8081/tcp": {},"8085/tcp": {}},`,如下,下面仅config.v2.json文件部分  这里的端口为容器的开放端口```json"Managed": false,"Path": "/bin/bash","Args": [],"Config": {"Hostname": "e13796630166","Domainname": "","User": "","AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"ExposedPorts": {"8081/tcp": {},"8082/tcp": {}},"Tty": true,```4. 重启容器和docker```shell
sudo systemctl restart docker.socket 
sudo docker start silly_utils_1wub@wub:~$ sudo docker ps -a
CONTAINER ID   IMAGE                  COMMAND       CREATED          STATUS                        PORTS                NAMES
3f2797b1863c   ubuntu                 "/bin/bash"   35 minutes ago   Exited (0) 35 minutes ago                          aaaa
e13796630166   arm_ub_cout            "/bin/bash"   45 minutes ago   Up 12 seconds                 0.0.0.0:5001->8081/tcp, :::5001->8081/tcp, 0.0.0.0:5005->8085/tcp, :::5005->8085/tcp   silly_utils_1

3.5 容器之间的互通

3.5.1 network连接容器

3.5.1.1 创建网络随机ip地址
  • 新建 Docker 网络
sudo docker network create -d bridge my-net
  • 运行两个容器并加入到 my-net 网络
sudo docker run -it --name nnn --network my-net net /bin/bash
sudo docker run -it --name mmm --network my-net net /bin/bash
  • 验证两个容器是否联通

这里在nnn容器中ping一下mmm容器

root@87df6a3b26b4:/# ping mmm
PING mmm (172.18.0.3) 56(84) bytes of data.
64 bytes from mmm.my-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.160 ms
64 bytes from mmm.my-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.188 ms
64 bytes from mmm.my-net (172.18.0.3): icmp_seq=3 ttl=64 time=0.149 ms

用 ping 来测试连接 mmm 容器,它会解析成 172.18.0.3。

这个网络是docker虚拟出来的一个内部网络

mmm容器可以直接通过172.18.0.3这个IP地址与nnn进行通讯,以链接mysql为例(nnn链接mmm的mysql):

root@87df6a3b26b4:/# mysql -h 172.18.0.3  -P 3306 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.34-0ubuntu0.22.04.1 (Ubuntu)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 
3.5.1.2 创建网络并固定IP地址

在 Docker 中,要为容器固定 IP 地址,并将其添加到网络中,有几种方法可以实现:

  1. 创建一个自定义网络并指定子网范围以及网关地址:
docker network create --subnet=<subnet> --gateway=<gateway> my-network
# 将 `<subnet>` 替换为所需的子网地址和范围(例如,172.18.0.0/16),将 `<gateway>` 替换为所需的网关地址(例如,172.18.0.1)。---------------实例------------------------
sudo docker network create --subnet=188.20.0.0/16 --gateway=188.20.0.1 ip_net
  1. 启动容器时,使用 --network 参数将容器连接到自定义网络,并使用 --ip 参数指定容器的 IP 地址:
docker run -d --network=my-network --ip=<ip_address> --name container1 <image1>
# 将 `<ip_address>` 替换为所需的固定 IP 地址。---------------实例------------------------
sudo  docker run -it --name ip_5 --network=ip_net --ip=188.20.0.5  net /bin/bash
sudo  docker run -it --name ip_6 --network=ip_net --ip=188.20.0.6  net /bin/bash
  1. 验证

# ip_5容器----------------------------------wub@wub:~$ sudo docker exec -it ip_5 /bin/bash
root@40ee057073be:/# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 188.20.0.5  netmask 255.255.0.0  broadcast 188.20.255.255ether 02:42:bc:14:00:05  txqueuelen 0  (Ethernet)RX packets 26  bytes 3116 (3.1 KB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0# ip_6容器----------------------------------wub@wub:~$ sudo docker exec -it ip_6 /bin/bash
[sudo] password for wub: 
root@b8e4e5e8e847:/# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 188.20.0.6  netmask 255.255.0.0  broadcast 188.20.255.255ether 02:42:bc:14:00:06  txqueuelen 0  (Ethernet)RX packets 27  bytes 3180 (3.1 KB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0root@b8e4e5e8e847:/# ping 188.20.0.5
PING 188.20.0.5 (188.20.0.5) 56(84) bytes of data.
64 bytes from 188.20.0.5: icmp_seq=1 ttl=64 time=111 ms
64 bytes from 188.20.0.5: icmp_seq=2 ttl=64 time=0.150 ms
64 bytes from 188.20.0.5: icmp_seq=3 ttl=64 time=0.103 ms

3.5.2 link连接容器

同一台宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口来通信,前者会导致ip址址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip,后都的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进来有限通信。通信docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器

使用–link参数可以让容器之间安全地进行交互

  • 创建两个容器并连接他们
sudo docker run -it --name vvv  net /bin/bashsudo docker start vvv   # 连接的容器必须要启动sudo docker run -it --name ccc --link vvv  net /bin/bash
  • 测试连接
root@5c97110084fa:/# ping vvv
PING vvv (172.17.0.2) 56(84) bytes of data.
64 bytes from vvv (172.17.0.2): icmp_seq=1 ttl=64 time=0.192 ms
64 bytes from vvv (172.17.0.2): icmp_seq=2 ttl=64 time=0.096 ms
64 bytes from vvv (172.17.0.2): icmp_seq=3 ttl=64 time=0.073 ms# -------------------------
# vvv容器连接ccc的数据库
root@6a6d7099b850:/# mysql -h 172.17.0.3  -P 3306 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.34-0ubuntu0.22.04.1 (Ubuntu)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;

3.5.3 绑定宿主机端口连接两个容器

  • 创建两个容器分别绑定宿主机的8086和8085端口
sudo docker run -it -p 8085:3306 --name ppp1  net  /bin/bash
sudo docker run -it -p 8086:3306 --name ppp2  net  /bin/bash
  • 绑定宿主机的8086和8085端口
sudo iptables -A INPUT -p tcp --dport 8085 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 8085 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8086 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 8086 -j ACCEPTsudo ufw allow 8085
sudo ufw allow 8086
  • 测试

    1. 在ppp1中数据库添加一个ppp1的库
mysql> CREATE DATABASE ppp1;
Query OK, 1 row affected (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| aaaa               |
| information_schema |
| mysql              |
| performance_schema |
| ppp1               |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
  1. 在ppp2中访问宿主机的IP地址,端口为ppp2绑定的端口
root@83b1e83476b7:/# mysql -h 172.17.0.1  -P 8085 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.34-0ubuntu0.22.04.1 (Ubuntu)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| aaaa               |
| information_schema |
| mysql              |
| performance_schema |
| ppp1               |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

ubuntu部署vcpkg
sudo apt-get install build-essential tar curl zip unzip
git clone http://192.168.0.60/develop/vcpkg.git
cd vcpkg
chmod 777 bootstrap-vcpkg.sh
./bootstrap-vcpkg.sh

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

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

相关文章

uni-app x生成的安卓包,安装时,提示不兼容。解决方案

找到 manifest.json 进入&#xff1a;源码视图 代码 {"name" : "xxx康养","appid" : "__xxx6","description" : "xxx康养","versionName" : "1.0.12","versionCode" : 100012,&…

sqli-labs靶场详解(less17-less22)

目录 less-17 less-18 less-19 less-20 less-21 less-22 less-17 修改密码关卡 服务器后端 账号密码都存在数据库中 使用UPDATE进行修改密码 尝试username处 尝试好久尝试不出来应该是对用户名进行了过滤 于是对password进行注入 判断注入点 passwdadmin 报错&#xff1a…

有手就会的产品宣传册制作步骤,一定要收藏!

产品宣传册制作就是为了扩大宣传企业产品&#xff0c;让大众了解和认识产品&#xff0c;从而对产品产生信任。但是&#xff0c;制作一本让人满意的产品宣传册并不容易&#xff0c;很多人都觉得很难&#xff0c;尤其是新手小白。 其实&#xff0c;这些都不是问题&#xff0c;只…

滑块验证码之图片距离计算

滑块验证码之图片距离计算 1.使用工具 vscodepython3.8 2.安装opencv-python python -m pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com查看安装的版本&#xff1a; C:\Users\wenhz>pip list|findstr opencv opencv-pyt…

初次尝试http OAuth2验证的请求

第一次对接OAuth2验证的接口&#xff0c; 莫不着门道&#xff0c;后面获取token成功后&#xff0c;发现其实不难&#xff0c; 用postman举例&#xff1a; 其实挺简单。用客户端id秘钥 获取token---》后面的请求带上token 1,在head中增加 Authorization头 内容格式如上图&…

NetApp FAS 统一存储平台,高效地提供数据保护、安全性和可扩展性

为什么选择 NetApp FAS 存储&#xff1f; 同类最佳数据管理&#xff0c;可简化运维 在 NetApp ONTAP 数据管理软件的支持下&#xff0c;我们可以帮助您构建简单、安全且值得信赖的存储基础架构。NetApp FAS 存储阵列可让客户同时兼顾性能和容量。 NetApp FAS 系统经过优化&a…

前端命名规范总结

布局类&#xff1a;header, footer, container, main, content, aside, page, section 包裹类&#xff1a;wrap, inner 区块类&#xff1a;region, block, box 结构类&#xff1a;hd, bd, ft, top, bottom, left, right, middle, col, row, grid, span 列表类&#xff1a;list,…

如何在外远程访问本地NAS威联通QNAP?

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 威联通安装cpolar内网穿透二. 内网穿透2.1 创建隧道2.2 测试公网远程访问 三.…

RK3568 android11 实现GT9xx双路I2C触摸

一&#xff0c;GT911 触摸屏简介 它的接口类型为 I2C &#xff0c;供电电压和通讯电压均为 3.3V 。这款电容触摸屏内置了上拉电阻&#xff0c;这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。关于线序&#xff0c;同样是 GT911 &#xff0c;不同批次的器件都有…

Spring Cloud+Nacos 注册中心详解及开发示例

目录 一、Nacos 的关键特性包括: 二、逻辑架构及其组件介绍 三、Nacos安装 1、版本选择 2、预备环境准备 3、下载源码或者安装包 4、启动服务器 5、关闭服务器 四、如何引入 Nacos Discovery Starter 五、启动一个 Provider 应用 1 pom.xml的配置。一个完整的 pom.xm…

JMeter---BeanShell实现接口前置和后置操作

在JMeter中&#xff0c;可以使用BeanShell脚本来实现接口的前置和后置操作。 下面是使用BeanShell脚本实现接口前置和后置操作的步骤&#xff1a; 1、在测试计划中添加一个BeanShell前置处理器或后置处理器。 右键点击需要添加前置或后置操作的接口请求&#xff0c;选择&quo…

JAXB的XmlValue注解

XmlValue注解用在Java属性、或者方法上。它可以使得映射到XML Schema中的Java类具有一个simpleContent 或者simpleType。 一个Java类中最多只能有一个属性被XmlValue注解。 如果被XmlValue注解的JavaBean属性是Java类中唯一映射到XML的成员&#xff0c;那么该Java类将会被映射…

波奇学C++:C++11的新特性

列表初始化 #include<iostream> using namespace std; struct A {int _x;int _y; }; int main() {// 三种方式等价&#xff0c;并且可以省略int x 1;int y { 2 };int z{ 3 };return 0; } {}按声明顺序初始化类成员变量 A p{ 1,2 }; cout << p._x; //1 cout &…

C语言--每日选择题--Day27

第一题 1. 对于代码段&#xff0c;问下面不可以表示a[1]地址的是&#xff08;&#xff09; int a[10]; A&#xff1a;&a[0] 1 B&#xff1a;a sizeof(int) C&#xff1a;(int*)&a 1 D&#xff1a;(int*)((char*)&a sizeof(int)) 答案及解析 A A&#xff1a;取到…

自定义一个函数返回两个值的两种方法

自定义一个函数返回两个值的两种方法 1.用void 2.用址传递

4D雷达跟踪算法代码实现——预处理

算法设计请参考4D雷达目标检测跟踪算法设计-CSDN博客&#xff0c;这里仅讨论代码实现。 1.坐标转换 坐标转换是将雷达点云从雷达中心点极坐标系转换到车辆后轴中心的直角坐标系&#xff0c;直接使用公式计算 x r*cos(eleφ)*cos(aziθ)OFFSET_X y r*cos(eleφ)*sin(aziθ)OF…

Maven生命周期

Maven生命周期 通过IDEA工具的辅助&#xff0c;能很轻易看见Maven的九种生命周期命令&#xff0c;如下&#xff1a; 双击其中任何一个&#xff0c;都会执行相应的Maven构建动作&#xff0c;为啥IDEA能实现这个功能呢&#xff1f;道理很简单&#xff0c;因为IDEA封装了Maven提供…

Xred木马是什么

xred是非常常见的蠕虫病毒之一&#xff0c;属于AutoRun家族&#xff0c;样本变种极多&#xff0c;使用Dephi编写。 病毒可通过文件分享和U盘、移动硬盘等媒介传播。 最常见的域名就是&#xff1a; xred.mooo.com 一般会访问链接&#xff0c;下载文件&#xff0c;但是网址文件…

neo4j在Linux上安装及使用

1、简介 neo4j安装主要有两个步骤&#xff1a; 环境配置&#xff1a;Java安装工具下载&#xff1a;neo4j安装 2、java 安装 2.1 检查 安装前可以检查下&#xff0c;当前环境是否有Java 查看是否安装&#xff1a;java -version 说明当前环境没有&#xff0c;那么去下载 …

87基于matlab的双卡尔曼滤波算法

基于matlab的双卡尔曼滤波算法。第一步使用了卡尔曼滤波算法&#xff0c;用电池电压来修正SOC&#xff0c;然后将修正后的SOC作为第二个卡尔曼滤波算法的输入&#xff0c;对安时积分法得到的SOC进行修正&#xff0c;最终得到双卡尔曼滤波算法SOC估计值。结合EKF算法和安时积分法…