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

  • Post author:
  • Post category:其他



目录


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="chenpp@163.com" 
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



版权声明:本文为qq_35448165原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。