Docker - 생활코딩 정리

Doodream·2021년 11월 9일
2

Docker는?

개발환경을 설치할 때에는 여러가지로 애먹기 마련입니다. 다양한 개발설정으로 해당 프로그램이 잘 돌아가지 않는다면 갖은 애를 써먹기 마련이죠.
보통 웹서버를 개발한다고 한다면 어플리케이션 - 웹서버- 데이터베이스 로 나눠서 서비스 됩니다. 하지만 각각 돌아가는 OS가 다르다면 어떻게 할까요?
이전에는 각각 필요한 컴퓨터 3대를 빌려서 해당 컴퓨터안의 OS를 맞춰서 각각 돌려 인터넷 통신을 통해 연결시켰습니다. 혹은 한 컴퓨터 안에 가상 OS (Virutal Box)같은 가상머신을 돌려 해당 프로그램을 그안에서 돌렸었죠.

하지만 프로그램을 하나만 돌릴건데 OS까지 까는 것은 너무하다 싶습니다.

그래서 새로운 컨테이너 라는 개념이 나왔습니다.

위 그림에서 원래 OS에서 돌릴 어플리케이션의 환경 즉, 그냥 내 컴퓨터 환경을 host라고 합니다. 그리고 각각의 격리된 환경인 컨테이너 안에 OS가 들어가는게 아니라 Web server라는 프로그램 만을 돌릴 라이브러리, 실행파일 들만 들어있습니다. 이렇게 앱을 돌릴 수 있다면 정말 좋겠습니다.

실제로 리눅스 OS 안에는 이렇게 앱을 실행할 수 있는 기술이 내장되어있는데 이러한 실행기술을 컨테이너 라고 부릅니다. 이러한 컨테이너 기술을 이용해서 사용자에게 개발환경을 간단하게 제공시켜주는 프로그램이 여럿있지만 그중 제일 잘나가는 기술이 바로 DOCKER 입니다.

Docker 설치

도커는 리눅스안에서 돌아가는 프로그램입니다. 따라서 도커 안에 돌아가는 프로그램들은 리눅스에서 돌아가는 프로그램이라는 것을 알수 있습니다. 하지만 우리의 컴퓨터는 OS가 리눅스가 아니기에 (리눅스인 사람은 존경) 가상머신으로 리눅스를 올리고 원하는 프로그램을 설치합니다. 이때 OS가 리눅스가 아니기에 가상머신을 거쳐서 이용할때의 성능저하가 있을 수 있지만 이러한 점은 도커가 제공하는 편의성보다 훨씬 값지다고 합니다.

도커 설치 페이지
위 링크를 따라 들어가면 각 os별 플렛폼 별로 docker를 설치하는 방법이 나와있습니다.


docker를 github Desktop 앱처럼 그래픽하게 표현한 Docker DashBoard 입니다. 하지만 도커는 명령어로 사용해야 100% 풀파워를 낼 수 있습니다.
위 명령어를 도커에서 실행시키고 설치가 다되면 docker images 명령어를 실행시켜주세요.
각각 의 환경에서 설치를 하고 윈도우는 cmd, mac은 터미널을 켰을때 docker images 라는 명령어를 실행시켜 이상이 없다면 정상적으로 설치가 된 것입니다.

이미지 Pull

도커를 이용하는 수단으로는 docker hub에서 image 를 다운로드 받아서 이것을 container에서 실행하는 것이 있습니다.
이과정에서 각각 app store, program, process와 대응시킬수 있습니다. image라는 것은 여러개의 컨테이너에서 사용될 수 있습니다. 우리는 컨테이너에서 이 이미지를 실행시키면 컨테이너안에서 실행되도록 조치된 것을 통해서 프로그램을 사용할 수 있게 됩니다. 처음에 docker hub에서 image를 다운로드 받는 것을 image pull 이라고 합니다.

도커 허브

Explore 클릭

위 화면에서 docker의 이미지를 검색할 수 있습니다. docker pull httpd 라는 명령어로 우리컴퓨터의 docker에 httpd 도커이미지를 설치 할 수 있는 것이죠.

💡 도커 명령어 문서

도커 명령어 문서를 통해서 도커 명령어의 사용법을 알아볼수 있습니다.

도커 이미지 pull

도커 이미지를 pull 받으면 docker images 명령어를 통해 image가 설치되었는지 알아볼 수 있습니다.

container run

이미지를 컨테이너에서 실행시키는 run 에 대해서 배워 봅니다.

dashboard에서 이미지 별로 run 이라는 버튼이 있고 이버튼을 통해 이미지를 실행시킬 컨테이너를 생성 할 수 있습니다.
컨테이너의 설정중 이름을 잘지어서 컨테이너 관리를 해줘야 합니다.

ws1 이라는 컨테이너를 생성하면 아래와 같이 컨테이너가 실행되고 있는 모습을 볼수 있습니다.

해당 컨테이너를 클릭하면 실행되고 있는 컨테이너의 프로세스의 로그를 볼수 있고 여러 통계들 또한 볼 수 있습니다.

docker 명령어

  • docker run [OPTIONS] httpd
    httpd 라는 이미지를 사용하는 컨테이너를 생성하는 명령어 입니다. 중간에 --name 이라는 옵션을 넣어주면 컨테이너의 이름을 설정 해 줄 수 있습니다.

  • docker ps
    현재 실행되고 있는 컨테이너의 현황을 볼수 있습니다. 중간의 옵션인 -a을 넣는다면 실행되지 않고 있는 컨테이너 전부를 볼수 있습니다.

  • docker stop
    현재 실행되고있는 컨테이너를 중지 할수 있습니다.

  • docker start
    중지된 컨테이너를 다시 실행시킬 수 있습니다. 다시 실행시킬 때는 컨테이너의 로그가 나오지 않아 따로 docker logs라는 명령어를 입력해야합니다.

  • docker logs
    실행되고 있는 특정 컨테이너의 로그를 볼수 있습니다. 중간에 -f 옵션을 넣으면 계속 해당 컨테이너의 로그를 모니터링 할수 있습니다.

  • docker logs -f

  • docker rm
    특정 컨테이너를 삭제합니다. 물론 실행되고 있는 컨테이너는 에러가 나지만 -f 옵션을 넣으면 실행되고 있는 컨테이너를 강제로 삭제할 수 있습니다.

  • docker rmi
    특정 이미지를 삭제합니다. 물론 해당이미지를 참조하며 실행중인 컨테이너가 있을 경우에 에러가 나지만 해당 컨테이너를 지우고 이미지를 지울 수 있습니다.

Network

도커에서 웹서버를 사용하는 모습을 보면 보통 웹브라우저에서 웹서버에 url로 요청을 보냅니다. 이러한 웹서버가 도커에서는 host라는 별도의 환경 안에 container로서 실행되고 있습니다.
따라서 host에서 받는 포트와 컨테이너 웹서버에서 받는 포트를 이어주어야합니다. 컨테이너에서 8000번 포트로 들어가는 것을 웹서버에서는 80번 포트로 받도록 설정되어 있으므로 docker run -p 8000 : 80 httpd 명령어를 통해서 포트포워딩을 해줍니다. 이렇게 이어주면 웹 브라우저에서 8000포트로 진입해서 index.html 파일을 요청하는 결과로 container안의 웹서버가 해당요청을 받고 웹브라우저로 index.html 파일을 전송해줍니다.


위 명령어를 뜯어보면
docker run --name ws2 -p 8081:80 httpd 명령어를 통해서 이름은 ws2라는 컨테이너를 만들고 8081 포트로 진입하는 연결을 컨테이너안에서는 80포트로 이어주는 포트포워딩 한 컨테이너를 생성한다 라는 작업을 했습니다.
이후 localhost:8081/index.html 요청을 통해서 도커로 부터 해당 파일을 받아오는 로그을 찍힌것을 볼수 있었습니다.

컨테이너 안에서의 작업

  • 현재 실행되고 있는 컨테이너를 살펴봅니다. docker ps
  • docker exec ws2 pwd ws2 컨테이너안에서 pwd 라는 명령어를 실행시킵니다. 해당 명령어를 실행시키면 그결과 로그가 터미널에 뜨게되는데 이후에는 호스트에 명령어를 주는 대기 커서로 변한것을 볼수 있습니다. 즉, 컨테이너에 명령을 줄 수 있는 일회성 명령어 입니다.
  • docker exec -it ws2 /bin/sh ws2 컨테이너 안에서 명령어를 내리는데 /bin/sh 으로 실행시킬 수 있는 sh 쉘을 지속적으로 끊기지 않고 열어주는 명령어 입니다. 해당 명령어를 입력한 이후에는 # 대기 커서가 뜨면서 지속적으로 컨테이너에 명령이 내려지는 모습을 확인 할 수 있습니다.
  • 추가로 이미지마다 사용할 수 있는 쉘이 다를 수 있는데 /bin/sh는 기능이 제한적이라 /bin/bash 쉘을 많이 사용합니다.

  • apt update명령어로 apt를 최신화 해주고 (apt는 리눅스에서 프로그램 설치 매니저 입니다.)
  • apt install nano 명령어로 nano 에디터 편집기를 설치해줍니다. vim을 설치해도 상관없습니다. 그냥 파일편집기면 됩니다.
  • nano index.html로 index.html을 편집해주고 리로드를 하면

나노 편집기 사용법

안전하게 컨테이너 안에서 작업하기

위와 같이 작업을 했을 경우 만약 실수로 컨테이너를 삭제한다면 어이없게 모든 작업물이 날아가게 됩니다. 따라서 호스트안에서 파일을 수정하면 컨테이너안에서 파일이 똑같이 수정되는 원격 작업 형태로 만들고 이렇게 동기화되는 컨테이너를 여러개 만들어 둔다면 안전해집니다.

~/Desktop/htdocs 폴더 안에 index.html 파일을 아래와 같이 만들어 작업했습니다.

그리고 이폴더와 새로운 컨테이너의 폴더를 동기화 시켜주는 작업을 해주는데

docker run -p 8888:80 -v ~/Desktop/htdocs:/usr/local/apache2/htdocs/ http
8888번 포트를 컨테이너의 80포트로 연결시키는 포트포워딩을 하고 호스트의 ~/Desktop/htdocs 와 컨테이너의 /usr/local/htdocs/ 폴더를 동기화 시켜주는 아파치(httpd) 이미지를 사용하는 컨테이너를 생성합니다.

이후 호스트에서 그냥 만든 html 파일을 수정하고 리로드를 하면 아래와 같이 동기화가 됩니다.

이렇게 되면 버전관리 / 백업 / 에디터 코드 편집들이 쉬워지고 장점이됩니다.

End

더 알고 싶다면

profile
일상을 기록하는 삶을 사는 개발자 ✒️ #front_end 💻

1개의 댓글

comment-user-thumbnail
2023년 2월 21일

안녕하세요 운영자님
인카토스입니다.
먼저, 댓글로 인사를 드리게 된 점 양해 부탁 드립니다.
이렇게 연락 드린 이유는 이번에 저희가 제작한 도커 각티슈케이스 제품 협찬을 제안드리고 싶어서 연락 드렸습니다.
개발자들에게 많은 사랑은 받은 각티슈케이스입니다.
저희 상품 블로그 포스팅이 가능하실지 여쭙고자 연락드렸습니다.
아니면 클리앙,서버포럼, okky,2cpu,그누보드 등 가입되어 있으신 개발자 커뮤니티가 있으시다면 해당 커뮤니티에 아래와 비슷하게 게시글을 올려주실수 있을까요?

클리앙 : https://www.clien.net/service/board/park/17797443

연락드릴수 있는방법이 댓글밖에 보이지 않아 이렇게 먼저 연락드립니다.

협찬제안에 긍정적인 검토 부탁드리고 제안이 마음에 드신다면 하기 메일로 메일주시면 제품 보내드리도록 하겠습니다.

sungjh0726@naver.com

협찬제품 링크 : https://incatos.shop/surl/P/11

답글 달기