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.042 RUN
在鏡像內部執行一些命令,比如安裝軟件,配置環境等,換行可以使用""
RUN groupadd -r mysql && useradd -r -g mysql mysql3 ENV
設置變量的值,ENV? MYSQL_MAJOR 5.7,可以通過docker run --e key=value修改,后面可以直接使用${MYSQL_MAJOR}
ENV MYSQL_MAJOR 5.74 LABEL
設置鏡像標簽
LABEL email="chenpp@163.com" LABEL name="chenpp"5 VOLUME
指定數據的掛載目錄,一般用來存放數據庫和需要持久化的數據等
VOLUME /var/lib/mysql5 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 test8 CMD
啟動容器時執行的命令,每個Dockerfile 只能有一條CMD命令。如果指定了多條命令,只有最后一條會被執行。如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉CMD指定的命令。
CMD ["mysqld"] 或 CMD mysqld9 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 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構建鏡像 ?
##注意最后的"." 表示以當前目錄下的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.03.下載并創建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
?
總結
以上是生活随笔為你收集整理的docker学习笔记(二)创建自己的镜像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kubernetes(一)kubeadm
- 下一篇: docker学习笔记(三)docker中