Docker 的简单使用

摘要

本篇博客主要介绍Docker的基本概念和简单使用内容包括:

1 Linux安装docker,以及配置;

2 IDEA插件界面化操作docker完成镜像的拉取,容器的创建;

3 配置mysql镜像的自启;

4 最后通过一个简单的Springboot项目简单演示docker完成项目的发布和部署等

1.1 什么是Docker

概念:

Docker 是一个开源的应用容器引擎 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。(简单理解:他就是一个对你的工具进行归类的箱子,每一种工具都可以放在不同的箱子里面,对其进行归类.我们的jar包,mysql,redis等等都可以看作一种工具,我们都可以使用docker容器对其进行封装)

作用:

在docker的概念里有几个关键词很重要:容器 轻量级 可移植

这几个关键字第一个就不必介绍了,轻量级也很好理解,最关键的就是 可移植 这一点很重要,它可以让我们后期维护成本降到一个很低的层次,举个例子,公司在A服务器上上线了一款应用,A服务器上有我们应用需要的全部环境(jdk 、DB、redis、等等一系列东西),这时候公司又买了一台B服务器,需要你讲A服务器上所有的东西原封不动的搬到B服务器上做一个升级或者备份。这时候如果你没有使用docker可想而知,你需要的维护成本有多高,就和你装系统一样,你想要你新买的电脑系统和原来旧电脑一样,可想而知有多麻烦。

但是如果你一开始使用的就是docker那你的工作就会相当轻松了,你只需要把你应用需要的容器拉取下来,在另一台服务器上也装一个docker直接运行你的镜像即可。这就是可移植性的好处。

1.2 Docker安装

docker 是基于linux的运行的,所以我们一般会将docker安装到linux服务器上,如果window等系统想要安装docker需要安装linux系统的虚拟机才能安装docker.

1.2.1 CentOS安装docker

这里以centos7为例来演示docker的安装,其实安装很简单,网上资料也一大堆

我喜欢使用一键安装的方式

首先:更新一下yum源

yum update

如果你之前安装过docker 请先卸载

-- 卸载安装包
yum remove docker-ce

-- 卸载cli
yum -y remove docker-ce-cli

-- 删除所有相关文件(镜像,容器,配置文件等等)
rm -rf /var/lib/docker

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如果你之前没有安装过docker直接使用如下命令即可,我这里因为已经删除过了所以没有匹配

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

在这里插入图片描述

安装docker

curl -sSL https://get.daocloud.io/docker | sh
或者
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

在这里插入图片描述

1.3 Docker简单操作

docker 是否安装成功前期需要建的命令验证一下

-- 查看版本
docker -v

在这里插入图片描述

启动docker,查看镜像,查看容器,拉取hello-world镜像并运行

-- 启动docker
sudo systemctl start docker
-- 查看镜像
docker images
-- 查看容器
docker ps -a
-- 拉取hello-world镜像
docker pull hello-world
-- 简单运行
docker run hello-world

在这里插入图片描述

在这里插入图片描述

1.4 Docker 配置服务开机自启

很显然我们不能每次重启服务器的时候就去重新启动docker服务,我们来配置一下docker自启

-- docker 服务开机自启
sudo systemctl enable docker.service
-- docker 服务关闭开机自启
sudo systemctl disable docker.service

在这里插入图片描述

1.5 IDEA插件连接Docker

IDEA安装docker插件

在这里插入图片描述

开放和放行2375端口(2375是docker的默认端口)不开放无法使用插件完成docker的远程连接

-- 开放2375端口
vi /usr/lib/systemd/system/docker.service
找到 ExecStart ,在最后面添加 -H tcp://0.0.0.0:2375
-- 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
-- 防火墙放行2375
firewall-cmd --zone=public --add-port=2375/tcp --permanent
systemctl restart firewalld.service
-- 查看是否放行成功
netstat -nlpt

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

注意:

如果上述配置都已经尝试过idea插件还是不能连接docker请 重启服务器

没错,就是重启服务器,简单粗暴的方式往往最有效.但是如果生产环境就需要考虑了,不要轻易重启哦!!!

再次连接 成功

在这里插入图片描述

在这里插入图片描述

1.6 插件简单操作Docker

我们使用插件简单操作一下docker

1.6.1 配置国内镜像源

docker的官方镜像源很慢,我们可以使用我们国内的加速镜像源

目前市面上有网易,中科大,阿里的加速镜像源,你可以选择配置多个

阿里的需要我们去阿里云控制台申请申请完毕之后可以在插件中配置,这里不再多说了,喜欢的用的可以自行百度.

 -- 修改或创建
 vi /etc/docker/daemon.json
 -- 添加加速镜像源
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
-- 重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
-- 查看docker信息
sudo docker info

在这里插入图片描述

1.6.2拉取mysql镜像并创建启动容器

拉取镜像mysql5.7.10

在这里插入图片描述

创建容器并启动

-- 如果在黑窗口运行使用命令
docker run --name mysql5.7.10-container -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7.10

/*
--name: 给新创建的容器命名,此处命名为mysql5.7.10-container
-e: 配置信息,此处配置 mysql 的 root 用户的登录密码
-p: 端口映射,此处映射主机的3306端口到容器mysql5.7.10-container的3306端口
-d: 成功启动同期后输出容器的完整ID
	最后一个mysql:5.7.10指的是mysql镜像
*/
-- 注意我们可以给一个镜像启动创建多个mysql容器,比如我们还可以,继续启动
docker run --name mysql5.7.10-container2 -e MYSQL_ROOT_PASSWORD=root -p 8899:3306 -d mysql:5.7.10

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.7 使用Docker完成一个项目的打包发布

基本的操作和配置已经完成,接下来我们使用IDEA来完成一个springboot项目的创建、打包、docker发布等操作

1.7.1 创建Springboot项目

IDEA创建springboot项目很简单,这里 就不再详细介绍了我直接列出配置即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>show.mrkay</groupId>
    <artifactId>docker-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.1</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <docker.image.prefix>mrkay.show</docker.image.prefix>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>
server:
  port: 8080
spring:
  application:
    name: test_common_modul
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.50.130:3306/docker_demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
    druid:
      #初始化连接池大小
      initialSize: 10
      #最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止
      minIdle: 1
      #最大活跃数
      maxActive: 50
      #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
      maxWait: 60000
      #失效检查线程运行时间间隔,要小于MySQL默认
      timeBetweenEvictionRunsMillis: 60000
      #连接的超时时间,默认为半小时
      minEvictableIdleTimeMillis: 300000
      #开启池的prepared statement 池功能
      poolPreparedStatements: false
      #statement池能够同时分配的打开的statements的最大数量
      maxOpenPreparedStatements: 50
mybatis-plus:
  mapper-locations: classpath*:mrkay/show/mapper/*.xml
@RestController
@RequestMapping("tUser")
public class TUserController {
    /**
     * 服务对象
     */
    @Resource
    private TUserService tUserService;

    @GetMapping("/all")
    public String listAllUser(){
        List<TUser> list = tUserService.list();
        return list.toString();
    }

}

启动验证项目是否正常

在这里插入图片描述

1.7.2 编写Dcokerfile

在我们的src\mian 目录下创建一个目录命名为docker,方便后期管理

然后创建一个名为Dockerfile的文件

编写如下执行命令

# 依赖java 8 编译
FROM openjdk:8-jdk-alpine
# 将所有 jar 包都添加进来,并命别名为docker-demo.jar
ADD *.jar docker-demo.jar
# 入口,执行java -jar 启动项目
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/.urandom","-jar","/docker-demo.jar"]

在这里插入图片描述

1.7.3 在pom.xml中添加如下配置

<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>
            <configuration>
                <!--告诉插件操作目录为我们创建的docker目录-->
                <dockerDirectory>src/main/docker</dockerDirectory>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <!--配置打包时将jar包拷贝到我们创建的docker目录中-->
                <execution>
                    <!-- 执行package命令时会执行如下操作:copy打包好的包到我们docker目录 -->
                    <phase>package</phase>
                    <configuration>
                        <tasks>
                            <copy todir="src/main/docker" file="target/${project.artifactId}-${project.version}.${project.packaging}"></copy>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

1.7.4 创建Dockerfile运行配置

使用idea创建运行配置

在这里插入图片描述

在这里插入图片描述

执行pagage命令,效果如下

在这里插入图片描述

执行我们创建的demo运行配置

在这里插入图片描述

打印日志正常,项目已经在docker启动,我们访问一下我们的服务器地址看一下效果是不是和我们在本地运行那个的结果一样

在这里插入图片描述

1.8 设置容器自启

其实截止到1.7章节位置我们已经已经大致完成了我们想要的效果,这样我们在前后端分离的情况下,前端就可以直接连接我们服务器上的项目进行接口对接,如果出现问题,我们本地修改之后,直接重新打包然后运行dockerfile运行配置重新上线,回滚上线方便快捷,非常简单。

那么问题来了,如果我docker服务重启了,我们之前创建并运行的容器是不是就挂了?当然。所以我们可以设置容器为自启,即使我们重启了docker服务,我们之前创建的容器也能自己启动。

1.8.1 创建容器之后设置自启

我喜欢在容器创建之后设置它自启,网上也有在创建容器的时候就指定它自启的,这里就不再演示,我们只演示创建之后设置自启

-- 一直尝试重启(推荐)
docker update --restart=always 容器ID
-- 设置重启次数,尝试次数过了还没启动就不再尝试(不推荐)
docker update --restart=on-failure:10 容器ID


Docker 容器的重启策略如下:
 --restart具体参数值详细信息:
       no        // 默认策略,容器退出时不重启容器;
       on-failure    // 在容器非正常退出时(退出状态非0)才重新启动容器;
       on-failure:3    // 在容器非正常退出时重启容器,最多重启3次;
       always      // 无论退出状态是如何,都重启容器;
       unless-stopped  // 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器

重启一下docker服务查看是不是我们想要的结果(以mysql为例子,我已经执行了上面命令)所以直接重启docker服务看一看是不是还能连接上mysql就行了

在这里插入图片描述

在这里插入图片描述

同样我们可以在为我们的springboot项目创建容器之后设置自启,过程一样

这里就不再演示。

1.9 结束语

本次就是一个简单的小记录,对于我来说就是为了熟悉IDEA的docker插件。当然对欲运维人员来说这个教程简直不能再简单了,运维人员对docker的熟练程度绝对要比开发者熟悉得多,所以本篇笔记只适合开发者简单使用,本次demo中部署的是一个单体应用,如果是微服务的话这一套还远远不够,我们还要进一步学习Docker Compose 以及 k8s 等运维工具。

参考链接:

docker菜鸟教程: https://www.runoob.com/docker/docker-tutorial.html

docker配置加速镜像源:https://www.cnblogs.com/cao-lei/p/14448052.html

2.0 资料包及代码

演示项目代码:https://github.com/mrkay001/docker-demo/

CentOS-7虚拟机:链接: https://pan.baidu.com/s/1xKpbvO9NVx6zwCTWMmO2Vg 提取码: ufwn

账号:root

密码:10086@123

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐