본문 바로가기
General CS/Docker

[Docker] 이미지 빌딩과 Vscode로 편한 개발환경 만들기

by 리나그(ReenAG) 2021. 7. 31.
728x90
반응형

 3일 동안 도커라는 물건을 만져 보았는데, 확실히 진전이 있었다. RPIZ에 되도 않는 nodejs를 까는 것 보다는 괜찮은 개발환경을 만들 수 있었다. 단 하나의 단점이라고 한다면 내가 노트북을 끝다면 더 이상 왭페이지가 돌아가지 않는다는 점이지만, 다른 모든 것이 100배 편했기 때문에 그 정도는 감안하려고 한다. 아무튼 미래의 내가 다시 도커를 이용해서 일관성있는 개발환경을 다시 만들고 싶어할 수 있기 때문에, 여기에 튜토리얼을 적어놓으려고 한다.

튜토리얼의 최종결과 :

대강 이런 결과물을 낼 수 있다.

도커를 이용해서 내 컴퓨터에 상당히 가벼운 가상머신을 돌리는 기분으로, 그것 심지어 셸을 vscode에 박아놓고 작업할 수 있다. "service apache2 reload"라던가 자주 칠 수 있는 명령어를 간편하게! 바로! 칠 수 있다. Putty나 Vmware같은 경우는 여러 윈도우를 왔다 갔다 하면서 작업해야해서 이런 환경을 만들어 본적은 없었는데, 얼마나 생산성이 올라갈지는 좀 더 써봐야 알 수 있을 것 같다.

 

https://github.com/heeboy007/bootstrap_test

 

GitHub - heeboy007/bootstrap_test: Junior programmer used struggle to ROR! It's not very effective.... LICENSE is apache 2.0

Junior programmer used struggle to ROR! It's not very effective.... LICENSE is apache 2.0 - GitHub - heeboy007/bootstrap_test: Junior programmer used struggle to ROR! It's not very effectiv...

github.com

나중에 이곳에도 튜토리얼을 작성해놓아야겠으니 링크만 걸어놓고 바로 본론으로 들어가자.

1. Dockerfile 작성

우선 위처럼 보이는 Dockerfile을 가져와도 되고, 본인이 작성해도 된다. 어떤 Dockerfile이든 같은 이미지를 내놓을 것이기 때문에, 일관성에 있어서 엄청난 메리트가 있다. 내가 이전에 작성한 간단한 튜토리얼의 기본적인 도커 파일을 긁어 왔다.

# Dockerfile
# My first docker project!
FROM ubuntu:18.04

RUN apt update
RUN apt install apache2 -y

ENV APACHE_RUN_USER = www-data
ENV APACHE_RUN_GROUP = www-data
ENV APACHE_LOG_DIR = /var/log/apache2
ENV APACHE_PID_FILE = /var/run/apache2/apache2.pid

EXPOSE 80
CMD [ "/usr/sbin/apache2ctl", "-D", "FOREGROUND" ]

이 도커파일은 정확히 apache 웹서버만을 ubuntu에 설치하는 dockerfile이다.

 

FROM 커맨드는 어떤 이미지를 베이스로~ 라는 뜻이다.

 우리가 이미지를 처음부터 작성하기에는 무리가 있다.(아무리 그래도 여러분이 Linux를 기반으로 한 O/S를 직접 작성할 수는 없다. 아니라면 애초에 이 튜토리얼을 보고 있을 리가 없다.) 그래서 전문가들이 docker에 맞게 다양한 O/S 기반을 마련해 두었다. 나는 ubuntu를 선택했다. 많은 사람들이 이용하기 때문에 stack overflow에 해결책도 많아서 개인적으로 선호하게 되었다.

 이것 말고도 alpine이라는 초초초경량 O/S도 있고(리눅스가 달랑 5MB...), 아예 한 기술에 집중한 ruby, nodejs 이미지도 있다. 한번 봐보시길 : https://hub.docker.com/search?operating_system=linux&source=verified&type=image 

 

RUN 커맨드는 그 이미지의 /bin/sh(bash 아님)에서 다음의 명령어를 실행하라는 의미이다.

 여기서 내 이미지에는 RoR이 있으면 좋겠는데? 아님 Node.js가 있음 좋겠는데? 하다면, 그것에 해당하는 커맨드를 추가하면 된다. 예를 들어, Nodejs를 asdf를 이용해서 깔고 싶어서 나는 이런 코드를 추가로 작성했다 :

#환경변수 HOME을 /root로 지정. 보통 이미 되어 있기 때문에 그다지 의미는 없음.
ENV HOME="/root"

#asdf이라는 nodejs 버전 매니저를 깔아서 노드 깔거임
RUN git clone https://github.com/asdf-vm/asdf.git ${HOME}/.asdf --branch v0.8.1

RUN echo ". ${HOME}/.asdf/asdf.sh" >> ${HOME}/.bashrc
RUN echo ". ${HOME}/.asdf/completions/asdf.bash" >> ${HOME}/.bashrc

#PATH 업데이트
ENV PATH="$PATH:/root/.asdf/shims:/root/.asdf/bin"

#nodejs 깔기(bash에서만 asdf가 업뎃되어 돌아가기 때문에 여기선 이렇게)
RUN ["/bin/bash", "-c", "asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git"]
RUN ["/bin/bash", "-c", "asdf install nodejs 14.17.4"]
RUN ["/bin/bash", "-c", "asdf global nodejs 14.17.4"]

 

ENV 커맨드는 말 그대로 환경변수를 이렇게 바꾸겠다는 의미이다. 여기서는 ${HOME}같은 와일드 카드가 통하지 않아서 그냥 $ENV하는 식으로 적어주거나 해야한다.

 

EXPOSE 커맨드는 다음에 올 포트번호를 열어두겠다는 의미이다. HTTP는 80번.

 

CMD 커맨드는 뭐하는 앤지 모르겠다.

2. 이미지 작성

그 도커파일을 만든 디렉토리 에서 vscode를 열고, 터미널에 이렇게 입력하면 된다.

docker build -t [만들어질 이미지 이름]{:[만들어질 이미지의 태그]} .

그럼 빌드가 될 때가 있고, 안될 때가 있는데, 중간에 터져도 너무 걱정하기 않아도 된다. Docker에서 cache기능을 지원해서 성공한 부분에서 부터 다시 빌드를 시작해 준다.(물론 터진 이유는 본인들이 각자 알아서...)

3. 컨테이너 생성

이제 그 이미지가 돌아갈 컨테이너를 작성하면 된다. create, start, attach 등의 명령어를 이용해서 순차적으로 컨테이너를 만들어서 실행하는 방법이 있고, run을 이용해서 한번에 처리하는 방법도 있는데, 나는 run을 이용했다.

docker run -d -p 80:80 -v [host의 디렉토리]:[container의 디렉토리] \
	[아까 만든 이미지의 이름]{:[태그]}

 이렇게 하면 host와 container의 디렉토리가 같이 공유됨과 동시에 여러분이 만든 이미지를 실행한다. 이 설정은 나중에 컨테이너가 꺼지고 켜져도 그대로 유지 된다.

4. 컨테이너에 접속하기

docker container ls
docker container rename [prev name] [new name]
docker exec -it [new name] /bin/bash

 컨테이너가 뒤에서 돌아가기 시작했으니 남은 건 vscode에서 접속하는 것 뿐이다. run을 돌리면서 container의 이름이 랜덤하게 만들어 졌을 텐데, docker container ls를 이용해서 그 이름을 알아낸다. 제일 오른쪽에 있는 희한한 이름이 하나 보일 건데, 그걸 원하는 이름으로 바꾸어 주면 된다. 그런 다음 아래의 커맨드를 이용해서 root계정으로 /bin/bash에 접속할 수 있다.

 

이제 원하는 디렉토리에서 직접 코드를 바꾸면서 셸에 명령을 내릴 수 있는 갓-IDE를 만들 수 있다.

 

 오늘도 포스팅은 이쯤 해야겠다. 어찌 되었건 방학 끝나기 전에 그냥 단순한 블로그 하나라도 띄울 수 있으면 좋을 텐데... 잘 됬으면 좋겠다.

728x90
반응형

'General CS > Docker' 카테고리의 다른 글

[Docker] 첫 프로젝트 작성해보기!  (0) 2021.07.29