深入探讨Image

 

说白了,image就是由一层一层的layer组成的。

官方image

https://github.com/docker-library

例如tomcat的地址

https://github.com/docker-library/tomcat/blob/master/8.5/jdk8/adoptopenjdk-hotspot/Dockerfile

Dockerfile

不妨我们也来制作一个自己的image镜像,顺便学习一下Dockerfile文件中常见语法

FROM

指定基础镜像,比如FROM ubuntu:14.04

FROM ubuntu:14.04

RUN

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

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

ENV

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

ENV MYSQL_MAJOR 5.7

LABEL

设置镜像标签

LABEL email="caojiulu@163.com"
LABEL name="caojiulu"

VOLUME

指定数据的挂在目录

VOLUME /var/lib/mysql

COPY

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

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

ADD

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

ADD application.yml /etc/caojiulu/

WORKDIR

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

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

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

WORKDIR /root
ADD app.yml test/

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

CMD

容器启动的时候默认会执行的命令,若有多个CMD命令,则最后一个生效

CMD ["mysqld"]
或
CMD mysqld

ENTRYPOINT

和CMD的使用类似

ENTRYPOINT ["docker-entrypoint.sh"]

和CMD的不同

docker run执行时,会覆盖CMD的命令,而ENTRYPOINT不会

EXPOSE

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

EXPOSE 3306

Dockerfile实战Spring Boot项目

(1)创建一个Spring Boot项目

(2)写一个controller

    @RestController
    public class DockerController {
        @GetMapping("/dockerfile")
        @ResponseBody
        String dockerfile() {
            return "hello docker" ;
        }
    }
(3)mvn clean package打成一个jar包

在target下找到"dockerfile-demo-0.0.1-SNAPSHOT.jar"

(4)在docker环境中新建一个目录"first-dockerfile"

(5)上传"dockerfile-demo-0.0.1-SNAPSHOT.jar"到该目录下,并且在此目录创建Dockerfile

(6)创建Dockerfile文件,编写内容

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

(7)基于Dockerfile构建镜像

docker build -t test-docker-image .

(8)基于image创建container

docker run -d --name user01 -p 6666:8080 test-docker-image

(9)查看启动日志docker logs user01

(10)宿主机上访问curl localhost:6666/dockerfile

hello docker

(11)还可以再次启动一个

docker run -d --name user02 -p 8081:8080 test-docker-image

镜像仓库

docker hub

(1)在docker机器上登录

    docker login
(2)输入用户名和密码

(3)docker push caojiulu/test-docker-image

[注意镜像名称要和docker id一致,不然push不成功]

(4)给image重命名,并删除掉原来的

docker tag test-docker-image caojiulu/test-docker-image

docker rmi -f test-docker-image

(5)再次推送,刷新hub.docker.com后台,发现成功

(6)别人下载,并且运行

docker pull caojiulu/test-docker-image

docker run -d --name user01 -p 6661:8080 caojiulu/test-docker-image

阿里云docker hub

阿里云docker仓库
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
参考手册
https://cr.console.aliyun.com/repository/cn-hangzhou/dreamit/image-repo/details

(1)登录到阿里云docker仓库

sudo docker login --username=caojiulu registry.cn-hangzhou.aliyuncs.com
(2)输入密码

(3)创建命名空间,比如caojiulu

(4)给image打tag

docker tag caojiulu/test-docker-image1 registry.cn-hangzhou.aliyuncs.com/aliyunjiulu/test-docker-image:v1.0

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

docker push registry.cn-hangzhou.aliyuncs.com/aliyunjiulu/test-docker-image:v1.0

(6)别人下载,并且运行

docker pull registry.cn-hangzhou.aliyuncs.com/aliyunjiulu/test-docker-image:v1.0

docker run -d --name user01 -p 6661:8080 registry.cn-hangzhou.aliyuncs.com/aliyunjiulu/test-docker-image:v1.0

阿里云推送成功之后:

搭建自己的Docker Harbor

(1)访问github上的harbor项目

https://github.com/goharbor/harbor

(2)下载版本,比如1.7.1

https://github.com/goharbor/harbor/releases

(3)找一台安装了docker-compose[这个后面的课程会讲解],上传并解压

tar -zxvf xxx.tar.gz

(4)进入到harbor目录

修改harbor.cfg文件,主要是ip地址的修改成当前机器的ip地址
同时也可以看到Harbor的密码,默认是Harbor12345

(5)安装harbor,需要一些时间

sh install.sh

(6)浏览器访问,比如39.100.39.63,输入用户名和密码即可

Image常见操作

(1)查看本地image列表

    docker images
    docker image ls

(2)获取远端镜像

    docker pull

(3)删除镜像[注意此镜像如果正在使用,或者有关联的镜像,则需要先处理完]

    docker image rm imageid
    docker rmi -f imageid
    docker rmi -f $(docker image ls) 删除所有镜像

(4)运行镜像

    docker run image

(5)发布镜像

    docker push

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐