全网最详细docker详解,从概念到实战一篇解决

一 Docker简介及部署方法

1 Docker简介

ocker之父Solomon Hykes:Docker就好比传统的货运集装箱

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

什么是docker?

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

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

轻量级虚拟化

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

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

一致性

  • 确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。

  • 无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。

可移植性

  • 可以轻松地将 Docker 容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差异。

  • 比如,在本地开发的容器可以无缝部署到云服务器上。

高效的资源利用:

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

易于部署和扩展:

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

docker在企业中的应用场景

 

docker与虚拟化的对比

docker的优势
  • 对于开发人员:Build once、Run anywhere。

  • 对于运维人员:Configure once、Run anything

  • 容器技术大大提升了IT人员的幸福指数!

2 部署docker
2.1 容器工作方法

2.2 部署第一个容器

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

配置软件仓库
#企业7
]# cd /etc/yum.repos.d
]# vim docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/dockerce/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

#企业9
]# cd /etc/yum.repos.d
]# vim docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/
gpgcheck=0

安装docker-ce并启动服务

#在rhel7中 需要
]# 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
]# sysctl --system
]# systemctl restart docker

 启动docker镜像加速器

[root@docker ~]# vim /etc/docker/daemon.json
{
        "registry-mirrors":["https://docker.m.daocloud.io"]
}
[root@docker ~]# systemctl restart docker.service 

二 Docker的基本操作

2.1 Docker镜像管理
搜索镜像
[root@Docker-node1 ~]# docker search nginx
NAME DESCRIPTION STARS
OFFICIAL
nginx Official build of Nginx. 20094 [OK]
@@@省略内容

拉取镜像
#从镜像仓库中拉取镜像
[root@Docker-node1 ~]# docker pull busybox
[root@Docker-node1 ~]# docker pull nginx:1.26-alpine
#查看本地镜像
[root@Docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
nginx latest 900dca2a61f5 7 weeks ago
188MB
nginx 1.26-alpine b32ed582bddb 7 weeks ago
43.2MB
ubuntu latest 35a88802559d 2 months ago
78.1Mbusybox latest 65ad0d468eb1 15 months ago
4.26MB
centos 7 eeb6ee3f44bd 2 years ago
204MB
centos latest 5d0da3dc9764 2 years ago
231MB
gcr.io/distroless/base-debian12 latest 7273f3276b21 N/A
20.7MB
gcr.io/distroless/base-debian11 latest 2a6de77407bf N/A
20.6MB

alpine 版本:nginx镜像的最小安装发型版本

查看镜像信息
[root@Docker-node1 ~]# docker image inspect nginx:1.26-alpine
导出镜像

#保存镜像
[root@Docker-node1 ~]# docker image save nginx:latest -o nginx-latest.tar.gz
[root@Docker-node1 ~]# docker image save nginx:latest nginx:1.26-alpine -o nginx.tag.gz
#保存所有镜像
[root@Docker-node1 ~]# docker save `docker images | awk 'NR>1{print $1":"$2}'` -
o images.tar.gz

删除镜像

[root@Docker-node1 ~]# docker rmi nginx:latest
[root@Docker-node1 ~]# docker rmi `docker images | awk 'NR>1{print $1":"$2}'` 

2.2 容器的常用操作
[root@Docker-node1 ~]# docker run -d --name mario -p 80:8080 timinglee/mario
[root@Docker-node1 ~]# docker run -it --name centos7 centos:7
[root@3ba22e59734f /]# #进入到容器中,按<ctrl>+<d>退出并停止容器,#按<ctrl>+<pq>退出但不停止容器

#重新进入容器
[root@docker ~]# docker attach centos7
[root@3ba22e59734f /]#

#在容器中执行命令
[root@docker ~]# docker exec -it test 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)

查看容器运行信
[root@Docker-node1 ~]# docker ps #查看当前运行容器
[root@Docker-node1 ~]# docker ps -a #查看所有容器
[root@Docker-node1 ~]# docker inspect busybox #查看容器运行的详细信息
[root@Docker-node1 ~]# docker history #用于查看指定镜像的历史层信息,查看镜像构建过程
停止和运行容器
[root@Docker-node1 ~]# docker stop busybox #停止容器
[root@Docker-node1 ~]# docker kill busybox #杀死容器,可以使用信号
[root@Docker-node1 ~]# docker start busybox #开启停止的容器

删除容器
[root@Docker-node1 ~]# docker rm centos7 #删除停止的容器
[root@Docker-node1 ~]# docker rm -f busybox #删除运行的容器
[root@Docker-node1 ~]# docker container prune -f #删除所有停止的容器
容器内容提交

默认情况下,容器被删除后,在容器中的所有操作都会被清理,包括要保存的文件 如果想永久保存,那么我们需要把动作提交,提交后会生成新的镜像 当我们在运行新镜像后即可看到我们提交的内容

[root@Docker-node1 ~]# docker run -it --name test busybox
/ # touch leefile #在容器中建立文件
/ # ls
bin etc leefile lib64 root tmp var
dev home lib proc sys usr
/ #
[root@Docker-node1 ~]# docker rm test #删掉容器后
test
[root@Docker-node1 ~]# docker run -it --name test busybox #删掉容器后开启新的容器文
件不存在
/ # ls
bin dev etc home lib lib64 proc root sys tmp usr var
/ #
[root@Docker-node1 ~]# docker commit -m "add leefile" test busybox:v1
sha256:c8ff62b7480c951635acb6064acdfeb25282bd0c19cbffee0e51f3902cbfa4bd
[root@Docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
busybox v1 c8ff62b7480c 12 seconds ago
4.26MB
[root@Docker-node1 ~]# docker image history busybox:v1
IMAGE CREATED CREATED BY SIZE
COMMENT
c8ff62b7480c 2 minutes ago sh 17B add
leefile
65ad0d468eb1 15 months ago BusyBox 1.36.1 (glibc), Debian 12 4.26M

此方法不利于企业审计,所以不推荐使用,在企业中我们多用Dockerfile来构建镜像  

系统中的文件和容器中的文件传输

 [root@Docker-node1 ~]# docker cp test2:/leefile /mnt #把容器中的文件复制到本机
Successfully copied 1.54kB to /mnt
[root@Docker-node1 ~]# docker cp /etc/fstab test2:/fstab #把本机文件复制到容器中

查询容器内部日志
[root@Docker-node1 ~]# docker logs web
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to
perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-bydefault.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of
/etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in
/etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/08/14 07:50:01 [notice] 1#1: using the "epoll" event method
2024/08/14 07:50:01 [notice] 1#1: nginx/1.27.0
2024/08/14 07:50:01 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/08/14 07:50:01 [notice] 1#1: OS: Linux 5.14.0-427.13.1.el9_4.x86_64
2024/08/14 07:50:01 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2024/08/14 07:50:01 [notice] 1#1: start worker processes
2024/08/14 07:50:01 [notice] 1#1: start worker process 29
2024/08/14 07:50:01 [notice] 1#1: start worker process 30
172.17.0.1 - - [14/Aug/2024:07:50:20 +0000] "GET / HTTP/1.1" 200 615 "-"
"curl/7.76.1" "-

三 docker镜像构建

.1 docker镜像结构

3.2 镜像运行的基本原理

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

  • 企业镜像可以用官方镜像+Dockerfile来生成

  • 系统关于镜像的获取动作有两种:

  1. docker pull 镜像地址

  2. docker load –i 本地镜像包

3.4 镜像构建
构建参数

参数示例及用法
#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 wang@wang.org #指定作者信息
COPY leefile / #复制当前目录文件到容器指定位置,leefile必须在当前目录中

[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 wang@wang.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
bin etc leefile leefile2 lib proc sys usr
dev home leefile1 leefile3 lib64 root tmp var
#ENV CMD
FROM busybox
MAINTAINER wang@wang.org
ENV NAME lee
CMD echo $NAME
#CMD ["/bin/echo", "$NAME"]
#CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3lee

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

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

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

#EXPOSE VOLUME VOLUME
FROM busybox
MAINTAINER wang@wang.org
ENV NAME lee
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 #

Dockerfile实例
[root@server1 ~]# mdkir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# cp ~/nginx-1.23.3.tar.gz .
[root@server1 docker]# vim Dockerfile
FROM centos:7         #使用的基础镜像
ADD nginx-1.23.3.tar.gz /mnt   #将宿主机的nginxtar包复制到docker的/mnt目录下
WORKDIR /mnt/nginx-1.23.3   #将工作目录切换到/mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel #下载nginx相关依赖项
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --with-http_ssl_module --with-http_stub_status_module #添加相关模块和检查软件包
RUN make      #编译
RUN make install
EXPOSE 80 #开发80端口
VOLUME ["/usr/local/nginx/html"] #将本地的默认目录挂载到docker的/usr/local/nginx/html
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"] #运行nginx

[root@Docker-node1 ~]# docker commit -m "add leefile" test busybox:v1

通过dockerfile生成镜像

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

测试镜像可用性

[root@server1 docker]# docker images webserver
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v1 bfd6774cc216 8 seconds ago 494MB
[root@server1 docker]# docker history webserver:v1
[root@server1 docker]# docker run -d --name checkimage webserver

查看容器详情

 [root@server1 docker]# docker inspect web1

3.5 镜像优化方案
镜像优化策略
  • 选择最精简的基础镜像

  • 减少镜像的层数

  • 清理镜像构建的中间产物

  • 选择最精简的基础镜像

  • 减少镜像的层数

  • 清理镜像构建的中间产物

镜像优化示例

方法1.缩减镜像层

[root@server1 docker]# vim Dockerfile
FROM centos:7 as build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3

RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS
-g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --
with-http_stub_status_module && make && make install && cd .. && rm -fr nginx1.23.3 && yum clean all

EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t webserver:v2 .
[root@server1 docker]# docker images webserver
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v2 caf0f80f2332 4 seconds ago 317MB
webserver v1 bfd6774cc216 About an hour ago 494MB

方法2.多阶段构建

[root@server1 docker]# vim Dockerfile
FROM centos:7 as build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS
-g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --
with-http_stub_status_module && make && make install && cd .. && rm -fr nginx1.23.3 && yum clean all
#上一个镜像的产物给下一个镜像,最后只生成最后的镜像
FROM centos:7
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@server1 docker]# docker build -t webserver:v3 .
[root@server1 docker]# docker images webserver
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v3 1ac964f2cefe 29 seconds ago 205MB
webserver v2 caf0f80f2332 3 minutes ago 317MB
webserver v1 bfd6774cc216 About an hour ago 494Mb

方法3.使用最精简镜像

使用google提供的最精简镜像

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

下载镜像:

docker pull gcr.io/distroless/base

利用最精简镜像构建

[root@server1 ~]# mkdir new
[root@server1 ~]# cd new/
[root@server1 new]# vim Dockerfile
FROM nginx:latest as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE #时区
#将必须的nginx模块移动到 /opt目录下
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 /       #将上一个镜像中/opt目录移动到现在这个镜像
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]

[root@server1 new]# docker build -t webserver:v4 .

[root@server1 new]# docker images webserver
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v4 c0c4e1d49f3d 4 seconds ago 34MB
webserver v3 1ac964f2cefe 12 minutes ago 205MB
webserver v2 caf0f80f2332 15 minutes ago 317MB
webserver v1 bfd6774cc216 About an hour ago 494Mb

四:实战

4.1搭建私有仓库

搭建简单的Registry仓库

1.下载Registry镜像

[root@docker ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
930bdd4d222e: Pull complete
a15309931e05: Pull complete
6263fb9c821f: Pull complete
86c1d3af3872: Pull complete
a37b1bf6a96f: Pull complete
Digest: sha256:12120425f07de11a1b899e418d4b0ea174c8d4d572d45bdb640f93bc7ca06a3d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

2.开启Registry

[root@docker ~]# docker run -d -p 5000:5000 --restart=always --name registry registry
bc58d3753a701ae67351fac335b06a4d7f66afa10ae60b992f647117827734c5
#-p 端口映射,将docker中的5000与宿主机的5000做映射 --restart 一直启动
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
bc58d3753a70 registry "/entrypoint.sh /etc…" 7 seconds ago Up 6 seconds
5000/tcp, 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry

3.上传镜像到仓库中

#给要上传的经镜像打标签
[root@docker ~]# docker tag busybox:latest 172.25.250.100:5000/busybox:latest

#docker在上传的过程中默认使用https,但是我们并没有建立https认证需要的认证文件所以会报错
[root@docker ~]# docker push 172.25.250.100:5000/busybox:latest
The push refers to repository [172.25.250.100:5000/busybox]    Get"https://172.25.250.100:5000/v2/": dial tcp 172.25.250.100:5000: connect:connection refused

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

[root@docker ~]# systemctl restart docker

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

#查看镜像上传
[root@docker ~]# curl 172.25.250.100:5000/v2/_catalog
{"repositories":["busybox"]}
为Registry提加密传输
#生成认证key和证书
[root@docker ~]# mkdir certs
#需要写本地解析
[root@docker ~]# vim /etc/hosts
172.25.250.100  docker.node1 reg.wang.org

[root@docker ~]# openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout certs/wang.org.key \
-addext "subjectAltName = DNS:reg.wang.org" \ #指定备用名称
-x509 -days 365 -out certs/wang.org.crt

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:wang
Organizational Unit Name (eg, section) []:docker
Common Name (eg, your name or your server's hostname) []:reg.wang.org
Email Address []:admin@timinglee.org

#启动registry仓库
[root@docker ~]# 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/wang.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/wang.org.key registry

测试:

#打标签
[root@docker ~]# docker tag busybox:latest reg.wang.org/busybox:latest

[root@docker docker]# docker push reg.wang.org/busybox:latest #docker客
户端没有key和证书
Error response from daemon: Get "https://reg.wang.org/v2/": tls: failed to
verify certificate: x509: certificate signed by unknown authority

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

[root@docker docker]# docker push reg.wang.org/busybox:latest
The push refers to repository [reg.timinglee.org/busybox]
d51af96cf93e: Pushed
latest: digest:
sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527
[root@docker docker]# curl -k https://reg.wang.org/v2/_catalog
{"repositories":["busybox"]}

为仓库建立登陆认证

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

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

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

4.2构建企业级私有仓库

下载软件包地址:Releases · goharbor/harbor · GitHub

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

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

  1. 基于角色的访问控制(RBAC):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理 的灵活性。

  2. 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。

  3. 图形化用户界面(UI):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。

  4. 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。

  5. 垃圾回收:可以清理不再使用的镜像,节省存储空间。

部署harbor
#首先去官网下载harbor的包,然后解压
[root@docker ~]# tar zxf harbor-offline-installer-v2.5.4.tgz
[root@docker ~]# ls
anaconda-ks.cfg certs harbor-offline-installer-v2.5.4.tgz
auth harbor
[root@docker ~]# cd harbor/

[root@docker harbor]# cp harbor.yml.tmpl harbor.yml #修改harbor配置文件
[root@docker harbor]# vim harbor.yml
hostname: reg.wang.org  #必须跟制作证书时DNS的地址一致
certificate: /data/certs/wang.org.crt  #证书和key的位置
private_key: /data/certs/wang.org.key
harbor_admin_password: redhat #用户 admin 的密码

#将上个实验的证书和key拷贝到/data下
[root@docker harbor]# mkdir /data
[root@docker harbor]# cp /root/certs /data/ -r

[root@docker harbor]# ./install.sh --help
Please set --with-notary #证书签名
Please set --with-trivy #安全扫描
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor

[root@docker harbor]# ./install.sh --with-chartmuseum
#管理harbor的容器
[root@docker harbor]# docker compose stop 
[root@docker harbor]# docker compose up -d
管理仓库

1.登陆

2.建立仓库项目

3.上传镜像

[root@docker harbor]# docker login reg.wang.org
Authenticating with existing credentials...
Stored credentials invalid or expired
Username (wang): 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 harbor]# docker tag  busybox:latest reg.wang.org/wang/busybox:latest
[root@docker harbor]# docker push reg.wang.org/wang/busybox
Using default tag: latest
The push refers to repository [reg.wang.org/wang/busybox]
d51af96cf93e: Pushed 
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527

 

4.3利用容器编排完成haproxy和nginx负载均衡架构实施

容器编排工具Docker Compose:

使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、 环境变量、存储卷等参数。

例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。

默认查找的yml文件是:docker-compose.yml

第一步:拉取相关镜像
root@docker test]# docker pull nginx:latest
[root@docker test]# docker pull haproxy:2.3
第二步:建立指定的目录和配置文件

建立web服务的index.html文件

[root@docker packages]# mkdir /docker/web/html1 -p
[root@docker packages]# mkdir /docker/web/html2 -p
[root@docker packages]# echo "welcom to web1" > /docker/web/html1/index.html
[root@docker packages]# echo "welcom to web2" > /docker/web/html2/index.html

建立haproxy配置文件

#由于需要haproxy的配置文件模板所以先下载一个haproxy
[root@docker packages]# yum install haproxy -y
#编辑配置文件
[root@docker packages]# vim /etc/haproxy/haproxy.cfg 
listen webcluster
  bind *:80
  balance roundrobin
  server web1 webserver1:80 check inter 3 fall 3 rise 5
  server web2 webserver2:80 check inter 3 fall 3 rise 5
#将配置文件copy到指定目录方便使用
[root@docker packages]# mkdir /docker/conf/haproxy -p
[root@docker packages]# cp /etc/haproxy/haproxy.cfg /docker/conf/haproxy/ -a
第三步:利用容器编排工具docker compose完成搭建
[root@docker ~]# vim haproxy.yml
services:
  web1:
    image: nginx:latest
    container_name: webserver1
    restart: always
    networks:
      - mynet1
    expose:
      - 80
    volumes:
      - /docker/web/html1:/usr/share/nginx/html
  web2:
    image: nginx:latest
    container_name: webserver2
    restart: always
    networks:
      - mynet1
    expose:
      - 80
    volumes:
      - /docker/web/html2:/usr/share/nginx/html

  haproxy:
    image: haproxy:2.3
    container_name: haproxy
    restart: always
    networks:
      - mynet1
      - mynet2
    volumes: #将默认的配置文件替换为自己的
      - /docker/conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    ports:
      - "80:80"

networks: #用于内网通讯
  mynet1:
    driver: bridge

  mynet2: #用于外网通讯
    driver: bridge

 

检测语法有无问题

[root@docker ~]# docker compose -f /root/haproxy.yml config

 

运行

[root@docker ~]# docker compose -f /root/haproxy.yml up -d

测试:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值