핵심 개념
Docker란?
Docker란 Go언어로 작성된 리눅스 컨테이너 기반으로하는 오픈소스 가상화 플랫폼이다. 에플리케이션의 실행환경을 구축하고 관리하기 위한 플랫폼이다.
Docker는 애플리케이션을 환경에 구애 받지 않고 실행할 수 있으며 에플리케이션 개발을 촉진하고 단순화하도록 설계된 오픈 소스 소프트웨어이다.
Docker 작동원리
Docker는 시스템이나 서버의 image를 만들고 container에 그 이미지를 담아 가상머신(VM)에서 실행한다.
레이어 시스템을 사용하는데 파일들을 추가하거나 수정할 때 새로운 레이어가 생성되어 기존 레이어에 덧붙여지는 시스템이다. 자원을 아낄 수 있다.
Docker를 사용하는 이유
코드를 더 빨리 전달하고, 애플리케이션 운영을 표준화하고, 코드를 원활하게 이동하고, 리소스 사용률을 높여 비용을 절감할 수 있다. 또한, Docker가 설치되어 있다면 어느 환경이든 상관 없이 바로 실행 할 수 있다.
도커 image?
이미지는 컨테이너를 구축하기 위한 템플릿으로써 실행할 응용 프로그램에 필요한 코드, 라이브러리, 의존성, 도구 및 기타 파일을 모두 포함하는 변하지않은 파일이다.
이미지로 여러개의 컨테이너를 생성할 수 있으며 템플릿일 뿐이므로 이미지 자체를 시작하거나 실행할 수 없다.
도커 container?
컨테이너는 이미지를 독립된 환경에서 설치한 가상화 된 런타임 환경이다.
컨테이너 내부에서는 컴퓨팅 환경이 이미지환경으로 표준화가 되고 강력한 격리를 제공하여 실행중인 다른 컨테이너의 서버를 방해하지 않도록 한다. 즉 배 안의 컨테이너 처럼 각각의 컨테이너 박스에 분리된 서버와 실행파일이 만들어져 있는 것이라고 생각하면 되겠다.
Dockerfile
Docker 이미지를 생성하는 파일
사용
구현환경
* Window CLI(Command line interface)에서 도커를 사용해볼 것이다.
쉽고 직관적인 방법인 Docker desktop도 있으니 사용해보길 권장한다.
설치
https://docs.docker.com/get-docker/
여기서 해당 파일 설치
설치가 잘 되었는지 확인
cmd에 docker를 작성하기
docker를 작성후 enter를 누르면 도움말이 뜨면 잘 설치된 것이다.
이미지 생성
1. 이미지 생성 or 등록
이미지 새로 생성하기 : 이미지를 생성하는 것은 앞서 말했듯 dockerfile로 생성 할 수 있는데 (이건 나중에 정리하기)
지금은 속성으로 이미 등록되어 있는 이미지를 사용해 볼 것이다.
docker hub 접속
Docker Hub
hub.docker.com
httpd(아파치 서버) 검색후 클릭
httpd는 공인 이미지로써 신뢰할 수 있는 이미지이다.
docker pull httpd 명령어를 사용하면 아파치 이미지를 다운 받을 수 있다고 명시되어있다.
이제 cmd 창을 켜고 일단 docker images 라는 명령어를 입력하자.
docker images
현재 이미지가 무엇이 있는지 확인할 수 있는 명령어이다.
이렇게 텅 비어져있을 것이다.
이제 아파치 서버의 이미지를 가져올 수 있는 명령어를 입력해보자.
docker pull httpd
그러고는 다시 docker images 명령어를 입력하면
이렇게 httpd image가 생성됨을 볼 수 있다.
컨테이너 생성
docker ps -a
docker ps -a 를 입력하면 해당 컨테이너들의 목록을 확인 할 수 있다.
(docker ps 입력시 running 중인 컨테이너만 보인다)
이렇게 아무 컨테이너도 없는것을 확인 할 수 있다.
이제 아까 만든 httpd의 이미지의 컨테이너를 만들어보자
docker run --name example httpd
docker nun은 컨테이너를 만드는 명령어이다. --name 태그를 붙이면 이름을 설정 할 수 있는데 위와 같은 경우는 example을 이름으로 하는 httpd 이미지의 컨테이너를 만들라는 명령어이다.
새 cmd를 열고 컨테이너 목록을 확인하면
컨테이너가 잘 생성이 됐음을 확인 할 수 있다.
docker stop example
포트 포워딩
컨테이너와 포트를 연결해주어 서버가 잘 작동하는지 확인해볼 것이다.
포트 연결은 -p 바꿀 포트: 호스트 포트 옵션을 사용한다.
docker run --name webserver -p 8000:80 httpd
즉, 위의 명령어는 httpd의 이미지의 컨테이너를 만들고 실행하라는 명령어(docker run)와
이름은 webserver이고(--name webserver), 포트요청이 8000번으로 들어오면 80번으로 연결시켜 포워딩 시키라는 말이다.(-p 8000:80)
80번으로 연결시키는 이유는 host가 80번이기 때문이다.
docker ps
docker ps를 통해 확인해보면
PORTS 부분이 추가됨을 알 수 있다.
또한 http://localhost:8000/ 로컬호스트에서 포워딩이 잘 실행됨을 확인 할 수 있다.
도커 컨테이너 안으로의 접근
이제 webserver안의 내용 it works! 를 수정해볼 것이다.
수정을 하려면 컨테이너에 접근을 해야한다.
docker exec -it webserver /bin/sh
위의 명령어는 터미널에서 컨테이너와 연결하여 명령어를 입력하고 수정 할 수 있게 한다.
입력하면 입력창이 #으로 변함을 알 수있다. 이제 webserver 컨테이너로 안으로 들어왔다.
컨테이너 런타임 환경은 리눅스 이므로 pwd나 ls -al과 같은 명령어들이 잘 적용됨을 알 수 있다.
아파치 서버는 /usr/local/apache2/htdocs 안에 index.html이라는 정적파일이 존재한다. 그 안으로 들어가서 index.html을 변경해 볼 것이다.
리눅스 명령어를 통해 index.html에 있는 위치까지 접근하였다.
vi 에디터를 설치하고 index.html을 변경해볼 것이다.
apt-get update
apt-get install vim
두 명령어를 입력하여 vim을 설치 한 후
vi index.html
위 명령어를 누르면 이러한 화면이 보인다.
i를 눌러 it works! hello docker!를 입력후 esc + :wq!를 작성하여 빠져나온다.
그리고 cat index.html으로 파일이 변경되었는지 확인해본다.
잘 반영됨을 확인 할 수 있다.
또한 http://localhost:8000/ 에서도 반영되었음을 확인 할 수 있다.
exit을 누르면 컨테이너를 빠져나올 수 있다.
* 보통 이러한 방법이 권장되진 않는다.
컨테이너의 생명 주기가 짧을 뿐더러, 컨테이너를 수정한다해도 본 이미지에 변경사항이 저장되지 않기 때문이다. 하지만 배우는 단계이니 작성을 해 보았다.
파일시스템과 도커 연결
위의 문제점을 해결 할 수 있는 방법중 하나가 볼륨을 이용하는 것이다. (다른하나는 바인드 마운트 이용하는것)
로컬의 파일 시스템과 도커를 연결하면 컨테이너의 수정사항이 로컬에 저장된다.
일단 로컬에 docker-test라는 폴더를 만들어준다. 그리고 index.html을 만들고 내용은 아래와 같다.
<html>
<body>
Hello, Docker! I connect with window file system
</body>
</html>
그리고 cmd에서 아래 명령어를 작성해준다.
docker run -p 8888:80 -v C:\dsy\Workspace\docker-test:/usr/local/apache2/htdocs/ httpd
docker run : 도커의 컨테이너를 생성하기
-p : 8888 포트가 들어오면 80번 포트로 바인딩 해주기
-v : C:\dsy\Workspace\docker-test이 경로와 아까 컨테이너 안으로 접속했던 /usr/local/apache2/htdocs/이 경로로 바인딩 해주기
httpd : 만들 image 이름
이런 명령어이다. 이제 http://localhost:8888/index.html 으로 접속하면
바인딩이 잘 됐음을 확인 할 수 있다.
Reference
https://phoenixnap.com/kb/docker-image-vs-container
Docker Image VS Container: What is the difference?
This tutorial helps you understand the difference between a Docker image and a container. Master basic Docker terminology with this comprehensive article.
phoenixnap.com
'개발 > 기타' 카테고리의 다른 글
UX/UI의 10가지 심리학 법칙을 읽고 (0) | 2022.08.17 |
---|---|
REST API 개념, 특징, 및 설계 규칙 (1) | 2022.02.21 |
쿠키(Cookie), 세션(Session)의 정의, 차이점 (0) | 2022.01.20 |