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进程通信实现容器的构建,运行和发布。clientserver可以运行在同一台集群,也可以通过跨主机实现远程通信。

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

docker login | Docker Docs

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

docker login | Docker Docs

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

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐