目录
创建自己的springboot项目image(Dockerfile方式)
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
参考: