Linux——Docker镜像创建、私有仓库和数据管理

Docker

一、Docker镜像的创建方法

Docker镜像除了是Docker的核心技术之外,也是应用发布的标准格式。

1.1 基于已有镜像创建

基于已有镜像创建其实质就是把一个容器里面运行的程序及该程序的运行环境打包起来生成新的镜像。

语法:

docker   commit   选项  容器ID/名称  仓库名称:标签

常用选项:

  • -m:说明信息
  • -a:作者信息
  • -p:生成过程中停止容器的运行

栗子:

(1)启动一个容器。

PS:在容器里修改修改,然后将修改的容器提交为新的镜像,但必须记住该容器的ID号

[root@docker ~]# docker pull centos:7
7: Pulling from library/centos
75f829a71a1c: Pull complete 
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
[root@docker ~]# docker run -itd --name  test1 centos:7 
3b0129182db30debbc0a75cb4cb13e8639affd2c7847f61725e0e3319ee12b27
[root@docker ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3b0129182db3        centos:7            "/bin/bash"         9 seconds ago       Up 8 seconds                            test1

(2)创建本地镜像

容器ID 3b0129182db3

[root@docker ~]# docker commit  -m "dhcp"  -a "liuyue"  3b0129182db3 centos:dhcp
sha256:4803a544bc33f1fe226b589706e76067d023d57beb468f3f1d0f0af80ca4da7c

(3)查看本地镜像列表

[root@docker ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              dhcp                4803a544bc33        2 minutes ago       203MB
centos              7                   7e6257c9f8d8        2 weeks ago         203MB

1.2 基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为http://openvz.org/Download/template/precreated

下载ubuntu模板压缩包,使用docker导入命令导入为本地镜像。

[root@localhost ~]# wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
--2020-04-22 16:46:01--  http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
正在解析主机 download.openvz.org (download.openvz.org)... 185.231.241.69
正在连接 download.openvz.org (download.openvz.org)|185.231.241.69|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:78421150 (75M) [application/x-gzip]
正在保存至: “ubuntu-14.04-x86_64-minimal.tar.gz”

100%[====================================================================>] 78,421,150   172KB/s 用时 4m 46s 

2020-04-22 16:50:51 (267 KB/s) - 已保存 “ubuntu-14.04-x86_64-minimal.tar.gz” [78421150/78421150])
[root@localhost ~]# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - daoke:new     //导入为本地镜像,名为daoke:new
sha256:641362b013d6ebf773c1e71173d37da3f80fca9226a7080b7317a9e97f06aa23

查看本地镜像

[root@localhost ~]# docker images | grep new
daoke                         new                 641362b013d6        2 minutes ago       215 MB

1.3 基于Dockerfile创建

Dockerfile是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。

Dockerfile结构大致分为四个部分:基础镜像信息,维护者信息,镜像操作指令,容器启动时执行指令,Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释。

Docker操作指令:

指令 含义
FROM 指定所基于的镜像
MAINTAINER 说明镜像的维护人信息
RUN 构建镜像时运行的shell命令
CMD 运行容器时执行的shell命令
EXPOSE端口号 声明容器的服务端口
ENV 设置容器环境变量
ADD 拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压
COPY 拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
USER 为RUN、CMD、和ENTRYPOINT执行命令指定运行用户
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录,意思为切换目录
HEALTHCHEC 健康检查
ARG 构建时指定的一些参数例如:FROM centos:7 ARG user USER $user

栗子:

1.建立工作目录

[root@docker ~]# mkdir apache
[root@docker ~]# cd apache/

2.创建并编写Docker文件

[root@docker apache]# docker pull centos:7
7: Pulling from library/centos
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
[root@docker apache]# vim Dockerfile 
#基于的基础镜像centos
FROM centos:7
#维护该镜像的用户信息
MAINTAINER The CentOS  Project <[email protected]>
#镜像操作指令安装apache软件包
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD  run.sh /run.sh
RUN  chmod 775 /run.sh
#设置apache服务不自行启动
RUN systemctl disable httpd 
#启动容器时执行脚本
CMD ["/run.sh"]

3.编写执行脚本内容和测试页面

[root@docker apache]# cat run.sh 
#!/bin/bash
rm -rf /run/httpd/*
#清理httpd的缓存
exec /usr/sbin/apachectl -D FOREGROUND
#启动apache服务
[root@docker apache]# vim index.html 
欢迎访问本网站!祝您生活愉快!!!
<div id="datetime">
    <script>
        setInterval("document.getElementById('datetime').innerHTML=new Date().toLocaleString();", 1000);
    </script>
</div>
[root@docker apache]# ls
Dockerfile  index.html  run.sh

4.使用Dockerfile生成镜像

语法:

docker  build  选项  Dockerfile路径
  • -t:指定镜像的标签信息
[root@docker apache]# docker build -t  httpd:centos .
......
[root@docker apache]# docker images   | grep httpd
httpd               centos              44442f50883d        52 seconds ago      419MB

5.使用镜像创建一个容器

[root@docker ~]# docker run -itd --name  web1 -p 1234:80 httpd:centos 
ccb1eac2aae0a4269e6c9c423cff4e3b70404bfa8a5869e730f6f1e8b1175049
[root@docker ~]# docker  exec -it  web1  /bin/bash
[root@ccb1eac2aae0 /]# curl  127.0.0.1
欢迎访问本网站!祝您生活愉快!!!
<div id="datetime">
    <script>
        setInterval("document.getElementById('datetime').innerHTML=new Date().toLocaleString();", 1000);
    </script>
</div>

查看从本地端口12345到容器的80端口映射

[root@docker ~]# docker ps -a  | grep  httpd
ccb1eac2aae0        httpd:centos        "/run.sh"           2 minutes ago       Up 2 minutes        0.0.0.0:1234->80/tcp   web1

6.访问网站

在这里插入图片描述

二、构建私有仓库

registry是官方提供的工具,可以用于构建私有的镜像仓库。你可以通过获取官方 registry 镜像来运行

第一种方法

2.1 安装运行docker-registry

使用registry来搭建本地私有仓库

[root@docker ~]# docker pull registry
Using default tag: latest
Trying to pull repository docker.io/library/registry ... 
latest: Pulling from docker.io/library/registry
cbdbe7a5bc2a: Pull complete 
47112e65547d: Pull complete 
46bcb632e506: Pull complete 
c1cc712bcecd: Pull complete 
3db6272dcbfa: Pull complete 
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for docker.io/registry:latest

2.2 修改配置文件

修改Docker配置文件制定私有藏龙URL,否则在自定义的私有仓库中上传镜像时会报错,修改完重启Docker服务

[root@docker ~]# vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
#把此行修改成下面这条
OPTIONS='--selinux-enabled  --insecure-registry=192.168.1.40:5000'
[root@docker ~]# systemctl restart docker

其中的IP地址是本机的IP

2.3启动一个容器

在本地启动一个私有仓库服务,监听端口号为5000,仓库存放于容器内的/tmp/registry目录,-v选项是将本地目录挂载到容器内的/tmp/registry目录下使用

[root@docker ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
4ae0455d8676750b09e307a4c84e8574d322d5af8174d2087387237aafc43425

2.4 上传镜像

(1)标记镜像

使用dockertag命令将要上传的镜像docke.io/registry标记为192.1681.40:5000/registry

[root@docker ~]# docker tag  docker.io/registry 192.168.1.40:5000/registry

(2)上传镜像

[root@docker ~]# docker push  192.168.1.40:5000/registry
The push refers to a repository [192.168.1.40:5000/registry]
b3f465d7c4d1: Pushed 
a5f27630cdd9: Pushed 
239a096513b5: Pushed 
f5b9430e0e42: Pushed 
3e207b409db3: Pushed 
latest: digest: sha256:e09ed8c6c837d366a501f15dcb47939bbbb6242bf3886270834e2a0fa1555234 size: 1363

2.5 查看上传的镜像

查看上传的镜像

[root@docker ~]# curl -XGET http://192.168.1.40:5000/v2/_catalog 
{"repositories":["registry"]}

查看上传镜像的标签名(registry)

[root@docker ~]# curl -XGET http://192.168.1.40:5000/v2/registry/tags/list 
{"name":"registry","tags":["latest"]}

第二种方法

2.6 安装运行docker-registry

[root@docker ~]# docker pull  registry:2
2: Pulling from library/registry
cbdbe7a5bc2a: Pull complete 
47112e65547d: Pull complete 
46bcb632e506: Pull complete 
c1cc712bcecd: Pull complete 
3db6272dcbfa: Pull complete 
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:2

PS:这里我们使用的是registry:2版本,还有一个registry镜像,这两个没有什么大的区别。registry: 是用Python语言写的,registry:2使用Go语言写的,理论上来说,registry:2这个版本运行更快些。

2.7 运行私有仓库

(1)创建一个容器

[root@docker ~]# docker run -itd --name  registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2 
5e75274c469b5a49e13e62e388fcf0f19b30316a1272e9f1b9c48f00fa4278ff
  • -p:端口映射。宿主机端口:同期暴露的端口
  • -p 80 : 如果-p选项后边只写了一个端口,那么这个端口是指容器暴露的端口号随机映射到宿主机(32768开始…)
  • -P:后边没有接任何的端口参数。那么它会把容器暴露的端口,全部随机的映射到宿主机
  • -v: 挂载目录。 宿主机的目录:容器内的目录

(2)镜像重命名

PS: 因为我们使用的私有镜像,在上传或下载的时候,都需要我们将镜像的名称直接重命名,要注明它私有仓库的IP地址:暴露端口。切记是必须,否则将识别不到仓库而上传或下载失败。

[root@docker ~]# docker tag  registry:2  192.168.1.40:5000/registry:2.1
[root@docker ~]# docker images | grep  192.168.1.40:5000/registry
192.168.1.40:5000/registry   2.1                 2d4f4b5309b1        2 months ago        26.2MB

2.8 编辑Docker配置文件

PS: 因为docker默认是从dockehub上下载镜像的,需要在本地指定一下私有仓库的IP加端口, 这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。 如果没做这一步,会报HTTPS的错。

指定私有仓库地址:

[root@docker ~]# vim /usr/lib/systemd/system/docker.service 
#查找这一行 并删除更改为带IP的哪一行
ExecStart=/usr/bin/dockerd -H unix://

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.40:5000
[root@docker ~]# systemctl  daemon-reload 
[root@docker ~]# systemctl  restart docker.service 

PS: 既然是私有仓库,肯定是要考虑多台DockerHost共用的情况,如果有其他的DockerHost想要使用私有仓库,仅需要修改docker的配置文件,指定私有仓库的IP和端口即可。当然别忘了,更改过配置文件之后,daemon-reload ,restart docker服务。

2.9 上传

[root@docker ~]# docker push 192.168.1.40:5000/registry:2.1 
The push refers to repository [192.168.1.40:5000/registry]
b3f465d7c4d1: Pushed 
a5f27630cdd9: Pushed 
239a096513b5: Pushed 
f5b9430e0e42: Pushed 
3e207b409db3: Pushed 
2.1: digest: sha256:e09ed8c6c837d366a501f15dcb47939bbbb6242bf3886270834e2a0fa1555234 size: 1363

查看上传的镜像

查看上传的镜像

[root@docker ~]# curl  -XGET http://192.168.1.40:5000/v2/_catalog
{"repositories":["registry"]}

查看上传镜像的标签

[root@docker ~]# curl  http://192.168.1.40:5000/v2/registry/tags/list
{"name":"registry","tags":["2.1"]}

PS:命令中的 /registry/是上传的镜像名

三、Harbor

3.1 Harbor简介

Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是DockeRegistry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库【注:helm就相当于k8s的yum】。另外它还整合了两个开源的安全组件,一个是Notary,另一个是Clair,Notary类似于私有CA中心,而Clair则是容器安全扫描工具,它通过各大厂商提供的CVE漏洞库来获取最新漏洞信息,并扫描用户上传的容器是否存在已知的漏洞信息,这两个安全功能对于企业级私有仓库来说是非常具有意义的。

3.2 Harbor安装方式

  • 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小
  • 离线安装:安装包包含部署的相关镜像,因此安装包比较大
  • OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor本文记录通过离线安装的方式部署

3.3 安装Harbor

这里为了省时间,选择离线安装

由于文档中之前创建过私有仓库,所有要删除之前创建的容器

3.3.1 下载Docker-compse工具

[root@docker ~]# curl -L  https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
......
[root@docker ~]# ls
docker-compose.1.25.0.tar.gz  
[root@docker ~]# tar -zxPf docker-compose.1.25.0.tar.gz -C /usr/local/bin/
[root@docker ~]# chmod  +x /usr/local/bin/docker-compose 
[root@docker ~]# docker-compose -v    #查看版本号,并验证命令可以
docker-compose version 1.25.0, build 0a186604
[root@docker ~]# yum -y install yum-utlis device-mapper-persistent-data lvm2 #安装依赖包

3.3.2 Harbor-offline离线模式下载

直接在百度搜 harbor进官网 harbor的部署方式,有在线和离线两种方式,考虑到网速原因,这里我们采用离线下载方式。

[root@docker ~]# wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.4.tgz  
[root@docker ~]# ls
harbor-offline-installer-v1.7.4.tgz  docker-compose.1.25.0.tar.gz  
[root@docker ~]# tar -zxf harbor-offline-installer-v1.7.4.tgz  -C /usr/local/

3.3.3 修改配置文件

指定harbor主机

[root@docker ~]# cd /usr/local/harbor/
[root@docker harbor]# vim harbor.cfg 
......
hostname = 192.168.1.40
......

PS: 这里我们将主机名直接改成我们的IP地址,其实也可以使用域名,如果使用域名需要在windows主机上修改hosts文件,地址为C:\Windows\System32\drivers\etc,将域名与ip添加进去即可。

配置文件部分解释

[root@docker harbor]#  vim harbor.cfg 
## Configuration file of Harbor
#hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
hostname = 192.168.1.100
#访问协议,默认是http,也可以设置https,如果设置https,则nginxssl需要设置on
ui_url_protocol = http
#最大连接数
max_job_workers = 10
#是否生成证书
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
secretkey_path = /data
admiral_url = NA
#关于日志切割选项
log_rotate_count = 50
#关于日志切割的大小,可以是KB、MB、GB
log_rotate_size = 200M
#是否启用代理访问
http_proxy =
https_proxy =
no_proxy = 127.0.0.1,localhost,core,registry
#邮件设置,发送重置密码邮件时使用
email_identity =
email_server = smtp.mydomain.com
email_server_port = 25
email_username = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false
#启动Harbor后,管理员admin,UI登录的密码,默认是Harbor12345
harbor_admin_password = Harbor12345
#认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是
db_auth,mysql   #数据库认证
auth_mode = db_auth  #是否开启自注册
self_registration = on
#token有效时间,默认30分钟
token_expiration = 30
#用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
project_creation_restriction = everyone

执行脚本,下载依赖镜像

PS: 修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动,并且注意,harbor默认使用的是80端口,最好确认是否有冲突,或者也可以在 docker-compose.yml 中修改对应的端口

[root@docker harbor]# ./install.sh 

[Step 0]: checking installation environment ...

Note: docker version: 18.09.0

Note: docker-compose version: 1.25.0

[Step 1]: loading Harbor images ...

......

[Step 4]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registryctl        ... done
Creating harbor-adminserver ... done
Creating redis              ... done
Creating registry           ... done
Creating harbor-db          ... done
Creating harbor-core        ... done
Creating harbor-portal      ... done
Creating harbor-jobservice  ... done
Creating nginx              ... done

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://192.168.1.40. 
For more details, please visit https://github.com/goharbor/harbor .

查看和监控

[root@docker harbor]# docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED              STATUS                        PORTS                                                              NAMES
8c9c2fb4ddd3        goharbor/nginx-photon:v1.7.4             "nginx -g 'daemon of…"   About a minute ago   Up About a minute (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
e2cc243ef392        goharbor/harbor-jobservice:v1.7.4        "/harbor/start.sh"       About a minute ago   Up About a minute                                                                                harbor-jobservice
03436a45b849        goharbor/harbor-portal:v1.7.4            "nginx -g 'daemon of…"   About a minute ago   Up About a minute (healthy)   80/tcp                                                             harbor-portal
538fb5aeda5d        goharbor/harbor-core:v1.7.4              "/harbor/start.sh"       About a minute ago   Up About a minute (healthy)                                                                      harbor-core
dfd29fc79ae1        goharbor/harbor-db:v1.7.4                "/entrypoint.sh post…"   About a minute ago   Up About a minute (healthy)   5432/tcp                                                           harbor-db
1eb92c20f18e        goharbor/registry-photon:v2.6.2-v1.7.4   "/entrypoint.sh /etc…"   About a minute ago   Up About a minute (healthy)   5000/tcp                                                           registry
645c7dd0a5e6        goharbor/harbor-registryctl:v1.7.4       "/harbor/start.sh"       About a minute ago   Up About a minute (healthy)                                                                      registryctl
38ca301e2593        goharbor/redis-photon:v1.7.4             "docker-entrypoint.s…"   About a minute ago   Up About a minute             6379/tcp                                                           redis
05c0bbfcaa90        goharbor/harbor-adminserver:v1.7.4       "/harbor/start.sh"       About a minute ago   Up About a minute (healthy)                                                                      harbor-adminserver
db8622719dab        goharbor/harbor-log:v1.7.4               "/bin/sh -c /usr/loc…"   2 minutes ago        Up About a minute (healthy)   127.0.0.1:1514->10514/tcp                                          harbor-log

3.3.4 Harbor使用

PS:docker-compose这个命令可以管理harbor服务,不过需要注意的是想使用开启、停止、重启命令,必须是和 docker-compose.yml 这个文件在同一个目录下,其实就是通过管理这个文件而管理harbor仓库的

  • Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI,token等服务。
  • db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。
  • UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。
  • jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。
  • Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。
  • Registry:镜像仓库,负责存储镜像文件。
  • Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析

启动

[root@docker harbor]# docker-compose  start
Starting log         ... done
Starting registry    ... done
Starting registryctl ... done
Starting postgresql  ... done
Starting adminserver ... done
Starting core        ... done
Starting portal      ... done
Starting redis       ... done
Starting jobservice  ... done
Starting proxy       ... done

停止

[root@docker harbor]# docker-compose  stop

重启

[root@docker harbor]# docker-compose  restart

3.3.5 浏览器访问

http://192.168.1.40/harbor/sign-in

在这里插入图片描述

登录名:admin

密码:Harbor12345

用户名和密码在Harbor的配置文件中可以设置

3.4 Harbor案例

环境

主机IP 主机名
192.168.1.40 docker
192.168.1.41 docker-client

1.在docker主机上访问浏览器创建名为docker的仓库

在这里插入图片描述

在这里插入图片描述

2.在docker-client上配置

2.1 更改docker配置文件

PS:同理因为docker不支持https的原因,我们也需要将docker的配置文件进行更改

[root@docker-client ~]# vim /usr/lib/systemd/system/docker.service
#查找这一行 并删除更改为带IP的哪一行
ExecStart=/usr/bin/dockerd -H unix://

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.40
[root@docker-client ~]# systemctl daemon-reload 
[root@docker-client ~]# systemctl restart docker

2.2 客户端登录仓库

[root@docker-client ~]# docker login  -uadmin -pHarbor12345 192.168.1.40
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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

2.3 删除私有镜像

提前把centos镜像下载到本地

[root@docker-client ~]# docker tag  centos:7  192.168.1.40/docker/centos:7.1
[root@docker-client ~]# docker push  192.168.1.40/docker/centos:7.1 
The push refers to repository [192.168.1.40/docker/centos]
613be09ab3c0: Pushed 
7.1: digest: sha256:fe2347002c630d5d61bf2f28f21246ad1c21cc6fd343e70b4cf1e5102f8711a9 size: 529

2.4在浏览器查看是否成功上传

在这里插入图片描述

四、Docker的数据管理

为了方便查看容器内产生的数据或者多个容器之间的数据实现共享,会涉及容器的数据管理操作。管理Docker容器中的数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)

4.1 数据卷

4.1.1 创建数据卷

[root@docker ~]# docker run -itd -v /data1 -v /data2 --name web centos:latest 
d16e5e3410deab053cc81f9104e537964d7073254f9d579647267db4ddd6ebd3

进入容器,可以看到数据卷已经成功创建分别挂载上了

[root@docker ~]# docker exec  -it web  bash
[root@d16e5e3410de /]# ls -l
total 0
lrwxrwxrwx   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x   2 root root   6 Sep  2 08:44 data1
drwxr-xr-x   2 root root   6 Sep  2 08:44 data2

4.1.2 挂载主机目录作为数据卷

使用-v可以再创建数据卷的同时,将宿主机的目录挂载到数据卷上使用,已实现宿主机与容器之间的数据迁移。但要注意的是,宿主机本地的目录路径是实验绝对路径,如果路径不存在,docker会自动创建相对应的路径。

将宿主机的/var/www/目录挂载到容器之上

以实现宿主机与容器之间的数据迁移

[root@docker ~]# mkdir -p /var/www
[root@docker ~]# cd /var/www/
[root@docker www]# touch hell.sh
[root@docker www]# ls
hell.sh
[root@docker www]# docker run -itd -v /var/www/:/data1 --name web-1 centos:latest 
f345b6e63b79afaba5433356b49f43de561b192b6d8f05759a2eade70c7ad16b
[root@docker www]# docker exec  -it web-1 bash
[root@f345b6e63b79 /]# ls
bin  data1  dev  etc  home  lib  lib64	lost+found  media  mnt	opt  proc  root  run  sbin  srv  sys  tmp  usr	var
[root@f345b6e63b79 /]# cd data1/
[root@f345b6e63b79 data1]# ls
hell.sh
[root@f345b6e63b79 data1]# exit
exit
[root@docker www]# touch 1.txt
[root@docker www]# docker exec  -it web-1 bash
[root@f345b6e63b79 /]# cd data1/
[root@f345b6e63b79 data1]# ls
1.txt  hell.sh

同样:在容器中创建,宿主机也有相应的内容

4.2 数据卷容器

PS:数据卷容器就是作了一个容器之间共享的功能

使用前面的数据卷容器web来创建新的数据卷容器

[root@docker ~]# docker run  -itd --volumes-from web --name db1 centos:latest 
fd1cc14e4ef2ccaccf45c7f42ca24854a22a8720f8a3f81e49ffb6de5d20b9a6
[root@docker ~]# docker exec  -it db1  bash
[root@fd1cc14e4ef2 /]# ls
bin  data1  data2  dev	etc  home  lib	lib64  lost+found  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var

PS:在db1容器中ls所查看到的内容和web容器的一样

在db1中创建文件,在web中也能查看到

[root@fd1cc14e4ef2 /]# cd /data1/
[root@fd1cc14e4ef2 data1]# touch 12 123 213
[root@fd1cc14e4ef2 data1]# ls
12  123  213
[root@fd1cc14e4ef2 data1]# exit
exit
[root@docker ~]# docker exec  -it web bash
[root@d16e5e3410de /]# cd /data1/
[root@d16e5e3410de data1]# ls
12  123  213

到目前为止就实现了容器之间的数据共享了

用容器web来创建新的数据卷容器**

[root@docker ~]# docker run  -itd --volumes-from web --name db1 centos:latest 
fd1cc14e4ef2ccaccf45c7f42ca24854a22a8720f8a3f81e49ffb6de5d20b9a6
[root@docker ~]# docker exec  -it db1  bash
[root@fd1cc14e4ef2 /]# ls
bin  data1  data2  dev	etc  home  lib	lib64  lost+found  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var

PS:在db1容器中ls所查看到的内容和web容器的一样

在db1中创建文件,在web中也能查看到

[root@fd1cc14e4ef2 /]# cd /data1/
[root@fd1cc14e4ef2 data1]# touch 12 123 213
[root@fd1cc14e4ef2 data1]# ls
12  123  213
[root@fd1cc14e4ef2 data1]# exit
exit
[root@docker ~]# docker exec  -it web bash
[root@d16e5e3410de /]# cd /data1/
[root@d16e5e3410de data1]# ls
12  123  213

到目前为止就实现了容器之间的数据共享了

PS:这样的好处是:容器在运行过程中出现故障,用户不用害怕数据发生丢失,如果发生意外,只需要重新创建容器就好了。省了很多时间。

猜你喜欢

转载自blog.csdn.net/weixin_45191791/article/details/108365851