Linux学习24-docker相关
docker简介
Docker 是一个基于 Go 语言开发的开源容器化平台,由 Solomon Hykes 于 2013 年首次发布,现由 Docker, Inc. 维护,它通过操作系统级别的虚拟化技术,将应用程序及其所有依赖项(运行时、系统工具、库、配置文件等)打包为一个轻量级、可移植的标准化单元——容器(Container),从而实现"一次构建,随处运行"的交付目标
核心架构
Docker 采用 客户端-服务端(Client-Server) 架构:
Docker Daemon(dockerd):运行在宿主机上的后台守护进程,负责镜像的构建、容器的创建与管理、网络配置、存储卷挂载等核心操作。
Docker Client(docker CLI):用户与 Docker 交互的命令行工具,通过 REST API 与 Daemon 通信,发送指令并接收响应。
Registry(镜像仓库):集中存储和分发镜像的服务,Docker Hub 是其官方公共仓库,企业通常部署私有仓库(如 Harbor)用于内部镜像管理。
docker部署
配置yum源

安装yum工具
![]()
下载docker社区版
![]()
启动服务

下载管理网络桥接的工具包
![]()
查看docker

配置 Linux 内核的网络参数,为 Docker 运行做前置准备
让经过桥接网卡的 IPv4 流量也走 iptables 规则,使Docker 的端口映射、容器隔离等网络功能正常工作

针对ipv6

开启 IP 转发。允许宿主机把数据包从一个网卡转发到另一个网卡,允许容器访问外网
![]()
重新加载配置文件,使修改生效
![]()
使用
从指定的镜像仓库docker.1ms.run中搜索yakexi007所有公开的镜像

从镜像仓库下载(拉取)mario镜像到本地
![]()
拉取完成后运行镜像,在浏览器访问该机ip即可
docker run -d --name demo -p 80:80 docker.1ms.run/yakexi007/mario
可以使用docker ps查看镜像情况
docker基本概念
镜像(Image)
Docker 镜像(Image)就是一个只读的模板、一个标准化包。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。镜像内包含操作系统,提供容器运行时所需的所有文件、二进制文件、库和配置等文件外,还包含了一些为运行时准备的一些配置参数(如环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变
镜像有两个重要原则:
- 镜像是不可变的。镜像一旦创建,就无法修改。您只能创建新镜像或在其上添加更改。
- 容器镜像由层组成。每层代表一组添加、删除或修改文件的文件系统更改。
容器(Container通过镜像创建)
Docker 利用容器(Container)独立运行的一个或一组应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的空间,因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(存放镜像的地方)
仓库类似于应用商店,存放的是docker镜像,分为公开仓库跟私有仓库。通常,仓库可以包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<镜像名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest作为默认标签。
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
Docker使用C/S架构,Client通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。


docker仓库
docker hub

首先注册账号 : https://hub.docker.com/
新建仓库

客户端登录docker hub
[root@server1 ~]# docker login
Login with your Docker ID 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.
Username: yakexi007 #docker hub注册的用户
Password: **** #密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
Login Succeeded
上传镜像
[root@server1 ~]# docker tag webserver:v4 yakexi007/webserver:v4
[root@server1 ~]# docker push yakexi007/webserver:v4
The push refers to repository [docker.io/yakexi007/webserver]
bbed3d4e37e0: Pushed
0b3d0512394d: Pushed
5b1fa8e3e100: Pushed
v4: digest: sha256:013969b9116df5dc77ddaef6c500129439e9db94f46b61b148b43e53900623e5 size: 949
registry私有仓库
官网: Deprecated and retired Docker products and features | Docker Docs
拉取registry镜像
docker pull registry
运行registry仓库
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
列出容器
docker ps -l
配置仓库自启动
vim /etc/systemd/system/registry.service
内容如下:
[Unit]
Description=Registry
Requires=docker.service
After=docker.service
[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/docker start -a registry
ExecStop=/usr/bin/docker stop registry
[Install]
WantedBy=multi-user.target
刷新配置
systemctl daemon-reload
停止容器
docker stop registry
设置开机自启
systemctl enable --now registry
docker ps -l
上传镜像
docker tag busybox:latest localhost:5000/busybox:latest
docker push localhost:5000/busybox
查询镜像
[root@server1 ~]# curl http://localhost:5000/v2/_catalog
{"repositories":["busybox"]}
[root@server1 ~]# curl http://localhost:5000/v2/busybox/tags/list
{"name":"busybox","tags":["latest"]}
下载镜像
[root@server1 ~]# docker pull localhost:5000/busybox
insecure registry
配置使用非加密端口(替换为实际仓库IP)
[root@server2 ~]# vim /etc/docker/daemon.json
{
"insecure-registries" : ["http://192.168.56.11:5000"]
}
[root@server2 docker]# systemctl restart docker
拉取镜像
[root@server2 docker]# docker pull 192.168.56.11:5000/nginx
仓库加密
下载并升级软件包(Rocky Linux 9 无需安装)
https://mirrors.aliyun.com/epel/7/x86_64/Packages/o/openssl11-1.1.1k-7.el7.x86_64.rpm
https://mirrors.aliyun.com/epel/7/x86_64/Packages/o/openssl11-libs-1.1.1k-7.el7.x86_64.rpm
[root@server1 ~]# yum install -y openssl11-1.1.1k-7.el7.x86_64.rpm openssl11-libs-1.1.1k-7.el7.x86_64.rpm
添加域名解析
[root@server1 ~]# vim /etc/hosts
...
192.168.56.11 server1 reg.westos.org
[root@server1 ~]# mkdir certs
[root@server1 ~]# openssl11 req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -addext "subjectAltName = DNS:reg.westos.org" -x509 -days 365 -out certs/westos.org.crt
域名保持一致

[root@server1 ~]# 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/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key registry
部署客户端证书,不然会报错
[root@server1 ~]# docker tag nginx:latest reg.westos.org/nginx:latest
[root@server1 ~]# docker push reg.westos.org/nginx:latest The push refers to repository [reg.westos.org/nginx]
Get "https://reg.westos.org/v2/": x509: certificate signed by unknown authority
[root@server1 ~]# mkdir -p /etc/docker/certs.d/reg.westos.org/
[root@server1 ~]# cp /root/certs/westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt
验证
[root@server1 ~]# docker push reg.westos.org/nginx:latest
[root@server1 reg.westos.org]# curl -k https://reg.westos.org/v2/_catalog
{"repositories":["nginx"]}
仓库认证
[root@server1 ~]# yum install -y httpd-tools
[root@server1 ~]# mkdir auth
[root@server1 ~]# htpasswd -Bc auth/htpasswd admin
New password:
Re-type new password:
Adding password for user admin
第二次添加不要加“-c”选项,不然会覆盖
[root@server1 ~]# htpasswd -B auth/htpasswd wxh
New password:
Re-type new password:
Adding password for user wxh
[root@server1 ~]# cat auth/htpasswd
admin:$2y$05$Wm2LHttPY5a6i2KMG0fShe92d/PjnaBbGitiClcE3wqHmwO8dIDFm
wxh:$2y$05$9rE9CXyZ1fdcMammhh7f6.soDHgKdSsi0DXBgkRW5sKRw5sEJo1lK
删除registry,重建
[root@server1 ~]# docker rm -f registry
[root@server1 ~]# 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/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.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@server1 ~]# docker login reg.westos.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/#credentials-store
Login Succeeded
[root@server1 ~]# cat .docker/config.json
{
"auths": {
"reg.westos.org": {
"auth": "YWRtaW46d2VzdG9z"
}
}
}
验证
[root@server1 ~]# docker tag busybox:latest reg.westos.org/busybox:latest
[root@server1 ~]# docker push reg.westos.org/busybox:latest
[root@server1 ~]# curl -k https://reg.westos.org/v2/_catalog -u admin:westos
{"repositories":["busybox","nginx"]}
登出
[root@server1 ~]# docker logout reg.westos.org
server2上移除非安全仓库设置
[root@server2 docker]# mv daemon.json /mnt/
[root@server2 docker]# systemctl restart docker
添加解析
[root@server2 ~]# vim /etc/hosts
...
192.168.56.11 (替换为自己的ip)server1 reg.westos.org
拷贝证书
[root@server1 ~]# cd /etc/docker/
[root@server1 ~]# scp -r certs.d/ server2:/etc/docker/
登录远程仓库
[root@server2 docker]# docker login reg.westos.org
Username: wxh
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
Login Succeeded
拉取镜像
[root@server2 docker]# docker pull reg.westos.org/busybox
Using default tag: latest
latest: Pulling from busybox
205dae5015e7: Pull complete
Digest: sha256:907ca53d7e2947e849b839b1cd258c98fd3916c60f2e6e70c30edbf741ab6754
Status: Downloaded newer image for reg.westos.org/busybox:latest
reg.westos.org/busybox:latest
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)