상세 컨텐츠

본문 제목

Docker Tutorial: 리눅스에 도커 설치하고 돌려보기 (데스크탑 버전 아님)

terminal

by Riella 2022. 6. 2. 16:11

본문

728x90

이 글은 도커 엔진 설치, 도커 이미지 다운로드, 컨테이너를 만들어서 내가 가진 프로그램을 돌려보고 컨테이너를 다시 삭제하는 정도의 튜토리얼이다.

DockerFile을 다루거나 GPU를 사용하는 경우는 다른 글에서 다룰 예정이다.

Reference (공식 사이트): 설치,설치 이후 세팅,공식 도커 이미지들,

 

도커는 프로그램 환경을 셋팅할때 유용하다. 도커 엔진을 설치하고, 도커 이미지라는걸 다운 받아 실행할 수 있는데, 도커 이미지를 실행하면 도커 컨테이너가 생성된다.

도커 컨테이너는 켰다 껐다 할 수 있으며 내가 가지고 있는 OS에 구애 받지 않는 완전히 분리된 공간이다.

Virtualenv가 파이썬 버전 정도를 자유자제로 쓸 수 있게 해준다면 컨테이너 안은 유저부터 다시 설정해야하는 새로운 OS를 돌려볼 수 있다.

 

도커 이미지는 굉장히 다양한데 디스크 이미지랑 비슷하다고 보면 된다. 다양한 OS버전에 원하는 Cuda 혹은 NodeJS가 설치되어있는 환경을 이미지화 시켜서 이미지를 읽고 컨테이너를 만들 수 있게 만든 것이다.

물론 아무것도 설치되어있지 않는 이미지도 있다.

기존 이미지를 활용해 이것 저것 더 설치한 다른 이미지를 만들 수 있으며 그건 DockerFile이라는 것을 통해서 가능하다.

컨테이너 안에서 프로그램을 설치하고 그 상태를 이미지로도 만들 수 있다.

다른 곳에 설명은 더 자세히 되어있으니 참고하길 바란다.

 

내가 도커를 쓰는 이유는 현재 가지고 있는 프로그램을 도커 컨테이너에 연결시켜서 돌려보고

컨테이너 안에서 작업하고 저장한 결과물을 원래 os에서도 연결시켜 볼 수 있기 때문이다 (아직 프로그램 배포는 안해봄).

그래서 간단하게나마 이 튜토리얼에서 이 작업도 해보려고 한다.

 

서두가 길었지만 이 튜토리얼에서는

도커 엔진으로 docker 명령어를 돌릴 수 있고 도커 이미지로 컨테이너를 만들 수 있다는 정도만 알아도 된다.

(이미지를 여러번 돌려서 여러개의 컨테이너를 만들 수 있고, 만들어 둔 컨테이너를 재사용도 가능)

ex)가 붙은 명령어들을 제외하고 위에서부터 아래로 다 돌리면 실행되게 만들어두었습니다.

 

[설치 이전 도커 repo세팅]

이전 버전의 도커가 있다면 삭제 해주기

sudo apt-get remove docker docker-engine docker.io containerd runc

설치 이전 세팅 - apt 패키지 업데이트 해주고

sudo apt-get update

도커 키를 받고 도커 repo(저장소)를 사용하기 위해 설치해준다.

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

도커 키 더하기

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

도커 repo세팅

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

[도커 엔진 다운받기]

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

컨테이너를 여러개 쓰는 경우는 docker compose도 다운 받으면 된다 (링크).

 

[설치 이후 옵션] sudo를 안 붙이고 docker 명령어 돌리게 설정

Manage Docker as non-root user이라고 되어있어서 root권한 없이 돌리는건줄 알았는데

도커 명령어를 돌릴때 sudo를 매번 붙이는게 번거로울때 설정하는것이다.

아래 명령어들은 도커라는 그룹을 만들고 root권한을 도커에게 주는것을 설정해 준다.

root 권한으로 돌리고 싶지 않은 경우에는 여기를 참고하자.

sudo groupadd docker
sudo usermod -aG docker $USER

이러고 컴퓨터를 재부팅시켜야한다.

터미널에서는 아래 커멘드를 입력하면 일시적으로 group을 업데이트하여 재부팅 없이 사용할 수 있다.

(하지만 매번 위의 명령어도 돌리고 번거롭다 껐다가 키자)

newgrp docker

 

[도커 이미지 받기]

아무것도 없는 이미지를 받아 컨테이너를 만들어 세팅하는게 도움이 많이 된다고 해서

공식으로 나온 우분투 20.04 이미지(링크)를 받아

(추후 DockerFile에 적는 RUN 커멘드가 컨테이너 안에서 돌리는 명령어이기 때문)

이외의 공식 이미지는 상단에 링크로 걸어두었다.

 

서포트 되는 태그 보면 20.04 또는 focal 등의 태그가 있음을 볼 수 있다.

기본 명령어인 docker pull ubuntudp 콜론을 붙이고 태그를 적어주면 해당 이미지가 다운된다.

docker pull ubuntu:20.04

 

[docker run: 도커 컨테이너 만들기]

docker run이라는 명령어를 통해 만들 수 있다.

여기에 옵션들이 많이 붙는데 형태는 대략 이렇다.

docker run [옵션들] [이미지 이름]
ex) docker run --name ubuntu_cont --volume $(pwd):/home/user/project ubuntu:20.04 /bin/bash
ex) docker run -it -n ubuntu_cont -v $(pwd):/home/user/project ubuntu:20.04

각 옵션들에 대해 보고 싶으면 여기에서 혹은 터미널에서 아래 명령어를 치면 된다.

docker run --help

대표적인거 몇개 설명을 하면

-it: 도커가 컨테이너 안에 상호작용 가능한 수도(pseudo) 터미널을 만든다.

이걸 붙이거나 이미지 뒤에 /bin/bash를 붙여주어야 컨테이너 안에서 명령어들을 칠 수 있다.

ex) docker run -it ubuntu:20.04
ex) docker run ubuntu:20.04 /bin/bash #bash쉘을 실행해라는 의미

--name: 이름을 지정 할 수 있다. 없으면 랜덤으로 주어짐. 아래는 이름을 ubuntu_cont라고 짓는 명령어이다.

ex) docker run --name ubuntu_cont ubuntu:20.04

--gpus: 터미널 안에서 gpu를 사용한다는 뜻이다. 이걸 안쓰면 그 컨테이너는 gpu를 사용 못함. all은 모든 gpu를 사용한다는 뜻.

ex) docker run --gpus all ubuntu:20.04

-v 혹은 --volume: 폴더를 마운트 한다. 프로젝트까지의 path를 적고 콜론을 붙인 후 도커 안에서의 파일 경로를 적으면 된다.

ex) docker run -v $(pwd):/home/user/test_project

 

그러면 임의로 폴더를 만들어 텍스트 파일을 만들고 도커에 마운트하여 컨테이너를 만들어보자 (튜토리얼 끝에 말끔히 삭제예정)

test_cont라는 파일을 만들고

들어간 후

test.sh라는 빈 쉘 스크립트를 만든 후

executable(돌릴 수 있게) 권한을 준것이다.

mkdir test_cont
cd test_cont
echo "" > test.sh
chmod 775 test.sh

test_cont안에 있는 상태에서 그대로 아래 명령어를 쳐준다.

docker run -it --name test_cont --volume $(pwd):/home/mtest_cont ubuntu:20.04

그리면 root@... :/# 에 커서가 있는것을 볼 수 있는데 컨테이너를 만들고 들어와있는것이다.

cd /home/mtest_cont
ls

그러면 외부에서 만들었던 빈 test.sh파일이 보인다. test_cont안의 내용들이 mtest_cont안으로 마운트 됨을 볼 수 있다.

여기에서 test.sh파일을 수정해보자.

우선 에디터가 전혀 없기 때문에 설치해 주어야한다.

apt 업데이트를 하고 (컨테이너 들어가면 국룰이다).

빔(vim)을 깔아주었다.

apt-get update -y
apt-get install vim -y
vi test.sh

i를 입력 (수정모드)

아래를 복사해서 우클릭 -> 복사 시켜준다.

#!/bin/bash

five=5

echo 'counting five seconds'

for ((var=0 ; var < $five ; var++));
do
	sleep 1
	count=`expr $five - $var`
       	echo "${count}"
done

sleep 1

MYSTERY_ANIMAL="\n       _\n       \\\`*-.\n        \
)  _\`-.\n       .  : \`. .\n       : _   \
'  \\ \n       ; *\` _.   \`*-._\n       \
\`-.-'          \`-.\n         ;       \
\`       \`.\n         :.       .        \
\\ \n         . \\  .   :   .-'   .\n         \
'  \`+.;  ;  '      :\n         :  '  |    \
;       ;-.\n         ; '   : :\`-:     _.\
\`* ;\n[hi!] .*' /  .*' ; .*\`- +'  \`*'\
\n      \`*-*   \`*-*  \`*-*'"

echo -e "Tada!\n${MYSTERY_ANIMAL}"

그리고 esc키를 누른 후

:wq

이제 파일이 수정 되었다.

우선 터미널에서 돌려보자

./test.sh

(미스테리한 동물이 무엇일까?)

이제 도커를 종료하고 원래 파일이 바뀌었는지 확인하자.

[exit: 실행중인 도커 컨테이너에서 나가기]

도커 컨테이너에서 나갈때 쓰는 명령어이다.

exit

그리고 내 컴퓨터의 아까 만들어 놓았던 쉘 스크립트를 다시 돌려보면 업데이트 되어있음을 알 수 있다.

./test.sh

[docker stop: 컨테이너 중지 시키기]

docker stop [옵션들] [도커 컨테이너 이름]

docker stop test_cont

보통 나가면 정지되지만 exec로 실행한 경우(하단의 docker exec 참고)는 여전히 실행되고 있다.

그래서 docker stop으로 멈춰주어야 한다.

[docker images: 생성된 이미지 확인]

docker images

아래 명령어는 중간과정 이미지까지 다 프린트 됨.

-a: all이기 때문이다.

<none>으로 시작하는거는 나중에 dependent한 이미지 없어지면 저절로 사라진다.

docker images -a

아까 받아둔 ubuntu이미지도 위의 커멘드들을 입력했을때 뜰거다.

[docker ps: 생성된 컨테이너 확인]

현재 실행중인 도커들이 출력된다.

docker ps

저장 및 종료된 도커까지 출력하려면 -a 옵션으로 보아야 한다.

docker ps -a

test_cont도 NAMES아래에 있음을 볼 수 있다.

[docker start: 만들어 놓았던 컨테이너 켜기]

컨테이너를 다시 시작하고 싶으면 켠 후 attach를 통해 접속해야한다. 둘다 아주 간단하다.

docker start [옵션들] [도커 컨테이너 이름]

컨테이너 이름 대신 컨테이너 아이디를 적어도 된다.

docker start test_cont

docker ps하면 이제 test_cont가 보인다.

[docker attach: 켜져있는 컨테이너 실행하기]

docker attach [옵션들] [도커 컨테이너 이름 혹은 아이디]

docker attach test_cont

이러면 아까 종료했던 컨테이너를 다시 실행 시킬 수 있다.

다시 나가자.

exit

비슷하게 docker exec도 있다.

이건 이미 컨테이너를 실행하고 작업하던 상태에서 다른 터미널 창에서 컨테이너를 실행하고자 할때 attach는 기존 켜둔게 종료 되어서 exec를 쓴다고 한다 (설명 링크).

처음에는 attach를 몰라서 매번 exec로만 켰었다.

아래에 일단 exec로 켜두는 문법만 남겨두도록 하겠다.

[docker exec: 컨테이너 실행중인데 다른 터미널 창에서 켜고 싶을때]

docker exec [옵션들] [도커 컨테이너 이름 또는 아이디] [시작하는 쉘 종류]

아까 docker attach 대신에 아래 명령어를 적어도 실행이 된다.

왜인지 모르겠지만 -it 옵션과 /bin/bash를 같이 주어야 터미널에서 입력할 수 있다.

아래는 다시 test_cont를 켜고 - 실행하고 - 나가서 - 끄기까지의 과정이다.

docker start test_cont
docker exec -it test_cont /bin/bash
exit
docker stop test_cont

[docker rm: 도커 컨테이너 삭제]

docker rm [옵션들] [도커 컨테이너 이름 혹은 아이디]

docker rm test_cont

[docker rmi: 도커 이미지 삭제]

docker rmi [옵션들] [도커 컨테이너 이름 혹은 아이디]

docker rmi ubuntu:20.04

마지막으로 임시로 만들었던 폴더와 쉘 스크립트 역시 삭제하도록 하겠다.

아직 test_cont 파일안에 있으니 폴더에서 나와 아까 만들어 두었던 폴더와 안의 파일들 삭제하기

cd ..
rm -rvf test_cont

 

감사합니다 :)

이미지는 추후에 첨부하도록 하겠습니다.

관련글 더보기

댓글 영역