이 글은 도커 엔진 설치, 도커 이미지 다운로드, 컨테이너를 만들어서 내가 가진 프로그램을 돌려보고 컨테이너를 다시 삭제하는 정도의 튜토리얼이다.
DockerFile을 다루거나 GPU를 사용하는 경우는 다른 글에서 다룰 예정이다.
Reference (공식 사이트): 설치,설치 이후 세팅,공식 도커 이미지들,
도커는 프로그램 환경을 셋팅할때 유용하다. 도커 엔진을 설치하고, 도커 이미지라는걸 다운 받아 실행할 수 있는데, 도커 이미지를 실행하면 도커 컨테이너가 생성된다.
도커 컨테이너는 켰다 껐다 할 수 있으며 내가 가지고 있는 OS에 구애 받지 않는 완전히 분리된 공간이다.
Virtualenv가 파이썬 버전 정도를 자유자제로 쓸 수 있게 해준다면 컨테이너 안은 유저부터 다시 설정해야하는 새로운 OS를 돌려볼 수 있다.
도커 이미지는 굉장히 다양한데 디스크 이미지랑 비슷하다고 보면 된다. 다양한 OS버전에 원하는 Cuda 혹은 NodeJS가 설치되어있는 환경을 이미지화 시켜서 이미지를 읽고 컨테이너를 만들 수 있게 만든 것이다.
물론 아무것도 설치되어있지 않는 이미지도 있다.
기존 이미지를 활용해 이것 저것 더 설치한 다른 이미지를 만들 수 있으며 그건 DockerFile이라는 것을 통해서 가능하다.
컨테이너 안에서 프로그램을 설치하고 그 상태를 이미지로도 만들 수 있다.
다른 곳에 설명은 더 자세히 되어있으니 참고하길 바란다.
내가 도커를 쓰는 이유는 현재 가지고 있는 프로그램을 도커 컨테이너에 연결시켜서 돌려보고
컨테이너 안에서 작업하고 저장한 결과물을 원래 os에서도 연결시켜 볼 수 있기 때문이다 (아직 프로그램 배포는 안해봄).
그래서 간단하게나마 이 튜토리얼에서 이 작업도 해보려고 한다.
서두가 길었지만 이 튜토리얼에서는
도커 엔진으로 docker 명령어를 돌릴 수 있고 도커 이미지로 컨테이너를 만들 수 있다는 정도만 알아도 된다.
(이미지를 여러번 돌려서 여러개의 컨테이너를 만들 수 있고, 만들어 둔 컨테이너를 재사용도 가능)
ex)가 붙은 명령어들을 제외하고 위에서부터 아래로 다 돌리면 실행되게 만들어두었습니다.
이전 버전의 도커가 있다면 삭제 해주기
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도 다운 받으면 된다 (링크).
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 [옵션들] [이미지 이름]
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
그리고 내 컴퓨터의 아까 만들어 놓았던 쉘 스크립트를 다시 돌려보면 업데이트 되어있음을 알 수 있다.
./test.sh
docker stop [옵션들] [도커 컨테이너 이름]
docker stop test_cont
보통 나가면 정지되지만 exec로 실행한 경우(하단의 docker exec 참고)는 여전히 실행되고 있다.
그래서 docker stop으로 멈춰주어야 한다.
docker images
아래 명령어는 중간과정 이미지까지 다 프린트 됨.
-a: all이기 때문이다.
<none>으로 시작하는거는 나중에 dependent한 이미지 없어지면 저절로 사라진다.
docker images -a
아까 받아둔 ubuntu이미지도 위의 커멘드들을 입력했을때 뜰거다.
현재 실행중인 도커들이 출력된다.
docker ps
저장 및 종료된 도커까지 출력하려면 -a 옵션으로 보아야 한다.
docker ps -a
test_cont도 NAMES아래에 있음을 볼 수 있다.
컨테이너를 다시 시작하고 싶으면 켠 후 attach를 통해 접속해야한다. 둘다 아주 간단하다.
docker start [옵션들] [도커 컨테이너 이름]
컨테이너 이름 대신 컨테이너 아이디를 적어도 된다.
docker start test_cont
docker ps하면 이제 test_cont가 보인다.
docker attach [옵션들] [도커 컨테이너 이름 혹은 아이디]
docker attach test_cont
이러면 아까 종료했던 컨테이너를 다시 실행 시킬 수 있다.
다시 나가자.
exit
비슷하게 docker exec도 있다.
이건 이미 컨테이너를 실행하고 작업하던 상태에서 다른 터미널 창에서 컨테이너를 실행하고자 할때 attach는 기존 켜둔게 종료 되어서 exec를 쓴다고 한다 (설명 링크).
처음에는 attach를 몰라서 매번 exec로만 켰었다.
아래에 일단 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 test_cont
docker rmi [옵션들] [도커 컨테이너 이름 혹은 아이디]
docker rmi ubuntu:20.04
마지막으로 임시로 만들었던 폴더와 쉘 스크립트 역시 삭제하도록 하겠다.
아직 test_cont 파일안에 있으니 폴더에서 나와 아까 만들어 두었던 폴더와 안의 파일들 삭제하기
cd ..
rm -rvf test_cont
감사합니다 :)
이미지는 추후에 첨부하도록 하겠습니다.
윈도우10 검색 먹통 (작업표시줄에서 검색 안됨) (0) | 2023.06.12 |
---|---|
ssh 공개키 만들기, 깃에 등록하기 (git token 사용 안하기) (0) | 2022.04.06 |
리눅스에서 심볼릭 링크 만들기/삭제하기 ln -s (Create Symlink) (0) | 2022.03.17 |
Matlab mac 터미널에서 돌리기 (0) | 2021.05.08 |
zsh 경로 설정 (.bash_profile에 경로를 더해도 터미널을 새로 킬 때마다 사라져요) (0) | 2021.05.08 |
댓글 영역