수학과의 좌충우돌 프로그래밍

[배포]Azure를 이용한 배포, Docker 명령어 본문

웹프로그래밍/배포

[배포]Azure를 이용한 배포, Docker 명령어

ssung.k 2019. 5. 27. 00:47

Docker 명령어

Docker 에 대해서 몇가지 명령어를 알아보고자 합니다.

Docker run
docker run -it python:3.7-stretch

먼저 가장 기본시 되는 Docker container 를 만드는 run명령어 입니다. 그 뒤에는 Docker 이미지의 이름이 위치하는데 다음과 같은 경우에는 Docker 공식 이미지인 python 이기 때문에 다음과 같이 image이름:버젼 으로 써주었습니다.

일반적인 경우, 즉 docker 공식 이미지가 아닌 경우에는 사용자이름/image이름:버젼 과 같은 형태로 써주게 됩니다.

docker run --rm -it python:3.7-stretch

그리고 rm 은 remove 의 줄임말로서 삭제를 의미합니다. docker가 stop 했을 경우 자동으로 삭제하게 하는 명령어로서, 앞에서 언급했던 immutable infrastructure 패러다임에 부합하는 명령어라고 할 수 있습니다.

이미지가 local에 없으면 다운을 받게 됩니다. 한 번 다운 받은 뒤로는 이미 존재하기 때문에 다시 다운 받을 필요가 없습니다. 다운이 완료되면 local에 python 3.7 이 없더라도 완전히 격리된 공간에서 3.7 버젼을 사용할 수 있습니다.

 

왜 인터프리터가 실행되지?

다음과 같이 run 이 되면 python 인터프리터가 실행이 될 것 입니다. 그 이유는 COMMAND 와 관련이 있습니다. Dockerfile 에서 CMD 부분이 아래와 같이 명시되어 있기 때문에 run을 할 시 python 인터프리터가 실행이 됩니다.

# Dockerfile
...
CMD ["python3"] 

만약 run 을 할 시, 맨 위에 다른 명령어를 적어준다면 그 명령이 CMD를 오버로드하게 됩니다. 따라서 이 경우 python의 version만 확인하고 docker container가 삭제됩니다.

docker run --rm -it python:3.7-stretch python3 --version

# Python 3.7.3
python version

인터프리터 내에서 python version 을 확인하기 위해서 확인을 해보면 다음과 같습니다.

>>> import sys
>>> sys.version
'3.7.3 (default, May  8 2019, 05:28:42) \n[GCC 6.3.0 20170516]'

 

docker container ls

현재 docker container 를 확인해보겠습니다. 먼저 docker container 를 생성한 후,

docker run -it python:3.7-stretch

다음과 같은 명령어로 현재 docker container 를 확인 할 수 있습니다. 이 때 -all 은 모든 docker를 전부 보여주고 -all이 없다면 동작중인 docker container만 보여주게 됩니다.

docker container ls -all

CONTAINER ID  IMAGE              COMMAND   CREATED        STATUS     PORTS        NAMES
0141ce183719  python:3.7-stretch "python3" 28 seconds ago Exited(0) 16 secondago  mystifying
docker stop,rm

앞에서 살펴봤듯이 container 를 한 번 사용 후 재 사용할 것이 아니기 때문에 통상적으로 —rm 을 붙여줍니다. 이를 붙이지 않았을 경우에는 docker 를 stop하고 직접 삭제해줘야합니다.

docker stop NAMES
docker rm NAMES

 

nginx 웹서버

nginx 웹서버를 띄워보도록 하겠습니다. 이 역시 docker 를 사용합니다.

docker run -p 8080:80 nginx

-p 는 —publish 와 같은 명령어로 호스트, 즉 local 에서의 port와 docker container의 port 를 연결해줍니다. 지금은 local의 8080 과 docker container의 80 을 연결해줍니다.

그 결과 localhost:8080 으로 접근 시 페이지가 잘뜹니다.

 

docker run -d -p 8080:80 nginx

-d 는 detach 모드로 실행이 된다. 이 때는 foreground로 실행되는게 아니라 background로 실행되기 때문에 여러 container 들을 돌릴 수 있습니다.

docker run -d -p 8080:80 nginx
docker run -d -p 8081:80 nginx
docker run -d -p 8082:80 nginx

다음과 같이 하나의 docker image로 여러 개의 container 를 생성할 수 있습니다.

 

호스트 머신 측 컨텐츠로 html 서빙하기

위에서 봤던 localhost:8080 은 docker container 안에 있는 html 파일로서 다음과 같은 경로에 있습니다.

/usr/share/nginx/html

이를 내 로컬에 있는 html 파일 mapping 시켜서 원하는 화면을 띄울 수 있습니다.

docker run -d -p 8080:80 --volume `pwd`/html:/usr/share/nginx/html --name mynginx nginx

volume 명령어를 통해서 : 를 기준으로 좌측은 내 local의 경로, 우측의 container 안의 경로가 위치합니다. 이 때 내 local 의 경로가 container 안의 경로와 mapping 이 됩니다. 이 떄 경로는 절대 경로로 지정해줘야 하고 현재 디렉토리를 출력하는 pwd 를 이용합니다. 주의해야할 점은 pwd 양 쪽은 따음표가 아니라 숫자 1 옆에 있는 백쿼터를 사용한다.

그리고 현재 local 에 html 폴더를 만들어주고 그 안에 index.html 를 만든 결과 다음과 같이 페이지가 잘 나오는 걸 확인할 수 있습니다.

<!-- html/index.html -->
<h1>Hello World! </h1>

 

Comments