一、概述
- 在docker的整个使用过程中,进入一个已经定型的容器后可以在其中进行服务的安装;
- 若要将已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。
二、docker镜像创建的三种方法
2.1、基于Dockerfile创建
Dockerfile简述:
- Dockerfile是由一组指令组成的脚本文件,其中每条指令对应Linux中的一条指令,Docker程序将读取Dockerfile中的指令生成指定镜像。
- Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
Docker镜像分层:
- Dockerfile中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当Dockerfile的指令修改了,复制到文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
- 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
Dockerfile常用指令:
使用Dockerfile创建镜像并在容器中运行案例:
- 建立生成的镜像的工作目录
[root@localhost ~]# mkdir /abc
[root@localhost ~]# cd /abc
- 创建并编写Dockerfile文件
[root@localhost abc]# vim Dockerfile
#基础镜像
FROM centos:7
#用户信息
MAINTAINER this is apache
#基于基础镜像安装软件
RUN yum -y update
RUN yum -y install httpd
#开启端口
EXPORT 80
#复制首页到指定站点
ADD index.html /var/www/html/index.html
#复制启动脚本到镜像
ADD run.sh /run.sh
#设置run.sh执行权限
RUN chmod +x /run.sh
#启动容器执行操作
CMD ["/run.sh"]
- 编写执行脚本内容
[root@localhost abc]# vi run.sh
#!/bin/bash
rm -rf /run/httpd/* ##清理apache缓存
exec /usr/sbin/apachectl -D FOREGROUND ##启动apache服务
- 创建测试页面
[root@localhost abc]# echo "this is apache" > index.html
[root@localhost abc]# ls
Dockerfile index.html run.sh
- 生成镜像
[root@localhost abc]# docker build -t httpd:centos .
- 将生成的镜像加载到容器中运行
[root@localhost abc]# docker run -d -p 1234:80 httpd:centos
055f0135a310c085e70547c3702db51f018eedd9011c99e3ac772c486fd20a89
[root@localhost abc]# docker ps -a ##查看容器此时为up状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
055f0135a310 httpd:centos "/run.sh" 3 minutes ago Up 3 minutes 0.0.0.0:1234->80/tcp gifted_feynman
- 查看当前当前主机ip,并用转换的1234端口访问apache网页
[root@localhost abc]# ifconfig ens33 | sed -n '2p'| awk '{print $2}'
192.168.5.130 ###当前IP
2.2、基于已有镜像容器创建
- 查看当前容器,只有一个
[root@localhost abc]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
055f0135a310 httpd:centos "/run.sh" 29 minutes ago Up 29 minutes 0.0.0.0:1234->80/tcp gifted_feynman
- 基于此容器创建名为docker:test的镜像
[root@localhost abc]# docker commit -m "new" -a "daoke" 055f0135a310 docker:test
sha256:a2f65aeee35780fd7d739110b4c8dc1dea2dffafe4a362b20e7e9a9f4d1236a2
[root@localhost abc]# docker images | grep docker
docker test a2f65aeee357 3 minutes ago 524MB
- 同理将此镜像加载到容器中运行
[root@localhost abc]# docker run -d -p 5678:80 docker:test
4ead41755cafe6cb82669b226f48360651b4641d878d64fd83d23dd66e13dcec
- 用转换的5678端口访问apache
2.3、基于本地模板创建
通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为http://openvz.org/Download/template/precreated
- 下载模板
[root@localhost /]# wget https://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
- 创建镜像
[root@localhost /]# cat debian-7.0-x86-minimal.tar.gz | docker import - centos:new
sha256:2dae7fc9961f510dc16d2a70bb26b221633a25d50e13429e2fcd010075d9edfd
[root@localhost /]# docker images | grep new
centos new 2dae7fc9961f About a minute ago 215MB
三、docker数据管理
- 在docker中,为了方便查看容器内产生的数据或者将多个容器中数据实现共享,就涉及到容器的数据管理操作;
- 管理docker容器中的数据主要有两种方式:数据卷和数据卷容器
3.1、数据卷
- 数据卷:挂载宿主系统的存储空间,实现宿主机和容器间数据共享
- 使用-v选项可以在创建数据卷的同时,将宿主机的目录挂载到数据卷上使用,以实现宿主机和容器之间的数据迁移
下载centos镜像
[root@localhost www]# docker pull centos
创建数据卷,挂载宿主机的/opt/test目录
[root@localhost ~]# docker run -v /opt/test:/data1 --name web1 -it centos /bin/bash
进入/data1数据卷中写入相关测试文件
[root@35f0e465d45e /]# cd /data1
[root@35f0e465d45e data1]# ls
[root@35f0e465d45e data1]# touch 1111.txt
[root@35f0e465d45e data1]# exit
返回宿主机查看/opt/test目录,发现文件1111.txt也存在
[root@localhost test]# ls /opt/test/
1111.txt
3.2、数据卷容器
- 数据卷容器:挂载容器里的存储空间,实现容器与容器间的数据共享
创建新容器web100
[root@localhost /]# docker run --name web100 -v /data2 -it centos /bin/bash
挂载数据卷容器web100到新容器web200中
[root@localhos /]# docker run -it --volumes-from web100 --name web200 centos /bin/bash
在数据卷容器web100的/data2中写入测试文件222.txt
[root@localhost test]# docker start 04b8d6b0a36c ##启动web100容器
04b8d6b0a36c
[root@localhost test]# docker exec -it 04b8d6b0a36c /bin/bash
[root@04b8d6b0a36c /]# cd /data2/
[root@04b8d6b0a36c data2]# touch 222.txt
[root@04b8d6b0a36c data2]# exit
exit
进入web200容器中查看/data2目录,发现有222.txt文件,实现了数据共享
[root@localhost test]# docker start 83307d41f451 ###先启动容器
83307d41f451
[root@localhost test]# docker exec -it 83307d41f451 /bin/bash
[root@83307d41f451 /]# ls /data2/
222.txt