도커란 뭘까?
도커는 '컨테이너(container)' 라는 격리된 프로세스를 이용하여 가상머신 상에 리눅스 응용 프로그램들을 실행하고 관리할 수 있게 도와주는 오픈소스 소프트웨어 입니다.
현재 본인이 사용하고 있는 컴퓨터의 운영체제가 리눅스 기반이 아니라 하더라도 이 도커 컨테이너 시스템을 이용해 리눅스 환경을 구축할 수 있는 것이죠.
이곳에서 도커를 설치할 수 있습니다.
https://docs.docker.com/get-docker/
Get Docker
docs.docker.com
이제 도커를 다운받았으면, docker hub라는 곳에서 자신이 원하는 소프트웨어, 즉 image를 다운(pull) 받을 수 있게 되고, 이 image를 실행(run)시키면 image가 container가 되어 내부 프로세스가 작동됩니다.
도커 허브에서 다운받을 수 있는 이미지들은 이곳에서 찾을 수 있습니다.
https://hub.docker.com/search?type=image
Docker Hub
hub.docker.com
기본적인 도커 명령어
윈도우면 명령 프롬프트(cmd), 맥이면 CLI, 또는 리눅스 커맨드 라인으로 가서 다음과 같이 입력하면 됩니다. 원하는 이미지를 다운 받거나 기존에 가지고 있던 이미지를 지울 수 있고, 가지고 있는 이미지로 컨테이너를 생성하고 실행시키거나 멈추고 삭제하는 등 다양한 명령을 내릴 수 있습니다.
이미지 다운
docker pull {image 이름}
이미지 확인
docker images
컨테이너 생성, 실행
docker run --name {컨테이너 이름} {이미지 이름}
실행 중인 컨테이너 확인
docker ps
모든 컨테이너 확인
docker ps -a
실행 중인 컨테이너 중지
docker stop {컨테이너 이름}
컨테이너 재실행
docker start {컨테이너 이름}
컨테이너 실행 시 로그 출력
docker logs -f {컨테이너 이름}
컨테이너 제거
docker rm {컨테이너 이름}
이미지 제거
docker rmi {이미지 이름}
위 작업들은 모두 명령어 입력 없이 Docker Desktop에서도 수행할 수 있습니다.
네트워크 연결
클라이언트와 웹 서버의 상호작용은 웹 서버의 포트(port)라는 곳에서 이뤄집니다. 클라이언트가 웹 서버 내부의 파일 시스템으로 접근하기 위해서 정해진 특정 번호의 포트로 연결해야 하고, 그렇게 해야 서버는 파일시스템에 저장되어 있는 html 같은 파일을 제공할 수 있는 것입니다.
그러나 도커의 경우, 웹 서버 자체가 컨테이너로 구현되어 도커 호스트(Host)라는 곳에 담겨 실행될 수 있습니다.
이때 호스트는 컨테이너와 독립된 포트를 가지게 되는데요, 따라서 클라이언트가 컨테이너 안의 웹 서버로 접속하기 위해선 호스트의 특정 포트를 거친 후, 그 포트와 연결된 컨테이너의 포트로 접속해야 합니다.
이렇게 호스트와 컨테이너의 연결된 포트의 신호로 접속하는 것을 포트 포워딩(port forwarding)이라고 합니다.
보통 컨테이너의 포트는 고정되어 있는 경우가 많고 호스트의 포트를 지정하여 포트 포워딩을 합니다.
명령어는 다음과 같습니다.
docker run --name {컨테이너 이름} -p 8000:80 {이미지 이름}
이렇게 하면 '8000'번 포트로 접속했을 때 컨테이너의 '80'번 포트로 연결하겠다고 지정할 수 있습니다.
그리고 컨테이너 실행 후 localhost:8000으로 접속하면 페이지 연결이 됩니다.
명령어 실행
컨테이너 내부의 파일들을 열람하거나 수정하기 위해 컨테이너 내부에 대한 명령어를 수행하기 위해선 다음과 같이 입력합니다.
docker exec {컨테이너 이름} {명령어}
예를 들어 test란 이름의 컨테이너가 있다 했을 때 docker exec test ls 를 입력하면 test 컨테이너의 내부 디렉토리들을 확인할 수 있습니다.
그러나 매 명령어마다 docker exec를 입력해야 되는데요, 지속적으로 컨테이너와 연결된 상태로 명령어를 전달하고 싶다면 다음과 같이 입력합니다.
docker exec -it {컨테이너 이름} /bin/sh
또는
docker exec -it {컨테이너 이름} /bin/bash
연결된 상태에서 나가고 싶을 땐
exit
그러나 컨테이너 내부에서 직접 파일을 수정해 가며 프로젝트의 버전 관리를 하는 것은 위험합니다. 컨테이너가 사라질 경우 해당 파일들도 모두 사라지기 때문입니다. 따라서 호스트에서 따로 파일 시스템을 관리하고 컨테이너 내 원하는 경로랑 연동시켜줘야 합니다.
docker run --name {컨테이너 이름} -p 8000:80 -v {호스트 내 경로}:{컨테이너 내 경로} {이미지 이름}
이렇게 두 경로에 대해 연결 시켜준후 컨테이너를 실행하면 호스트 내의 파일을 변경할 때 마다 해당 내용이 컨테이너에 반영되는 것을 확인할 수 있습니다.
이미지 생성
기존에 도커 허브에서 제공하는 이미지가 아닌, 특정 이미지로부터 생성된 컨테이너 내부의 파일들을 수정하고 이 변경된 상태의 컨테이너를 새로운 이미지로 만들어낼 수 있습니다.
우선 컨테이너 하나를 실행하고 /bin/sh을 실행해 명령어 창을 띄운 다음, 새로운 패키지를 설치합니다.
apt update
apt install {패키지명}
그리고 원래대로 돌아와서, 컨테이너와 이미지의 파일시스템 간의 변경 사항을 다음과 같은 방법으로 확인할 수 있습니다.
docker diff {컨테이너 이름}
이제 commit을 통해 기존의 이미지와 달라진 이 컨테이너를 또 다른 이름을 가진 이미지로 만들 수 있습니다.
docker commit {컨테이너 이름} {새로운 이미지 이름}
참고 자료
- 공식 도커 문서 : https://docs.docker.com/reference/
- 생활코딩 Docker 입구 수업 : https://opentutorials.org/course/4781/30609
- 도커(Docker) 입문편 | 44BITS : https://www.44bits.io/ko/post/easy-deploy-with-docker
'DevOps' 카테고리의 다른 글
[Docker] 도커 파일(Dockerfile) 작성법 (0) | 2021.10.07 |
---|