docker学习笔记(二)创建自己的镜像

目录

image与container的可读写性

创建自己的镜像

dockerfile语法

创建自己的springboot项目image(Dockerfile方式)

推送镜像到镜像仓库(阿里云)

通过Container生成Image


image与container的可读写性

An image is a read-only template with instructions for creating a Docker container. Often, an image is based on another image, with some additional customization.

镜像(Image)就是一堆只读层(read-only layer)的统一视角 ,可以由一个个基础的镜像layer组成

而容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

Container = Image(只读曾) + 可读层

docker create <image-id> 通过镜像image创建一个container,就是为指定的镜像(image)添加了一个可读写层,组成了一个新的容器(此时容器还没有运行)

docker start <container-id> 为容器创建了一个隔离的进程空间,使得容器在其中独立地运行

而docker run <image-id> 相当于 docker create + docker start 

创建自己的镜像

官方一般通过一个dockerfile来生成对应的image镜像,可以参照dockerfile的命令制作自己的镜像文件

dockerfile语法

1 FROM

指定基础镜像

Docker会逐条运行Dockerfile中的指令,第一条指令必须为FROM指令,如果在同一个Dockerfile中需要创建多个镜像时,可以使用多个FROM指令

FROM ubuntu:14.04

2 RUN

在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用""

RUN groupadd -r mysql && useradd -r -g mysql mysql

3 ENV

设置变量的值,ENV  MYSQL_MAJOR 5.7,可以通过docker run --e key=value修改,后面可以直接使用${MYSQL_MAJOR}

ENV MYSQL_MAJOR 5.7 

4 LABEL

设置镜像标签

LABEL email="[email protected]" 
LABEL name="chenpp"

5 VOLUME

指定数据的挂载目录,一般用来存放数据库和需要持久化的数据等

VOLUME /var/lib/mysql

5 COPY

将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录(只是复制,不会提取和解压)

COPY docker-entrypoint.sh /usr/local/bin/

6 ADD

将主机的文件复制到镜像内,和COPY类似,同时会对压缩文件提取和解压

ADD application.yml /etc/itcrazy2016/

7 WORKDIR

指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建

在/usr/local/tomcat下创建test.txt文件

WORKDIR /usr/local 
WORKDIR tomcat 
RUN touch test.txt

在/root/test下多出一个app.yml文件

WORKDIR /root 
ADD app.yml test

8 CMD

启动容器时执行的命令,每个Dockerfile 只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。

CMD ["mysqld"] 或 CMD mysqld

9 ENTRYPOINT

配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT ["docker-entrypoint.sh"]

10 EXPOSE

指定镜像要暴露的端口,启动镜像时,可以使用-p参数将该端口映射给宿主机

EXPOSE 3306

 

创建自己的springboot项目image(Dockerfile方式)

1.通过mvn clean package 在target下打成包dockerfile-demo-0.0.1-SNAPSHOT.jar

2.创建springboot-dockerfile目录
   [root@10 ~]# mkdir /opt/springboot-dockerfile

3.上传jar包到该目录下,并且在此目录创建Dockerfile

4.创建Dockerfile文件

 FROM openjdk:8    
 MAINTAINER chenpp
 LABEL name="springboot-dockerfile" version="1.0" author="chenpp"    
 COPY dockerfile-demo-0.0.1-SNAPSHOT.jar springboot-dockerfile-image.jar   
 CMD ["java","-jar","springboot-dockerfile-image.jar"] 

5.基于Dockerfile构建镜像  

##注意最后的"." 表示以当前目录下的Dockerfile构建镜像
[root@10 springboot-dockerfile]#  docker build  -t springboot-docker-image .

6. 基于image创建container    
   docker run -d --name boot01 -p 8180:8080  springboot-docker-image

7. 访问映射的ip地址: 成功

推送镜像到镜像仓库(阿里云)

1.登录自己的阿里云,创建镜像仓库(注意namespace和密码)

2. 登录阿里云账号,tag 创建的image并推送到阿里云镜像库

#登录阿里云的镜像仓库,然后将当前的image 标记成对应的格式 :阿里云地址/命名空间/image
[root@10 springboot-dockerfile]# sudo docker login --username=dearfulan registry.cn-shenzhen.aliyuncs.com

[root@10 springboot-dockerfile]# docker tag springboot-docker-image registry.cn-shenzhen.aliyuncs.com/chenpp/springboot-image:v2.0

[root@10 springboot-dockerfile]# docker push registry.cn-shenzhen.aliyuncs.com/chenpp/springboot-image:v2.0

3.下载并创建container运行

[root@10 springboot-dockerfile]#docker pull registry.cn-shenzhen.aliyuncs.com/chenpp/springboot-image:v2.0
[root@10 springboot-dockerfile]#docker run -d --name boot02 -p 8280:8080 registry.cn-shenzhen.aliyuncs.com/chenpp/springboot-image:v2.0

成功访问:

 

通过Container生成Image

前面说了container是可读写的,相当于在image上加了一层读写层,那么去掉这层读写层,就又变成了一个只读层

所以除了使用Dockerfile生成image,还可以将当前的container生成新的image以供使用(不过官方推荐使用Dockerfile的方式来生成镜像)

1.拉取一个基础镜像
  docker pull centos
2.根据centos镜像创建出一个container    
  docker run -d -it --name my-centos centos    
3.进入my-centos容器中    
  docker exec -it my-centos bash    
4.输入vim命令    
  bash: vim: command not found   

 对该container进行修改,也就是安装一下vim命令,然后将其生成一个新的centos

5.在centos的container中安装vim    
  yum install -y vim   
6.退出容器,将其生成一个新的centos image ---"vim-centos-image"    
  docker commit my-centos vim-centos-image   
7.基于"vim-centos-image"创建新的容器    
  docker run -d -it --name my-vim-centos vim-centos-image   
8.进入到my-vim-centos容器中,检查vim命令是否存在    
  docker exec -it my-vim-centos bash    
  vim 

参考:

https://www.cnblogs.com/bethal/p/5942369.html
 

发布了47 篇原创文章 · 获赞 12 · 访问量 5097

猜你喜欢

转载自blog.csdn.net/qq_35448165/article/details/103208717