探索云原生技术之基石-Docker容器入门篇(3)【与云原生的故事】
❤️💛🧡💚💔🖤💜💙❤💕💞💓💗❣️💝💘💖❤️💛🧡💚💔🖤💜💙❤💕💞💓💗❣️💝💘💖💖💖 💖
❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💖
💛博客首页:C站个人主页🌞 💖
💗作者目的:如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门,共同进步! 💖
❤️💛🧡💚💔🖤💜💙❤💕💞💓💗❣️💝💘💖❤️💛🧡💚💔🖤💜💙❤💕💞💓💗❣️💝💘💖💖💖 💖
@[toc]
探索云原生技术之基石-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. See
Login 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 --help
Usage: 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 --help
Usage: docker push [OPTIONS] NAME[:TAG]
Push an image or a repository to a registry
Options:
-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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu 6.6 5a035af5ac0c 2 hours ago 176MB
- 我们要推送的就是这个myubuntu镜像
登录阿里云帐号
[root@aubin ~]# docker login --username=游政杰eee registry.cn-guangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
Login 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.77
The 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.66
The 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.66
6.66: Pulling from my_cloud_namespace/my_cloud_repository
7b1a6ab2e44d: Already exists
58ab36472911: Pull complete
Digest: sha256:a82e46b4b3a681b744a69df935dccab1ad9d901e257abb297610c9d995f2a83b
Status: Downloaded newer image for registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.66
registry.cn-guangzhou.aliyuncs.com/my_cloud_namespace/my_cloud_repository:6.66
[root@aubin ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.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 registry
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
registry 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-auth 0
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:/# ifconfig
eth0: 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 0
lo: 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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
ifconfigubuntu 2.0 a9683693b1c6 10 seconds ago 176MB
查看私服库中的镜像
- ip:使用ifconfig查询替换上去即可
ifconfig: 192.168.184.132就是我的ip
[root@aubin ~]# ifconfig
ens33: 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/_catalog
curl: (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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
ifconfigubuntu 2.0 a9683693b1c6 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.3
The 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.3
The 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.3
3.3: Pulling from configubuntu
7b1a6ab2e44d: Already exists
b71359a660f3: Pull complete
Digest: sha256:b59453f0561ec74a3703a16f7de9c41c34c91cb361410abeb9ea82da2b73f67a
Status: Downloaded newer image for 192.168.184.132:5000/configubuntu:3.3
192.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]# ls
a.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# ls
a.txt
root@7cf8eedf967c:/container1/data# cat a.txt
you are best
nice,大功告成,数据被完美的恢复了!!!
查看容器挂载数据卷
[root@aubin data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ae5cce418d7 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
结论:我们会发现写入失败了!
❤️💛🧡本章结束,我们下一章见❤️💛🧡
【与云原生的故事】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/345260
- 点赞
- 收藏
- 关注作者
评论(0)