docker实践之从入门到放弃

一、什么是docker?

Docker 是一个开源的应用容器引擎。

简单讲就是一个相对独立的运行环境区域。

重要的三个概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

简单讲:

镜像-- Java中的类,

容器--类创建的实例对象

仓库--gitlab仓库

还听不懂?

上图:

image.png

 

二、为什么要用docker?

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

简单讲就是把自己的工程打一个包,然后丢到任何支持docker部署的服务器上都可以运行。

三、怎么用docker?

首先来讲我的需求,我想把gitlab 上的项目通过Jenkins部署在服务器,使用docker 容器化方式部署。

1.安装docker

2.docker安装Jenkins

安装

docker pull jenkins[:版本]

这里我安装的版本是:Jenkins 2.249.2 版本很多可以再官网查看docker安装版本(试过错,才知道他的好)

查看

docker images

image.png

看到有Jenkins 说明镜像包已经导入成功

配置

首先介绍两个目录

  • 所有服务的docker-compose必须存储在: /home/deploy/service
  • 应用数据全部存储在: /data

方便数据持久化,原因:当容器启动或停止时,容器内对象会全部销毁。因此需要数据持久化。将容器下的文件目录挂在到/data 下对应的文件中去。

  • 创建Jenkins数据文件夹/data/jenkins_home
  • 创建jenkins 镜像配置文件/home/deploy/service/jenkins/docker-compose.yml
  • 将镜像文件数据挂在到/data/jenkins_home

docker-compose.yml 文件配置如下

version: '3'
services:
  jenkins:
    image: jenkins/jenkins:2.249.2
    restart: always
    container_name: jenkins
    ports:
      - '8080:8080'
      - '50000:50000'
    volumes:
      - /data/jenkins_home:/var/jenkins_home       
      - /var/run/docker.sock:/var/run/docker.sock # 默认配置
      - /usr/bin/docker:/usr/bin/docker                   # 默认配置
      - /etc/localtime:/etc/localtime:ro                  # 默认配置

配置解读

  • image:我们的镜像文件版本,启动时会先从本地查找,如果没有会从远程仓库拉取指定版本镜像
  • container_name:我们启动镜像后容器的名称
  • ports:指定容器端口号为8080
  • volumes: 文件挂在配置“:”前为本地(容器外服务器上)真实挂在的卷轴地址,之后为容器虚拟环境文件数据地址。

启动容器

docker启动:如果没有配置docker-compose.yml 时

docker run --name jenkins --user=root -p 8080:8080 -p 50000:50000 -v /data/jenkins_home:/var/jenkins_home -d jenkins/jenkins:2.249.2

docker-compose 启动:

进入Jenkins配置文件根目录cd /home/deploy/service/jenkins/

执行命令:

启动容器 docker-compose up [-d] -d 后台运行

停止容器 docker-compose down

 

测试

查看容器是否正常启动:docker ps -a 查看最近启动的容器信息

image.png

那就代表容器启动成功了,那么接下来测试下是否可以正常访问

ifconfig 查看服务器对外公网地址,也就是你登录服务器的ip 地址

正常情况下就可以了,但是我们仅支持80和443端口对外访问,所以要说那个Nginx代理转发我们的服务地址通过域名方式访问。

3.Nginx代理配置

安装

docker pull nginx

配置

  • 同样的方法,我们需要创建数据存放文件/data/nginx以及子目录

image.png

  • 配置文件/home/deploy/service/nginx/ docker-compose.yml
  • 修改文件权限 chmod 777 /data/nginx
  • 在/data/nginx/conf.d中创建文件mynginx.conf 名字随便起,但要.conf的后缀,

为什么呢,去看看/data/nginx/conf/nginx.conf 中有这么一段

include /etc/nginx/conf.d/*.conf;意思是去该文件下找*.conf文件并加载它

  • vim docker-compose.yml
version: '3.1'
services:
  nginx:
    restart: always
    image: nginx
    container_name: nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - /data/nginx/nginx.conf:/data/nginx/nginx.conf 
      - /data/nginx/conf.d:/etc/nginx/conf.d 
      - /data/nginx/log:/data/log/nginx
      - /data/nginx/wwwroot:/data/nginx/wwwroot
      - /data/nginx/html:/usr/share/nginx/html

配置解读

/home/deploy/service/nginx/ docker-compose.yml

主要还是要注意volumes: 中要将容器中的配置数据文件挂载到容器外我们制定的文件中去。

/data/nginx/conf.d/mynginx.conf

upstream jenkins {
    keepalive 32; # keepalive connections
        server [你的服务器本地地址]:8080; # jenkins ip and port
}
# Required for Jenkins websocket agents
map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
}

server {
  listen          80;       # Listen on port 80 for IPv4 requests

  server_name     [你的域名地址]; #访问域名

  # this is the jenkins web root directory
  # (mentioned in the /etc/default/jenkins file)
  root            /usr/share/nginx/html;

  # pass through headers from Jenkins that Nginx considers invalid
  ignore_invalid_headers off;


  location / {
      sendfile off;
      proxy_pass         http://jenkins;#根路径访问域名跳转到Jenkins指定的IP地址服务上
      proxy_redirect     default;
      proxy_http_version 1.1;

      # Required for Jenkins websocket agents
      proxy_set_header   Connection        $connection_upgrade;
      proxy_set_header   Upgrade           $http_upgrade;

      proxy_set_header   Host              $host;
      proxy_set_header   X-Real-IP         $remote_addr;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_max_temp_file_size 0;

      #this is the maximum upload size
      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffering            off;
      proxy_request_buffering    off; # Required for HTTP CLI commands
      proxy_set_header Connection ""; # Clear for keepalive
  }

}
启动容器

同上还是两种方式,因为我们配置了docker-compose.yml 使用docker-compose 启动

cd /home/deploy/service/nginx/
docker-compose up 

测试

docker ps -a

image.png

可以看到我们已经成功启动了nginx 容器并成功监听了80 和443端口。前面的0.0.0.0:80/443 指的是所有通过该端口ip监听

Jenkins本地服务地址 server [本地地址]:8080;

用户通过域名:qaman.ixm5.cn  访问,当nginx 监听到有80/443访问会跳转到本地location 指定的服务Jenkins 上,upstream jenkins 用来做负载均衡,如果允许我们可以如下配置

upstream backend {
    server 127.0.0.1:8888;
    server 127.0.0.3:8888;
    server 127.0.0.2:8888;
}

至此我们已经完成了docker服务部署并完成了Nginx代理转发!

四、过程中的坑点???

1.有关Jenkins的问题

我想通过Jenkins在服务器执行shell 命令,但发现说权限不对!

细看报错,说我的私钥不对,这里说明下,我们的服务器登录使用的是rsa 私钥解密方式,公钥放在服务器。

但是我的git 已经同样的方法获取到了gitlab 的代码呀,咳咳,去百度了一把,

提示说:Jenkins版本在2.2之后版本使用的rsa私钥不合法,不能用openssh格式的,如下示例:

错误:

-----BEGIN OPENSSH PRIVATE KEY-----
**************************************...
-----END OPENSSH PRIVATE KEY-----

正确:

-----BEGIN RSA PRIVATE KEY-----
******************************...
-----END RSA PRIVATE KEY-----

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值