探索云原生技术之基石-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

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

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

更多推荐