devops

Docker와 친해지기

ri5 2023. 3. 2. 01:23

이번 세션은 내가 이 스터디에 신청한 이유 중 하나인 도커로 시작하게 되었다. 회사내 클라우드 서버를 컨테이너 서비스로 이전하고 관리하기 위해 공부를 하고 싶었지만 다른 것에 우선순위에 밀리다가 이제야 좀 공부를 시작하게 되었다. 아직은 모놀리식의 서비스를 운영하고 있어 쿠버네티스까지는 구축하지 않아도 되지만 자동화된 장애 대응, CI/CD, 요금 감축을 위한 인스턴스 관리 등을 구축하려면 컨테이너로 이전해야되는 것이 맞다고 판단되어 시작하게 되었다. 도커와 익숙해질 수 있는 시간이 되었으면 좋겠다.

 

도커란?

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼 이다. 도커는 애플리케이션을 실행하기 위한 모든 라이브러리, 실행환경, 코드 등을 컨테이너로 추상화하여 관리가 가능하며  호스트 환경에 구애받지 않고 어디서든 실행 가능하다. 도커는 기존에 있던 VM보다 가벼운 가상화 기술을 통해 가상머신보다 더 높은 성능과 효율성을 보장한다. 

 

이미지

도커에서 이미지는 애플리케이션 실행에 필요한 모든 정보를 포함하고 있는 패키지다. 이미지는 컨테이너를 생성하기 위한 템플릿 역할을 하며 도커허브와 같은 저장소를 통해 다른 사용자와 공유가 가능하다.

 

컨테이너 

프로세스와 같은 개념과 비슷하다고 생각하면 된다. 독립적으로 격리된 공간에서 프로세스가 동작하는 공간으로 어플리케이션을 실행하기 위한 코드, 실행 환경 등을 가상화된 공간에 해당 프로세스를 띄운다고 생각하면 된다. 보통 가상머신은 호스트 OS 위에서 하이퍼바이저 위에 또 메모리와 CPU를 제한하여 Guest OS가 띄워지게 되면서 오버헤드가 발생하게 된다.

하지만 컨테이너는 호스트 OS위에서 도커엔진을 통해 관리가 되면서 필요한 만큼의 메모리나 CPU 사용할 수 있어 좀 더 안정적으로 어플케이션을 운영할 수 있다.

도커 필수 명령어 

설명 명령어
모든 컨테이너 확인 docker ps -a
컨테이너 실행 docker run ~
컨테이너 중지 docker stop ~
컨테이너 삭제 docker rm ~
이미지 확인 docker images
이미지 생성 docker build ~
이미지 삭제 docker rmi ~

도커로 Ubuntu 올리기

1. 도커 허브에서 Ubuntu 22.04 이미지 내려받기

Docker pull ubuntu:22.04

2. 도커 이미지 확인

docker images

3. 도커 컨테이너 띄우기

docker run -d --name ubuntu_test -it ubuntu:22.04 bash
  • -d: detached mode(백그라운드 모드)로 실행
  • --name: 컨테이너 이름 설정
  • -i: 표준 입력(stdin)을 컨테이너 내부의 프로세스에게 연결하는 옵션이다. 보통 이 옵션을 사용하여 Bash 에 명령을 입력합니다.
  • -t: 생성된 컨테이너에 tty를 할당하는 옵션으로, 가상 터미널을 생성하는 옵션이다.
  • bash: 도커에서 bash 옵션은 도커 컨테이너 내부에서 쉘을 실행하는 옵션이다.

위 명령어를 통해 우분투 이미지 기반에 쉘 명령어를 입력할 수 있는 터미널을 생성할 수 있다.

 

4. 도커 ps 실행을 통해 확인

docker ps

 5. ubuntu 컨테이너 접속

exec: 특정한 컨테이너가 실행되는 환경에서 또 다른 프로세스를 실행하게 해주는 명령어로 터미널을 접속해본다.

docker exec -it ubuntu_test bash

5.1. Vim 설치하기

패키지 툴을 활용하여 Vim을 설치해서 잘 동작하는 지 확인해본다.

apt-get update
apt-get install vim

도커 이미지로 Ubuntu 띄우기

하지만 이러한 명령어는 환경 구축하는 것이 복잡해지고 설정하는 것이 많아질수록 수동으로 처리해야 되는 작업이 많아진다. 그렇기 때문에 도커파일을 통해 이미지를 생성하여 자동으로 환경을 구축하는 기능을 제공하고 있다.

 

1. 도커파일 생성

Dockerfile이라고 명시해놓지않으면 이미지를 생성할 때 인식하지 못하기 때문에 꼭 명시해야한다.

FROM ubuntu:22.04

RUN apt-get update && apt-get install -y vim
  • FROM : Dockerfile은 FROM으로 시작한다.
    커스텀 이미지의 기반이 되는 이미지 이름을 지정해준다. 이미지를 생성할 때 FROM에 설정한 이미지가 로컬에 있으면 바로 사용하고, 없으면 Docker Hub에서 받아온다.
  • RUN : 명령어를 실행하는 키워드. 쉘 스크립트 구문이 실행됨.
    • RUN이 실행될 때마다 Layer가 생성되어 저장된다.
  • WORKDIR : 작업할 디렉터리를 설정하는 것이다.
  • COPY : 호스트OS의 로컬 파일 또는 디렉토리를, 이미지(컨테이너) 내의 경로로 복사한다.
  • ENTRYPOINT : 컨테이너 실행 시 실행하게 할 명령어 설정
  • CMD : 컨테이너가 시작될 때 스크립트 혹은 명령을 실행한다.
    • docker run으로 매개변수를 넘길 수 있다
  • ENV: 환경변수 설정

2. 이미지 생성

docker build -t <리포지토리>:<태그명> 도커파일 위치 이와 같은 형태로 명령어를 입력하게 되면 이미지를 생성할 수 있다.

docker build -t test-ubuntu:test-ubuntu .

-t: 태그 옵션 지정을 할수 있는 옵션

 

3. 도커 컨테이너 띄우기

docker run -d -it test-ubuntu

 

 

도커로 Nginx 올리기

아래 링크를 통해 확인해보면 Nginx 현재 stable한 버전은 1.22.1 버전임을 확인할 수 있다.

https://hub.docker.com/_/nginx

 

nginx - Official Image | Docker Hub

Quick reference Supported tags and respective Dockerfile links 1.23.3, mainline, 1, 1.23, latest 1.23.3-perl, mainline-perl, 1-perl, 1.23-perl, perl 1.23.3-alpine, mainline-alpine, 1-alpine, 1.23-alpine, alpine 1.23.3-alpine-perl, mainline-alpine-perl, 1-a

hub.docker.com

1. Nginx 이미지 받기

docker pull nginx:1.22.1

2. Nginx 컨테이너 띄우기

docker run --name test-nginx -p 80:80 -d nginx:1.22.1
  • -p: 도커 내부와 외부의 포트를 설정하는 옵션으로 <컨테이너 외부 포트> : <컨테이너 내부 옵션> 형식으로 설정하면 된다.

3. ps를 통해 확인

Docker ps를 통해 확인 해보면 Nginx 컨테이너가 떠있는 것을 확인해볼 수 있다.

 

도커 컴포즈 활용하기

여러개의 컨테이너를 활용해야될 때 사용되는 것이 Docker-compose이다. 도커 컴포즈는 yml형태로 컨테이너의 환경, 연결방식, 환경변수를 설정할 수 있다. yml을 작성할 때에는 indent는 무조건 space 2칸씩 띄워야한다.

 

1. 우분투와 mysql을 연결하는 상황을 가정하고 yml을 작성한다.

# yml의 버전을 의미한다.
version: "3.5"

# 도커 컴포즈를 통해 띄울 컨테이너를 의미한다.
services:
  app:
    container_name: ubuntu
    # 베이스가 되는 컨테이너를 가져온다.
    image: ubuntu:22.04
    # 해당 컨테이너의 입력할 커맨드를 입력한다. tail -f log
    command:
      bash -c "apt-get update
      && apt-get install -y mysql-client
      && tail -f /dev/null"
  # mysql 컨테이너 환경 설정
  db:
    container_name: db
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=test
    ports:
      - 3306:3306

2. 도커 컴포즈 실행

docker-compose -f docker-compose.yml up -d

도커 컴포즈는 up이라는 명령어를 통해 컨테이너를 실행시킬 수 있다.

  • -f: 정의한 파일의 경로를 명시
  • -d: 도커와 마찬가지로 detached mode(백그라운드 모드)로 실행

3. ubuntu 를 통해 mysql 접속 

mysql -u root  -ptest -h db
  • -u : 데이터 베이스 접속시에 사용할 사용자 이름
  • -p : 접속할 사용자의 패스워드
  • -h : 접속할 데이터베이스의 호스트 주소

느낀점

도커와 도커 컴포즈를 잘 사용하지를 않아서 예상보다 삽질을 많이 했다. 이미지를 생성하기위한 도커파일 형식, 도커 컨테이너를 띄우기 위한 명령어, 도커 컴포즈를 활용하기 위한 yml 파일 형식 등이 익숙하지 않아서 문제가 발생했을 때 원인을 찾는 것이 어려웠었다. 이전에 강의를 들으면서 이해하지 못했던 이미지, 컨테이너 관리, 도커 컴포즈 등의 개념들을 실습하면서 조금 이해하게 되었다.

지금은 도커 명령어와 도커파일를 작성하는 것도 벅차기에 나중에 문법들에 좀 익숙해진다면 도커의 레이어, 도커 컴포즈가 동작하는 방식, 도커를 활용한 개발, 운영, 테스트 환경 구축등을 연습해봐야겠다.

 

참조

https://devzzi.tistory.com/m/76

 

[Docker] Docker Compose의 개념, 사용법, 명령어 정리

[Docker] Docker Compose의 개념, 사용법, 명령어 정리 📍 도커 컴포즈란? 시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일, Compose File)에 기재해 명령어 한번에 시스템 전체를 실행하고

devzzi.tistory.com

https://velog.io/@monadk/Docker-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

Docker 이미지 만들기

이 글은 생활코딩(egoing)의 Docker 수업과 블로그들을 참고하여 정리한 자료입니다. (하단 참고자료 표기)이미지를 만드는 방법을 알아보자.👏Commit을 통해 만드는 방법Build를 통해 만드는 방법이

velog.io

https://hub.docker.com/_/mysql

 

mysql - Official Image | Docker Hub

Quick reference Supported tags and respective Dockerfile links 8.0.32, 8.0, 8, latest, 8.0.32-oracle, 8.0-oracle, 8-oracle, oracle 8.0.32-debian, 8.0-debian, 8-debian, debian 5.7.41, 5.7, 5, 5.7.41-oracle, 5.7-oracle, 5-oracle 5.7.41-debian, 5.7-debian, 5-

hub.docker.com