Category: Docker

  • useradd

    리눅스에서 계정을 생성하는 방법에는 useradd와 adduser가 있다. 한 번만 실행할 것이라면 adduser로 하는 것이 홈디렉토리와 비밀번호를 한 번에 만들 수 있으므로 편하다.

    Docker에서는 root가 기본 계정이다. 비밀번호는 제공되지 않는다. 비밀번호가 없기 때문에 발생하는 문제들도 있고 Python 은 root로 실행하면 경고 문구가 실행할 때마다 나온다. 그래서 Docker에서 계정을 만들어서 이용해 보기로 했다. 계정을 꼭 만들어야겠다고 생각한 이유는 RStudio는 꼭 비밀번호가 있어야 접속을 할 수 있기 때문이다.

    useradd로 할 경우 홈 폴더는 -m 옵션을 이용하면 관습적인 위치에 만들어 준다. 비밀번호는 encrypted 된 것을 입력해 주어야 한다. 이것을 이해 못해서 문제를 해결하는데 시간이 꽤 걸렸다.

    Dockerfile에서 다음과 같이 실행하여 준다. 예시는 byun1114 계정에 1을 비빌번호로 사용하겠다고 할 경우이다.

    RUN useradd -m -p $(echo "1" | openssl passwd -1 -stdin) byun1114
    
  • 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 컨테이너