[Linux] Docker 설치, CLI, Compose

zzwon1212·2023년 12월 13일
0

Linux

목록 보기
9/11
post-thumbnail

1. Isolation

  • Process의 scope: 현대적인 OS는 프로세스가 독립적인 공간을 가지게 해준다.

    • 장점: 프로스세는 고유한 공간을 받을 수 있다.
    • 단점: 외부 통신을 위해서 IPC를 사용하여 I/O 비용이 높아진다. 여러 프로세스가 협동해야 하는 프로그램에서는 단점이 더 커진다.(DBMS나 각종 server system 등) 한 시스템에 2개의 DBMS를 구동하면, DBMS를 구성하는 각종 프로세스들이 독점적으로 사용하는 디렉토리, 파일, 소켓 등에 충돌이 발생한다. 물리적으로 2개 이상의 컴퓨터를 이용하는 것이 좋다.
  • Isolation의 활용

    • 특정 파일 경로의 접근을 제한한다.(특정 시스템 자원의 사용을 제한) 예를 들어 FTP 프로세스가 /home/ftp 디렉토리 이하에서만 이동하도록 한다.
    • 시스템에서 격리된 공간을 제공하여 아래 문제를 해결한다.
      • 동일한 디렉토리를 사용하는 프로세스들의 독립된 실행은 어떻게 해결?
      • 서로 다른 버전의 파일을 사용하는 프로세스가 있다면? (서로 다른 version의 library 파일을 사용해야만 하는 경우)

1.1. chroot

  • change root directory
  • root dir.을 특정 디렉토리로 변경
  • chroot로 격리된 directory hierarchy를 통해 경로를 속일 수 있다. 즉, 동일한 프로그램을 쉽게 다른 환경으로 복제할 수 있다.

1.2. namespace

  • 프로세스 간에 격리를 제공하는 기술 중 하나
  • 종류: mount, UTS(UNIX Time-sharing), IPC, network, PID, user, cgroup
  • 관리 명령어: unshare, lsns, nsenter

1.3. cgroup

  • OS level abstraction
    • group별로 가상화된 공간을 만들고 자원을 제약할 수 있다. 다른 그룹은 격리되어 있으므로 마치 물리적으로 다른 호스트처럼 인식한다.
    • docker, hadoop, systemd 등의 프로젝트가 cgroup을 사용

1.4. Virtualization

  • Virtual machine
    • Full virtualization(Hypervisor) 사용
    • 장점: 소프트웨어로 가상화된 하드웨어를 구현하여 완전히 격리된 공간을 제공한다. 이를 통해 보안 문제, 호환성 문제를 거의 대부분 해결한다.
    • 단점: 낮은 성능. 단지 격리가 목적이라면 굳이 사용할 필요가 없다.

1.5. Container

  • 가장 큰 장점은 성능과 배포이다.

2. Docker 개요

  • container runtime 기술
    • 격리된 자원의 묶음(image)과 런타임으로 구성
    • 장점
      • Host OS 위에서 작동하는 격리된 프로세스의 일종이므로 virtual machine과 달리 memory, File system의 I/O에서 발생되는 크리티컬한 overhead가 없다.
      • Host OS의 튜닝이나 성능 향상은 docker에게도 향상을 가져다 준다.
    • 단점
      • daemon으로 작동하면서 child process로 수직 관리
      • 관리자 권한 사용

3. WSL2에 Docker 설치

WSL autoMemoryReclaim 활성화(Optional)

  • WSL VM이 차지하고 있는 메모리 중 사용되고 있지 않은 메모리를 조금씩 회수한다.
  • 'C:\Users\'에 '.wslconfig' 생성하여 아래 내용 추가
    # Makes the WSL VM shrink in memory as you use it by reclaiming cached memory
    [experimental]
    autoMemoryReclaim=gradual
  • 아래 명령어로 'memory.reclaim'가 존재하는지 확인
    $ ls /sys/fs/cgroup/

Docker Desktop for Windows 설치

Docker 설정

  • 설정 → 일반 → 'WSL 2 기반 엔진 사용' 선택
  • 설정 → 리소스 → WSL 통합 → Docker 통합을 사용할, 기설치된 WSL 배포판 선택

④ 사용하려는 WSL 배포판(Ubuntu 등)에서 정상적으로 설치되었는지 확인

$ docker --version

⑤ 간단한 Docker 이미지를 실행

$ docker run hello-world
$ docker run -it ubuntu bash
  • -i: interactive mode (open stdin)
  • -t: terminal (Allocate a pseudo-TTY, stdio)
  • 쉘(방송)과 터미널(TV) 사용

4. Docker CLI

4.1. ps

$ sudo usermod -aG docker $(whoami)
$ id
$ id $(whoami)
  • docker를 사용하기 위해서 docker group을 supplementary group에 포함시켜야 한다.
$ docker ps
$ docker ps -a
  • ps는 기본적으로 작동 중인 docker process를 출력한다.

4.2. run

$ docker run --name hello-world_01 hello-world
$ for ii in {1..10}; do docker run --name hello-world_${ii} hello-world; done
  • 보통 --name으로 이름을 지정하며 실행한다.

4.3. filter

$ docker ps -a -f 'name=hello'
$ docker ps -af 'name=hello-world_{1-3}'

4.4. format

$ docker ps -af 'name=hel' --format "{{.ID}} {{.Image}} {{.Status}} {{.Names}}"
  • 자주 사용되는 docker ps 명령을 alias(~/.bash_aliases)에 등록하고 사용하면 편하다.
  • Formatting 항목

4.5. rm

$ docker rm [CONTAINER ID | NAMES]
$ docker ps -af 'name=hello' --format "{{.Names}}" | xargs docker rm
$ docker ps -a --format "{{.ID}}" | xargs docker rm # 존재하는 모든 container를 삭제
  • rm은 container를 삭제하지만 image를 삭제하지는 않는다.

4.6. image

  • rmi

    $ docker ps -af 'ancestor=hello-world' --format {{.Names}} | xargs docker rm
    $ docker rmi hello-world
  • image

    $ docker image
    • ls: iamge list
      $ docker image ls
    • inspect: return low-level information on Docker objects
      $ docker image inspect nginx
      $ docker inspect nginx
    • pull: run은 하지 않고, image를 pull(가져오기)만 함
      $ docker image pull nginx
      $ docker pull nginx
    • rm
    • save: save one or more images to a tar archive
      $ docker image save nginx > docker_nginx_1.19.10.tar
      $ docker save nginx > docker_nginx_1.19.10.tar
      $ file docker_nginx_1.19.10.tar
      • 버전은 inspect로 미리 확인 가능
    • load: load an image form a tar archive or STDIN
      $ docker image load < docker_nginx_1.19.10.tar
      $ docker load < docker_nginx_1.19.10.tar

4.7. run

$ docker run -it --name ubuntu_top ubuntu "top" "-d 1"
  • run은 container를 새롭게 실행하는 명령
  • container는 동일한 NAME을 가질 수 없다.

4.8. exec

$ docker exec -it ubuntu_top top "-d 0.2"
  • 기존에 존재하는 container에서 실행

4.9. binding

# 호스트의 /host/path 디렉터리를 컨테이너의 /container/path 디렉터리에 바인딩
$ docker run -v /host/path:/container/path -d image_name
  • container 자원을 외부와 연결
  • mount

4.10. attach, detach

$ docker run --rm -itd --name ubuntu_bash ubuntu bash # 바로 detach가 됨
$ docker attach ubuntu_bash # 쉘에 들어가기 위해 attach
  • 실행 중인 컨테이너에 attach하여 상호 작용
  • 실행 중인 컨테이너를 detach (백그라운드 실행)
  • escape key sequence: [^P^Q]로 container를 running 상태로 두고 detach 할 수 있다.
  • --rm: 컨테이너 종료 시 컨테이너를 삭제

4.11. stop, start

$ docker run -d -p 8080:80/tcp \
--mount type=bind, src=/home/jiwon/nginx_doc_root, dst=/usr/share/nginx/html \
--name nginx_8080 nginx

$ docker ps

$ docker stop nginx_8080 && docker ps -a

$ docker start nginx_8080 && docker ps

$ docker rm nginx_8080
  • stop
    • detached mode로 실행 중이라면, 외부에서 이 명령어로 정지
    • -it를 사용하지 않는 시스템은 signal 혹은 이 명령어로 정지할 수 밖에 없다.
  • start
    • docker run --rm을 쓰지 않는 경우 exited할 시 container는 남는다.
    • stop 후 재시작할 때는 start로 가능

4.12. 정리

  • docker run의 선택적 옵션

    기능명령어
    detach mode-d
    stdio의 사용-it
    종료 시 제거--rm
    binding (port)-p host_port:container_port
    binding (file)--mount ... or -v ...
    binding (env.)-e KEY=value or --env-file ...

5. Docker Compose

  • docker CLI option이 복잡해지면 docker-compose를 사용하는 것을 권장한다.
  • 설정에 따라 /etc/hosts에 IP address와 hostname의 등록이 필요하다.
$ docker-compose [-f<arg>...] [--profile <name>...] [options] [COMMAND] [ARGS...]
  • -f <config file>
    • config: Yaml filetype
    • default filename: docker-compose.yml
  • builds or rebuilds, creates, starts

5.1. 간단한 설정 만들어보기

  • docker-compose.yml

    $ mkdir ~/docker-compose
    $ cd ~/docker-compose
    $ vi docker-compose.yml # 아래 내용 입력 후 저장
    version: '3'
     services:
      nginx_8080:
       image: nginx
       restart: always
       hostname: nginx1
       container_name: cmp_nignx1_1
       networks:
        mynet:
         ipv4_address: 172.20.0.10
       ports:
        - 8080:80
       volumes:
        - /home/jiwon/nginx_doc_root:/usr/share/nginx/html
    
    networks:
     mynet:
      ipam:
       driver: default
       config:
        - subnet: 172.20.0.0/24
  • docker-compose up

    $ docker-compose up -d
    • Docker Compose를 사용하여 백그라운드에서 컨테이너를 실행
    • docker-compose: 여러 컨테이너를 정의하고 구성하는 도구인 Docker Compose를 실행
    • up: 정의된 서비스 및 컨테이너를 시작하고 구축
    • -d: 컨테이너를 백그라운드(daemon 모드)에서 실행한다. 터미널이 해당 프로세스를 차지하지 않고 사용 가능한 상태로 남아 있다.
    • docker-compose.yml 파일이 현재 디렉토리에 있어야 한다. 해당 파일에 정의된 서비스들을 기반으로 컨테이너들을 시작하고 백그라운드에서 실행한다.

    • docker-compose.yml을 수정한 뒤 up하면 recreating이 되어 container id가 변경된다.
    $ docker-compose ps
    $ curl http://127.0.0.1:8080 # curl http://127.0.0.1:8080/hello.txt

    $ docker-compose stop
    $ docker-compose rm
profile
JUST DO IT.

0개의 댓글

관련 채용 정보