woniper

[Docker] --link를 이용해 nginx와 jenkins 연결하기 본문

개발환경

[Docker] --link를 이용해 nginx와 jenkins 연결하기

woniper1 2016. 8. 15. 20:58

 며칠 전부터 Docker를 학습하고 있는데, 집에 있는 서버에 docker를 이용해 jenkins를 띄워보고 싶었다. jenkins 뿐만 아니라 여러가지 서비스를 nginx에 연결해서 사용하고 싶었다. nginx 역시 마찬가지로 docker로 사용하기로 했다.

설명을 보지 않고 바로 사용하고 싶다면 github을 보자.

docker에 기본 명령어는 설명하지 않을 것이다. 기본 설명은 여기를 참고하자.


hub.docker.com

  hub.docker.com에는 docker 사용자들이 만들어 놓은 docker image 들이 존재하기 때문에 우리가 사용하고자 하는 image가 필요하다면 여기서 먼저 검색해보자.


jenkins 설치

  jenkins 역시 docker hub에 존재한다.

먼저 jenkins image를 pull 받자.

$docker pull jenkins


jenkins docker image를 모두 pull 받았다면 컨테이너를 실행한다.

$docker run -p 8080:8080 -p 50000:50000 --name jenkins -v jenkins_home:/var/jenkins_home jenkins

  • -p : host와 docker 에 8080 port와 50000 port를 연결
  • --name : docker 컨테이너 이름
  • -v : host directory(jenkins_home)과 docker directory(/var/jenkins_home)과 연결
docker run 실행이 모두 끝났다면 localhost:8080으로 접속해보자. jenkins 첫 화면이 뜨면 성공이다.

nginx 설치
  conf 디렉토리 생성 후 conf 디렉토리에 nginx.conf와 jenkins.conf 파일을 아래와 같이 작성한다. nginx docker 컨테이너에 nginx 설정 파일을 복사(COPY) 하기 위한 파일이다.

1. nginx.conf 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
daemon off;
user  www-data;
worker_processes  2;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
events {
    worker_connections  1024;
    use epoll;
    accept_mutex off;
}
 
http {
    include       /etc/nginx/mime.types;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
    default_type  application/octet-stream;
 
    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  /var/log/nginx/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  65;
 
    client_max_body_size 300m;
    client_body_buffer_size 128k;
 
    gzip  on;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_min_length 0;
    gzip_buffers 16 8k;
    gzip_proxied any;
    gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
    gzip_disable "MSIE [1-6]\.";
    gzip_vary on;
 
    include /etc/nginx/conf.d/*.conf;
}
 
cs

2. jenkins.conf 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
    listen       80;
    server_name  "";
 
    access_log off;
 
    location / {
        proxy_pass         http://jenkins:8080;
 
        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 http;
        proxy_max_temp_file_size 0;
 
        proxy_connect_timeout      150;
        proxy_send_timeout         100;
        proxy_read_timeout         100;
 
        proxy_buffer_size          8k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
 
    }
 
}
cs
  • server_name (3라인) : 80 port로 접속 시 사용될 domain명 
      • "" 으로 설정하면 localhost(127.0.0.1)가 기본으로 셋팅된다.
      • 예를 들어 210.192.168.12라는 IP에 jenkins.woniper.net이라는 도메인 호스트를 추가한 경우 server_name을 jenkins.woniper.net으로 설정 후 요청하면 nginx 내부적으로는 http://jenkins:8080 (8라인)으로 proxy하는 설정이다.
  • proxy_pass (8라인) : localhost:80으로 접속 시 http://jenkins:8080으로 접속되는 설정
      • jenkins는 앞서 생성한 jenkins docker 컨테이너 이름(--name jenkins)이다.
      • 8080은 jenkins docker 컨테이너 생성 시 사용된 -d 8080:8080 포트를 의미한다.


3. Dockerfile 작성

  다음은 Dockerfile을 작성할 것이다. Dockerfile은 docker image를 생성(build) 하기 위한 실행 파일이라고 생각하면된다. Dockerfile은 conf 디렉토리 밑에(../) 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM ubuntu:14.04
MAINTAINER woniper <leekw3747@gmail.com>
 
RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/*
RUN chown -R www-data:www-data /var/lib/nginx
 
COPY conf/jenkins.conf  /etc/nginx/conf.d/jenkins.conf
COPY conf/nginx.conf    /etc/nginx/nginx.conf
 
VOLUME ["/data""/etc/nginx""/var/log/nginx"]
 
WORKDIR /etc/nginx
 
CMD ["nginx"]
 
EXPOSE 80
EXPOSE 443
cs
  • COPY (7,8라인) : host에 conf/jenkins.conf와 conf/nginx.conf 파일을 docker nginx에 복사한다. 복사 위치는 /etc/nginx 밑에 생성한다.
      • conf/jenkins.conf 가 실행되기 때문에 conf 디렉토리 밑에 Dockerfile을 생성하는 것이다.
4. nginx image 생성
$docker build -t nginx-jenkins .
작성한 Dockerfile과 같은 경로에서 위와 같은 docker 명령어를 실행해 nginx docker image를 생성(build)한다.

5. nginx docker 컨테이너 실행
$docker run -p 80:80 --name web --link jenkins:jenkins -d nginx-jenkins
  • --link : 앞서 생성한 jenkins docker 컨테이너와 run 명령어로 생성될 web과 연결
      • 물론 -- link 명령어가 실행될 때는 연결하려는 docker 컨테이너(여기서는 jenkins docker 컨테이너)가 실행되어 있는 상태여야한다. (컨테이너 실행 확인 명령어 : $docker ps)
  
  nginx와 jenkins를 연결해 사용하기 위한 모든 작업이 끝났다. localhost로 접속해보자. localhost:8080이 아닌 localhost로 접속해야한다. jenkins 초기 화면이 나오면 nginx와 jenkins가 연결된 것이다.

  docker-compose 라는 걸 사용하면 한번에 nginx docker와 jenkins docker 컨테이너를 수월하게 띄우고 연결 할 수 있는 것 같다. 아직 학습하기 전이라 원초적인 방법으로했다. docker를 이제 조금 사용해 봤지만 학습 시간 대비 굉장히 유용하게 사용할 수 있을 것 같다.


Comments