一 Docker镜像的介绍
(1)简介
Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需的文件系统结构及其内容,因此是启动一个Docker容器的基础。Docker镜像的文件内容以及一些运行Docker容器的配置文件组成了Docker容器的静态文件系统运行环境–rootfs。可以这么理解,Docker镜像是Docker容器的静态视角,Docker容器是Docker镜像的运行状态。
(2)镜像的分层结构
1.共享宿主机的内核
2.base镜像提供的是最小的linux发行版
其实就是linux的根/文件系统
3.同一docker主机支持运行多种linux发行版
4.采用分层结构的做大好处是“共享资源”
不同的镜像使用同一个镜像层的时候,文件系统便可以实现资源共享,只需要备份一次,节省空间。
二 docker commit构建新镜像
(1)导入ubuntu的镜像包
docker load -i ubuntu.tar
(2)使用镜像开启并运行容器
docker run -it --name vm2 ubuntu
(3)在容器中建立文件,ctrl+d退出
删除容器vm2,重新用ubuntu镜像创建并运行容器时,之前创建的文件消失,因为上次的操作全部写在容器层,镜像层的内容只读。当上次的容器释放之后,写在容器层的内容也会随之消失。
两个快捷退出键的区别:
ctrl+d: 直接终止容器的运行。只能通过docker ps -a查看到此容器
ctrl+p+q: 在后台运行此容器,通过docker ps查看到
(4)将容器保存为新的镜像
[root@server1 ~]# docker run -it --name vm2 ubuntu
root@7255139a6a15:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
##重新在容器中建立文件
root@7255139a6a15:/# touch newfile{1..10}
root@7255139a6a15:/# ls
bin etc lib64 newfile1 newfile3 newfile6 newfile9 root srv usr
boot home media newfile10 newfile4 newfile7 opt run sys var
dev lib mnt newfile2 newfile5 newfile8 proc sbin tmp
root@7255139a6a15:/# ls
##保存为新的镜像
[root@server1 ~]# docker commit vm2 ubuntu:v2
sha256:97dcc8db7483e29385ea73d7b880209c9c9ef79868b9f8ca4ffc19b315718c99
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu v2 97dcc8db7483 27 seconds ago 188MB
ubuntu v1 516bbbfe0967 About an hour ago 188MB
game2048 latest 19299002fdbe 2 years ago 55.5MB
ubuntu latest 07c86167cdc4 3 years ago 188MB
新镜像创建的容器保存上一容器建立的文件。
使用容器创建镜像。容器就是在镜像层的最上方存在一个可写的容器层。将容器打包镜像,就是将该可写的容器层,变成一个只读的镜像层,和下层的所有镜像层一起作为新镜像的镜像层。
以上例子中镜像ubuntu:v2 是在ubuntu镜像打开容器的基础上生成的。查看他们的镜像分层。
ubuntu:v2 是在ubuntu镜像基础上多添加了一层。
三 Dockerfile 创建镜像
根据Dockerfile中的内容,通过使用docker bulid指令,自动创建镜像,也是基于docker commit的层层构建得出。Dockerfile文件名称,是docker默认的,在u不特殊指定的情况下,一般都是从该文件中读取创建信息。并且在创建的过程中,docker会将该文件所在目录中的所有内容发送给docker引擎。所以建创建一个空来目录来存放Dockerfile文件。
实验准备:清除上一实验的容器与镜像
(1)导入rhel7的镜像包
[root@server1 ~]# docker load -i rhel7.tar
(2)创建空目录,Dockerfile文件以及westos.repo文件
1.建立docker目录
[root@server1 ~]# mkdir /docker
[root@server1 ~]# cd /docker/
2.创建westos.repo文件
[root@server1 docker]# vim westos.repo
[root@server1 docker]# cat westos.repo
[rhel]
name=rhel7.3
baseurl=http://172.25.60.250/westos
gpgcheck=0
3.创建Dockerfile文件
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM rhel7
COPY westos.repo /etc/yum.repos.d/westos.repo
RUN rpmdb --rebuilddb && yum install -y httpd
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
(3)使用Dockerfile文件构建http服务的镜像
[root@server1 docker]# docker build -t rhel7:v1 .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM rhel7
---> 0a3eb3fde7fd
Step 2/4 : COPY westos.repo /etc/yum.repos.d/westos.repo
---> c036b5519337
Step 3/4 : RUN rpmdb --rebuilddb && yum install -y httpd
---> Running in ae43a051d93c
可以发现建立成功的提示后面有一个码 5632320b0b51,这个码就是rhel7镜像v1的码。
(4)查看新建镜像的分层
(4)用新建的镜像建立一个容器vm1并将httpd首页文件所在的目录挂载到httpd的默认发布目录下,做一个端口映射:
[root@server1 docker]# docker run -d --name vm1 -p 80:80 -v /docker/web/:/var/www/html rhel7:v1
f9f92cd6829a4ad5e8d5bcd8cc92475bdcefa6aca70846c87aa89485f5e2d38a
[root@server1 docker]# vim web/index.html
[root@server1 docker]# cat web/index.html
Docker!
访问server1IP 可以直接读取http发布页面
修改容器中的发布页面信息,访问页面刷新后实时更新。
四 dockerfile常用的指令
1.
1 、FROM:
用于指定base镜像,本地不存在会从远程仓库进行下载
2、MAINTAINER
MAINTAINER:设置镜像的作者,如用户邮箱等(不是必须的)
3、COPY
把文件从build context复制到镜像
支持两种形式:COPY src dest和COPY [" src" ,"dest "]
src必须指定build context中的文件或目录
dest为容器中的路径
1 、FROM:
用于指定base镜像,本地不存在会从远程仓库进行下载
2、MAINTAINER
MAINTAINER:设置镜像的作者,如用户邮箱等(不是必须的)
3、COPY
把文件从build context复制到镜像
支持两种形式:COPY src dest和COPY [" src" ,"dest "]
src必须指定build context中的文件或目录
dest为容器中的路径
4 、ADD
用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可自动下载URL并拷贝到镜像
DD html.tar /var/www ##解压
ADD http://ip/html.tar /var/www ##下载
5 EXPOSE
如果容器中运行应用服务,则可以包服务端口暴露出去
[root@toto6 docker]# vim Dockerfile
FROM rhel7
Add backup.tar.gz /mnt
EXPOSE 80
6 、VOLUME
声明数据卷,通常指定应用数据挂载点VOLUME [ “/var/www/html”] :该路径为容器中的路径。如果路径不存在,启动容器的时候会自动创建。
一般VOLUME指定挂载点,没有此路径就会新建路径。在运行docker宿主机上,可以根据命令docker inspect 容器名的具体信息,可以查看封装容器,声明的数据卷,Source会存在此容器目录挂接到本地_data目录。由于自动挂载的路径很长,不太方便记,也可以在运行的时候指定挂载路径
VOLUME ["/data"] # 声明数据卷
docker run -it --name vm3 -v /opt/data:/data ubuntu:v1 ##:前为物理机挂载目录,:后为docker挂载目录
7 、WORKDIR
为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在也会自动创建
8 、RUN
RUN 在容器中运行命令并创建新的镜像层,常用于安装软件包:每个run 都会多一层
9 、ENV:
设置环境变量,变量可以被后续的指令使用
10 、CMD 与 ENTRYPOINT
设置容器启动后执行的命令,但是CMD会被docker run 后面的命令覆盖,但ENTRYPOINT不会
Dockerfile中只能指定一个ENTRYPOINT,如果指定过多则只有最后一个有效
docke run后面的参数可以传递给ENTRYPOINT指令当作参数;