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 <cloud-ops@centos.org>
#镜像操作指令安装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 = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
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:这样的好处是:容器在运行过程中出现故障,用户不用害怕数据发生丢失,如果发生意外,只需要重新创建容器就好了。省了很多时间。