docker学习笔记(二)创建自己的镜像
目錄
image與container的可讀寫性
創(chuàng)建自己的鏡像
dockerfile語(yǔ)法
創(chuàng)建自己的springboot項(xiàng)目image(Dockerfile方式)
推送鏡像到鏡像倉(cāng)庫(kù)(阿里云)
通過(guò)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)的統(tǒng)一視角?,可以由一個(gè)個(gè)基礎(chǔ)的鏡像layer組成
?
?
而容器(container)的定義和鏡像(image)幾乎一模一樣,也是一堆層的統(tǒng)一視角,唯一區(qū)別在于容器的最上面那一層是可讀可寫的。
?
Container = Image(只讀曾)?+ 可讀層
docker create <image-id> 通過(guò)鏡像image創(chuàng)建一個(gè)container,就是為指定的鏡像(image)添加了一個(gè)可讀寫層,組成了一個(gè)新的容器(此時(shí)容器還沒(méi)有運(yùn)行)
docker start <container-id>?為容器創(chuàng)建了一個(gè)隔離的進(jìn)程空間,使得容器在其中獨(dú)立地運(yùn)行
而docker run <image-id> 相當(dāng)于 docker create + docker start?
創(chuàng)建自己的鏡像
官方一般通過(guò)一個(gè)dockerfile來(lái)生成對(duì)應(yīng)的image鏡像,可以參照dockerfile的命令制作自己的鏡像文件
dockerfile語(yǔ)法
1 FROM
指定基礎(chǔ)鏡像
Docker會(huì)逐條運(yùn)行Dockerfile中的指令,第一條指令必須為FROM指令,如果在同一個(gè)Dockerfile中需要?jiǎng)?chuàng)建多個(gè)鏡像時(shí),可以使用多個(gè)FROM指令
FROM ubuntu:14.042 RUN
在鏡像內(nèi)部執(zhí)行一些命令,比如安裝軟件,配置環(huán)境等,換行可以使用""
RUN groupadd -r mysql && useradd -r -g mysql mysql3 ENV
設(shè)置變量的值,ENV? MYSQL_MAJOR 5.7,可以通過(guò)docker run --e key=value修改,后面可以直接使用${MYSQL_MAJOR}
ENV MYSQL_MAJOR 5.74 LABEL
設(shè)置鏡像標(biāo)簽
LABEL email="chenpp@163.com" LABEL name="chenpp"5 VOLUME
指定數(shù)據(jù)的掛載目錄,一般用來(lái)存放數(shù)據(jù)庫(kù)和需要持久化的數(shù)據(jù)等
VOLUME /var/lib/mysql5 COPY
將主機(jī)的文件復(fù)制到鏡像內(nèi),如果目錄不存在,會(huì)自動(dòng)創(chuàng)建所需要的目錄(只是復(fù)制,不會(huì)提取和解壓)
COPY docker-entrypoint.sh /usr/local/bin/6 ADD
將主機(jī)的文件復(fù)制到鏡像內(nèi),和COPY類似,同時(shí)會(huì)對(duì)壓縮文件提取和解壓
ADD application.yml /etc/itcrazy2016/7 WORKDIR
指定鏡像的工作目錄,之后的命令都是基于此目錄工作,若不存在則創(chuàng)建
在/usr/local/tomcat下創(chuàng)建test.txt文件
WORKDIR /usr/local WORKDIR tomcat RUN touch test.txt在/root/test下多出一個(gè)app.yml文件
WORKDIR /root ADD app.yml test8 CMD
啟動(dòng)容器時(shí)執(zhí)行的命令,每個(gè)Dockerfile 只能有一條CMD命令。如果指定了多條命令,只有最后一條會(huì)被執(zhí)行。如果用戶啟動(dòng)容器時(shí)候指定了運(yùn)行的命令,則會(huì)覆蓋掉CMD指定的命令。
CMD ["mysqld"] 或 CMD mysqld9 ENTRYPOINT
配置容器啟動(dòng)后執(zhí)行的命令,并且不可被docker run提供的參數(shù)覆蓋。每個(gè)Dockerfile中只能有一個(gè)ENTRYPOINT,當(dāng)指定多個(gè)時(shí),只有最后一個(gè)起效。
ENTRYPOINT ["docker-entrypoint.sh"]10 EXPOSE
指定鏡像要暴露的端口,啟動(dòng)鏡像時(shí),可以使用-p參數(shù)將該端口映射給宿主機(jī)
EXPOSE 3306?
創(chuàng)建自己的springboot項(xiàng)目image(Dockerfile方式)
1.通過(guò)mvn clean package 在target下打成包dockerfile-demo-0.0.1-SNAPSHOT.jar
2.創(chuàng)建springboot-dockerfile目錄
? ?[root@10 ~]# mkdir /opt/springboot-dockerfile
3.上傳jar包到該目錄下,并且在此目錄創(chuàng)建Dockerfile
4.創(chuàng)建Dockerfile文件
FROM openjdk:8 ? ?MAINTAINER chenppLABEL 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構(gòu)建鏡像 ?
##注意最后的"." 表示以當(dāng)前目錄下的Dockerfile構(gòu)建鏡像 [root@10 springboot-dockerfile]# docker build -t springboot-docker-image .6. 基于image創(chuàng)建container ? ?
???docker run -d --name boot01 -p 8180:8080 ?springboot-docker-image
7. 訪問(wèn)映射的ip地址: 成功
?
推送鏡像到鏡像倉(cāng)庫(kù)(阿里云)
1.登錄自己的阿里云,創(chuàng)建鏡像倉(cāng)庫(kù)(注意namespace和密碼)
2. 登錄阿里云賬號(hào),tag 創(chuàng)建的image并推送到阿里云鏡像庫(kù)
#登錄阿里云的鏡像倉(cāng)庫(kù),然后將當(dāng)前的image 標(biāo)記成對(duì)應(yīng)的格式 :阿里云地址/命名空間/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.03.下載并創(chuàng)建container運(yùn)行
[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成功訪問(wèn):
?
?
?
?
?
通過(guò)Container生成Image
前面說(shuō)了container是可讀寫的,相當(dāng)于在image上加了一層讀寫層,那么去掉這層讀寫層,就又變成了一個(gè)只讀層
所以除了使用Dockerfile生成image,還可以將當(dāng)前的container生成新的image以供使用(不過(guò)官方推薦使用Dockerfile的方式來(lái)生成鏡像)
1.拉取一個(gè)基礎(chǔ)鏡像
??docker pull centos
2.根據(jù)centos鏡像創(chuàng)建出一個(gè)container ? ?
??docker run -d -it --name my-centos centos ? ?
3.進(jìn)入my-centos容器中 ? ?
??docker exec -it my-centos bash ? ?
4.輸入vim命令 ? ?
??bash: vim: command not found? ?
?對(duì)該container進(jìn)行修改,也就是安裝一下vim命令,然后將其生成一個(gè)新的centos
5.在centos的container中安裝vim ? ?
??yum install -y vim? ?
6.退出容器,將其生成一個(gè)新的centos image ---"vim-centos-image" ? ?
? docker commit my-centos vim-centos-image? ?
7.基于"vim-centos-image"創(chuàng)建新的容器 ? ?
??docker run -d -it --name my-vim-centos vim-centos-image? ?
8.進(jìn)入到my-vim-centos容器中,檢查vim命令是否存在 ? ?
??docker exec -it my-vim-centos bash ? ?
??vim?
?
?
參考:
https://www.cnblogs.com/bethal/p/5942369.html
?
總結(jié)
以上是生活随笔為你收集整理的docker学习笔记(二)创建自己的镜像的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: kubernetes(一)kubeadm
- 下一篇: docker学习笔记(三)docker中