What is docker?
Docker是一个开源的应用容器引擎,它基于Go语言开发,并遵从Apache2.0协议。Docker允许开发者将他们的应用以及依赖包打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,同时也可以实现虚拟化。以下是关于Docker的详细解释:
一、Docker的核心概念
- 容器(Container):容器是Docker的核心组件,它是从镜像创建的运行实例。容器是完全使用沙箱机制,相互之间不会有任何接口,确保了容器的安全性和隔离性。容器可以被启动、停止、删除,并且每个容器都是一个独立的、保证安全的平台。
- 镜像(Image):镜像是Docker容器的只读模板,用于创建Docker容器。一个镜像可以创建多个容器,并且镜像可以被更新或替换。Docker提供了一个简单的机制来创建或更新镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
- 仓库(Repository):仓库是集中存放镜像文件的场所,类似于代码仓库。用户可以从仓库中拉取或推送镜像,以便在不同的环境中部署应用。
二、Docker的架构
Docker使用客户端-服务器(C/S)架构模式,其中Docker客户端与Docker守护进程(Daemon)进行通信。Docker守护进程作为服务端接受来自客户端的请求,并处理这些请求(如创建、运行、分发容器等)。客户端和服务端既可以运行在一个机器上,也可以通过socket或者RESTful API来进行通信。
三、Docker的优势
- 轻量级:与传统的虚拟机相比,Docker容器更加轻量级,因为它们直接复用本地主机的操作系统,而不需要额外的操作系统层。
- 高效性:Docker容器启动速度快,资源占用少,使得应用程序可以更快地部署和迭代。
- 可移植性:Docker容器可以在不同的操作系统和环境中运行,确保了应用程序的一致性和可移植性。
- 隔离性:Docker容器使用沙箱机制,相互之间不会有任何接口,确保了容器的安全性和隔离性。
四、Docker的应用场景
- Web应用的自动化打包和发布:Docker可以自动化地打包和发布Web应用,使得开发、测试和部署过程更加高效。
- 自动化测试和持续集成:Docker可以用于自动化测试和持续集成环境,确保代码的质量和稳定性。
- 在服务型环境中部署和调整数据库:Docker可以用于在服务型环境中部署和调整数据库或其他后台应用,提高了服务的可用性和可扩展性。
- 搭建PaaS环境:Docker可以用于从头编译或扩展现有的PaaS平台(如OpenShift或Cloud Foundry),搭建自己的PaaS环境。
五、Docker的局限性
- 隔离性相对有限:虽然Docker容器提供了隔离性,但与KVM等虚拟化方案相比,其隔离性还是有所欠缺。
- 网络管理相对简单:Docker的网络管理相对简单,主要是基于namespace隔离,与KVM等虚拟化方案相比,其网络功能可能不够强大。
- 对disk的管理比较有限:Docker对disk的管理比较有限,container随着用户进程的停止而销毁,container中的log等用户数据不便收集。
综上所述,Docker是一个强大的应用容器引擎,它提供了轻量级、高效性、可移植性和隔离性等优势,广泛应用于Web应用的自动化打包和发布、自动化测试和持续集成、服务型环境部署以及PaaS环境搭建等场景。然而,Docker也存在一些局限性,如隔离性相对有限、网络管理相对简单以及对disk的管理比较有限等。因此,在选择是否使用Docker时,需要根据具体的应用场景和需求进行权衡。
How to use docker??
rhel9部署docker
1.配置软件仓库
[root@docker ~]# cd /etc/yum.repos.d/
[root@docker yum.repos.d]# ls
redhat.repo rhel9.repo
[root@docker yum.repos.d]# vim docker.repo
[root@docker yum.repos.d]# cat dockere.repo
[docker]
name=docker
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9/x86_64/stable/ #清华镜像站
gpgcheck=0
2.安装docker
1、yum install -y docker
2、yum install -y docker-engine
3、yum install -y docker-ce #最常用下载方式
因为Docker最早的版本名是docker和docker-engin,现在的名字是docker-ce和docker-ee。有兴趣的小伙伴可以通过下方链接去官网查看。
docker 官方网站https://docs.docker.com/engine/install/centos/因为docker官网对国内网络不友好
可以前往阿里云等国内大厂的镜像站找资源
阿里云docker地址https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.57e31b118oYRXi
docker对于镜像的操作
1.查找镜像
docker search mysql
2.拉取镜像
docker pull mysql
3.查看镜像
docker image
4.删除镜像
docker rmi ID #这里的ID是上文的image id
docker 容器的操作
1.启动容器
docker run -d --name mario -p 80:8080 timinglee/mario
2.查看容器
docker ps
3.停止容器
docker stop [id]
4.删除容器
docker rm [id]
docker镜像构建
1.构建参数
2.dockerfile实例
1.在一号虚拟机下载httpd并设置开机自启
[root@yhm1 ~]# mount /dev/cdrom /mnt/
mount: /mnt: WARNING: device write-protected, mounted read-only.
[root@yhm1 ~]# yum -y install httpd
[root@yhm1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
2.上传扫雷的软件包
[root@yhm1 ~]# cd /var/www/html/
[root@yhm1 html]# yum install -y lrzsz
[root@yhm1 html]# rz -E
rz waiting to receive.
[root@yhm1 html]# ll
total 244
-rw-r--r--. 1 root root 247278 Aug 30 20:53 saolei.zip
3.关闭防火墙
[root@yhm1 ~]# systemctl stop firewalld
[root@yhm1 ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@yhm1 ~]# vim /etc/selinux/config
...
SELINUX=disabled
...
4.部署Dockerfile
[root@yhm2 ~]# yum -y install lrzsz
[root@yhm2 ~]# rz -E
rz waiting to receive.
[root@yhm2 ~]# rz -E
rz waiting to receive.
5.构建镜像
[root@yhm2 ~]# docker build -t saolei:z1 .
Successfully built fe682460e4a1
Successfully tagged saolei:z1
6.运行容器
[root@yhm2 ~]# docker run -d --name yuhemiao -p 8081:8080 saolei:z1
976a6d90b47009128aae9f4ffde8ce911868735d5fb23d52176cd18dbbbaeef9
[root@yhm2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
976a6d90b470 saolei:z1 "/bin/bash /init.sh" 3 seconds ago Up 3 seconds 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp yuhemiao
docker仓库管理
官网https://hub.docker.com/进行注册登录
登录信息保存位置
[root@docker ~]# cd .docker/
[root@docker docker]# ls
buildx config.json
[root@docker docker]# cat config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "MTsdasdOlpYenhjdmJubQ=="
}
}
}
打标记上传docker
[root@docker ~]# docker tag webserver:v1 hhd/webserver:v1
[root@docker ~]# docker push hhd/webserver:v1
搭建Registry仓库
下载Registry镜像
[root@docker ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
86c1d3af3872: Pull complete
a37b1bf6a96f: Pull complete
Digest: sha256:12120425f07de11a1b899e418d4b0ea174c8d4d572d45bdb640f93bc7ca06a3d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
开启Registry
[root@docker ~]# docker run -d -p 5000:5000 --restart=always --name registry registry
bc58d3753a701ae67351fac335b06a4d7f66afa10ae60b992f647117827734c5
[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
上传镜像到仓库中
[root@docker ~]# docker tag busybox:latest 172.25.254.100:5000/busybox:latest
[root@docker ~]# 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/": dial tcp 172.25.254.100:5000: connect: connection refused
[root@docker ~]# vim /etc/docker/daemon.json
{
"insecure-registries" : ["http://172.25.254.100:5000"]
}
[root@docker ~]# systemctl restart docker
[root@docker ~]# 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 ~]# curl 172.25.254.100:5000/v2/_catalog
{"repositories":["busybox"]}
为Registry提加密传输
为仓库建立登陆认证
#安装建立认证文件的工具包
[root@docker docker]# dnf install httpd-tools -y
#建立认证文件
[root@docker ~]# mkdir auth
[root@docker ~]# htpasswd -Bc auth/htpasswd timinglee #-B 强制使用最安全加密方式,默认用md5加密
New password:
Re-type new password:
Adding password for user timinglee
#添加认证到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/timinglee.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/timinglee.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 ~]# curl -k https://reg.timinglee.org/v2/_catalog -u timinglee:lee
{"repositories":["busybox","nginx"]}
#登陆测试
[root@docker ~]# docker login reg.timinglee.org
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 ~]# docker push reg.timinglee.org/busybox
Using default tag: latest
The push refers to repository [reg.timinglee.org/busybox]
d51af96cf93e: Preparing
no basic auth credentials
#未登陆请款下也不能下载
[root@docker-node2 ~]# docker pull reg.timinglee.org/busybox
Using default tag: latest
Error response from daemon: Head "https://reg.timinglee.org/v2/busybox/manifests/latest": no basic auth credentials
部署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
[root@docker harbor]# vim harbor.yml
hostname: reg.timinglee.org
certificate: /data/certs/timinglee.org.crt
private_key: /data/certs/timinglee.org.key
harbor_admin_password: lee
[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
[root@docker harbor]# docker compose stop
[root@docker harbor]# docker compose up -d
#上传镜像
[root@docker harbor]# docker login reg.timinglee.org
Username: 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.timinglee.org/timinglee/busybox:latest
[root@docker harbor]# docker push reg.timinglee.org/timinglee/busybox:latest
The push refers to repository [reg.timinglee.org/timinglee/busybox]
d51af96cf93e: Pushed
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527
docker网络
Docker网络是Docker容器之间的通信桥梁,它允许容器通过网络连接到其它容器,从而在容器群集中传输数据。以下是对Docker网络的详细介绍:
一、Docker网络的概念
Docker网络是一种用于连接Docker容器的网络技术,它使用虚拟网络,使容器可以通过虚拟网络进行通信。Docker网络支持多种类型的网络,包括但不限于网桥模式(bridge)、容器间网络、网络隔离、多主机网络(如Overlay网络)等。这些网络类型使用不同的网络驱动程序,为容器提供最佳的网络性能和功能。
二、Docker网络的主要类型
- Bridge网络模式:这是Docker的默认网络模式。它创建一个名为docker0的虚拟网络桥接,容器之间以及容器与宿主机之间可以通过这个桥接进行通信。每个容器都会分配一个IP地址,用于在桥接网络中通信。
- Host网络模式:在此模式下,容器直接使用宿主机的网络栈,不会被分配单独的IP地址。容器与宿主机之间没有网络隔离,可以直接访问宿主机的网络资源和端口。
- None网络模式:在此模式下,容器没有网络接口和IP地址,通常用于不需要网络通信的容器。
- Overlay网络模式:这是一种用于跨主机通信的网络模式,它允许容器在不同的主机上运行,并通过Overlay网络进行通信。这个网络模式通常用于构建分布式系统。
三、Docker网络配置与管理
- 创建网络:使用
docker network create
命令可以创建一个新的网络。例如,docker network create my_network
会创建一个名为my_network的网络。 - 连接容器:使用
docker run
命令创建新的容器时,可以通过--network
参数指定要连接的网络。例如,docker run --network my_network --name my_container -it ubuntu
会创建一个名为my_container的Ubuntu容器,并将其连接到my_network网络。 - 网络设置:Docker网络支持多种设置,如IP地址分配、路由、DNS配置等。例如,可以使用
--ip
参数为容器指定IP地址,使用--dns
参数配置DNS服务器,使用--gateway
参数设置默认网关等。 - 网络管理:Docker提供了丰富的网络管理命令,如
docker network connect
、docker network disconnect
、docker network inspect
、docker network ls
、docker network prune
和docker network rm
等,用于连接、断开、查看、列出、清理和删除网络。
四、Docker网络的性能优化与安全性
- 性能优化:Docker支持设置虚拟网络,允许为容器分配指定的IP地址,从而有效地提高网络性能。此外,还可以使用网络代理、缓存机制、网络优化技术和网络分片技术等手段来加快网络速度、降低网络延迟。
- 安全性:Docker网络的安全性至关重要。为了确保容器的网络安全,应该采用安全的网络架构,如建立防火墙和VPN等;使用复杂的用户名和密码以及安全的认证机制;使用SSL等安全的加密技术;实施安全的网络控制策略;并考虑使用容器安全工具来加强网络安全防护。