Docker - #2 Application

Joshua Song / 송성현·2020년 3월 19일
0

백엔드

목록 보기
6/8

Introduction

지난 포스트에는 도커의 이론적인 기본을 배웠으니, 이번 포스트에는 실제로 설치한 후 필요한 이미지를 다운로드하고 한번 실행해보는 것을 해보자! 요즘 몸 컨디션이 좋지 않아 약을 먹고 쉬며 공부를 해 속도가 잘 안난다 ㅠ 공부도 중요하지만 건강도 놓치지 않고 싶어서...

Installation

먼저 도커를 설치해보자! 맥이나 윈도우는 다를 수 있지만 나는 우분투이기에 리눅스에 맞는 방법을 따라 했다. 리눅스 컨테이너 기술이여서 맥이나 윈도우에는 가상머신에 설치가 된다는 사실!

Linux
먼저 리눅스에서는 자동 설치 스크립트를 이용해 설치하는 것이 가장 쉽다. 다음 명령어를 통해 설치를 하는데, 권한이 없다고 하면 sudo 를 앞에 기입하고 실행해준다. 어디에? 터미널에!

curl -fsSL https://get.docker.com/ | sudo sh

처음 도커를 설치한 후, 도커가 잘 설치되었는지 확인하려면,

docker version

위의 명령어를 실행해 확인해야 하는데, 처음에는 서버 부분의 버전이 안나오며 docker: Got permission denied while trying to connect to the Docker daemon socket at unix: 이라는 메시지가 나온다. 현재 내가 로그인 되어있는 계정의 이름은 joshua인데, 유저를 root 유저로 인식하지 않기에, root 유저가 아닌 사람도 서버 정보를 볼 수 있게 권한을 추가해줘야 서버 정보를 볼 수 있다. 이 권한을 주려면,

1. 권한이 있는 유저들을 모아둔 docker 그룹이 있나 확인한다.

sudo groupadd docker

2. docker 그룹에 현재 유저를 추가한다. 나 같은 경우에는 joshua 이다.

sudo usermod -aG docker joshua

3. 이렇게 추가해 준 후 다시 로그아웃 후 로그인을 해서 실행하거나, 아래와 같은 명령어를 실행한다.

newgrp docker

4. 이제 추가가 잘 됬다면, root가 아니어도 실행이 되는지 테스트 해본다.

docker run hello-world

위와 같은 메시지가 나온다면, 권한을 주는데 성공한 것이다. 도커의 다운로드도 성공적이다!
버전정보가 클라이언트와 서버로 나눠져 있는 이유는 도커가 하나의 실행파일이지만, 각각의 역할을 할 수 있기 때문이다. 도커 커맨드를 입력하면 도커 클라이언트가 도커 서버로 명령을 전송하고 결과를 받아 터미널에 출력한다.

이제 도커를 설치하고, 권한도 잘 설정해 주었으니, 실제로 이미지를 다운받고 컨테이너를 실행해보자!

이미지

이제 도커 측에 있는 이미지를 다운 받은 후 한번 리스트 해보고, 삭제하는 방법까지 알아보자.

이미지 다운로드

패키지화 되어 있는 이미지를 다운로드 받는 명령어는 이다.

docker pull [OPTIONS] NAME [:TAG|@DIGEST]

생각보다 간단하다! 예를 들어, 내가 mariaDB를 최신버전으로 다운 받고 싶다면,

docker pull mariadb

위의 명령어를 실행한다. 뒤에 숫자가 붙지 않는다면, 버전을 특정화하지 않는 것이다. 그리고 이미지 이름은 전부 소문자여야 한다. 우분투를 받아보자.

docker pull ubuntu:14.04

위의 명령어를 실행하면, 14.04버전의 우분투 이미지를 다운 받는다. 사실 컨테이너 run 명령어를 실행하면, 이미지가 없을 때 자동으로 다운 받기는 한다. 하지만, pull명령어를 사용하면 최신버전으로 다신 다운 받는다.

이미지 리스트

지금까지 도커로 다운로드 받은 이미지 목록을 보려면, 아래의 명령어를 이용한다.

docker images

이 명령어를 내 컴퓨터에 실행해 본다면,

이렇게 내가 받은 이미지 리스트를 친절하게 다 보여준다. 하지만, 이제 이미지를 삭제하고 싶다면 어떻하지?

이미지 삭제

이미지 삭제도 간단하다. 아래와 같은 명령어를 사용한다.

docker rmi [OPTIONS] IMAGE [IMAGE...]

Image 부분에 이 이미지 아이디를 넣어서 실행해준다면, 이미지가 삭제가 된다. 하지만 컨테이너로 실행중이라면 이미지는 삭제되지 않는다. 컨테이너는 이미지들의 레이어를 사용해 실행중이기 때문에 삭제할 수 없다.

위의 명령어로 알아낸, hello-world 이미지를 삭제해보자.

docker rmi fc

이미지 아이디끼리 서로 겹치지 않는다면, 2글자 까지만 기입해도, 알아서 잘 찾아서 삭제해준다.

삭제하기 전 명심해야 할 것은, 컨테이너가 실행중이라면 멈춰준 후, 이미지를 사용하는 컨테이너도 삭제해 줘야 한다. 그래야 이미지를 삭제할 수 있다.

컨테이너

이제 이미지를 사용하는 법을 알았으니, 이미지를 사용한 컨테이너를 사용해보자.

컨테이너 실행

컨테이너를 생성한 다는 것은, 결국 실행을 통해 생성한 후 실행하는 것이다. 먼저 이미지를 풀해서 다운로드 한 경우 그 이미지를 사용해 실행하고, 없다면 실행했을 경우 다운도 받아준다. 도커를 실행하는 명령어는 아래와 같다.

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

추가로, 실행하지 않고 생성만 하고 싶을 때는 run 을 create으로만 바꾸어주면 된다.
다음은 자주 컨테이너 실행 / 생성 때 자주 사용하는 옵션들이다.

그렇다면 아까 받아놓은 우분투를 한번 컨테이너로 만들어준 후 실행해보자.

우분투 컨테이너

docker run ubuntu:16.04

docker ps 라는 명령어는 현재 실행중인 컨테이너 목록을, docker ps -a 는 실행중과 멈춘 컨테이너를 다 보여준다. 컨테이너는 생성이 되었지만, 명령어를 전달하지 않았기에 바로 생성되지마자 종료된다. 명령어를 통해 실행중인 프로세스가 없으면, 컨테이너는 종료된다. 다음은, /bin/bash를 뒤에 붙혀줘 만든 컨테이너의 배쉬로 들어가보자!

docker run -it --name joshua ubuntu:16.04 /bin/bash

위의 명령어를 통해, joshua 라는 이름은 가진 우분투 컨테이너를 만들어 준 후, 실행해 그 안의 bash로 들어간다. 안에는 우분투처럼 사용할 수 있다. exit을 누르면 컨테이너에서 나온다. docker ps -a 를 실행하면, 방금 만든, joshua 라는 컨테이너를 볼 수 있다.

옵션 부분에 --rm을 넣어준다면 exit으로 프로세스를 종료시켰을 경우에 컨테이너가 자동으로 삭제된다. -it는 bash 쉘 안에서 키보드 입력을 가능케 하기 위해 넣어주는 옵션이다.

마리아디비 컨테이너

이번엔, 프로젝트를 통해 조금 친근해진 마리아디비를 받아 컨테이너로 실행해보자.

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 --name maria mariadb:10.1

위 명령어를 한번 해부해보자. 먼저 -d를 통해 백그라운드에서 실행을 시켜주고 -p로 포트설정을 해준다. 로컬에서 이미 mysql을 실행하고 있다면 3306포트를 사용중일테니 잠시 멈춰준다. -e로는 옵션 설정을 해주는데, 접속할 경우 실행하는 패스워드를 설정해주었다. 이후 컨테이너 이름 지정 후 사용할 이미지와 그 버전을 설정한다. 없을 경우, 다운 받아줄 것이다.

도커 컨테이너 리스트에 maria이름을 가진 컨테이너가 생성된 것을 볼 수 있다. 이제 이 컨테이너를 실행한 후 (docker start [컨테이너 ID / 이름]) ,

docker exec -it maria bash

위 명령어(exec)를 실행시켜 컨테이너의 bash 쉘로 들어간다. 이후 평소대로 접속을 해 아까 설정해준 패스워드를 기입하면, 마리아디비를 사용할 수 있다.

데이터베이스 이미지를 사용하는 컨테이너를 처음 만들 때, 뒤에 추가로 값을 넣어줘 configure를 해주거나, 아니면 자신이 설정한 커스텀 configuration 파일을 적용시켜줄 수 있다. 자세한 것은, 도커허브에 마리아디비 링크를 볼 것!

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

컨테이너 제거

아까는 docker rmi를 통해 이미지를 제거했다면, 이번엔 docker rm을 통해 컨테이너를 제거해준다. 먼저 docker ps -a를 실행 해 컨테이너 목록들을 본 후 하나를 제거해보자.

목록 중, mariadb를 사용하는 컨테이너를 제거하려 했는데, 실행 중이여서 제거를 하지 못했다. docker stop을 사용해 멈춰 준 후, 제거해보자!

이제 maria라는 이름을 가진 컨테이너는 실행이 멈춰진 후, 제거되었다.

컨테이너 둘러보기

컨테이너의 log는 logs라는 명령어를 통해 기록을 볼 수 있다. --tail옵션은 ~줄만 출력하게 설정을, -f는 실시간으로 로그가 생성되는 것을 볼 수 있다.

컨테이너 접속하기

컨테이너 접속은 위에서 잠깐 나왔듯이 exec 키워드를 사용한다. exec 키워드를 사용하는 명령어는 아래와 같다.

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

위에 볼 수 있듯이, exec을 통해 컨테이너에 들어가 bash를 실행 할 수 있다. 비슷한 방식으로, 로컬에 데이터베이스를 설치하지 않아도, 컨테이너를 통해 사용 가능하다.

컨테이너 업데이트

컨테이너의 업데이트는, 새 버전의 이미지를 다운 받고, 구 버전의 이미지를 사용하는 컨테이너를 제거 후 다시 만들어 주면 된다. 하지만 컨테이너 삭제시 컨테이너에 저장되고 생성된 파일들이 모두 사라진다는 말이기에 보통 데이터는 컨테이너 내부가 아닌 외부 스토리지에 저장하는 게 좋다. 클라우드 서비스 혹은 데이터 볼륨을 컨테이너에 추가해 사용한다.

흔히 사용하는 방법 중 하나는 로컬의 파일에 마운트해서 사용하는 것이다. 한번 마운트를 한 후 새로 생성할 때 그 경로를 마운트하면 데이터를 계속 사용할 수 있다. -v 옵션을 통해 그 경로에 새로 생성하는 컨테이너를 연결해주면 된다.

# before
docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7

# after
docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  -v /my/own/datadir:/var/lib/mysql \ # <- volume mount
  mysql:5.7

https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html 예제

Conclusion

일단 기본적으로 도커를 설치해 이미지를 다운받고, 또 이미지를 기반으로 컨테이너를 어떻게 생성해 사용하는지 알아봤다. 워낙 공부할 양이 방대하기에, 꾸준히 포스팅을 이어나가야겠다. Docker의 다른 유용한 명령어, 그리고 이미지 생성 방법도 다음 파트에서 공부해보겠다. 그럼 다음 시간에...!

참조
https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
https://hub.docker.com/_/mariadb
https://stackoverflow.com/questions/48957195/how-to-fix-docker-got-permission-denied-issue

profile
Grow Joshua, Grow!

0개의 댓글