Docker 学习笔记—扩展操作

131 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

迁移与备份

  1. 容器保存为镜像

    docker commit [容器名] [保存的镜像名]
    
  2. 镜像备份

    docker save -o [镜像备份名.tar] [镜像]
    
  3. 镜像恢复与迁移

    docker load -i [镜像备份名.tar]
    

Docker 私有仓库

私有仓库搭建与配置

  1. 拉取私有仓库镜像

    docker pull registry
    
  2. 启动私有仓库容器

    docker run -di --name=registry -p 5000:5000 registry
    

    打开浏览器访问地址:【主机 IP:5000/v2/_catalog】

    image-20211228153518022

  3. 修改 daemon.json

    vim /etc/docker/daemon.json
    

    添加以下内容,保存退出

    {"insecure-registries":["主机 IP:5000"]}
    
    {"insecure-registries":["192.168.3.39:5000"]}
    

    此步是用于让 docker 信任私有仓库地址

  4. 重启 Docker 服务

    systemctl restart docker
    
  5. 启动 registry 容器

    docker start registry
    

上传本地镜像

  1. 将本地镜像打包

    docker tag [本地镜像名称]:[版本] [主机 IP:5000]/[镜像名]
    
    docker tag mysql:5.7 192.168.3.39:5000/mysql
    
  2. push 上传镜像到私有仓库

    docker push [镜像名 REPOSITORY]
    
    docker push 192.168.3.39:5000/mysql
    
  3. 浏览器访问地址:【主机 IP:5000/v2/_catalog】

    image-20211228155532385

Dockerfile

Dockerfile 是由一系列命令和参数组成的脚本文件。这些命令应用于基础镜像并最终创建一个新的镜像。

常用命令

命令作用
FROM image_name:tag定义了使用哪个基础镜像启动构建流程
MAINTAINER usr_name声明镜像的创建者
ENV key value设置环境变量
RUN command是 Dockerfile 的核心部分
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件,则会在复制后自动解压
COPY source_dir/file dest_dir/file和 ADD 类似,但是不解压压缩文件
WORKDIR path_dir设置工作目录

制作 JDK1.8 镜像

  1. 首先,在 Linux 中创建一个 jdk8 目录,用来存放我们的 JDK 文件

    mkdir -p /usr/local/jdk8
    
  2. 将 JDK8 的 *.tar.gz 包通过 XFTP 上传到 /usr/local/jdk8 目录下

    image-20211228163150241

  3. /usr/local/jdk8 目录下,创建并编辑 Dockerfile 文件(也就是 JDK 包和 Dockerfile 需要在同一目录下)

    vim Dockerfile
    

    添加以下内容:

    FROM centos:7
    WORKDIR /usr
    RUN mkdir /usr/local/java
    ADD jdk-8u311-linux-x64.tar.gz /usr/local/java
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_311
    ENV PATH $JAVA_HOME/bin:$PATH
    
    • FROM centos:7:指定基础镜像为 Centos7
    • WORKDIR /usr:工作目录
    • RUN mkdir /usr/local/java:创建目录
    • ADD jdk-8u311-linux-x64.tar.gz /usr/local/java:将 jdk8 包拷贝并解压到 ==/usr/local/java== 目录
    • ENV JAVA_HOME【ENV PATH】:配置环境变量
  4. 构建镜像

    docker build -t='jdk1.8' .
    

    ==.== 表示当前目录,不能丢

  5. 等待 Docerfile 里的命令执行完成,构建成功

    image-20211228164201034

DockerMaven 插件进行微服务部署

DockerMaven 插件 Github 地址:github.com/spotify/doc…

微服务部署

手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器

通过使用 Maven 插件实现自动部署,对于数量众多的微服务,手动部署非常麻烦且容易出错,所以建议使用自动部署。

步骤

总体步骤:

  • DockerMaven 先将项目打成 Jar 包
  • 再将 Jar 包打包成 Image 镜像
  • 之后将镜像上传到私有仓库
  • 最后我们直接去 Doker 里面通过镜像创建容器去运行访问就可以了

修改主机配置

  1. 修改主机的 docker.service 文件,使其可以远程访问

    vim /lib/systemd/system/docker.service
    

    打开 docker.service 文件,将

    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    

    修改为:

    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
    
  2. 重启服务

    systemctl daemon-reload
    
  3. 重新启动 Docker

    systemctl restart docker
    
  4. 启动私人仓库

    docker start registry
    

修改防火墙规则

  1. 修改防火墙暴露 2375 端口(开放端口很重要,困了好久)

    firewall-cmd --zone=public --add-port=2375/tcp --permanent #开放2375/tcp端口
    
  2. 更新防火墙,使防火墙设置生效

    firewall-cmd --reload
    
  3. 查看防火墙开放端口

    firewall-cmd --zone=public --list-ports
    

IDEA 插件配置

  1. 在 pom.xml 中添加 plugin 配置

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.1.0</version>
                <executions>
                    <execution>
                        <id>build-image</id>
                        <phase>package</phase>	<!--绑定 maven package 命令-->
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--打包后的镜像名称-->
                    <imageName>${project.artifactId}:${project.version}</imageName>
                    <!--doker 远程地址-->
                    <dockerHost>http://192.168.3.39:2375</dockerHost>
                    <!--基于基础镜像构建-->
                    <baseImage>jdk1.8</baseImage>
                    <!--运行 jar 包的命令-->
                    <entryPoint>["java","-jar","-Dspring.profiles.active=dev","/${project.build.finalName}.jar"]
                    </entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  2. 执行 Maven 的 package 命令

image-20211228183302472

  1. 等待打包完成

    image-20211228183418679

  2. 在宿主机上查看镜像

    docker images
    

    可以看到我们以项目名命名的镜像,版本为 pom.xml 中的版本

    image-20211228200747040

  3. 创建容器 test1,端口映射到 7070

    docker run -di --name=test1 -p 7070:7070 dockertest:0.0.1-SNAPSHOT
    
  4. 浏览器访问【宿主机 IP:端口】即可以正常访问。

    image-20211228201025487