Docker原理及实例

news2024/12/24 7:32:36

目录

一 Docker简介及部署方法

1.1 Docker简介

1.1.1 什么是docker?

1.1.2 docker在企业中的应用场景

1.1.3 docker与虚拟化的对比

1.1.4 docker的优势

2 部署docker

2.1 容器工作方法

2.2 部署第一个容器

2.2.1 配置软件仓库

2.2.2 安装docker-ce并启动服务

2.2.3 激活内核网络选项

2.3 通过压缩包安装

三 Docker的基本操作

3.1 Docker镜像管理

3.1.1 搜索镜像

四 docker镜像构建

4.1 docker镜像结构

4.2 镜像运行的基本原理

4.3 镜像获得方式

4.4 镜像构建

4.4.1 构建参数

4.4.2 Dockerfile实例

​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑

4.5 镜像优化方案

4.5.1 镜像优化策略

4.5.2 镜像优化示例

4.5.2.1 方法1.缩减镜像层

4.5.2.2 方法2.多阶段构建

4.5.2.3 方法3.使用最精简镜像

五 docker 镜像仓库的管理

5.1 什么是docker仓库

5.2 docker hub

5.2.1 docker hub的使用方法

5.3 docker仓库的工作原理

5.3.1 pull原理

5.3.2 push原理

5.3 搭建docker的私有仓库

5.3.1 为什么搭建私有仓库

5.3.2 搭建简单的Registry仓库

5.3.3 为Registry提加密传输

5.3.4 为仓库建立登陆认证

5.4 构建企业级私有仓库

5.4.1 部署harbor

5.4.2 管理仓库

六 Docker 网络

6.1 docker原生bridge网路

6.2 docker原生网络host

6.3 docker 原生网络none

6.4 docker的自定义网络

6.4.1 自定义桥接网络

6.4.2 为什么要自定义桥接

6.4.3 如何让不同的自定义网络互通?

6.4.4 joined容器网络

6.4.5 joined网络示例演示


一 Docker简介及部署方法

1.1 Docker简介

2008 年LXC(LinuX Contiainer)发布,但是没有行业标准,兼容性非常差 docker2013年首次发布,由Docker, Inc开发

1.1.1 什么是docker?

Docker是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术

它具有以下几个重要特点和优势:

1. 轻量级虚拟化 :

        Docker 容器相较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省系统资源。

        例如,启动一个 Docker 容器可能只需要几秒钟,而启动一个虚拟机则可能需要几分钟。

2. 一致性 :

        确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。 无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。

3. 可移植性 :

        可以轻松地将 Docker 容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差 异。 比如,在本地开发的容器可以无缝部署到云服务器上。

4. 高效的资源利用:

        多个 Docker 容器可以共享主机的操作系统内核,从而更有效地利用系统资 源。

5. 易于部署和扩展:

        能够快速部署新的应用实例,并且可以根据需求轻松地进行水平扩展。 总之,Docker 极大地简化了应用程序的开发、部署和管理流程,提高了开发效率和运维的便利性。 它在现代软件开发和云计算领域得到了广泛的应用。

1.1.2 docker在企业中的应用场景

  • 在企业中docker作为业务的最小载体而被广泛应用
  • 通过docker企业可以更效率的部署应用并更节省资源

注意!!!!:

IaaS(Infrastructure as a Service),即基础设施即服务

PaaS是(Platform as a Service)即指平台即服务

SaaS(Software as a Service)软件运营服务是

1.1.3 docker与虚拟化的对比

虚拟机docker容器
操作系统宿主机上运行虚拟机OS共享宿主机OS
存储镜像较大(GB镜像小(MB)
性能操作系统额外的cpu、内存消耗几乎无性能损耗
移植性笨重、与虚拟化技术耦合度高轻量、灵活迁移
隔离性完全隔离安全隔离
部署慢、分钟级快速、秒级
运行密度一般几十个单机支持上千容器

1.1.4 docker的优势

  • 对于开发人员:Build once、Run anywhere。
  • 对于运维人员:Configure once、Run anything
  • 容器技术大大提升了IT人员的幸福指数!

2 部署docker

2.1 容器工作方法

2.2 部署第一个容器

官方站点: https://docs.docker.com/

实验准备:

主机名IP
docker-node1172.25.254.100

由于无法拉取镜像,这个博客所以的实验用到的镜像都是提前从压缩包里准备好了的 

2.2.1 配置软件仓库

[root@docker-node1 ~]# cd /etc/yum.repos.d
[root@docker-node1 yum.repos.d]# vim docker.repo
 [docker]
 name=docker-ce
 baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker
ce/linux/centos/7/x86_64/stable/
 gpgcheck=0
 [centos]
 name=extras
 baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/extras/x86_64
 gpgcheck=0

2.2.2 安装docker-ce并启动服务

#安装docker
[root@docker-node1 ~]# yum install -y docker-ce 

#编辑docker启动文件,设定其使用iptables的网络设定方式,默认使用nftables
[root@docker-node1 ~]# vim /usr/lib/systemd/system/docker.service
 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
[root@docker-node1 ~]# systemctl  enable --now docker
[root@docker-node1 ~]# docker info

2.2.3 激活内核网络选项

#在rhel7中 需要
[root@docker-node1 ~]# vim /etc/sysctl.d/docker.conf
 net.bridge.bridge-nf-call-iptables = 1
 net.bridge.bridge-nf-call-ip6tables = 1
 net.ipv4.ip_forward = 1
[root@docker-node1 ~]# sysctl --system
[root@docker-node1 ~]# systemctl  restart docker

2.3 通过压缩包安装

#解压压缩包,并安装rpm包
[root@docker-node1 ~]# tar zxf docker.tar.gz 
[root@docker-node1 ~]# yum install *.rpm -y

#启动docker
[root@docker-node1 ~]# systemctl  enable --now docker
[root@docker-node1 ~]# systemctl  restart docker
[root@docker-node1 ~]# docker info


#将压缩包加载到本地的 Docker 环境中以供使用。
[root@docker-node1 ~]# docker load -i game2048.tar.gz
[root@docker-node1 ~]# docker load -i mario.tar.gz
[root@docker-node1 ~]# docker load -i nginx-latest.tar.gz
[root@docker-node1 ~]# docker load -i busybox-latest.tar.gz

#查看是否加载成功
[root@docker-node1 ~]# docker images

#运行测试是否成功
[root@docker-node1 ~]# docker run -d --rm --name webserver -p 80:80 nginx
[root@docker-node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
dce64a796306   nginx     "/docker-entrypoint.…"   22 seconds ago   Up 22 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   webserver

[root@docker-node1 ~]# docker rm -f webserver
webserver
[root@docker-node1 ~]# docker ps

三 Docker的基本操作

3.1 Docker镜像管理

3.1.1 搜索镜像

四 docker镜像构建

4.1 docker镜像结构

  • 共享宿主机的kernel
  • base镜像提供的是最小的Linux发行版
  • 同一docker主机支持运行多种Linux发行版
  • 采用分层结构的最大好处是:共享资源

4.2 镜像运行的基本原理

  • Copy-on-Write 可写容器层
  • 容器层以下所有镜像层都是只读的
  • docker从上往下依次查找文件
  • 容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
  • 一个镜像最多127层

4.3 镜像获得方式

  • 基本镜像通常由软件官方提供
  • 企业镜像可以用官方镜像+Dockerfile来生成
  • 系统关于镜像的获取动作有两种:
    • docker pull 镜像地址
    • docker load –i 本地镜像包

4.4 镜像构建

4.4.1 构建参数

参数意思
FROM指定base镜像 eg:FROM busybox:version
COPY复制文件 eg:COPY file /file 或者 COPY [“file”,”/”]
MAINTAINER指定作者信息,比如邮箱 eg:MAINTAINER user@example.com 在最新版的docker中用LABEL KEY="VALUE"代替
ADD功能和copy相似,指定压缩文件或url eg: ADD test.tar /mnt 或者 eg:ADD http://ip/test.tar /mnt
ENV指定环境变量 eg:ENV FILENAME test
EXPOSE暴漏容器端口 eg:EXPOSE 80
VOLUME申明数据卷,通常指数据挂载点 eg:VOLUME [“/var/www/html”]
WORKDIR切换路径 eg:WORKDIR /mnt
RUN在容器中运行的指令 eg: touch file
CMD在启动容器时自动运行动作可以被覆盖 eg:CMD echo $FILENAME 会调用 shell解析 eg:CMD [“/bin/sh”,”-c”,“echo $FILENAME”] 不调用shell解析
ENTRYPOINT和CMD功能和用法类似,但动作不可被覆盖

参数示例及用法

#FROM COPY 和MAINTAINER
 [root@Docker-node1 ~]# mkdir  docker/
 [root@Docker-node1 ~]# cd docker/
 [root@Docker-node1 docker]# touch leefile
 [root@Docker-node1 docker]# vim Dockerfile 
FROM busybox:latest              #指定使用的基础镜像
MAINTAINER admin@test.org        #指定作者信息
COPY testfile /                  #复制当前目录文件到容器指定位置,testfile必须在当前目录中


[root@Docker-node1 docker]# docker build -t example:v1 .    

#ADD
 [root@Docker-node1 docker]# touch leefile{1..3}
 [root@Docker-node1 docker]# tar zcf leefile.gz leefile*
 [root@Docker-node1 docker]# vim Dockerfile
 FROM busybox
 MAINTAINER admin@test.org
 COPY leefile /
 ADD leefile.gz /

[root@Docker-node1 docker]# docker build -t example:v2 .
[root@Docker-node1 docker]# docker run -it --rm --name test example:v2
 / # ls

#ENV CMD
 FROM busybox
 MAINTAINER admin@test.org
 ENV NAME test
 CMD echo $NAME
 [root@Docker-node1 docker]# docker run -it --rm --name test example:v3
 test


 FROM busybox
 MAINTAINER admin@test.org
 ENV NAME test
 CMD ["/bin/echo", "$NAME"]
 [root@Docker-node1 docker]# docker run -it --rm --name test example:v3
 $NAME


 #ENV CMD
 FROM busybox
 MAINTAINER admin@test.org
 ENV NAME test
 CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
 [root@Docker-node1 docker]# docker run -it --rm --name test example:v3
 test


 #ENTRYPOINT
 FROM busybox
 MAINTAINER admin@test.org
 ENV NAME test
 ENTRYPOINT echo $NAME
 [root@Docker-node1 docker]# docker run -it --rm --name test example:v3  sh
 test
 
#EXPOSE VOLUME VOLUME
 FROM busybox
 MAINTAINER admin@test.org
 ENV NAME test
 EXPOSE 80 443
 VOLUME /var/www/html
 WORKDIR /var/www/html
 RUN touch leefile
 

[root@Docker-node1 docker]# docker build -t example:v4 .
 [root@Docker-node1 docker]# docker run -it --rm --name test example:v4
 /var/www/html #

4.4.2 Dockerfile实例

建立centos7

准备工作:虚拟机需要两个CD/DVD,一个是rhel9.4,另外一个是rhel7.9

#将centos7加载到本地的 Docker 环境中以供使用
[root@docker-node2 ~]# docker load -i /mnt/centos-7.tar.gz 
174f56854903: Loading layer  211.7MB/211.7MB
Loaded image: centos:7
[root@docker-node2 ~]# cd docker/
[root@docker-node2 docker]# mv /mnt/nginx-1.26.1.tar.gz .
[root@docker-node2 docker]# ls
Dockerfile  nginx-1.26.1.tar.gz  

#配置文件
[root@docker-node1 docker]# vim Dockerfile 
FROM centos:repo
LABEL Mail=admin@test.com
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y
RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
RUN make 
RUN make install
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off"]

[root@docker-node2 docker]#  docker build -t webserver:v1 .


#配置HTTP和挂载
[root@docker-node1 docker]# yum install httpd -y
[root@docker-node1 docker]# vim /etc/httpd/conf/httpd.conf 
[root@docker-node1 docker]# systemctl restart httpd
[root@docker-node1 docker]# mkdir /var/www/html/rhel7.9
[root@docker-node1 docker]# mount /dev/sr1 /var/www/html/rhel7.9/
mount: /var/www/html/rhel7.9: WARNING: source write-protected, mounted read-only.


#查看容器的网络(一定要启动容器才能看到网络)
[root@docker-node1 docker]# docker run -it --name centos centos:7
[root@7d4c2668f09e /]# 

[root@docker-node1 docker]# docker inspect centos


#配置仓库
[root@docker-node1 docker]# docker run -it --name centos centos:7
[root@34b2ac427894 /]# cd /etc/yum.repos.d/
[root@34b2ac427894 yum.repos.d]# rm -rf *
[root@34b2ac427894 yum.repos.d]# vi centos7.repo
[centos7]
name=centos7
baseurl=http://172.17.0.1:8888/rhel7.9
gpgcheck=0

[root@docker-node1 yum.repos.d]# docker commit -m "add repo" centos centos:repo
sha256:3e761d58fcc47abfa2a55eaab9d0be9ba22a0e734063f99d4491b0d198f45e97
[root@docker-node1 yum.repos.d]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
centos               repo      3e761d58fcc4   4 seconds ago   204MB
nginx                latest    5ef79149e0ec   12 days ago     188MB
busybox              latest    65ad0d468eb1   15 months ago   4.26MB
centos               7         eeb6ee3f44bd   2 years ago     204MB
timinglee/game2048   latest    19299002fdbe   7 years ago     55.5MB
timinglee/mario      latest    9a35a9e43e8c   8 years ago     198MB

[root@65b4c98291a5 yum.repos.d]# exit
exit
[root@docker-node1 docker]# docker rm centos
centos

[root@docker-node1 docker]# docker build -t webserver:v1 .
[+] Building 28.6s (12/12) FINISHED                                      docker:default
 => [internal] load build definition from Dockerfile                               0.0s
 => => transferring dockerfile: 414B                                               0.0s
 => [internal] load metadata for docker.io/library/centos:repo                     0.0s
 => [internal] load .dockerignore                                                  0.0s
 => => transferring context: 2B                                                    0.0s
 => [internal] load build context                                                  0.0s
 => => transferring context: 1.25MB                                                0.0s
 => [1/7] FROM docker.io/library/centos:repo                                       0.0s
 => [2/7] ADD nginx-1.26.1.tar.gz /mnt                                             0.2s
 => [3/7] WORKDIR /mnt/nginx-1.26.1                                                0.0s
 => [4/7] RUN yum install gcc make pcre-devel openssl-devel -y                     4.4s
 => [5/7] RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with  5.0s 
 => [6/7] RUN make                                                                18.3s 
 => [7/7] RUN make install                                                         0.2s 
 => exporting to image                                                             0.4s 
 => => exporting layers                                                            0.4s 
 => => writing image sha256:5d2d60fd89872faf40a66c168ff9b3c990d3dd0b9fa30c75f84f4  0.0s 
 => => naming to docker.io/library/webserver:v1                                    0.0s

4.5 镜像优化方案

4.5.1 镜像优化策略

  • 选择最精简的基础镜像
  • 减少镜像的层数
  • 清理镜像构建的中间产物
  • 选择最精简的基础镜像
  • 减少镜像的层数
  • 清理镜像构建的中间产物

4.5.2 镜像优化示例

4.5.2.1 方法1.缩减镜像层
[root@node1 docker]# vim Dockerfile 
FROM centos:repo
LABEL Mail=admin@test.com
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && make && make install && rm -rf /mnt/nginx.1.26.1 && yum clean all
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off"]

[root@node1 docker]# docker build -t webserver:v1 .

[root@node1 docker]# docker images
REPOSITORY                        TAG       IMAGE ID       CREATED          SIZE
webserver                         v3        cc71beda411e   13 minutes ago   34.5MB
webserver                         v2        43eba985f5db   42 minutes ago   210MB
webserver                         v1        b3309248e2bf   47 minutes ago   313MB
<none>                            <none>    f2afa136ea2d   52 minutes ago   356MB
centos                            repo      a732bd43ba9b   53 minutes ago   204MB
nginx                             latest    5ef79149e0ec   2 weeks ago      188MB
nginx                             1.23      a7be6198544f   15 months ago    142MB
centos                            7         eeb6ee3f44bd   2 years ago      204MB
gcr.io/distroless/base-debian11   latest    2a6de77407bf   N/A              20.6MB

4.5.2.2 方法2.多阶段构建
[root@node1 docker]# vim Dockerfile 
FROM centos:repo AS build
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && make && make install && rm -rf /mnt/nginx.1.26.1 && yum clean all

FROM centos:repo
LABEL Mail=admin@test.com
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

[root@node1 docker]# docker build -t webserver:v2 . 

[root@node1 docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
webserver    v2        43eba985f5db   3 minutes ago    210MB
webserver    v1        f2afa136ea2d   13 minutes ago   356MB
centos       repo      a732bd43ba9b   14 minutes ago   204MB
nginx        latest    5ef79149e0ec   2 weeks ago      188MB
centos       7         eeb6ee3f44bd   2 years ago      204MB

4.5.2.3 方法3.使用最精简镜像

使用google提供的最精简镜像

下载地址: https://github.com/GoogleContainerTools/distroless

下载镜像: docker pull gcr.io/distroless/base

[root@node1 docker]# vim Dockerfile 
FROM nginx:1.23 AS base
 ARG TIME_ZONE
 RUN mkdir -p /opt/var/cache/nginx && \
 cp -a --parents /usr/lib/nginx /opt && \
 cp -a --parents /usr/share/nginx /opt && \
 cp -a --parents /var/log/nginx /opt && \
 cp -aL --parents /var/run /opt && \
 cp -a --parents /etc/nginx /opt && \
 cp -a --parents /etc/passwd /opt && \
 cp -a --parents /etc/group /opt && \
 cp -a --parents /usr/sbin/nginx /opt && \
 cp -a --parents /usr/sbin/nginx-debug /opt && \
 cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \
 cp -a --parents /usr/lib/x86_64-linux-gnu/libpcre* /opt && \
 cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
 cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \
 cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
 cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
 cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \
 cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
 cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
 cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime
  FROM gcr.io/distroless/base-debian11
 COPY --from=base /opt /
 EXPOSE 80 443
 ENTRYPOINT ["nginx", "-g", "daemon off;"]

[root@node1 docker]# docker build -t webserver:v3 .


[root@node1 docker]# docker images
REPOSITORY                        TAG       IMAGE ID       CREATED              SIZE
webserver                         v3        cc71beda411e   About a minute ago   34.5MB
webserver                         v2        43eba985f5db   30 minutes ago       210MB
webserver                         v1        f2afa136ea2d   40 minutes ago       356MB
centos                            repo      a732bd43ba9b   41 minutes ago       204MB
nginx                             latest    5ef79149e0ec   2 weeks ago          188MB
nginx                             1.23      a7be6198544f   15 months ago        142MB
centos                            7         eeb6ee3f44bd   2 years ago          204MB
gcr.io/distroless/base-debian11   latest    2a6de77407bf   N/A                  20.6MB

五 docker 镜像仓库的管理

5.1 什么是docker仓库

Docker 仓库(Docker Registry) 是用于存储和分发 Docker 镜像的集中式存储库。

它就像是一个大型的镜像仓库,开发者可以将自己创建的 Docker 镜像推送到仓库中,也可以从仓库中拉 取所需的镜像。

Docker 仓库可以分为公共仓库和私有仓库:

  • 公共仓库,如 Docker Hub,任何人都可以访问和使用其中的镜像。许多常用的软件和应用都有在 Docker Hub 上提供的镜像,方便用户直接获取和使用。 例如,您想要部署一个 Nginx 服务器,就可以从 Docker Hub 上拉取 Nginx 的镜像。
  • 私有仓库则是由组织或个人自己搭建和管理的,用于存储内部使用的、不希望公开的镜像。 比如,一家企业为其特定的业务应用创建了定制化的镜像,并将其存储在自己的私有仓库中, 以保证安全性和控制访问权限。

通过 Docker 仓库,开发者能够方便地共享和复用镜像,加速应用的开发和部署过程。

5.2 docker hub

官网: https://hub.docker.com/

Docker Hub 是 Docker 官方提供的一个公共的镜像仓库服务。

它是 Docker 生态系统中最知名和广泛使用的镜像仓库之一,拥有大量的官方和社区贡献的镜像。

以下是 Docker Hub 的一些关键特点和优势:

1. 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、Web 服务器等众多应用 的镜像。

  • 例如,您可以轻松找到 Ubuntu、CentOS 等操作系统的镜像,以及 MySQL、Redis 等数据库 的镜像。

2. 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。

3. 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。

4. 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。

5. 便于搜索:用户可以通过关键词轻松搜索到所需的镜像。

5.2.1 docker hub的使用方法

#登陆官方仓库
[root@docker ~]# docker login
 Log in with your Docker ID or email address to push and pull images from Docker 
Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to 
create one.
 You can log in with your password or a Personal Access Token (PAT). Using a 
limited-scope PAT grants better security and is required for organizations using 
SSO. Learn more at https://docs.docker.com/go/access-tokens/
 Username: timinglee
 Password:
 WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
 Configure a credential helper to remove this warning. See
 https://docs.docker.com/engine/reference/commandline/login/#credential-stores
 Login Succeeded
 

#登陆信息保存位置
[root@docker ~]# cd .docker/
 [root@docker .docker]# ls
 config.json
 [root@docker .docker]# cat config.json
 {
 "auths": {
 "https://index.docker.io/v1/": {
 "auth": "dGltaW5nbGVlOjY3NTE1MTVtaW5nemxu"
 }
 }
 [root@docker ~]# docker tag gcr.io/distroless/base-debian11:latest  
timinglee/base-debian11:latest
 [root@docker ~]# docker push  timinglee/base-debian11:latest
 The push refers to repository [docker.io/timinglee/base-debian11]
 6835249f577a: Pushed
 24aacbf97031: Pushed
 8451c71f8c1e: Pushed
 2388d21e8e2b: Pushed
 c048279a7d9f: Pushed
 1a73b54f556b: Pushed
 2a92d6ac9e4f: Pushed
 bbb6cacb8c82: Pushed
 ac805962e479: Pushed
 af5aa97ebe6c: Pushed
 4d049f83d9cf: Pushed
 9ed498e122b2: Pushed
 577c8ee06f39: Pushed
 5342a2647e87: Pushed
 latest: digest: 
sha256:f8179c20f1f2b1168665003412197549bd4faab5ccc1b140c666f9b8aa958042 size: 
3234

5.3 docker仓库的工作原理

仓库中的三个角色

index docker索引服务,负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。

registry docker仓库,是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证

Registry Client Docker充当registry客户端来维护推送和拉取,以及客户端的授权。

5.3.1 pull原理

镜像拉取分为以下几步:

1.docker客户端向index发送镜像拉去请求并完成与index的认证

2.index发送认证token和镜像位置给dockerclient

3.dockerclient携带token和根据index指引的镜像位置取连接registry

4.Registry会根据client持有的token跟index核实身份合法性

5.index确认此token合法性 6.Registry会根据client的请求传递镜像到客户端

5.3.2 push原理

镜像上传的步骤:

1.client向index发送上传请求并完成用户认证

2.index会发方token给client来证明client的合法性

3.client携带index提供的token连接Registry

4.Registry向index合适token的合法性

5.index证实token的合法性

6.Registry开始接收客户端上传过来的镜像

5.3 搭建docker的私有仓库

5.3.1 为什么搭建私有仓库

docker hub虽然方便,但是还是有限制

  • 需要internet连接,速度慢
  • 所有人都可以访问
  • 由于安全原因企业不允许将镜像放到外网

好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库

5.3.2 搭建简单的Registry仓库

[root@docker-node1 ~]# docker load -i registry.tag.gz 
ce7f800efff9: Loading layer  7.644MB/7.644MB
30609d4f10dd: Loading layer  792.6kB/792.6kB
3b6a51496c9d: Loading layer  17.55MB/17.55MB
e704e9e3e9dc: Loading layer  3.584kB/3.584kB
f019f591461d: Loading layer  2.048kB/2.048kB
Loaded image: registry:latest
[root@docker-node1 ~]# docker images




开启Registry
[root@docker-node1 ~]# docker run -d -p 5000:5000 --restart=always --name registry registry
20706cfdd2e5280950ddc58d0e7890f41f752ab484e680ca8cb8ebe7e6da565e
[root@docker-node1 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                       NAMES
20706cfdd2e5   registry   "/entrypoint.sh /etc…"   5 seconds ago   Up 5 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry


#给要上传的经镜像打标签
#docker在上传的过程中默认使用https,但是我们并没有建立https认证需要的认证文件所以会报错
[root@docker-node1 ~]# docker tag busybox:latest  172.25.254.100:5000/busybox:latest
[root@docker-node1 ~]# docker push 172.25.254.100:5000/busybox:latest
The push refers to repository [172.25.254.100:5000/busybox]
Get "https://172.25.254.100:5000/v2/": http: server gave HTTP response to HTTPS client



#配置非加密端口
[root@docker-node1 ~]# vim /etc/docker/daemon.json
{
   "insecure-registries":["http://172.25.254.100:5000"]
}
[root@docker-node1 ~]# systemctl restart docker

#上传镜像
[root@docker-node1 ~]# docker push 172.25.254.100:5000/busybox:latest
The push refers to repository [172.25.254.100:5000/busybox]
d51af96cf93e: Pushed 
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527

#查看镜像上传
[root@docker-node1 ~]# curl 172.25.254.100:5000/v2/_catalog
{"repositories":["busybox"]}

5.3.3 为Registry提加密传输

#生成认证key和证书
[root@docker-node1 ~]# mkdir certs
[root@docker-node1 ~]#  openssl req -newkey  rsa:4096 \
> -nodes -sha256 -keyout certs/test.org.key \
> -addext "subjectAltName = DNS:www.test.com" \
> -x509 -days 365 -out certs/test.org.crt

#启动registry仓库
[root@docker-node1 ~]#  docker run -d -p 443:443 --restart=always --name registry  --name registry -v /opt/registry:/var/lib/registry  -v /root/certs:/certs  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/test.org.crt  -e REGISTRY_HTTP_TLS_KEY=/certs/test.org.key registry

#为客户端建立证书
[root@docker-node1 ~]# mkdir /etc/docker/certs.d/www.test.com/ -p
[root@docker-node1 ~]#  cp /root/certs/test.org.crt /etc/docker/certs.d/www.test.com/ca.crt
[root@docker-node1 ~]# systemctl restart docker

#测试
[root@docker-node1 ~]#    docker tag busybox www.test.com/busybox:latest
[root@docker-node1 ~]# docker push www.test.com/busybox:latest
The push refers to repository [www.test.com/busybox]
d51af96cf93e: Pushed 
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527

5.3.4 为仓库建立登陆认证

#建立认证文件
[root@docker-node1 ~]#  mkdir auth
[root@docker-node1 ~]# htpasswd -Bc auth/htpasswd test
New password: 
Re-type new password: 
Adding password for user test

#添加认证到registry容器中
[root@docker-node1 ~]# docker run -d -p 443:443 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/test.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/test.org.key -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
3b335f65a14ef5291fe56adf22fda37fd3d36fe955a73b0115f89b505dc32098

 #登陆测试
[root@docker-node1 ~]#  curl -k https://www.test.com/v2/_catalog -u test:redhat
{"repositories":["busybox"]}
[root@docker-node1 ~]#  docker login www.test.com
Username: test
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

当仓库开启认证后必须登陆仓库才能进行镜像上传

#未登陆情况下上传镜像
[root@docker ~]# docker push  www.test.com/busybox
 Using default tag: latest
 The push refers to repository [www.test.com/busybox]
 d51af96cf93e: Preparing
 no basic auth credentials

#未登陆请款下也不能下载
[root@docker-node2 ~]# docker pull www.test.com/busybox
 Using default tag: latest
 Error response from daemon: Head 
"https://www.test.com/v2/busybox/manifests/latest": no basic auth 
credentials

5.4 构建企业级私有仓库

下载软件包地址 https://github.com/goharbor/harbor/releases

Harbor 是由vmware公司开源的企业级 Docker Registry 项目。

它提供了以下主要功能和特点:

  • 基于角色的访问控制(RBAC):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理 的灵活性。
  • 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。
  • 图形化用户界面(UI):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。
  • 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
  • 垃圾回收:可以清理不再使用的镜像,节省存储空间。

5.4.1 部署harbor

[root@docker-node1 ~]# tar zxf harbor-offline-installer-v2.5.4.tgz
[root@docker-node1 ~]# cd harbor/
[root@docker-node1 harbor]# cp harbor.yml.tmpl harbor.yml

[root@docker-node1 harbor]# vim harbor.yml
  5 hostname: www.test.com
 17   certificate: /data/certs/test.org.crt
 18   private_key: /data/certs/test.org.key
 34 harbor_admin_password: redhat

[root@docker-node1 ~]# cp certs/test.org.crt /data/certs/test.org.crt
[root@docker-node1 ~]# cp certs/test.org.key /data/certs/test.org.key

[root@docker-node1 harbor]# ./install.sh --with-chartmuseum

#管理harbor的容器
[root@docker-node1 harbor]# docker compose stop
[root@docker-node1 harbor]# docker compose up -d

#上传镜像
[root@docker-node1 ~]# docker login www.test.com
Authenticating with existing credentials...
Stored credentials invalid or expired
Username (test): admin     
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

[root@docker-node1 ~]# docker tag busybox:latest www.test.com/test1/busybox:latest
[root@docker-node1 ~]# docker push www.test.com/test1/busybox:latest
The push refers to repository [www.test.com/test1/busybox]
d51af96cf93e: Pushed 
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527

5.4.2 管理仓库

1.登陆

2.建立仓库项目

上传镜像

查看上传的镜像

六 Docker 网络

docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分

docker安装后会自动创建3种网络:bridge、host、none

[root@node1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
379f9058b579   bridge    bridge    local
1f1aaf679312   host      host      local
64a9d568f680   none      null      local

6.1 docker原生bridge网路

docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口

[root@node1 ~]# ip link show type bridge
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:a6:ea:66:f0 brd ff:ff:ff:ff:ff:ff

  • bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
  • 容器通过宿主机的NAT规则后可以访问外网

[root@docker-node1 ~]# docker run -d --name web -p 80:80 nginx
e117d06382066e2f0963bb5851f91931607ebe40b61a23fbb12abc32796c98e5
[root@docker-node1 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ba:22:ea:b4  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27  bytes 3866 (3.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.100  netmask 255.255.255.0  broadcast 172.25.254.255
        inet6 fe80::10dc:4e34:b1e0:2000  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:55:95:0d  txqueuelen 1000  (Ethernet)
        RX packets 2630  bytes 421690 (411.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2074  bytes 339687 (331.7 KiB)
        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 508  bytes 60604 (59.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 508  bytes 60604 (59.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethe59a8b3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::e8e7:c2ff:fe65:36b8  prefixlen 64  scopeid 0x20<link>
        ether ea:e7:c2:65:36:b8  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 18  bytes 2308 (2.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

6.2 docker原生网络host

host网络模式需要在容器创建时指定 --network=host

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少 隔离性

注意!!!!:如果公用一个网络,那么所有的网络资源都是公用的,比如启动了nginx容器那么真实主机的80端口被占 用,在启动第二个nginx容器就会失败

[root@docker-node1 ~]# docker run -it --name test  --network host busybox
/ # ifconfig 
docker0   Link encap:Ethernet  HWaddr 02:42:BA:22:EA:B4  
          inet addr:172.17.0.1  Bcast:172.17.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:21 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:3326 (3.2 KiB)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:55:95:0D  
          inet addr:172.25.254.100  Bcast:172.25.254.255  Mask:255.255.255.0
          inet6 addr: fe80::10dc:4e34:b1e0:2000/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:825 errors:0 dropped:0 overruns:0 frame:0
          TX packets:694 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:195172 (190.5 KiB)  TX bytes:126886 (123.9 KiB)

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:508 errors:0 dropped:0 overruns:0 frame:0
          TX packets:508 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:60604 (59.1 KiB)  TX bytes:60604 (59.1 KiB)

6.3 docker 原生网络none

none模式是指禁用网络功能,只有lo接口,在容器创建时使用--network=none指定

[root@docker-node1 ~]#  docker run -it --name test --rm --network none  busybox
/ # ifconfig 
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: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)

6.4 docker的自定义网络

自定义网络模式,docker提供了三种自定义网络驱动:

bridge

overlay

macvlan

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,

overlay和macvlan是用于创建跨主机网络

建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。

6.4.1 自定义桥接网络

  • 在建立自定以网络时,默认使用桥接模式
  • 桥接默认是单调递增
  • 桥接也支持自定义子网和网关
[root@docker-node1 ~]# docker network create my_net1
e911d2714ea9d07c66dfcd7d0f790bf63f66bd2e825ae0a8ee52218ce4e231ce
[root@docker-node1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
5cc1606816e0   bridge    bridge    local
6097c99f9b54   host      host      local
e911d2714ea9   my_net1   bridge    local
eac05d3a0460   none      null      local
[root@docker-node1 ~]# ifconfig
br-e911d2714ea9: 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:5a:11:3d:3b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21  bytes 2518 (2.4 KiB)
        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
        ether 02:42:ba:22:ea:b4  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27  bytes 3866 (3.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



[root@docker-node1 ~]# docker network create my_net2 --subnet 192.168.0.0/24 --gateway 192.168.0.100
ca9e8110801bab5595930b42b3c9782cce271212ab6bf18f5659827c5e3c4cdd
[root@docker-node1 ~]# docker network  inspect my_net2
[
    {
        "Name": "my_net2",
        "Id": "ca9e8110801bab5595930b42b3c9782cce271212ab6bf18f5659827c5e3c4cdd",
        "Created": "2024-08-29T11:35:19.919558195+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/24",
                    "Gateway": "192.168.0.100"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

6.4.2 为什么要自定义桥接

多容器之间如何互访?通过ip可以,但是有什么问题?

  • docker引擎在分配ip时时根据容器启动顺序分配到,谁先启动谁用,是动态变更的
  • 多容器互访用ip很显然不是很靠谱,那么多容器访问一般使用容器的名字访问更加稳定
  • docker原生网络是不支持dns解析的,自定义网络中内嵌了dns

注意:不同的自定义网络是不能通讯的

[root@docker-node1 ~]# docker run  -d --name web1 nginx
6c47331826ec47d8e38816381f6f9d075828ecf1232601d57c841eb500dcf8bd
[root@docker-node1 ~]# docker run  -d --name web2 nginx
b8f9bf49f8208f99e16d0102a03feb85cfd9557c1e32ddb4f24b6075d8c5af2c
[root@docker-node1 ~]#  docker inspect  web1


[root@docker-node1 ~]# docker run -d --network my_net1 --name web nginx
06fbd8d7695bff43f5add707ef2f2c2783b43ccf5b9132ca9f512dd539365eab
[root@docker-node1 ~]# docker run  -it --network my_net1  --name  test busybox
/ # ping web
PING web (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.298 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.100 ms

6.4.3 如何让不同的自定义网络互通?

[root@docker-node1 ~]# docker run -d  --name web1 --network my_net1 nginx
[root@docker-node1 ~]# docker network connect my_net1 test
[root@docker-node1 ~]# docker run  -it --name test --network my_net2 busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:00:01  
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 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:1630 (1.5 KiB)  TX bytes:0 (0.0 B)

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: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)

/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:00:01  
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:18 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:2388 (2.3 KiB)  TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:AC:12:00:04  
          inet addr:172.18.0.4  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 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:516 (516.0 B)  TX bytes:0 (0.0 B)

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: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)
/ # ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.203 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.259 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.098 ms

6.4.4 joined容器网络

Joined容器一种较为特别的网络模式,•在容器创建时使用--network=container:vm1指定。(vm1指定 的是运行的容器名)

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

[root@docker-node1 ~]# docker run  -it --rm  --network container:web1 busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:03  
          inet addr:172.18.0.3  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:21 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:2450 (2.3 KiB)  TX bytes:0 (0.0 B)

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: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)


[root@docker-node1 ~]#  docker run  -it --rm  --network container:web1 centos:7
[root@36d58d4314d3 /]#  curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

6.4.5 joined网络示例演示

利用容器部署phpmyadmin管理mysql

注意!!!!:开启的phpmyadmin容器中是没有数据库的,这里填写的localhost:3306是因为mysql容器和phpmyadmin容器公用一个网络站

[root@docker-node1 ~]# docker load -i mysql-5.7.tar.gz 
[root@docker-node1 ~]# docker load -i phpmyadmin-latest.tar.gz 

[root@docker-node1 ~]# docker run -d --name mysqladmin --network my_net1 \
> -e PMA_ARBITRARY=1 \
> -p 80:80 phpmyadmin:latest
523f241bbbbbe6186b0fd89c974096927aa87f938e389969dd79dfc2988aadb0
[root@docker-node1 ~]# docker run  -d --name mysql \
> -e MYSQL_ROOT_PASSWORD='redhat' \
> --network container:mysqladmin  \
> mysql:5.7
98c4710f682b012a721402c308505c3b1b566184424af9872c4f483ac01e1164


[root@docker-node1 ~]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED              STATUS              PORTS                               NAMES
98c4710f682b   mysql:5.7           "docker-entrypoint.s…"   About a minute ago   Up About a minute                                       mysql
523f241bbbbb   phpmyadmin:latest   "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes        0.0.0.0:80->80/tcp, :::80->80/tcp   mysqladmin
f37bbc10b61a   busybox             "sh"                     53 minutes ago       Up 53 minutes                                           sweet_mcnulty

[root@docker-node1 ~]# docker exec -it mysql bash
bash-4.2# mysql -uroot -predhat

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

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

相关文章

排序算法见解(2)

1.快速排序 1.1基本思想&#xff1a; 快速排序是通过一趟排序将待排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排序过程可以递归进行&#xff0c;以…

如何构建Java SpringBoot文献检索系统:高效管理学术资料,掌握数据库核心技术

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

搭上“跨境电商”便车,中国家居在海外越杀越勇

文&#xff5c;新熔财经 作者&#xff5c;楷楷 从去年至今&#xff0c;已有多家跨境家居企业谋求IPO&#xff0c;包括近期启动IPO辅导的圣奥科技&#xff1b;今年4月正式向港交所递交招股说明书的傲基科技&#xff1b;去年11月启动A股IPO的跨境家居品牌杰西亚&#xff0c;还有…

vulhub xxe靶机通关教程

首先我们进行端口扫描 扫出来端口之后去尝试得出地址为183 发现robots.txt文件 由此我们就得到了两个目录 我们先进入xxe目录&#xff0c;并开始登录抓包 并进入重放器在xml里面构造语句 <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY admin SYSTEM "php://filt…

【在Linux世界中追寻伟大的One Piece】传输层协议UDP

目录 1 -> 传输层 2 -> 端口号 2.1 -> 端口号范围划分 2.2 -> 知名端口号 3 -> UDP协议 3.1 -> UDP协议端格式 3.2 -> UDP的特点 3.2.1 -> 面向数据报 3.3 -> UDP的缓冲区 3.4 -> UDP使用注意事项 3.5 -> 基于UDP的应用层协议 1 -…

Vue实战:轻松掌握输入框@功能实现技巧

成员列表 创建 实现成员列表的方式比较简单&#xff0c;其实就是一个列表&#xff0c;一个简单的v-for循环就可以搞定&#xff0c;点击时将当前选择的成员项回调给父组件。 新增一个AtPop.vue文件&#xff1a; <template> <div class"at-pop-index">…

DIFFUSION 系列笔记| Latent Diffusion Model、Stable Diffusion基础概念、数学原理、代码分析、案例展示

目录 Latent Diffusion Model LDM 主要思想 LDM使用示例 LDM Pipeline LDM 中的 UNET 准备时间步 time steps 预处理阶段 pre-process 下采样过程 down sampling 中间处理 mid processing 上采样 upsampling 后处理 post-process LDM Super Resolution Pipeline…

海康视觉二次开发学习笔记8-从回调函数获取结果

回调函数使用方法 通常在方案或流程执行完成后,就可以获取到流程运行的结果.运行一次流程后,我们就可以获取到流程的渲染结果以及流程的数据结果.那么使用通讯或硬件进行外部触发时,如何获取结果呢? 这种时候就要用到回调函数. 1. 注释原获取结果代码 2. 注册回调函数 在构…

【文献及模型、制图分享】数字技术力量下传统村落景观修复演进的特征与机制研究——以岳阳市张谷英村为例(GIS空间分析、点云提取)

文献介绍 景观修复作为弘扬中华优秀传统文化的重要方式&#xff0c;如何在乡村数字化新时代背景下&#xff0c;把握传统村落景观修复的数字赋能&#xff0c;已成为推动中华优秀传统文化创造性转化与创新性发展亟需解决的科学问题。运用深度访谈、GIS空间分析、点云数据提取等方…

html+css+js网页设计 婚庆类型12个页面

htmlcssjs网页设计 婚庆类型12个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

FreeRTOS 低功耗模式

正如STM32的裸机编程一样&#xff0c;FreeRTOS通用提供了低功耗模式。 前面说的很明白&#xff0c;FreeRTOS的低功耗模式实际上还是基于STM32的低功耗模式指令进入睡眠模式来实现的&#xff0c;并且只要中断来临&#xff0c;就会退出低功耗&#xff0c;FreeRTOS的系统时钟是最底…

猫头虎分享:Python库 Statsmodels 的简介、安装、用法详解入门教程

猫头虎分享&#xff1a;Python库 Statsmodels 的简介、安装、用法详解入门教程 &#x1f42f; 引言 &#x1f3af; 今天猫头虎带您 深入探讨 Statsmodels 这个在数据分析和统计建模领域非常重要的Python库。最近有粉丝在评论区问道&#xff1a;“猫哥&#xff0c;如何使用 St…

USB端点

USB端点 各端点使用循环冗余校验&#xff08;CRC&#xff09;来检测传输中发生的错误。 根据 USB 规范&#xff0c;设备端点是 USB 设备中一个独特的可寻址部分&#xff0c;它作为主机和设备间通信流的信息源或库。 USB 枚举和配置一节介绍了设备向默认地址做出响应的步骤。 枚…

能进大厂的自动化测试面试题

前言 每次到金九银十都避免不了要聊一聊面试题了&#xff0c;如今九月已经是中下旬了&#xff0c;马上就要到十月份了&#xff0c;还在投简历找工作的小伙伴可以看看我这几天发的文章&#xff0c;最近发的都是面试题&#xff0c;如果需要笔者教一下大家怎么写简历的小伙伴可以…

光伏高压并网升压箱变

在当今能源领域的变革浪潮中&#xff0c;光伏能源以其清洁、可再生的显著优势&#xff0c;成为了备受瞩目的焦点。而光伏高压并网升压箱变&#xff0c;则是实现光伏电能顺利接入高压电网的核心设备。 光伏高压并网升压箱变宛如光伏能源系统中的一位“大力士”&#xff0c;承担着…

一张图浏览CSS Functions

点我CSS Functions思维导图下载 函数文章链接示例属性函数var attr env介绍访问文章示例地址

银河麒麟编译opencv库并配置qt环境

1.opencv下载版本:opencv4.5.5,qt安装的是qt5.12.11,系统版本: 2.首先应该安装cmake工具: 下载地址:https://cmake.org/download/ 安装步骤: 1)解压; 2)进入解压后的文件夹cd cmake-3.30.2 3)./bootstrap 4)sudo make 5)sudo make install 3.下载opencv,下…

实现 GridLayoutManger 和 StaggeredGridLayoutManager 混排的工具类

序言 最近项目中要实现瀑布流的混排&#xff0c;于是写了一些工具类来实现。使用了这个工具类&#xff0c;可以处理混排&#xff0c;可以处理间距。都集成在一个接口中。 最后效果类似这样。 工具类 GridItemUI 下面的这个类是用来实现在GridLayouManger中混排的。 packag…

硬件-PCB-正片(常用默认)和负片

文章目录 问题&#xff1a;什么是PCB的正片和负片&#xff1f;1.正片设计默认是无铜的&#xff08;常用&#xff09;2.负片设计是默认有铜的3.网友评论道友&#xff1a;我们的对手从来不是别人&#xff0c;而是自己。如果有什么必须战胜&#xff0c;那就是过去的自己。战胜自己…

Nginx 部署前端 Vue 项目全攻略

一、前期准备工作 要将 Vue 项目部署到 Nginx &#xff0c;需要做好以下准备工作&#xff1a; Nginx 的安装&#xff1a; 对于 Centos 系统&#xff0c;可以通过 yum install -y nginx 命令来安装 Nginx 。 对于 Windows 系统&#xff0c;需要在 Nginx 官网下载相应的安装包并…