docker基础

一、入门

1、使用docker,可更快打包、测试、部署,并可缩短从编写到部署运行代码的周期。

2、registry:一个registry包含多个docker仓库,每个库可包含多个镜像标签。

       唯一的image=docker库+标签

 

(一)、docker 安装

1、卸载旧版本docker:

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

注:该命令只会删除docker本身,不会删除docker存储的文件,如:images, containers, volumes, and networks。这些文件保存在/var/lib/docker

2、安装仓库:

sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

3、安装最新版本的docker-engine:sudo yum install docker-ce docker-ce-cli containerd.io

注:列出当前可用的docker版本:yum list docker-ce.x86_64 --showduplicates | sort -r

4、启动docker:sudo systemctl start docker

5、升级docker:sudo yum makecache fast--->然后按照安装docker的步骤,即可完成升级

6、卸载docker:sudo yum remove docker-ce---->sudo rm -rf /var/lib/docker

 

(二)、docker常用命令

1、image常用命令

a、搜索image:docker search java

b、下载image:docker pull java

c、列出image:docker images

d、删除指定image:docker rmi java

     删除所有image:docker rmi -f $(docker images)

e、保存image(将java保存为java.tar):docker save --output java.tar java

f、加载image(从java.tar中加载java):docker load --input java.tar

g、通过dockerFile构建image:docker build -t 镜像名(a:b) dockerFile

2、docker常用命令

a、创建并启动container:docker run -d --name 容器名 -p 宿主机端口:容器端口 镜像名

b、列出容器:docker ps

c、停止容器:docker stop 容器id

d、强制停止容器:docker kill 容器id

e、启动停止的容器:docker start 容器id

f、进入容器:docker exec -it 容器id /bin/bash

g、退出容器:exit

 

二、将服务运行在docker上

(一)、dockerFile常用指令

1、文件复制:ADD src dest

注:a、从src目录复制文件到容器的dest。其中src可以是Dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包。

b、如果src是一个url。dest以斜杠结尾,dest将被视为目录;dest不以斜杠结尾,dest将被视为文件。

c、如果src是一个目录,name整个目录下内容将被复制

2、设置构建参数:ARG user=sunxj

住:ARG指令用于设置构建参数,类似于ENV。和ENV不同的是,ARG设置的是构建时的环境变量,在容器运行时是不会存在这些变量的。

3、容器启动命令:CMD

注:CMD指令用于为执行容器提供默认值,每个Dockerfile只有一个CMD命令,如果执行了多个CMD命令,那么只有最后一条会被执行,

格式1:CMD ["executable" "param1" "param2"]

格式2:CMD ["param1" "param2"]  (为entrypoint指令提供预设参数)

格式3:CMD command param1 param2 (在shall中执行)

4、文件复制:COPY src dest

注:与ADD类似,COPY不支持URL和压缩包

5、ENTRYPOINT入口点

格式1:CMD ["executable" "param1" "param2"]

格式2:CMD command param1 param2 (在shall中执行)

注:entrypoint和cmd指令的目的一样,都是指定Docker容器启动时执行的命令,可以多次设置,只有最后一个有效

6、设置容器环境变量:ENV 

注:ENV JAVA_HOME /path/to/java

7、生命暴露的端口:EXPOSE

注:用于声明在运行时容器提供服务的端口

8、指定基础镜像:FROM image

9、为镜像添加元数据:LABEL key=value

10、执行命令:RUN 

格式1:RUN <command>

格式2:RUN ["executable" "param1" "param2"]

注:RUN <command> 在shell终端运行,在Linux中默认是/bin/sh -c,在windows中cmd /s /c,使用这种格式就行在命令行中输入命令一样,

RUN ["/bin/bash" "-c" "echo hello"]

11、指定挂载点:VOLUME

注:该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可供其他容器使用。

例:VOLUME /data

12、指定工作目录

例:WORKDIR /path/to/workdir

切换目录指令,类似于cd命令,写在该指令后的RUN、CMD以及ENTRYPOINT指令都将该目录视为当前目录,并执行相应的命令。

 

(二)、使用Dockerfile构建镜像

1、构建jar包:microservice-discovery-eureka-0.0.1-SNAPSHOT.jar

2、创建Dockerfile

[root@A01-R06-I169-67 eureka]# cat Dockerfile 
FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

3、利用Dockerfile构建image:docker build -t itmuch/microservice-discovery-eureka:0.0.1 .

4、利用image构建container:docker run -d --name my-eureka -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1(仓库名称/镜像名称:标签)

(三)、使用docker-registry管理docker镜像

1、在hub.docker.com上创建repository:test-repository

      登录私有仓库:docker login

2、将image推送到dockerHub:docker push itmuch/microservice-discovery-eureka:0.0.1

3、使用docker registry2.0搭建一个私有仓库

a、搭建docker registry-2.0:docker run -d -p 5000:5000 --restart=always --name registry2 registry:2

b、修改image-tag:docker tag itmuch/microservice-discovery-eureka:0.0.1 localhost:5000/itmuch/microservice-discovery-eureka:0.0.1

因为docker-hub是默认的docker-registry,所以,itmuch/microservice-discovery-eureka:0.0.1相当于docker.io/itmuch/microservice-discovery-eureka:0.0.1

c、将image推送到私有仓库(只需指定私有仓库地址):docker push localhost:5000/itmuch/microservice-discovery-eureka:0.0.1

 

三、使用maven插件构建docker镜像

(一)、快速入门

1、插件名称:docker-maven-plugin

      官方地址:https://github.com/spotify/docker-maven-plugin

2、插件配置

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>0.4.13</version>
        <configuration>
          <imageName>itmuch/${project.artifactId}:${project.version}</imageName>
          <baseImage>java</baseImage>
          <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
          <resources>
            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>
        </configuration>
      </plugin>

说明:

resources.resource.directory:用于指定需要复制的根目录。${project.build.directory}表示target目录

resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar文件

3、构建docker镜像:mvn clean docker:build

(二)、插件读取Dockerfile进行构建

1、在项目中创建src/main/docker/Dockerfile文件,如上

2、插件内容:

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>0.4.13</version>
        <configuration>
          <imageName>itmuch/${project.artifactId}:${project.version}</imageName>
          <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
          <resources>
            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>
        </configuration>
      </plugin>

说明:使用dockerDirectory指定Dockerfile所在路径

(三)将插件绑定到某个phase执行

执行mvn clean package时,插件就自动构建docker镜像。要想实现这一点,就要将插件的goal绑定到某个phase

注:phase和goal的理解:maven 命令的格式是mvn phase:goal,例如mvn package docker:build。那么,package和docker都是phase,build就是goal。

1、插件内容:将docker的build绑定到了package

也就是说只要执行mvn package就会执行mvn docker:build

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>0.4.13</version>
        <executions>
          <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
              <goal>build</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <imageName>itmuch/microservice-discovery-eureka:0.0.3</imageName>
          <baseImage>java</baseImage>
          <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
          <resources>
            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>
        </configuration>
      </plugin>

(四)、推送镜像

使用mvn插件实现docker push到docker-hub

1、修改maven-settings.xml,添加docker-hub的用户信息

<server>
  <id>docker-hub</id>
  <username>docker-hub用户名</username>
  <password>docker-hub密码</password>
  <configuration>
    <email>docker-hub邮箱</email>
  </configuration>
</server>

2、插件内容

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>0.4.13</version>
        <configuration>
          <imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>
          <baseImage>java</baseImage>
          <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
          <resources>
            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>

          <!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
          <serverId>docker-hub</serverId>
        </configuration>
      </plugin>

3、mvn命令:mvn clean package docker:build -DpushImage

注:也可推送到私有仓库:<imageName>localhost:5000/itmuch/microservice-discovery-eureka:0.0.4</imageName>

(五)、常用技巧

1、以上是通过imageName指定镜像名称和标签的

例如:<imageName>localhost:5000/itmuch/microservice-discovery-eureka:0.0.4</imageName>

也可以借助imageTags指定标签

例如:


        <configuration>
          <imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>
          <imageTags>
            <imageTag>0.0.5</imageTag>
            <imageTag>latest</imageTag>
          </imageTags>
          <baseImage>java</baseImage>
          <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
          <resources>
            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>

          <!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
          <serverId>docker-hub</serverId>
        </configuration>

这样就可以为同一个镜像指定两个标签

2、也可以在执行构建命令时,使用dockerImageTags参数执行标签名称,例如:mvn clean package docker:build -DpushImageTags -DdockerImageTags=latest -DdockerImageTags=anther-tag

3、如果重复构建相同标签名的镜像,可将forceTags设置为true,这样就会覆盖相同标签的镜像


        <configuration>
          <forceTags>true</forceTags>
        </configuration>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值