一.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 #上传镜像