DOCKER

DOCKER Basic

  • 가상 컴퓨팅 환경과 비슷한 컨테이너 서비스
  • 초기에는 LXC(Linux Container) 방식으로 구현되어 리눅스에서만 동작했었다.
  • 현재는 runC라는 방식으로 변경되어 다양한 운영체제에서 사용할 수 있다.

    1. httpsL//hub.docker.com 에 접속해 가입을 진행한다.
      • 추가 정보는 입력하지 않아도 된다.
      • email 인증까지 진행하도록 한다.
    2. 도커를 설치한다.

      1
      2
      3
      4
      5
      # 리눅스에서 설치 시
      $ curl -s https://get.docker.com/ | sudo sh

      # curl이 없다면
      $ sudo apt-get -y install curl
    3. 도커의 권한을 변경한다.

      1
      2
      # 관리자 계정 권한
      $ sudo usermod -aG docker $USER
    4. docker 명령을 실행하여 옵션이 나타나는지 확인한다.

      1
      $ docker
    5. 도커에서 ubuntu 18.04 가상 컨테이너를 사용해본다.

      • run 명령어를 사용하여 이미지명을 지정하고 새로운 컨테이너를 실행한다.
      • 컨테이너는 프로세스가 돌고있는 동안만 유효하다.
        1
        $ docker run ubuntu:18.04
    6. 다음 명령을 통해 현재 로컬에 있는 이미지 목록을 볼 수 있다.

      1
      $ docker image ls
    7. 다음 명령을 통해 bash shell를 실행할 수 있다.

      1
      2
      3
      $ docker run --rm -it ubuntu:18.04 bin/bash
      # --rm : 실행 종료 후 컨테이너 제거
      # -it : 터미널 사용
    8. nginx를 설치하고 서버 접속 테스트를 해본다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      # 포트는 여러 개를 지정할 수 있음
      $ docker container run --rm -it -p 8080:80 ubuntu:18.04 bin/bash

      # -y 옵션은 yes
      $ apt-get -y update

      $ apt-get -y install nginx

      # nginx version 확인
      $ nginx -v

      $ service nginx start

      # 서버에 접속하여 확인해보자.(127.0.0.1:8080)
    9. 베이스 파일을 만들어서 원하는 추가 프로그램 설치 목록을 넣어본다.

      1
      $ vim Dockerfile.base
    • 추가를 원하는 프로그램을 넣으면 된다.
    • Amazon AWS의 EC2를 이용하여 배포할 때 넣은 내용을 넣었다.
    • supervisor 명령을 통해 설정 파일을 복사하는 명령어를 입력한다.
      • docker는 하나의 프로세스만 동작하는 명령을 실행할 수 있다.
      • 동작하고 있는 프로세스가 없는 경우 컨테이너는 종료된다.
      • nginx와 uwsgi가 모두 동작해야 하기 때문에 supervisor 모듈을 사용한다.
    • FROM의 내용은 base image를 지정하는 것이기 때문에 정해져 있는 목록에서 지정해야 한다.
    • RUN을 통해 생성 및 설치를 한다.
    • ADD를 통해 이미 만들어진 파일을 복사할 수 있다.
    • bash shell teminal를 하나 더 실행하여 추가 프로그램 설치 명령어를 직접 입력해보고 추가하도록 한다.

      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
      [Dockerfile.base의 내용]

      FROM django:latest
      MAINTAINER askjw123@naver.com

      RUN apt-get -y update
      RUN apt-get -y install nginx
      RUN apt-get -y install python3-dev python3-venv python3-pip
      RUN useradd -b /home -m -s /bin/bash django
      RUN usermod -a -G www-data django
      RUN mkdir -p /var/www/django
      RUN mkdir /var/www/django/run
      RUN mkdir /var/www/django/logs
      RUN mkdir /var/www/django/ini

      ADD ./conf/nginx/default /etc/nginx/sites-available/default
      ADD ./conf/uwsgi/uwsgi.ini /var/www/django/ini/uwsgi.ini
      ADD ./conf/requirements.txt /var/www/django/requirements.txt

      RUN python3 -m venv /var/www/django/venv
      RUN /var/www/django/venv/bin/pip3 install -r /var/www/django/requirements.txt
      RUN /var/www/django/venv/bin/django-admin startproject config /var/www/django

      RUN apt-get -y install supervisor
      ADD ./conf/supervisord.conf /etc/supervisor/supervisord.conf

      CMD ["/usr/bin/supervisord"]
    • 로컬에 conf 폴더를 만들어서 복사할 파일 내용들을 생성해둔다.

      • conf/requirements.txt

        1
        2
        Django==2.2.2
        uwsgi
      • conf/supervisord.conf

        1
        2
        3
        4
        5
        [supervisord]
        nodaemon=true

        [program:nginx]
        command = nginx -g "daemon off;"
      • conf/nginx/default

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        upstream django {
        server unix:/var/www/django/run/uwsgi.sock;
        }
        server {
        listen 80;
        charset utf-8;
        access_log /var/www/django/logs/access.log;
        error_log /var/www/django/logs/error.log;
        server_name _;

        location = /favicon.ico { access_log off; log_not_found off; }

        location / {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass django;
        }
        }
      • conf/uwsgi/uwsgi.ini

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        [uwsgi]
        uid = django
        base = /var/www/django

        home = %(base)/venv
        chdir = %(base)
        module = config.wsgi:application
        env = DJANGO_SETTINGS_MODULE=config.settings

        master = true
        processes = 5

        socket = %(base)/run/uwsgi.sock
        logto = %(base)/logs/uwsgi.log
        chown-socket = %(uid):www-data
        chmod-socket = 660
        vacuum = true
      • conf/uwsgi/uwsgi.service

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        [Unit]
        Description=uWSGI Emperor service

        [Service]
        ExecStart=/var/www/django/venv/bin/uwsgi --emperor /var/www/django/ini
        User=django
        Group=www-data
        Restart=on-failure
        KillSignal=SIGQUIT
        Type=notify
        NotifyAccess=all
        StandardError=syslog

        [Install]
        WantedBy=multi-user.target
    • 새로운 내용으로 이미지를 만들어 본다.

      1
      2
      # 베이스를 사용하여 처음 이미지를 생성할 경우, 시간이 어느정도 걸릴 수 있다.
      $ docker iamge build -f Dockerfile.base -t django:0.2
    • 생성된 이미지로 컨테이너를 실행해보고 사이트에도 접속해본다.

      1
      $ docker container run it --rm -p 7000:80 django:0.2
Share