创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。
1.基于现有镜像创建
(1)首先启动一个镜像,进入容器进行内容修改
先用现有镜像启动容器
docker run
再进入容器进行内容更新
docker exec -it
docker run -id --name c1 centos:7 /bin/bash
docker exec -it c1 bash
yum install -y epel-release
yum install -y nginx
nginx
cd /usr/share/nginx/html/
echo '<h1>wx dsb</h1>' > wx.html
exit#修改后退出到宿主机
(2)然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像
最后提交成新的镜像
docker commit
例如:docker commit -m "nginx on centos7" -a "wxdsb" 9b1286a577ab nginx:ky33
#常用选项:
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。
docker images
2.基于模板文件创建
将本地容器导出为模板文件
docker export -o 模板文件名 容器名|容器ID
例如:
docker export -o nginx-centos.tar 9b1286a577ab
mv nginx-centos.tar /opt将文件传到/opt
cd opt
ls查看
再将模板文件导入成镜像
docker import 模板文件名 --镜像名
例如:docker import nginx-centos.tar -- nginx:centos7
docker images #查看镜像
测试新镜像
docker run -id --name
例如:
docker run -id --name c3 nginx:centos7 bash
3.基于Dockerfile创建
1)FROM 镜像
指定新镜像所基于的基础镜像,dockerfile的第一行指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令
2)MAINTAINER 名字(可选)
指定镜像的维护人信息
3)RUN 命令
指定linux命令,尽量将多条linux命令放在一个run指令里,用 “ ;”或”&&“或<<EOF使用
4)EXPOSE 端口号
指定容器要开启的应用的端口号
5)ENV 环境变量 变量值
指定容器的环境变量
6)ADD/COPY
ADD 源文件/目录 目标文件/目录
COPY 源文件/目录 目标文件/目录
复制本地文件或目录到镜像里
7)VOLUME [“目录”]
指定容器的匿名数据卷(作用类似于docker run -v /var/lib/docker/volumes/容器ID/:容器数据卷目录)
8)USER 用户名/UID
指定容器云的用户
9)WORKDIR 路径
指定后续镜像层的工作目录
10)ARG
指定构建镜像时传入的参数变量(可通过“docker build --build-arg 变量=值”进行传入参数)
11)CMD/ENTRYPOINT
指定容器启动时执行的命令和参数
如何使用dockerfile构建镜像?
1.编写dockerfile文件,在第一行用FROM指令指定基础镜像
2.用MAINTAINER指令指定镜像维护人信息(可选)
3.用RUN EXPOSE ENV ADD COPY等指令编写构建镜像的过程
4.在Docekerfile结尾用CMD或ENTRYPOINT指令指定容器启动时执行的命令
5.用docker build -t build -t 镜像名:标签 . 命令来构建镜像
编写dockerfile的yum安装nginx步骤
在/opt下创建dockerfile
再在dockerfile下创建nginx目录
将nginx的repo包上传到nginx目录下,创建Dockerfile文件
vim Dockerfile
#指定基础镜像
FROM centos:7
#指定维护人信息
MAINTAINER this is nginx image by yum install <hyh 20240125>
#编写构建镜像的过程
COPY nginx.repo /etc/yum.repos.d/
RUN yum install -y nginx
EXPOSE 80
#EXPOSE 443
#指定容器启动命令
CMD ["/usr/sbin/nginx","-g","daemon off;"]
docker build -t nginx:ky33 . #-t 指定要创建的nginx镜像名称 .代表从当前目录中搜索dockerfile文件
docker run -d -p 1314:80 nginx:ky33
docker ps -a
docker exec -it 容器ID bash
cd /usr/share/ngix/html
ls
echo '<h1>wx is dsb</h1>' >dsbwx.html
浏览器访问192.168.116.21:1314/dsbwx.html
通过源码编译安装nginx
改源码编译nginx脚本
vim dockerfileFROM centos:7
ADD nginx-1.24.0.tar.gz /opt/RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make && \useradd -M -s /sbin/nologin nginx && \cd /opt/nginx-1.24.0/ && \./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \make && make installENV PATH=$PATH:/usr/local/nginx/sbinEXPOSE 80
#EXPOSE 443ENTRYPOINT ["/usr/local/nginx/sbin/nginx"]
CMD ["-g","daemon off;"]docker build -t nginx:1.24 .docker run -d -p 1314:80 nginx:ky33
docker ps -a
docker exec -it 容器ID bash
cd /usr/share/ngix/html
ls
echo '<h1>wx is dsb</h1>' >dsbwx.html
浏览器访问192.168.116.21:1314/dsbwx.html
在编写 Dockerfile 时,有严格的格式需要遵循:
●第一行必须使用 FROM 指令指明所基于的镜像名称;
●之后使用 MAINTAINER 指令说明维护该镜像的用户信息;
●然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。
●最后使用 CMD 指令指定启动容器时要运行的命令操作。
ADD和COPY的区别?
共同点:都可以将本地的文件或目录复制到镜像里
区别:
ADD还可以通过URL地址下载文件并复制到镜像里,还能将本地的压缩包解压后再复制到镜像里 (URL下载和压缩包解压特性不能同时生效)
即通过URL下载的压缩包只能以压缩包的形式复制到镜像里
CMD和ENTRYPOINT的区别?
共同点:都可以用来指定容器的启动命令
区别:ENTRYPOINT指定的容器启动命令优先级更高
如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用
容器启动时运行命令的优先级
1.docker run --entrypoint="命令"
2.镜像里的ENTRYPOINT指令指定的“命令”
3.docker run …… 镜像“命令”
4.镜像里的CMD指令指定的“命令”