Docker 搭建部署 仓库的搭建以及网络设置

安装docker

一、关闭防火墙和SELinux

1.1systemctl stop firewalld

1.2setenfoce 0

二、配置内核转发以及网桥过滤

2.1vi /etc/sysctl.d/k8s.conf

root@openeuler system\]# vi /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 vm.swappiness = 0 2.2sysctl -p /etc/sysctl.d/k8s.conf :让文件生效 2.3modprobe br_netfilter:加载模块 若未生效成功 则还需加载下列模块 ![](https://i-blog.csdnimg.cn/direct/5b7245467a5245d98ab0110cc6eb50a4.png) **1. 加载\`br_netfilter\`内核模块:** **执行以下命令加载\`br_netfilter\`内核模块:** **sudo modprobe br_netfilter** **该命令会将\`br_netfilter\`模块加载到内核中,加载成功后,相关的\`proc\`文件通常就会出现。** **2. 设置开机自动加载模块:** **为确保系统重启后\`br_netfilter\`模块依然能正常加载,可以创建一个配置文件让其自动加载。在\`/etc/modules-load.d/\`目录下创建一个新文件,例如\`br_netfilter.conf\`:** **sudo touch /etc/modules-load.d/br_netfilter.conf** **sudo vi /etc/modules-load.d/br_netfilter.conf** **在打开的文件中添加一行内容:** **br_netfilter** **保存并退出文件。这样系统下次启动时就会自动加载\`br_netfilter\`模块。** **sudo sysctl -p /etc/sysctl.d/k8s.conf** 三、启动ipvs: 3.1vi /etc/sysconfig/modules/ipvs.modules 3.2chmod +x /etc/sysconfig/modules/ipvs.modules 3.3bash /etc/sysconfig/modules/ipvs.modules 四、关闭swap分区 临时关闭:swapoff -a 永久关闭:sed -i 's/.\*swap.\*/#\&/' /etc/fstab 五。安装docker 5.1cd /etc/yum.repos.d/ 5.2wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 注释:openEuler 系统在跟换源后需要将/etc/yum.repos.d/kubernetes.repo 中的$release 跟换成 8 打开docker.repo文件 :% s/$release/8/ 5.3yum makecache 5.4yum list docker-ce.x86_64 --showduplicates \| sort -r 5.5yum install docker-ce # 下载 container-selinux 包 https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 可能出现的问题: **虚拟机ping不通外网** (1)进入网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 (2)修改ip地址与默认网关,一定要按照自己的情况修改(没懂的再看一遍第一步),UUID与MAC地址的部分我删掉了(这两个不写好像也会自己生成的,但如果你写了,但是和你的虚拟机不对应的话就会有问题,比如你复制别人的虚拟机,结果没改,就会出错,所以我选择不写) TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=172.20.10.16 # 自定义虚拟机的ip地址,必须与主机在同一网段 NETMASK=255.255.255.0 #设置子网掩码,跟宿主一样 GATEWAY=172.20.10.1 #默认网关,跟宿主一样 DNS1=8.8.8.8 #DNS,跟宿主一样 DNS2=114.114.114.114 (3)保存配置后重启网络,这样配置才能生效 systemctl restart network.service (4)关闭防火墙(我这里是让它永久性关闭) systemctl disable firewalld.service (5)一般这种时候就可以ping百度了,如果没有,好的那恭喜你,继续看第二部分吧 二、坑点排查: (1)修改虚拟机网络配置部分: 打开虚拟网络编辑器: ![](https://i-blog.csdnimg.cn/direct/d58d242f77404f3780a171ebc2350d62.png) 确定VMnet0是否为桥接模式,将桥接模式设定为指定的连接,这里是Intel(R) Wi-Fi 6 AX201 160MHz,应用后关闭。然后再来,编辑虚拟机设置(需要先将虚拟机关机) ![](https://i-blog.csdnimg.cn/direct/5cb84b13fc7a449a9fb7045d536bbcf0.png) ![](https://i-blog.csdnimg.cn/direct/a1ac657446e9400c9fcb9222d23a978c.png) 到这里,虚拟机的配置部分就结束了 (2)如果你复制过别人的虚拟机,那么请将/etc/sysconfig/network-scripts/ifcfg-ens33文件中的UUID和MAC地址删掉,因为这个是每个虚拟机都是唯一对应的,如果不对应那就会出错。 (3)检查虚拟机ip地址是否与主机在同一网段,网关是否相同。 安装docker openEuler安装epel源 问题描述 yum -y install epel-release No match for argument: epel-release Error: Unable to find a match: epel-release rpm -ivh epel-release-9-5.el9.noarch.rpm error: Failed dependencies: redhat-release \>= 9 is needed by epel-release-9-5.el9.noarch 解决方案: vi /etc/yum.repos.d/epel.repo \[epel

name=epel

baseurl=https://repo.huaweicloud.com/epel/7/x86_64/

enabled=1

gpgcheck=0

priority=1

yum clean all

yum makecache

yum repolist enabled

在 OpenEuler 22.03 SP4 上下载 Docker 可以参考以下步骤:

  1. 更新系统:确保系统是最新的,执行命令sudo dnf update -y。
  2. 安装依赖包:安装一些必要的依赖包,执行命令sudo dnf install -y dnf-utils device-mapper-persistent-data lvm2。
  3. 添加 Docker 官方仓库:为确保安装的是官方版本的 Docker,添加官方仓库,执行命令sudo dnf config - manager --add - repo = https://download.docker.com/linux/centos/docker - ce.repo。
  4. 安装 Docker:执行命令sudo dnf install -y docker - ce docker - ce - cli containerd.io
  5. 启动并启用 Docker 服务:安装完成后,启动 Docker 服务并设置为开机自启动,执行命令sudo systemctl start docker和sudo systemctl enable docker。
  6. 验证 Docker 安装:执行命令sudo docker --version,查看 Docker 版本,确保 Docker 已经正确安装并运行。
  7. 为当前用户添加 Docker 权限:默认情况下,只有 root 用户和 docker 组的用户才能运行 Docker 命令。可以将当前用户添加到 docker 组,这样就不需要每次都使用 sudo,执行命令sudo usermod -aG docker $USER。
  8. 测试 Docker:运行一个简单的 Docker 容器来验证一切是否正常,执行命令docker run hello - world。

另外,如果是离线环境安装,可以参考以下步骤6:

  1. 下载 Docker 二进制离线包 :从Docker 官方网站下载适合系统的版本,如docker-27.0.3.tgz,使用命令wget https://download.docker.com/linux/static/stable/x86_64/docker-27.0.3.tgz。
  2. 解压文件:将下载好的 Docker 二进制安装包拷贝到目标系统上,然后使用tar命令解压缩,执行命令tar -zxvf docker-27.0.3.tgz。
  3. 复制文件到指定目录:将解压后的文件移动到系统的标准可执行文件目录中,执行命令cp docker/* /usr/bin/。
  4. 创建 Docker 服务文件:使用systemd来管理 Docker 服务,创建一个名为docker.service的systemd服务文件,位于/usr/lib/systemd/system/目录下,内容如下:

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

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

  1. 启动并启用 Docker 服务:重新加载systemd的配置,执行命令sudo systemctl daemon-reload。启动 Docker 服务,执行命令systemctl start docker。检查 Docker 服务状态,确保其正常运行,执行命令systemctl status docker。设置 Docker 服务开机自启动,执行命令systemctl enable docker。

sudo yum install -y git make

Docker基本配置

仓库用来存放镜像,镜像生成容器,容器是真正运行的业务实例(容器靠镜像,用镜像打开容器,用容器去打开业务)

当本地有镜像的时候,可以用镜像来运行容器,当没有镜像的时候,从仓库(docker pull)拉取镜像,再通过(docker run)来运行镜像,获得容器

二。部署第一个容器

2.1vim /etc/yum.repos.d/docker-ce.repo

2.2yum clean all

2.3 yum makecache

2.4 yum install docker-ce.x86_64

2.5systemctl enable --now docker

2.6检测是否成功

2.7vim /etc/docker/daemon.json:添加加速器

2.8 systemctl restart docker

2.9尝试拉去镜像busybox:

三、镜像的基础命令

1.镜像搜索:docker search 服务名

2.镜像拉取:docker pull 服务

3.内容查看:docker images(内容详细查看:docker image inspect busybox)

4.查看镜像历史信息:docker history busybox

5.如果提前下载了压缩包下载: docker load -i busybox-latest.tar.gz(一次只能导入一个)

6.镜像删除:docker rmi 服务名/服务id

7.镜像保存全部内容: docker save `docker images | awk 'NR>1{print 1 ":" 2}'` -o images.tar.gz

8.镜像删除全部内容:docker rmi `docker images | awk 'NR>1{print 1 ":" 2}'`

8.镜像的还原:docker load -i images.tar.gz

四、容器内运行服务:

1.容器的启动:

方法1:docker run -d --rm --name web1 nginx

-d:后台运行 -i:交互式运行 -t:打开一个终端 --name:指定容器名称 -p:端口映射 --rm:容器停止自动删除容器

--network:指定容器使用的网络

方法2: docker run -d --name test busybox

docker start test

docker exec -it test1=docker attach test1

docker ps -a:查看是否开启

2.容器的停止与删除:先退出exit,在删除docker rm test(容器名)

3.查看网络:docker network ls

五、容器的运行删除

1.查看:

docker ps:查看当前运行容器

docker ps -a:查看所有容器

docker inspect busybux:查看容器运行的详细信息

2.停止与运行:

docker stop busybox:停止容器

docker kill busybox:杀死容器

docker start busybox:开启容器

3.容器的删除:

如果删除暂停的容器:docker rm buxybox

删除正在运行的容器:docker rm -f buxybox

删除所有停止的容器:docker container prune -f

4.开启多个TAG镜像:

1.先启动 一个容器,2.再添加新的容器名

root@openeuler xiaoli\]# docker run -d --name test busybox ![](https://i-blog.csdnimg.cn/direct/32ee829661be4040b547e902e2f1fb4a.png) ![](https://i-blog.csdnimg.cn/direct/e59a9ffb264d45e0967168d4fa5c9c5d.png) 注释:进入新容器的方法:先删除容器,再启动对于的TAG容器 \[root@openeuler xiaoli\]# docker rm test \[root@openeuler xiaoli\]# docker run -it --name test busybox :v1 删除镜像的方法:1.先停止该镜像的容器,2.再删除此容器,3.最后删除该镜像 \[root@openeuler xiaoli\]#docker stop test \[root@openeuler xiaoli\]#docker rm test \[root@openeuler xiaoli\]#docker rmi busybox:v1 六。在docker内运行nginx 1.docker pull nginx:获取nginx镜像 2.docker run -d -p 8080:80 --name mynginx nginx:latest:运行mynginx容器,80为docker内nginx去连接外部的8080端口,-p:指向端口 3.docker exec -it nginx1 /bin/bash:交互式打开nginx1容器界面 4.echo "hello docker nginx" \> /usr/share/nginx/html/index.html:写入内容 5. chmod 644 /usr/share/nginx/html/index.html:修改权限 ![](https://i-blog.csdnimg.cn/direct/885afa0b43074655a7147d8b2bf5c460.png) 一、Docker的构建参数 ![](https://i-blog.csdnimg.cn/direct/eda7e142312345969a86c27817dfd579.png) ![](https://i-blog.csdnimg.cn/direct/b3953fdf81ca497985e97c4d473a865d.png) 注释: 1.对于CMD,如果不想显示,而是使用交互界面:docker run -ti --rm --name test2 busybox:v5 sh 2.对于CMD,一个交互界面只可以使用一个,如果想多次使用CMD,则用ENTRYPOINT进行替换 FROM的基本使用 mkdir /docker cd /docker vi /Dockerfile ![](https://i-blog.csdnimg.cn/direct/cb3a6aaf9b06462d8ff4118339b7a339.png) FROM busybox:这是 Dockerfile 中的一条指令,FROM 用于指定基础镜像,busybox 是一个轻量级的 Linux 工具集镜像,许多 Docker 镜像都会基于它来构建,以此为基础可以在其之上添加额外的功能。 RUN touch /leefile:RUN 指令用于在镜像构建过程中执行命令。touch 是 Linux 系统中用于创建空文件的命令,/leefile 是要创建的文件的路径,这里表示在镜像中创建一个名为 leefile 的空文件。 docker build -t busybox:v3= . (或者使用: \[root@openeuler docker\]# docker build -f /Dockerfile -t busybox:v3 .) docker build 是 Docker 用于构建镜像的命令,-t 选项用于给构建的镜像指定一个标签(tag),busybox:v2 表示镜像的名称为 busybox,版本号为 v2。 docker run -it --rm --name test1 busybox:v3 ![](https://i-blog.csdnimg.cn/direct/59a860e16c4e48c28f1ac1d2721f86bb.png) --rm 选项表示容器停止运行后自动删除容器,避免占用过多磁盘空间。 综上所述,这一系列操作的整体流程是:先创建一个目录,然后在该目录下创建一个 Dockerfile 来定义镜像的构建步骤,接着使用 docker build 命令基于 Dockerfile 构建一个名为 busybox:v2 的镜像,最后使用 docker run 命令基于这个镜像启动一个交互式的容器,并将其命名为 test1,容器停止后会自动删除。 docker history busybox:v2:可以用于查看该镜像版本的信息 COPY的使用 将passwd复制到容器内 1.首先进行文件的复制,copy /etc/passwd /docker 2.vi /docker/Dockerfile1 ![](https://i-blog.csdnimg.cn/direct/8f38865936eb4df3b423296238a3b2e7.png) 3.docker build -f /docker/Dockerfile1 -t busybox:v3 . ![](https://i-blog.csdnimg.cn/direct/a9e4ebebac64430098ea86dd653ef1e4.png) 4.docker run -it --rm --name test1 busybox:v2 ADD和COPY相似,可以进行压缩文件 ![](https://i-blog.csdnimg.cn/direct/dafa9c127c0044fbb67511c7e731f0d5.png) **二、docker内部署centos** **2、拉取指定版本的 CentOS 镜像,这里我们安装指定版本为例(centos7):**$ docker pull centos:centos7 ![](https://i-blog.csdnimg.cn/direct/004cca6140524698bf5dba25f308939a.png) [](https://www.runoob.com/wp-content/uploads/2019/11/docker-centos3.png "  ") **2、查看本地镜像** 3.使用以下命令来查看是否已安装了 centos7: $ docker images [](https://www.runoob.com/wp-content/uploads/2019/11/docker-centos4.png "  ")![](https://i-blog.csdnimg.cn/direct/2789bd0fecb247a1bb2727e2c6498de0.png) **4、运行容器,并且可以通过 exec 命令进入 CentOS 容器。** $ docker run -itd --name centos-test centos:centos7 [](https://www.runoob.com/wp-content/uploads/2019/11/dcoker-centos6.png "  ")![](https://i-blog.csdnimg.cn/direct/7a3bf1c2c04b41c8864e8d9f00ddcad8.png) **5、安装成功** 最后我们可以通过 **docker ps** 命令查看容器的运行信息 [](https://www.runoob.com/wp-content/uploads/2019/11/docker-centos7.png "  ") 三、搭建docker的私有仓库 1. docker pull registry:拉取文件 2. docker run -d -p 5000:5000 --restart=always registry 创建register容器,-p端口5000,--restart=always:这是一个重启策略选项,指定容器在退出后总是自动重启,确保镜像仓库服务能够持续运行 3.docker tag busybox:latest 192.168.142.135:5000/busybox:latest docker tag:用于为镜像添加标签,方便对镜像进行标识和管理。 busybox:latest:是源镜像的名称和标签,这里表示本地的busybox镜像的latest版本。 192.168.142.135:5000/busybox:latest:是目标标签,指定了将本地的busybox:latest镜像标记为可以推送到地址为192.168.142.135、端口为 5000 的本地镜像仓库中的busybox:latest镜像。 4.docker push 192.168.142.135:5000/busybox:latest docker push:用于将本地的镜像推送到指定的镜像仓库。 192.168.142.135:5000/busybox:latest:指定了要推送的镜像的目标地址和名称标签 5.vi /etc/docker/daemon.json ![](https://i-blog.csdnimg.cn/direct/75ebd8575108499ba17446fe09a86cd3.png) 6.测试: ![](https://i-blog.csdnimg.cn/direct/522a2e1b5d4646cd97c35d0cbec33346.png) 注释:register文件在: ![](https://i-blog.csdnimg.cn/direct/18daaea1ad0843cb894477684e3f336c.png) /var/lib/docker/volumes/596362a2e64baa9f6ec55af5497037726c48deedfdcdce7e52c7ebce5e056f39/_data/docker/registry/v2/repositories 当该文件不存在时: **1. 推送镜像到私有仓库** 若仓库为空,你得把镜像推送到该仓库。以下是具体操作步骤: **拉取测试镜像** docker pull busybox **为镜像打标签** docker tag busybox 192.168.251.155:5000/busybox **登录到私有仓库** docker login 192.168.251.155:5000 **推送镜像到私有仓库** docker push 192.168.251.155:5000/busybox **2. 检查镜像推送是否成功** 你可以查看 Docker 守护进程日志,以确认镜像推送是否成功。 journalctl -u docker.service 若日志里有错误信息,要依据错误提示进行排查和修复。 **3. 检查仓库服务状态** 要保证 Docker 私有仓库服务正在运行,并且没有报错。你可以通过以下命令来检查服务状态: systemctl status docker-registry # 假设使用 systemd 管理 若服务未运行,可使用下面的命令启动: systemctl start docker-registry 拓展:私有仓库直接存入,风险太大,需要进行加密保证安全性: 1.mkdir certs:创建用于存储共公私钥的目录 2.openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/jiami.org.key -addext "subjectAltName =DNS:reg.jiami.org" -x509 -days 365 -out certs/jiami.org.crt 注释:使用openssl req生成一个4096位的私钥,采用sha256哈希算法最终将私钥存储与certs/jiami.org.key文件内,指定解析后,生成-x509证书,最终将证书保存于后续文件 3. \[root@openeuler \~\]# docker run -d -p 443:443 --restart=always -v /root/certs:/certs \\ \> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \\ \> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/jiami.org.crt \\ \> -e REGISTRY_HTTP_TLS_KEY=/certs/jiami.org.key \\ \> registry:latest 注释:-v /root/certs:/certs,-v表挂载,将主机上的/root/cets挂载于容器内的certs,-e表设置环境变量,设置端口,证书和私钥 ![](https://i-blog.csdnimg.cn/direct/a3b9724a073a4564a8b5a39b4a3dd57b.png) 4. mkdir -p /etc/docker/certs.d/reg.jiami.org:创建一个docker子目录用于存储证书 5.cp /root/certs/jiami.org.crt /etc/docker/certs.d/reg.jiami.org/ca.crt:将证书复制于文件 6.systemctl restart docker 7.docker tag nginx:v1 reg.jiami.org/nginx:v1:打标签 8.docker push reg.jiami.org/nginx:v1:进行推送 ![](https://i-blog.csdnimg.cn/direct/aca6f81c197d464d98624ced679c543f.png) 当你执行 docker push 命令时遇到 remote error: tls: unrecognized name 错误,这通常是由于 TLS(传输层安全协议)握手过程中,服务器无法识别客户端请求中的主机名造成的。以下是可能的原因及对应的解决办法:![](https://i-blog.csdnimg.cn/direct/4038eee9ecb54822b301aa96fce01c8d.png) ![](https://i-blog.csdnimg.cn/direct/a9c9888bfb694108b5a4422d797ca7ca.png) systemctl restart docker **四。为仓库建立登陆认证:(前提创建好私钥和证书)** 1.yum install httpd-tools:下载登陆工具 2.mkdir auth 3. htpasswd -Bc auth/.htpasswd lee:为目录创建密码和用户lee ![](https://i-blog.csdnimg.cn/direct/2765179b270340e582884c6913b63c9a.png) 四、为仓库建立登陆认证:(前提创建好私钥和证书) 1.yum install httpd-tools:下载登陆工具 2.mkdir auth 3. htpasswd -Bc auth/.htpasswd lee:为目录创建密码和用户lee 注释:再次添加密码和用户不需要添加c,只要-B 4. \[root@openeuler xiaoli\]# docker run -d \\ \> -p 5001:443 \\ \> --restart=always \\ \> -v /root/certs:/certs \\ \> -e REGISTRY_HTTP_AD DR=0.0.0.0:443 \\ \> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/jiami.org.crt \\ \> -e REGISTRY_HTTP_TLS_KEY=/certs/jiami.org.key \\ \> -v /root/auth:/auth \\ \> -e REGISTRY_AUTH=htpasswd \\ \> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \\ \> -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/.htpasswd" \\ \> -e REGISTRY_HTTP_SECRET=$(openssl rand -hex 32) \\ \> registry ![](https://i-blog.csdnimg.cn/direct/87634b1523974199a49d0da09cec449e.png) 注释:必须拥有此文件,提供http加密 注释:在以后上传任何东西前,必须进行登陆:docker login reg.jiami.org,否则无法上床内容于私有仓库 **使用lsof命令**:lsof(list open files)工具可以列出当前系统打开的文件和进程信息,也能用于查看占用端口的进程。执行以下命令: lsof -i :443 kill PID -------------------------------------------------------------------------- 五、搭建一个Harbor仓库 wget -c https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz * **安装 Docker Compose**: curl -L "https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose **2. 下载 Harbor** 从 Harbor 的官方 GitHub 仓库下载最新的离线安装包,例如: wget https://github.com/goharbor/harbor/releases/download/v2.8.3/harbor-offline-installer-v2.8.3.tgz 下载完成后,解压安装包: tar xvf harbor-offline-installer-v2.8.3.tgz cd harbor 一、网络的模式 查看网络:docker network ls 1.bridge模式:容器没有一个共有ip,只有宿主机可以直接访问,外部主机是不可见的,容器通过宿主机的NAT规则可以访问外网(--network=bridge),bridge的主机通过容器的docker0口和外主机eth0的ip进行连接,先将ip映射到docker的ip,在通过eth0的ip进行访问外网 2.host模式:可以让容器共享宿主机的网络栈,这样的好处是外部主机于容器直接通信,但是有的容器的网络缺少隔离性(--network=host) 3.none模式:没有ip 拓展:有源生网络为什么还要使用自定义网络? 源生的桥接网络中没有DNS插件,不能做解析,自定义网络,在创建后具有DNS解析ping其他容器名,因为源生桥接下ip在断开连接后,会发生变化进行变换,使用ping容器名更加稳定 自定义网络的创建方法:(同一台主机上,两个容器使用一样的自定义网络) docker network create mynet1 -d bridge:自定义网络,为桥接 docker run -it --name test1 --network mynet1 busybox docker run -it --name test2 --network mynet1 busybox 再用test1去ping test2即可ping通 ![](https://i-blog.csdnimg.cn/direct/474825b439b146d597dcaf6e4c3133a6.png) **二。相同主机,不同容器,不同网卡之间的通信** 1.主机1建立两个自定义网络(从而让两个自定义网卡的ip处于不同网卡) ![](https://i-blog.csdnimg.cn/direct/b41d6249fa734e87b9fc1bcb85d684c7.png) 2.同一个创建两个容器(拥有不同的自定义网络) docker run -it --name demo1 --network mynet1 busybox docker run -it --name demo2 --network mynet2 busybox 3.将第一块网卡给demo2,让demo2拥有两块网卡 **将 demo2 容器连接到 mynet1 网络** docker network connect mynet1 demo2 ![](https://i-blog.csdnimg.cn/direct/8f10e60e18144393ab93667beb60880e.png) 4.test1容器ping test2容器 docker stop demo2 docker rm demo2 docker run -it --name demo1 --network mynet1 busybox ![](https://i-blog.csdnimg.cn/direct/7844e1595c77495887b3ec6fe19d38ed.png) 三、不同主机之间的容器互通 **macvlan 网络方式** * Linux kernel 提供的一种网卡虚拟化技术。 * 无需 Linux bridge,直接使用物理接口,性能极好。 * 容器的接口直接与主机网卡连接,无需 NAT 或端口映射。 * macvlan 会独占主机网卡,但可以使用 vlans 子接口实现多 macvlan 网络。 * vlan 可以将物理二层网络划分为 4094 个逻辑网络,彼此隔离,vlan id 取值为 1 - 4094。 **macvlan 网络间的隔离和连通** * macvlan 网络在二层上是隔离的,所以不同 macvlan 网络的容器是不能通信的。 * 可以在三层上通过网关将 macvlan 网络连通起来。 * docker 本身不做任何限制,像传统 vlan 网络那样管理即可。 1.添加两块网卡 ![](https://i-blog.csdnimg.cn/direct/c5d50ac651694bf088fa045b01a576db.png) _______________________________________________________- 2.打开混杂模式:(两台主机间均开通混杂模式) ip link set ens224 promisc on ip link set up ens224 3.创建自定义网络:(两台主机配置一样的步骤) docker network create -d macvlan --subnet 4.4.4.0/24 --gateway 4.4.4.4 -o parent=ens224 mynet1(设定模式为macvlan,网段,弯管以及指定的配置和名称) 删除网络:docker network rm 网络名 4.不同主机上创建相同容器 docker run -it --rm --name test1 --network mynet1 --ip 4.4.4.1 busybox docker run -it --rm --name test1 --network mynet1 --ip 4.4.4.2 busybox ![](https://i-blog.csdnimg.cn/direct/effdf92ba1204bf3acd38dfe91c962e6.png) 5.进行测试: ![](https://i-blog.csdnimg.cn/direct/69053604d6584b93bcacbcf95d371baa.png) docker pull mysql:latest ![](https://i-blog.csdnimg.cn/direct/bcbee34acccc488d809f4a700b24c1e1.png) docker pull phpmyadmin/phpmyadmin:latest ![](https://i-blog.csdnimg.cn/direct/e2e571fbd09c4fe4ad72a1d748143aef.png) -docker stop mysql -docker rm mysql docker run -d --name mysql --network mynet1 mysql:latest -e MYSQL_ROOT_PASSWD='lee' --network container:mysqladmin docker run -d --name mysqladmin1 --network mynet1 phpmyadmin:latest -e PMA_ARBITRARY=1 -p 80:80 phpmyadmin:latest ![](https://i-blog.csdnimg.cn/direct/f02ed0c5a21a4eeb80ed9e3a3926b2e1.png) **登录 MySQL 容器** 1. 打开终端,通过 SSH 连接到部署容器的服务器。 2. 执行docker exec -it mysql bash(mysql是 MySQL 容器名)进入 MySQL 容器内部。 3. 在容器内执行mysql -uroot -p ,输入密码lee即可登录到 MySQL 数据库。 4. docker run -d --name mysql --network mynet1 -e MYSQL_ROOT_PASSWORD='lee' mysql:latest \[root@openeuler xiaoli\]# docker exec -it mysql bash bash-5.1# mysql -u root -p ![](https://i-blog.csdnimg.cn/direct/1af7015432da43e8a35e1793efc72aa2.png) docker run -d --name mysqladmin1 --network mynet1 -e PMA_ARBITRARY=1 -p 8080:80 phpmyadmin:latest http://192.168.251.155:8080 ![](https://i-blog.csdnimg.cn/direct/39ac3fb00a0d4c759818ec27a3aab081.png) 服务器:mysql 用户名:root 密码:lee ![](https://i-blog.csdnimg.cn/direct/90b78d605b3b422da82472e2ae3531b9.png) **五。容器内外网之间的访问** ![](https://i-blog.csdnimg.cn/direct/6f0bf168e6434dd096e2eb0d83042cab.png) 在rhel 7 中,docker访问外网是通过iptables添加地址伪装策略来完成容器访问外网 在rhel7之后的版本中通过nftables添加地址伪装来访问外网 容器访问外网:通过iptables的[nat](https://so.csdn.net/so/search?q=nat&spm=1001.2101.3001.7020 "nat")模式即可访问外网 ![](https://i-blog.csdnimg.cn/direct/5ca9f97f17db480c92f2491eb1cb8263.png) 端口映射 -p 本机端口来暴漏端口从而达到访问效果 外网访问容器网:可以通过iptables的nat进行访问内网,还可以通过docker-proxy进行访问 __

相关推荐
行者Sun19893 分钟前
【Docker】Dockerfile 优化工具 hadolint
运维·docker·容器
树下一少年1 小时前
docker-compose部署prometheus+grafana+node_exporter
docker·json·grafana·prometheus·node_exporter
白夜易寒2 小时前
Docker学习之服务编排(day9)
学习·docker·eureka
谢平康7 小时前
docker 镜像下载的另一种方式
运维·docker·容器
空气力学先驱11 小时前
自顶向下学习K8S--部署Agones
docker·云原生·容器·kubernetes·go
coding随想12 小时前
macOS (M1 Pro) 上 Docker Desktop 安装失败问题及其解决方案
macos·docker·容器
Yang三少喜欢撸铁13 小时前
【10分钟掌握Docker、k8s的基础命令】
运维·docker·容器·kubernetes·k8s
悟空和大王15 小时前
docker安装jenkins与docker 容器时区和时间同步问题
docker
kill bert18 小时前
第30周Java分布式入门 docker
java·分布式·docker
羊城迷鹿19 小时前
软链接解决docker中的conda路径错误:ModuleNotFoundError: No module named ‘Cpython‘
docker·容器·conda·路径