文章目录
一、镜像创建方法
1.1、Docker 镜像概述
- Docker镜像是什么
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化,所以Docker镜像是分层的
-
构建镜像一般有三种方法
- 基于Dockerfile(最常用)创建
- 基于已有的镜像容器进行创建镜像
- 基于本地模板进行构建
-
Docker镜像的分层
1.2、基于已有镜像容器创建
创建容器并创建镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c39a868aad02 10 days ago 133MB
centos latest 0d120b6ccaa8 3 months ago 215MB
[root@localhost ~]# docker create -it nginx:latest /bin/bash
676077b1c9e6351939e007bcbeb899b8da0fd768ab4ec61824f122fefcf75d0a
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
676077b1c9e6 nginx:latest "/docker-entrypoint.…" 7 seconds ago Created magical_grothendieck
[root@localhost ~]# docker commit -m "lu" -a "lu" 676077b1c9e6 lu:test
sha256:6601cabced83ac2c43aa65f9fb44827d691c794752298aba912229d1730ae45a
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lu test 6601cabced83 14 seconds ago 133MB
nginx latest c39a868aad02 10 days ago 133MB
centos latest 0d120b6ccaa8 3 months ago 215MB
1.3、基于本地模板创建
下载本地模板
通过导入系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载
地址为:https://wiki.openvz.org/Download/template/precreated
或者使用wget下载:wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
创建镜像
[root@localhost ~]# ls
anaconda-ks.cfg docker.sh
debian-7.0-x86-minimal.tar.gz initial-setup-ks.cfg
[root@localhost ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - lu:new
sha256:6cfb538b32a202cbc2c2122f3c4a952cd5bdd98e6f0fc9a19ffd9cca44e3c43d
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lu new 6cfb538b32a2 7 seconds ago 215MB
lu test 6601cabced83 6 minutes ago 133MB
1.4、基于Dockerfile 创建镜像
1.4.1、Dockerfile 概述
Dockerfile是由一组指令组成的文件
Dockerfile结构分成四个部分:
1、基础镜像信息
2、维护者信息
3、镜像操作指令
4、容器启动时指定指令
1.4.2、Dockerfile 常用操作指令
指令 | 含义 |
---|---|
FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN 命令 | 在所基于的镜像执行命令,并提交到新的镜像中 |
HEALTHCHECK | 健康检查 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
WORKDIR 路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ADD 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL,也有直接解压缩包功能 |
COPY 源文件/目录 目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
EXPOSE 端口号 | 指定新镜像加载到Docker时要开启的端口 |
VOLUME [“目录”] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
CMD [ “要运行的程序”,“参数1”,“参数2”] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条 |
1.4.3、创建镜像
以创建apache镜像为例
编写Dockerfile文件
mkdir apache
cd apache
vim Dockerfile
FROM centos:7
MAINTAINER lu
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
ADD index.html /var/www/html/index.html
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["./run.sh"]
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
echo "123" > index.html
docker build -t httpd:centos .
docker run -d -p 1111:80 http:centos
真机浏览器访问20.0.0.21:1111 可以发现创建成功
二、Docker 私有仓库建立
- 私有仓库设置步骤
1、下载registry镜像
2、客户端设置daemon.json文件,指定私有仓库位置
3、生成registry容器,开放5000端口
4、镜像打标签
5、上传镜像,docker push
6、下载镜像,docker pull
- 建立私有仓库
docker pull nginx 作为要上传的镜像
docker pull registry
vim /etc/docker/daemon.json
{
"insecure-registries":["20.0.0.21:5000"], ##添加这一行
"registry-mirrors": ["https://fm8gnp3.mirror.aliyuncs.com"] #为阿里云镜像加速地址之前有介绍
}
systemctl restart docker
docker create -it registry /bin/bash
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
docker tag nginx:latest 20.0.0.21:5000/nginx
docker push 20.0.0.21:5000/nginx
[root@docker ~]# curl -XGET http://20.0.0.21:5000/v2/_catalog
{"repositories":["nginx"]}
docker rmi -f c39a868aad02
docker pull 20.0.0.21:5000/nginx
[root@docker ~]# docker images
20.0.0.21:5000/nginx latest c39a868aad02 5 days ago 133MB