自学内容网 自学内容网

docker镜像的创建

创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于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 dockerfile

FROM 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 install

ENV PATH=$PATH:/usr/local/nginx/sbin

EXPOSE 80
#EXPOSE 443

ENTRYPOINT ["/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指令指定的“命令”


原文地址:https://blog.csdn.net/HanYuHao11/article/details/135856251

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!