> 文档中心 > 探索云原生技术之基石-Docker容器入门篇(3)

探索云原生技术之基石-Docker容器入门篇(3)


❤️💛🧡💚💔🖤💜💙❤💕💞💓💗❣️💝💘💖❤️💛🧡💚💔🖤💜💙❤💕💞💓💗❣️💝💘💖💖💖 💖

❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💖

💛博客首页:C站个人主页🌞                                    💖

💗作者目的:如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门,共同进步!      💖
❤️💛🧡💚💔🖤💜💙❤💕💞💓💗❣️💝💘💖❤️💛🧡💚💔🖤💜💙❤💕💞💓💗❣️💝💘💖💖💖 💖

文章目录

    • 探索云原生技术之基石-Docker容器入门篇(3)
      • 什么是云原生
      • 什么是Docker
      • 本地镜像对接阿里云
        • 本地服务器登录阿里云
        • 创建命名空间
        • 创建镜像仓库
        • 本地镜像推送阿里云
        • 推送本地镜像(实战)
      • 从阿里云镜像仓库拉取镜像
        • 从阿里云镜像仓库拉取镜像(实战)
      • 本地镜像与私服库 docker registry
      • 安装 ifconfig 并发布私服库
        • 查看私服库中的镜像
        • 记得要先运行私服库的镜像
        • 将本地镜像上传私服库(实战)
          • 标记本地镜像
          • 开始推送
          • 推送出现问题(报错)
        • 拉取私服库镜像
      • 容器数据卷(volume)
        • 容器挂载数据卷
        • 模拟当容器被删除后数据是否能同步(实战)
        • 查看容器挂载数据卷
        • 容器数据卷的读写权限(只能限制容器的操作,而不是宿主机)

探索云原生技术之基石-Docker容器入门篇(3)

本博文一共有7篇,如下

  • 探索云原生技术之基石-Docker容器入门篇(1)
  • 探索云原生技术之基石-Docker容器入门篇(2)
  • 探索云原生技术之基石-Docker容器入门篇(3)
  • 探索云原生技术之基石-Docker容器入门篇(4),=>由于篇幅过长,所以另起一篇

等你对Docker有一定理解的时候可以看高级篇,不过不太建议。

  • 探索云原生技术之基石-Docker容器高级篇(1)
  • 探索云原生技术之基石-Docker容器高级篇(2)
  • 探索云原生技术之基石-Docker容器高级篇(3)-视情况而定

剧透:未来将出云原生技术-Kubernetes(k8s),此时的你可以对Docker进行统一管理、动态扩缩容等等。

看完之后你会对Docker有一定的理解,并能熟练的使用Docker进行容器化开发、以及Docker部署微服务、Docker网络等等。干起来!

什么是云原生

Pivotal公司的Matt Stine于2013年首次提出云原生(Cloud-Native)的概念;2015年,云原生刚推广时,Matt Stine在《迁移到云原生架构》一书中定义了符合云原生架构的几个特征:12因素、微服务、自敏捷架构、基于API协作、扛脆弱性;到了2017年,Matt Stine在接受InfoQ采访时又改了口风,将云原生架构归纳为模块化、可观察、可部署、可测试、可替换、可处理6特质;而Pivotal最新官网对云原生概括为4个要点:DevOps+持续交付+微服务+容器

总而言之,符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。

此处摘选自《知乎-华为云官方帐号》

在这里插入图片描述

什么是Docker

  • Docker 是一个开源的应用容器引擎,基于Go语言开发。
  • Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
  • 容器是完全使用沙箱机制(容器实例相互隔离),容器性能开销极低(高性能)。

总而言之:

Docker是一个高性能的容器引擎;

可以把本地源代码、配置文件、依赖、环境通通打包成一个容器即可以到处运行;

使用Docker安装软件十分方便,而且安装的软件十分精简,方便扩展。

本地镜像对接阿里云

本地服务器登录阿里云

  • 这个username需要自己改成你的,这个是我的。
  • 然后输入密码即可。
sudo docker login --username=游政杰eee registry.cn-hangzhou.aliyuncs.com
  • 登录成功提示。
Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. SeeLogin Succeeded
  • 只有登录了才能进行下面的操作。

创建命名空间

  • 1:阿里云命名空间
  • 2:点击创建命令空间,输入名称即可。例如:my_cloud_namespace(我的命名空间)

创建镜像仓库

  • 有了命名空间,我们才可以创建镜像仓库

本地镜像推送阿里云

  • 推送命令如下:
$ docker login --username=游政杰eee registry.cn-guangzhou.aliyuncs.com$ docker tag [ImageId] registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:[镜像版本号]$ docker push registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:[镜像版本号]
  • docker login:
[root@aubin ~]# docker login --helpUsage:  docker login [OPTIONS] [SERVER]Log in to a Docker registry.If no server is specified, the default is defined by the daemon.Options:  -p, --password string   Password      --password-stdin    Take the password from stdin  -u, --username string   Username
  • docker push:
[root@aubin ~]# docker push --helpUsage:  docker push [OPTIONS] NAME[:TAG]Push an image or a repository to a registryOptions:  -a, --all-tags  Push all tagged images in the repository      --disable-content-trust   Skip image signing (default true)  -q, --quiet     Suppress verbose output

推送本地镜像(实战)

查看镜像

[root@aubin ~]# docker imagesREPOSITORY   TAGIMAGE IDCREATED SIZEmyubuntu     6.65a035af5ac0c   2 hours ago    176MB
  • 我们要推送的就是这个myubuntu镜像

登录阿里云帐号

[root@aubin ~]# docker login --username=游政杰eee registry.cn-guangzhou.aliyuncs.comPassword: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. SeeLogin Succeeded
  • 指定上传的镜像
$ docker tag 5a035af5ac0c registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.66
  • 正式推送刚刚指定上传的镜像
$ docker push registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.66
  • 成功推送到阿里云镜像仓库了!
[root@aubin ~]# docker push registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.77The push refers to repository [registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository]tag does not exist: registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.77[root@aubin ~]# docker push registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.66The push refers to repository [registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository]11e2b5ff8e45: Pushed 9f54eef41275: Pushed 6.66: digest: sha256:a82e46b4b3a681b744a69df935dccab1ad9d901e257abb297610c9d995f2a83b size: 741

从阿里云镜像仓库拉取镜像

  • shell命令如下:
$ docker pull registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:[镜像版本号]

从阿里云镜像仓库拉取镜像(实战)

$ docker pull registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.66
  • 拉取成功了!
[root@aubin ~]# docker pull registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.666.66: Pulling from my_cloud_namespace/my_cloud_repository7b1a6ab2e44d: Already exists 58ab36472911: Pull complete Digest: sha256:a82e46b4b3a681b744a69df935dccab1ad9d901e257abb297610c9d995f2a83bStatus: Downloaded newer image for registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.66registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.66
[root@aubin ~]# docker imagesREPOSITORY   TAGIMAGE IDCREATED SIZEregistry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository   6.66      5a035af5ac0c   3 hours ago  
  • 运行我们从镜像仓库拉取的镜像
docker run -it 5a035af5ac0c

本地镜像与私服库 docker registry

  • 在 Docker 中,当我们执行 docker pull 去拉取镜像的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,而且十分的慢这就是Docker公司为我们提供的公共仓库(DockerHub)。在工作中,我们不可能把企业项目push到公有仓库进行管理。所以为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。
  • docker 官方提供了一个搭建私有仓库的镜像 registry使用十分简单只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了
[root@aubin ~]# docker search registryNAME   DESCRIPTION  STARS     OFFICIAL   AUTOMATEDregistry      The Docker Registry 2.0 implementation for s…   3564      [OK]google/docker-registry      Docker Registry w/ Google Cloud Storage driv…   48     docker/dtr    Docker Trusted Registry    14     deis/registry Docker image registry for the Deis open sour…   12     ibmcom/isam-openldap This image provides a user registry which ca…   10     vmware/registry     6      docker/migrator      Tool to migrate Docker images from a v1 regi…   5      [OK]ibmcom/verify-access-openldap      This image provides a user registry which ca…   3      ibmcom/registry-ppc64le     Docker Image for IBM Cloud Private-CE (Commu…   2      ibmcom/registry-s390x      1      ibmcom/wazi-code-dev-file   A Devfile registry container for IBM® Wazi f…   1      ibmcom/wazi-code-plugin     A Plugin registry container for IBM® Wazi fo…   1      ibmcom/registry      Docker Image for IBM Cloud private-CE (Commu…   1      snyk/container-registry-agent      Container registry agent allows securely con…   1      vmware/registry-photon     0      okteto/registry-configurator      0      docker/trusted-registry-index      Search Index for Docker Trusted Registry 0      ibmcom/reg-crawler   Docker Image for IBM Cloud Private-CE (Commu…   0      okteto/registry     0      okteto/registry-auth0      ibmcom/registry-amd64      0      store/microsoft/defaultpublisher   This image contains the Azure Industrial IoT…   0      store/microsoft/defaultpublisher   This image contains the Azure Industrial IoT…   0      store/microsoft/defaultpublisher   This image contains the Azure Industrial IoT…   0      astronomerinc/ap-registry   Docker registry for the Astronomer Platform.    0    
$ docker pull registry

运行私服库

$ docker run -d -p 5000:5000 -v /youzhengjie/myregistry/:/tmp/registry --privileged=true registry

安装 ifconfig 并发布私服库

  • 因为我们的容器没有关闭,所以直接用exec进入容器:
docker exec -it f82b9b4f63b0 /bin/bash
  • 使用ifconfig命令,发现并没有:
root@f82b9b4f63b0:/# ifconfig      bash: ifconfig: command not found
  • 安装ifconfig

更新

$ apt-get update

安装

$ apt-get install net-tools

安装成功了:

root@f82b9b4f63b0:/# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500 inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255 ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet) RX packets 20000  bytes 43325081 (43.3 MB) RX errors 0  dropped 0  overruns 0  frame 0 TX packets 13564  bytes 743065 (743.0 KB) TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536 inet 127.0.0.1  netmask 255.0.0.0 loop  txqueuelen 1000  (Local Loopback) RX packets 0  bytes 0 (0.0 B) RX errors 0  dropped 0  overruns 0  frame 0 TX packets 0  bytes 0 (0.0 B) TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

退出容器

ctrl p+q 

使用docker commit生成新镜像

docker commit -a youzhengjie -m iconfig f82b9b4f63b0 ifconfigubuntu:2.0

查看新镜像

[root@aubin ~]# docker imagesREPOSITORY   TAGIMAGE IDCREATED   SIZEifconfigubuntu      2.0a9683693b1c6   10 seconds ago   176MB

查看私服库中的镜像

  • ip:使用ifconfig查询替换上去即可

ifconfig: 192.168.184.132就是我的ip

[root@aubin ~]# ifconfigens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500 inet 192.168.184.132  netmask 255.255.255.0  broadcast 192.168.184.255 inet6 fe80::5c87:5037:8d1d:7650  prefixlen 64  scopeid 0x20<link> ether 00:0c:29:23:28:59  txqueuelen 1000  (Ethernet) RX packets 169226  bytes 186477878 (177.8 MiB) RX errors 0  dropped 0  overruns 0  frame 0 TX packets 84828  bytes 11617557 (11.0 MiB) TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 命令格式如下:
curl -XGET http://ip:5000/v2/_catalog

记得要先运行私服库的镜像

  • 下面这种情况就是没有运行私服库镜像。
[root@aubin ~]# curl -XGET http://ip:5000/v2/_catalogcurl: (7) Failed connect to 192.168.184.132:5000; Connection refused
  • 运行私服库
docker run -d -p 5000:5000 -v /youzhengjie/myregistry/:/tmp/registry --privileged=true registry
  • 再次查询
[root@aubin ~]# curl -XGET http://ip:5000/v2/_catalog{"repositories":[]}

将本地镜像上传私服库(实战)

[root@aubin ~]# docker imagesREPOSITORY   TAGIMAGE IDCREATED   SIZEifconfigubuntu      2.0a9683693b1c6   12 minutes ago   176MB
标记本地镜像
$ docker tag ifconfigubuntu:2.0 192.168.184.132:5000/configubuntu:3.3
开始推送
$ docker push 192.168.184.132:5000/configubuntu:3.3
推送出现问题(报错)
  • 报错提示:
[root@aubin ~]# docker push 192.168.184.132:5000/configubuntu:3.3The push refers to repository [192.168.184.132:5000/configubuntu]Get "https://192.168.184.132:5000/v2/": http: server gave HTTP response to HTTPS client

解决方法

vim /etc/docker/daemon.json 
  • 修改后的配置文件
{  "registry-mirrors": ["https://u01jo9qv.mirror.aliyuncs.com"],  "insecure-registries":["192.168.184.132:5000"]}
  • 重启docker
$ systemctl restart docker
  • 重新运行私服库
docker run -d -p 5000:5000 -v /youzhengjie/myregistry/:/tmp/registry --privileged=true registry
  • 重新推送
$ docker push 192.168.184.132:5000/configubuntu:3.3
  • OK啦,推送成功!
[root@aubin ~]# docker push 192.168.184.132:5000/configubuntu:3.3The push refers to repository [192.168.184.132:5000/configubuntu]c45dd515854c: Pushed 9f54eef41275: Pushed 3.3: digest: sha256:b59453f0561ec74a3703a16f7de9c41c34c91cb361410abeb9ea82da2b73f67a size: 741

查询私服库

[root@aubin ~]# curl -XGET http://ip:5000/v2/_catalog{"repositories":["configubuntu"]}

拉取私服库镜像

[root@aubin ~]# docker pull 192.168.184.132:5000/configubuntu:3.33.3: Pulling from configubuntu7b1a6ab2e44d: Already exists b71359a660f3: Pull complete Digest: sha256:b59453f0561ec74a3703a16f7de9c41c34c91cb361410abeb9ea82da2b73f67aStatus: Downloaded newer image for 192.168.184.132:5000/configubuntu:3.3192.168.184.132:5000/configubuntu:3.3

容器数据卷(volume)

  • 格式:docker run -v 宿主机目录 : 容器目录 镜像名
  • -v:指定(volume)容器数据卷目录。
  • 效果:指定宿主机目录容器目录相互连通,无论修改那一方的目录文件,两者都会立刻同步。
  • 作用:生产环境中,我们每一个容器实例都要进行容器数据卷(volume),这样一来,即使容器被删除了,数据也不至于丢失,起到持久化的效果,比如MySQL数据库的data,如果没有容器数据卷,那么当这个MySQL容器实例被rm之后数据将不复存在,这是很恐怖的事情,当我们使用了容器数据卷,容器的data会实时传到宿主机的目录上,即使容器被rm,只要我们再启动一个容器并绑定要这个宿主机目录,数据就能恢复。

容器挂载数据卷

docker run -it -v /host/data:/container/data --name=ub1 ubuntu /bin/bash
  • 当我们在容器内的(/container/data目录下)创建文件
root@5ae5cce418d7:/container/data# touch a.txt
  • 此时我们去宿主机的(/host/data目录下执行ls),发现居然多了一个文件:
[root@aubin data]# lsa.txt
  • 返回宿主机往a.txt写数据
[root@aubin data]# echo "hello world" > a.txt [root@aubin data]# cat a.txt hello world
  • 返回容器查看a.txt内容,所以可知这个目录下的所有文件和(宿主机)-(容器)一一对应
root@5ae5cce418d7:/container/data# cat a.txt hello world

模拟当容器被删除后数据是否能同步(实战)

  • 删除容器
docker rm -f ub1
  • 删除容器之后,我们往宿主机的a.txt写内容(删除容器之后,/host/data目录下的文件不会受到任何影响,这是我为了演示所以重新写内容的)
[root@aubin data]# echo "you are best" > a.txt [root@aubin data]# cat a.txt you are best
  • 重新run(启动)一个容器实例,并且绑定到我们/host/data目录进行数据恢复:

一定要绑定到我们刚刚宿主机存放数据的目录/host/data

docker run -it -v /host/data:/container1/data --name=ub1 ubuntu /bin/bash
  • 再看看数据恢复了没有
root@7cf8eedf967c:/container1/data# lsa.txtroot@7cf8eedf967c:/container1/data# cat a.txt you are best

nice,大功告成,数据被完美的恢复了!!!

查看容器挂载数据卷

[root@aubin data]# docker psCONTAINER ID   IMAGE     COMMANDCREATED   STATUS   PORTS     NAMES5ae5cce418d7   ubuntu    "/bin/bash"   59 minutes ago   Up 59 minutes      ub1[root@aubin data]# docker inspect ub1
  • 输出结果
省略..."Mounts": [     {  "Type": "bind",  "Source": "/host/data",  "Destination": "/container/data",  "Mode": "",  "RW": true,  "Propagation": "rprivate"     } ]省略...
  • Type:类型是bind绑定,所以容器数据卷可以实时同步数据
  • Source:指定绑定的宿主机目录
  • Destination:指定绑定的容器内的目录
  • RW:可读可写

容器数据卷的读写权限(只能限制容器的操作,而不是宿主机)

  • 容器默认的读写权限是rw(可读可写)
  • ro:read only(只读)
docker run -it -v /host/data:/container1/data:ro --name=ub2 ubuntu /bin/bash
  • /container1/data:ro :设置容器在/container1/data目录下只能读

如果我们强行要写会发生什么?

root@b2c4f74224ae:/container1/data# echo "very good" > a.txt bash: a.txt: Read-only file system

结论:我们会发现写入失败了!

❤️💛🧡本章结束,我们下一章见❤️💛🧡