likes
comments
collection
share

docker安装与idea集成

作者站长头像
站长
· 阅读数 9

安装docker

centos下的docker安装

脚本安装docker

使用官方脚本安装(推荐):

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

也可以手动安装:

先卸载久的版本:

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

安装需要的软件包:

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

设置稳定仓库,从下面任意选一项:

-- 官方的(国内比较慢,国外节点选这个)
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
-- 阿里云(国内节点选这个)
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

手动安装docker

安装最新版的docker

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。

启动 Docker。

sudo systemctl start docker

设置开机自启

sudo systemctl enable docker

运行hello-world:

sudo docker run hello-world

docker镜像加速

如果是在国内节点,因为一些客观因素,安装完成之后还不能直接使用。国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,比如:

当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。

在 /etc/docker/daemon.json 中写入如下内容:

{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}

然后重新启动服务:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

docker compose安装

windows/macos下的桌面版自带compose,无需安装。

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

github上下载docker-compose:

sudo curl -L "https://github.com/docker/compose/releases/download/v1.25.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

设置可执行权限

sudo chmod +x /usr/local/bin/docker-compose

创建软链

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

查看是否安装成功

$ docker-compose version
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

https链接

开放端口之后,最好使用https的方式远程连接docker,不然可能会被不怀好意的人扫到,当成肉鸡,或者矿机,说多了都是泪啊~

当然不介意安全的或者防火墙可以限制ip的,可以跳过https的方式。

docker安装与idea集成

下面介绍一下如何安装https证书,首先保存脚本:

#!/bin/bash

#相关配置信息
SERVER="输入你的服务器外网IP"
PASSWORD="输入你的密码"
COUNTRY="CN"
STATE="输入你的省份"
CITY="输入你的城市"
ORGANIZATION="输入你的组织"
ORGANIZATIONAL_UNIT="Dev"
EMAIL="输入你的邮箱"

###开始生成文件###
echo "开始生成文件"

#切换到生产密钥的目录
mkdir /opt/docker_ca
cd /opt/docker_ca 
#生成ca私钥(使用aes256加密)
openssl genrsa -aes256 -passout pass:$PASSWORD  -out ca-key.pem 4096
#生成ca证书,填写配置信息
openssl req -new -x509 -passin "pass:$PASSWORD" -days 365 -key ca-key.pem -sha256 -out ca.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL"

#生成server证书私钥文件
openssl genrsa -out server-key.pem 4096
#生成server证书请求文件
openssl req -subj "/CN=$SERVER" -sha256 -new -key server-key.pem -out server.csr
#配置白名单,多个用逗号隔开
sh -c 'echo subjectAltName = IP:'$SERVER',IP:0.0.0.0 >> extfile.cnf'
#把 extendedKeyUsage = serverAuth 键值设置到extfile.cnf文件里,限制扩展只能用在服务器认证
sh -c 'echo extendedKeyUsage = serverAuth >> extfile.cnf'
#使用CA证书及CA密钥以及上面的server证书请求文件进行签发,生成server自签证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -\CAcreateserial -out server-cert.pem -extfile extfile.cnf

#生成client证书RSA私钥文件
openssl genrsa -out key.pem 4096
#生成client证书请求文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
#继续设置证书扩展属性
sh -c 'echo extendedKeyUsage = clientAuth >> extfile.cnf'
#生成client自签证书(根据上面的client私钥文件、client证书请求文件生成)
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -\CAcreateserial -out cert.pem -extfile extfile.cnf

#更改密钥权限
chmod 0400 ca-key.pem key.pem server-key.pem
#更改密钥权限
chmod 0444 ca.pem server-cert.pem cert.pem
#删除无用文件
rm client.csr server.csr

echo "生成文件完成"
###生成结束###

修改docker配置:

vim /lib/systemd/system/docker.service

在ExecStart的/usr/bin/dockerd后面加\,然后添加配置:

ExecStart=/usr/bin/dockerd \
        --tlsverify \
        --tlscacert=/opt/docker_ca/ca.pem \
        --tlscert=/opt/docker_ca/server-cert.pem \
        --tlskey=/opt/docker_ca/server-key.pem \
        -H tcp://0.0.0.0:2376 \
        -H unix:///var/run/docker.sock \
        -H fd:// --containerd=/run/containerd/containerd.sock

将2376端口添加到安全组然后重启docker:

systemctl daemon-reload && systemctl restart docker

将生成的密钥下载到本地电脑:

docker安装与idea集成

接下来就可以配置idea进行连接了。

使用idea连接docker进行远程部署

连接远程docker服务

首先需要安装docker插件,我这里已经安装好了。

docker安装与idea集成

然后在设置界面,Build,Execution,Deployment ----> Docker,增加一条docker server连接,在TCP socket的Engine API URL中填入ip地址,比如 https://127.0.0.1:2376,在Certificates folder中填写https证书存放的位置,注意是本地目录,而不是服务器上证书的位置。

docker安装与idea集成

如果提示Connection successful,说明连接成功。

docker安装与idea集成

创建SpringBoot应用

新建一个SpringBoot项目,项目maven如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.9</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.lin</groupId>
  <artifactId>docker</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>BootDocker</name>
  <description>Demo project for Spring Boot</description>
  <properties>
    <java.version>8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

只添加了web依赖,能看见效果即可。Application的代码就不贴了。

接下来,在最外层创建DockerFile文件,和pom.xml文件平级:

#基于哪个镜像制作,我跑的是java项目,所以基于java8
FROM java:8-jdk-alpine
MAINTAINER "lingxiao"<xxx@qq.com>
#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
# 添加jar包,这里做了重命名
ADD target/docker-0.0.1-SNAPSHOT.jar demo.jar
#暴露8080端口
EXPOSE 8080
#启动容器时的进程
ENTRYPOINT ["java","-jar","/demo.jar"]

因为我最后通过mvn install生成的jar包文件叫BootDocker-0.0.1-SNAPSHOT.jar,所以这里就直接填的这个名字。

添加docker部署配置

创建一个docker配置,如下,点击Edit Configurations:

docker安装与idea集成

选择Dockerfile:

docker安装与idea集成

然后按照如下配置:

docker安装与idea集成

需要注意的是,这个地方在启动docker配置之前,需要先做一个打包的动作,也就是在before launch下面,点击+号:

docker安装与idea集成

选择 run maven goal,然后输入:

docker安装与idea集成

完成后,点击倒三角,运行程序:

docker安装与idea集成

如下图所示,程序已经运行起来了。

docker安装与idea集成

访问服务器,发现正常运行:

docker安装与idea集成

至此,Idea下的docker插件配置使用就完成了。如果是非常简单的应用,就可以直接用这种方式运行,部署非常快。

docker compose编排服务部署

上面的情况适合只有单个java应用的情况,但是现实情况可能比较复杂,比如我的mysql、redis、nginx等都基于docker部署的,这种情况下怎么样才能方便部署呢。这个时候就可以使用docker compose了。

docker安装与idea集成

改造之前的项目:

docker安装与idea集成

这个地方我创建了两个项目,一个项目是core,一个项目是nginx。其中core为SpringBoot项目,nginx是一个文件夹。

分别在core文件夹和nginx文件夹根目录创建Dockerfile文件:

docker安装与idea集成

再创建一个nginx.conf文件,这个文件就是nginx的配置文件,待会会添加在Dockerfile文件中,创建nginx容器的时候就直接使用这个配置文件了:


#user  nobody;
worker_processes 1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
	worker_connections 1024;
}


http {
	include mime.types;
	default_type application/octet-stream;
	server_names_hash_bucket_size 64;

	#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	#                  '$status $body_bytes_sent "$http_referer" '
	#                  '"$http_user_agent" "$http_x_forwarded_for"';

	#access_log  logs/access.log  main;
	client_max_body_size 10M;
	sendfile on;
	#tcp_nopush     on;

	#keepalive_timeout  0;
	keepalive_timeout 65;

	#gzip  on;
	server {
		listen 80;
		server_name api.lingxiao.cn;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-Host $host;
		proxy_set_header X-Forwarded-Server $host;
		proxy_set_header Host $host;
		location / {
			proxy_pass http://127.0.0.1:8080;
		}
	}

	server {
		listen 80;
		server_name localhost;

		#charset koi8-r;

		#access_log  logs/host.access.log  main;

		location / {
			root html;
			index index.html index.htm;
		}

		#error_page  404              /404.html;

		# redirect server error pages to the static page /50x.html
		#
		error_page 500 502 503 504 /50x.html;
		location = /50x.html {
			root html;
		}
	}
}

其中,core文件夹的Dockerfile文件直接沿用之前的文件,nginx中的文件内容为:

FROM nginx:latest
COPY nginx.conf /etc/nginx/
# COPY fronted/ /www/wwwroot/
# 容器启动nginx后会立刻退出,所以需要使用nginx的前台运行模式
CMD [ "nginx", "-g", "daemon off;"]

两个项目都配置好了,接下来开始编写docker-compose文件:

version: '3.4'   # compose文件版本格式和docker版本兼容
services:
  boot-docker:
    build: ./
    ports:
      - "8080:8080"
    depends_on:
      - db
      - nginx-web
  db:
    image: mysql:latest
    ports:
      - "3300:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
  nginx-web:
    build:
      context: ../nginx
      dockerfile: Dockerfile
    # ports:
    #  - "80:80"
    volumes:
      - "/home/nginx/www:/usr/share/nginx/html"
      - "/home/nginx/logs:/var/log/nginx"
      - "/www/wwwroot:/www/wwwroot"
    network_mode: host

接下来再配置idea,创建一个新配置选择Docker-compose:

docker安装与idea集成

如下图这样的配置:

docker安装与idea集成

接下来点击运行即可:

docker安装与idea集成

由于我是本地运行的,可以在docker控制面板看,已经跑起来了:

docker安装与idea集成

参考:

菜鸟教程-docker安装

Docker开启2376端口