您的位置:首页 > 汽车 > 时评 > docker实战演练

docker实战演练

2024/11/17 22:42:37 来源:https://blog.csdn.net/ANCHG_/article/details/141615397  浏览:    关键词:docker实战演练

一.docker简介

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

<1>.docker优势和特点

1. 轻量级虚拟化
       Docker 容器相较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省系统资源。例如,启动一个 Docker 容器可能只需要几秒钟,而启动一个虚拟机则可能需要几分钟。
2. 一致性
       确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。
3. 可移植性
       可以轻松地将 Docker 容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差 异。比如,在本地开发的容器可以无缝部署到云服务器上。
4. 高效的资源利用
       多个 Docker 容器可以共享主机的操作系统内核,从而更有效地利用系统资 源。
5. 易于部署和扩展
       能够快速部署新的应用实例,并且可以根据需求轻松地进行水平扩展。
       总之, Docker 极大地简化了应用程序的开发、部署和管理流程,提高了开发效率和运维的便利性。它在现代软件开发和云计算领域得到了广泛的应用。

<2>.docker与虚拟化的对比

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

二.docker部署

1.解压并安装所需要的软件

[root@docker-node1 ~]# ls
anaconda-ks.cfg        docker.tar.gz    mario.tar.gz
busybox-latest.tar.gz  game2048.tar.gz  nginx-latest.tar.gz
[root@docker-node1 ~]# tar zxf docker.tar.gz 
[root@docker-node1 ~]# ls
anaconda-ks.cfg
busybox-latest.tar.gz
containerd.io-1.7.20-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
docker-ce-27.1.2-1.el9.x86_64.rpm
docker-ce-cli-27.1.2-1.el9.x86_64.rpm
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
docker.tar.gz
game2048.tar.gz
mario.tar.gz
nginx-latest.tar.gz
[root@docker-node1 ~]# yum install *.rpm -y

2.启动服务并从归档文件中加载镜像

[root@docker-node1 ~]# systemctl enable --now 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 

3.测试:

[root@docker-node1 ~]# docker run -d --rm --name game1 -p 80:80 timinglee/game2048:latest 

[root@docker-node1 ~]# docker rm -f game1 
[root@docker-node1 ~]# docker run -d --rm --name game2 -p 80:8080 timinglee/mario:latest 

三.docker的基本操作

<1>.docker镜像管理

1.搜索镜像

[root@Docker-node1 ~]# docker search nginx

2.拉取镜像

alpine 版本: nginx 镜像的最小安装发型版本
[root@docker-node1 ~]# docker pull nginx:1.26-alpine

3.查看镜像信息

[root@Docker-node1 ~]# docker image inspect nginx:1.26-alpine

4.导出镜像

-o :指定导出镜像的位置; 可以同时导出多个镜像到一个文件中; 指定 .tar.gz 可以导出并压缩。
[root@docker-node1 ~]# docker image save -o nginx-1.26-alpine.tar.gz nginx:1.26-alpine 
[root@Docker-node1 ~]# docker save `docker images | awk 'NR>1{print $1":"$2}'` -o images.tar.gz

5.导入镜像

[root@docker-node1 ~]# docker load -i busybox-latest.tar.gz 

6.删除镜像

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

<2>.容器的常用操作

-d
后台运行
-i
交互式运行
-t
打开一个终端
--name
指定容器名称
-p
端口映射 -p 80:8080 把容器8080端口映射到本机80端口
--rm
容器停止自动删除容器
--network
指定容器使用的网络

1.启动容器

[root@Docker-node1 ~]# docker run -d --name mario -p 80:8080 timinglee/mario
[root@docker-node1 ~]# docker run -d --rm --name web1 nginx
进入到容器中,按<ctrl>+<d>退出并停止容器,按<ctrl>+<pq>退出但不停止容器
[root@docker-node1 ~]# docker run -it --name test busybox
[root@docker-node1 ~]# docker attach test           #重新进入容器
[root@docker ~]# docker exec -it test ifconfig      #在容器中执行命令 

2.查看容器运行信息

[root@Docker-node1 ~]# docker ps              #查看当前运行容器
[root@Docker-node1 ~]# docker ps -a           #查看所有容器
[root@Docker-node1 ~]# docker inspect busybox #查看容器运行的详细信息

3.停止和运行容器

容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
[root@Docker-node1 ~]# docker stop busybox     #停止容器
[root@Docker-node1 ~]# docker kill busybox     #杀死容器,可以使用信号
[root@Docker-node1 ~]# docker start busybox    #开启停止的容器

4.删除容器

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

5.容器内容提交

       默认情况下,容器被删除后,在容器中的所有操作都会被清理,包括要保存的文件,如果想永久保存,那么我们需要把动作提交,提交后会生成新的镜像,当我们在运行新镜像后即可看到我们提交的内容。此方法不利于企业审计,所以不推荐使用,在企业中我们多用 Dockerfile 来构建镜像。
[root@docker-node1 ~]# docker run -it --name test busybox
/ # touch liufile
/ # ls
bin      etc      lib      liufile  root     tmp      var
dev      home     lib64    proc     sys      usr[root@docker-node1 ~]# docker commit -m "add liufile" test busybox:v1

测试:删除旧镜像,加载新镜像

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

[root@docker-node1 ~]# docker cp test:/liufile /mnt        #把容器中的文件复制到本机
[root@Docker-node1 ~]# docker cp /etc/fstab test:/fstab    #把本机文件复制到容器中

7.查询容器内部日志

[root@Docker-node1 ~]# docker logs test

四.docker镜像构建

1.共享宿主机的kernel, base 镜像提供的是最小的 Linux 发行版, 同一 docker 主机支持运行多种 Linux 发行版, 采用分层结构的最大好处是:共享资源。
2. Copy-on-Write 可写容器层, 容器层以下所有镜像层都是只读的, docker 从上往下依次查找文件, 容器层保存镜像变化的部分,并不会对镜像本身进行任何修改, 一个镜像最多 127 层。
3.镜像构建参数
FROM
指定 base 镜像
FROM busybox:version
COPY
复制文件
COPY file /file 或者 COPY [“file”,”/”]
MAINTAINER
指定作者信息
MAINTAINER user@example.com
ADD
功能和copy相似,指定压缩文件或url
ADD test.tar /mnt 或者ADDhttp://ip/test.tar /mnt
ENV
指定环境变量
ENV FILENAME test
EXPOSE
暴漏容器端口
EXPOSE 80
VOLUME
申明数据卷,通常指数据挂载点
VOLUME [“/var/www/html”]
WORKDIR
切换路径
WORKDIR /mnt
RUN
在容器中运行的指令
touch file
CMD
在启动容器时自动运行动作可以被覆盖
CMD echo $FILENAME 会调用
shell 解析 CMD [“/bin/sh”,”-c”,“echo $FILENAME”] 不调用 shell 解析
ENTRYPOINT
CMD 功能和用法类似,但动作不可被覆盖

<1>.建立构建目录,编写构建文件

[root@docker-node1 ~]# docker load -i centos-7.tar.gz 
[root@docker-node1 ~]# mkdir docker
[root@docker-node1 ~]# cd docker/
[root@docker-node1 docker]# mv /root/nginx-1.26-alpine.tar.gz .
[root@docker-node1 docker]# vim DockerfileFROM centos:7
LABEL Mail=liu@rhel9.org
ADD nginx-1.26-alpine.tar.gz /mnt
WORKDIR nginx-1.26-alpine.tar.gz
RUN yum install -y gcc make pcre-devel openssl-devel
RUN ./configure --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;"]

<2>.通过dockerfile生成镜像

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

<3>.测试镜像可用性

[root@docker-node1 docker]# docker images nginx
REPOSITORY   TAG           IMAGE ID       CREATED       SIZE
nginx        1.26-alpine   9703b2608a98   2 weeks ago   43.3MB
nginx        v1            5ef79149e0ec   2 weeks ago   494MB

<4>.镜像优化方案

1.缩减镜像层

[root@server1 docker]# vim DockerfileFROM centos:repo 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 nginx-1.23.3 && yum clean all
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

2.多阶段构建

[root@server1 docker]# vim DockerfileFROM centos:repo 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 nginx-
1.23.3 && yum clean allFROM centos:repo
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

3.使用最精简镜像

[root@server1 new]# vim DockerfileFROM nginx:latest 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;"]

五.docker仓库构建

       Docker仓库(Docker Registry) 是用于存储和分发 Docker 镜像的集中式存储库。 它就像是一个大型的镜像仓库,开发者可以将自己创建的 Docker 镜像推送到仓库中,也可以从仓库中拉 取所需的镜像。 Docker 仓库可以分为公共仓库和私有仓库: 公共仓库,如 Docker Hub ,任何人都可以访问和使用其中的镜像。许多常用的软件和应用都有在 Docker Hub 上提供的镜像,方便用户直接获取和使用。 例如,想要部署一个 Nginx 服务器,就可以从 Docker Hub 上拉取 Nginx 的镜像。 私有仓库则是由组织或个人自己搭建和管理的,用于存储内部使用的、不希望公开的镜像。 比如,一家企业为其特定的业务应用创建了定制化的镜像,并将其存储在自己的私有仓库中, 以保证安全性和控制访问权限。 通过 Docker 仓库,开发者能够方便地共享和复用镜像,加速应用的开发和部署过程。

<1>.搭建简单的registry仓库

1.导入Registry镜像
[root@docker-node1 ~]# docker load -i registry.tag.gz
2.开启Registry
[root@docker-node1 ~]# docker run -d -p 5000:5000 --restart=always --name registry registry
3.给要上传的镜像打标签,上传镜像到仓库中
[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 
4.配置非加密端口
[root@docker-node1 ~]# vim /etc/docker/daemon.json {
"insecure-registries" : ["http://172.25.254.100:5000"]
}[root@docker-node1 ~]# systemctl restart docker

5.上传镜像并查看

[root@docker-node1 ~]# docker push 172.25.254.100:5000/busybox:latest 
[root@docker-node1 ~]# curl 172.25.254.100:5000/v2/_catalog
{"repositories":["busybox"]}

6.Registry提加密传输

(1).为Registry提加密传输,生成认证key和证书

[root@docker-node1 ~]# mkdir certs
[root@docker-node1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/rhel9.org.key -addext "subjectAltName = DNS:www.rhel9.org" -x509 -days 365 -out certs/rhel9.org.crt
(2).启动 registry 仓库
[root@docker-node1 ~]# docker run -d -p 443:443 --restart=always --name registry --name registry1 -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/rhel9.org.crt  -e REGISTRY_HTTP_TLS_KEY=/certs/rhel9.org.key registry

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

(4).测试:上传镜像

[root@docker-node1 ~]# docker push www.rhel9.org/busybox:latest
[root@docker-node1 ~]# curl -k https://www.rhel9.org/v2/_catalog
{"repositories":["busybox"]}
7.为仓库建立登陆认证
(1). 安装建立认证文件的工具包
[root@docker-node1 ~]# dnf install httpd-tools -y
(2).建立认证文件
[root@docker-node1 ~]# mkdir auth
[root@docker-node1 ~]# htpasswd -Bc auth/htpasswd rhel9   #-B 强制使用最安全加密方式,默认用md5加密
New password: 
Re-type new password: 
Adding password for user rhel9
(3).添加认证到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/rhel9.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/rhel9.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
[root@docker-node1 ~]# curl -k https://www.rhel9.org/v2/_catalog -u rhel9:123456
{"repositories":["busybox"]}

(4).登陆测试

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

<2>.搭建企业级私有仓库

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.ymlhostname: www.rhel9.org
certificate: /data/certs/rhel9.org.crt
private_key: /data/certs/rhel9.org.key
harbor_admin_password: 123456[root@docker-node1 harbor]# cp /root/certs/ /data/ -r
[root@docker-node1 harbor]# ./install.sh --with-chartmuseum

2.管理仓库

[root@docker-node1 harbor]# docker compose stop      #停止服务
[root@docker-node1 harbor]# docker compose up -d     #启动并后台运行

(1).登录

用户名:admin

2.建立仓库项目

3.上传镜像
[root@docker-node1 harbor]# docker login www.rhel9.org                      #登录
[root@docker-node1 harbor]# docker tag busybox:latest                       #给要上传的镜像打标签
[root@docker-node1 harbor]# docker push www.rhel9.org/liu/busybox:latest    #上传镜像

六.docker网络

七.docker数据卷管理及优化

八.docker的安全优化

九.容器编排工具

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com