Category: Docker

  • Docker 에서 Container 실행/시작시에 명령어가 실행되도록 하기

    Docker 이미지를 build 할 때에 CMD나 ENTRYPOINT를 이용하면 이미지를 실행할 때에 실행된다고 하는 글들이 많은데 이상하게 nginx나 apache, mysql 등은 통하지 않았다. 여러 글들을 찾아본 끝에 유일하게 성공한 방법은 .bashrc를 이용하는 것이다.

    이는 container의 기본 설정에서 bash를 실행하도록 되어 있다는 것을 이용한 것이다.

    따라서, NGINX 를 컴파일하여 설치한 경우 Image를 실행할 때에 nginx를 실행하도록 하기 위해서는 다음과 같은 내용을 /root/.bashrc 에 추가하여 준다.

    /usr/local/nginx/sbin/nginx

    Apache나 MariaDB를 실행하려고 하면 다음과 같이 한다.

    service apache2 start
    service mysql start
  • NGINX를 Reverse Proxy로 Apache를 Web으로 연결하기

    나의 프로젝트에서는 NGINX를 reverse proxy로 동작하게 할 것이다. 프로젝트용 홈페이지 구현은 중요하기 때문에 이를 우선적으로 구현해 보고자 하였다.

    나와 같은 초보자에게 이 부분은 꽤나 어렵다. 그 이유는 Client – Server (Web) 라는 단순한 구조가 아니기 때문이다. Client – NGINX – Web 으로 구성이 되어야 하는데 기본 설정으로만 따라가면 Web은 NGINX에서 오는 데이터로만 받아보기 때문이다. 잘 모르는 상태에서 글로만 표현하려니 힘든데, 이 부분의 설정을 수정하지 않으면 WordPress 기반으로 운영할 Web 서비스에서 링크가 blog.my-network으로 Client에게 제공이 된다. 당연히 Client는 Docker 밖에 있으니 저런 링크로는 서비스가 제대로 이루어질 수 없게 된다.

    우선 NGINX 가 있는 컨테이너의 nginx.conf 파일을 다음과 같은 설정으로 reverse proxy를 구성한다. WordPress를 설치한 컨테이너로는 8080 포트를 이용하도록 했다. proxy_pass 이외의 설정이 있어야 client 의 정보도 같이 전달이 된다고 한다.

    location / {
    	proxy_pass http://blog.my-network: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;
    }

    WordPress를 설치한 컨테이너에서 Apache의 ports.conf 파일을 수정하여 80포트가 아닌 8080 포트로 서비스 하도록 한다.

    Listen 8080

    Apache의 apache2.conf 파일을 수정한다. 왜 인지는 모르겠는데, 이렇게 하니까 되었다. ㅠ

    ServerName my-domain
    
    <VirtualHost my-domain:8080>
            ServerName my-domain:8080
            ServerAlias my-domain
    </VirtualHost>
  • Docker Network

    Docker에서 실행하는 컨테이너는 실행할 때마다 정해진 IP를 받아오는 것이 아니다. 따라서, 컨테이너를 재시작 하였을 때 이전과 동일한 IP를 받는다는 보장이 없다. 이럴 경우 컨터이너를 특정 network으로 지정하면 DNS와 비슷한 개념으로 이용할 수 있다.

    우선 network을 만든다. 예를 들어 my-network이라는 bridge를 만든다고 하자.

    # sudo docker network create my-network

    그 다음에는 컨테이너를 시작할 때에 –network 를 이용하여 설정한다. 다음의 예시는 my-debian-blog라는 이미지를 blog라는 이름으로 시작하면서 my-network이라는 bridge에 할당하는 것이다.

    # sudo docker run -itd \
            --name blog \
            --network my-network \
            my-debian-blog
    

    이 다음부터는 컨테이너에서 blog 컨테이너와 통신해야 할 경우 blog.my-network 라고 주소를 설정하고 진행하면 된다.

    이미 만들어진 컨테이어도 연결하거나 연결을 끊을 수 있다.

    # sudo docker network connect my-network 컨테이너
    # sudo docker network disconnect my-network 컨테이너
  • Docker Private Registry

    Debian 도커 이미지의 경우 apt update 부터 실행해야 할 정도로 날 것이기 때문에 최소한의 사용에 맞게 설정해야 할 필요가 있다. 이번에는 별도의 컴퓨터에 Registry를 설치해서 push와 pull 을 할 수 있도록 했다.

    인터넷에서 관련 정보를 찾으면 보통 registry 이미지를 5000번 포트를 이용해서 사용하는 예제들이 있다. 이를 따라해 보도록 한다.

    # sudo docker run --name private-repository -d -p 5000:5000 registry

    이미지를 build 할 때 IP 와 포트 등을 지정한다.

    # sudo docker build 192.168.88.250:5000/byun1114/my-debian

    Docker는 설치 단계에서 repository 의 정보를 받을 때 HTTPS를 이용한다. 그래서 그런지 build 할 때에도 기본적으로 https를 이용하는 것을 전제하고 있다. HTTPS를 이용하지 않는다면 오류가 발생한다. “http: server gave HTTP response to HTTPS client” 이런 오류 메세지가 나타나면 2가지 방법으로 해결할 수 있다고 하는데 그 중에 하나인 daemon.json 을 이용하는 방법을 사용하였다. 이 방법은 Docker 를 build 하는 컴퓨터에서 적용하는 것이다. 이 파일의 내용을 추가한 다음 Docker 를 재시작하고 build 하면 된다.

    /etc/docker/daemon.json
    {
        "insecure-registries": ["192.168.88.250:5000"]
    }