Docker 制作镜像

docker镜像制作的两种方法:
1,基于docker commit 制作镜像
2,基于dockerfile制作镜像,为主流镜像制作方式。

▪docker镜像命名规则:仓库IP:端口号/分类名/镜像名:标签
例:192.168.0.1:5000/web/nginx:v1
       192.168.0.1:5000/db/mysql:v1

基于基础镜像定制后,使用commit制作自定义镜像
1,使用docker commit利用运行的容器来制作自定义镜像
docker commit 容器id centos7_ifconfig #简单制作一个有ifconfig命令的镜像

2,查看制作的镜像信息
docker inspect centos7_ifconfig

3,使用自定义的镜像来启动容器
docker run -it centos7_ifconfig /bin/bash
ifconfig #测试一下是否支持ifconfig命令

4,使用自定义的镜像来启动后台容器
docker run -d centos7_ifconfig /bin/bash -c 'while true;do echo hello; sleep 3; done'

★以tomcat容器为例:

▶启动 tomcat 容器
docker run -it -p 主机端口:容器端口 镜像名称

▶修改tomcat
保存提交重命名镜像
docker commit -a=”作者” -m=”备注” 容器ID 镜像名:tag
启动新的镜像

●例:
①连接tomcat容器:docker exec -it 容器id /bin/bash #需要提供一个终端
②修改webapps下的内容。
提交:docker commit -a="mydocker_tomcat" -m="delete examples" 容器id nm/tomcat:1.0

基于DockerFile制作自定义镜像

(1),DockerFile 文件
Docker可以通过从Dockerfile中读取指令来自动构建镜像。
Dockerfile是一个文本文档,包含用户可以在命令行上调用的所有命令,以组合镜像。
使用docker build,docker即可启动构建工作,构建过程为连续执行DockerFile中的
多个命令行指令。
•官方例:
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL org.label-schema.schema-version="1.0"
org.label-schema.name="CentOS Base Image"
org.label-schema.vendor="CentOS"
org.label-schema.license="GPLv2"
org.label-schema.build-date="20190305"

CMD ["/bin/bash"]

(2),DockerFile 基础语法
•关键字指令必须为大写字母,且至少需要一个参数;
•关键字指令从上到下顺序执行;
•#表示注释;
•每条指令执行都会创建一个镜像层;

(3),DockerFile 执行流程
•docker从基础镜像运行一个容器。
•执行一条指令并对容器做出修改。
•执行类似docker commit的操作,提交一个新的镜像层。
•docker再基于刚刚提交的镜像,运行一个新容器。
•执行dockerfile中的下一条指令直到所有的指令都执行完成。

(4),DockerFile 关键字指令

FROM : 初始化新的构建阶段,设置基本镜像。即新镜像是基于那个基本镜像。
MAINTAINER(过期): 维护者指令,设置新镜像的作者信息等。
RUN: 将在当前镜像之上的新层中执行的shell命令,并提交结果。
EXPOSE: 容器在运行时监听指定的网络端口,即容器运行的服务端口。EXPORT不会让主机访问容器的端口。
WORKDIR: 为文件中跟随它的任何RUN、CMD、ENTRYPONT、COPY和ADD指令设置工作目录。
ENV: 设置环境变量
ADD: 复制文件,并将它们添加到镜像文件系统的指定目录。
COPY: 类似ADD,向镜像中拷贝文件或目录。
VOLUME: 设置数据卷
CMD: 一个文件中只能有一条CMD指令。若列出了多个CMD,则只有最后一个CMD生效。
ENTRYPOINT: 类似CMD,镜像启动时运行的命令,不可替换。若有多个命令,则仅最后一个生效。
ONBUILD : 当镜像被用作另一个构建的基础时,ONBUILD指令在镜像中添加了一个稍后要执行的触发指令。
USER: 为RUN、CMD和ENTRYPOINT执行命令指定运行用户.
HEALTHCHECK:容器中服务健康检查

●阿里云镜像搜索:https://cr.console.aliyun.com/cn-qingdao/instances/images


(5)docker制作镜像示例1(Centos镜像)

★自定义镜像 centos
1、编写DockerFile 文件
2、使用docker build 构建镜像
3、使用docker run 创建容器

★DockerFile

FROM centos:mytag
LABEL author="xxx@zzz.com" #或:MAINTAINER liming liming_01@163.com
ENV myhome /tmp
WORKDIR $myhome
RUN yum -y install vim
COPY test.txt /etc/ #拷贝test.txt到etc下。
RUN mkdir /datavolume
VOLUME /datavolume #设置一个数据卷。此时,主机中的数据卷自动生成。

CMD /bin/bash

★构建镜像

docker build -f dockerfile_path -t image:tag . #最后的.勿忘。
例:docker build -f /mydocker/DockerFile -t my_centos:1.1 .
测试:docker run -it my_centos:1.1 /bin/bash


(6)docker制作镜像示例2(tomcat镜像)
环境:centos + jdk8 + tomcat + vim

 1 #选择基础镜像
 2 FROM centos
 3 #设置描述信息
 4 LABEL maintainer="xxx@zzz.com"
 5 #测试COPY从主机拷贝文件到容器
 6 COPY testcp.txt /usr/local/testcp.txt
 7 #在基础镜像上安装软件 apache-tomcat-9.0.13.tar.gz 和 jdk-8u181-linux-x64.tar.gz
 8 ADD jdk-8u181-linux-x64.tar.gz /usr/local/ #从主机的当前路径拷贝jdk-8u181到容器的/usr/local/
 9 ADD apache-tomcat-9.0.13.tar.gz /usr/local/
10 #安装 vim 编辑器
11 RUN yum -y install vim
12 #设置 容器数据卷
13 RUN mkdir /dataVolume
14 VOLUME /dataVolume
15 
16 #设置工作路径
17 ENV MYPATH /usr/local
18 WORKDIR $MYPATH
19 #设置环境变量
20 ENV JAVA_HOME /usr/local/jdk1.8.0_181
21 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
22 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.13
23 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.13
24 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
25 #容器监听端口
26 EXPOSE 8080
27 #启动时运行 tomcat
28 CMD /usr/local/apache-tomcat-9.0.13/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.13/bin/logs/catalina.out
View Code

★构建镜像

docker build -t my_tomcat . #省略的参数,从当前目录找。

★利用当前镜像创建容器。
docker run -d -p 8888:8080 --name mytomcat01 mytomcat

★附:

docker build [OPTIONS] PATH | URL | -

OPTIONS说明:
-f : 指定要使用的Dockerfile路径;
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm : 设置镜像成功后删除中间容器;
--shm-size : 设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--network: 默认 default。在构建期间设置RUN指令的网络模式
例:
docker build . #从当前文件读取docker file文件。
docker build -t my_tomcat:tag01 -f /path/dockerfile #从指定路径读取dockerfile。
docker build -t my_tomcat:tag02 -f http://www.test.com/dockerfile #从指定网址读取dockerfile。

原文地址:https://www.cnblogs.com/mountain2011/p/11223452.html