[69일차]Docker

유태형·2022년 8월 4일
0

코드스테이츠

목록 보기
69/77

오늘의 목표

  1. Docker
  2. 컨테이너 실행
  3. 이미지로 만들기
  4. docker-compose



내용

Docker

Docker 사용 이유

수십억대의 컴퓨터(클라이언트, 서버 각각)들은 의도적으로 같은 환경을 구성할 수는 있겠지만 그러기 매우 힘듭니다. 따라서 다른 실행 환경이라도 실행 환경의 영향을 받지 않고 같은 결과를 내기 위해선 외부와 격리 시키는 것이 중요합니다.

예를 들어 SQL 버전 7을 쓰는 시스템과 버전 8을 쓰는 시스템은 실행 환경이 달라서 이전의 방법으로 결과가 달라질 수도 있습니다.



컨테이너

컴퓨터 마다 같은 실행 환경을 갖추기 어려우므로 내부의 일정한 공간을 격리시켜 그곳을 개발자가 원하는 공간으로 만드는 것이 컨테이너입니다. 북극이든, 사막이든, 한국이든 환경이 달라지더라도 화물 컨테이너의 내부는 동일하듯이 어느 실행환경에서도 도커는 컨테이너 내부의 환경을 일치시킵니다.

컨테이너를 외부로부터 격리 시켜 개발자가 원하는 환경으로 만들기 위해서는 3가지의 리소스를 외부로 부터 격리시켜야 합니다.

  • 프로세스 : 컨테이너에서 동작중이 프로세스는 컨테이너 내부에서만 사용가능하며 외부에서는 접근이 불가능합니다. 또한 컨테이너 내부에서 동작 중인 프로세스는 외부의 프로세스에 영향을 주지 못합니다.
  • 네트워크 : 컨테이너는 제 각각의 IP주소가 할당됩니다.
  • 파일 시스템 : 컨테이너 안에서 사용되는 파일 시스템은 명령이나 파일 등의 엑세스를 제한할 수 있습니다.


이미지

애플리케이션을 컨테이너에서 바로 실행할 수 있도록 저장해둔 데이터입니다. 이미지는 클래스 컨테이너는 객체라 생각하시면 편합니다. 이미지는 또한 수평적으로 확장하기 매우 유리한데 클라우드 컴퓨팅과 같은 다수의 인스턴스가 사용량에 따라 자동으로 늘어 났다가 줄어들때 특히 유리할 수 있습니다. 이미지 파일을 가지고 단순히 다수의 컨테이너를 만들어 실행하면 같은 웹 서버를 무한정 만들 수 있으니까요.

이미지는 깃헙(github)처럼 원격 저장소에 저장할 수도 있고, 추가/커밋 해서 새로운 이미지를 생성하거나 변경사항을 수정할 수도 있습니다.



레지스트리

이미지는 레지스트리에 저장됩니다. 즉 레지스트리는 이미지의 저장소라고 볼 수 있겠습니다. 대표적인 이미지 레지스트리로는 DockerHub, ECS, 로컬레지스트리등이 존재합니다. 이미지를 활용해 컨테이너를 생성할 때 로컬에 이미지가 존재하지 않다면 원격 레지스트리에서 다운로드 받습니다.




컨테이너 실행

원격 레지스트리 로부터 이미지를 다운로드 받아 이미지로 컨테이너를 생성하여 실행할 수 있습니다.

이때 원격 레지스트리의 이미지를 나타내는 포맷은 레지스트리/이미지:태그:태그latest 태그로 생략이 가능합니다.

docker image pull 레지스트리/이미지:태그

해당하는 이미지를 다운로드합니다.

docker image ls

로컬 레지스트리에 존재하고 있는 이미지 목록을 출력합니다.

docker continaer run --name 컨테이너_이름 레지스트리/이미지:태그 cowsay 파라미터

로컬 레지스트리의 해당 이미지를 가지고 컨테이너를 생성하고 실행합니다. --name은 컨테이너 이름을 지정하는 옵션, cowsay는 변수와 같은 명령어입니다. 파라미터를 지정하여 값을 입력할 수 도 있습니다.

docker container ps -a

컨테이너의 목록을 출력합니다. -a옵션은 현재 실행중이지 않는 컨테이너들도 포함합니다.

docker container rm 컨테이너_이름

로컬에 존재하는 컨테이너를 삭제합니다. 이름 또는 컨테이너_ID로 삭제할 컨테이너를 지정할 수도 있습니다.

docker image rm 레지스트리/이미지

로컬에 존재하는 이미지를 지정하여 삭제합니다. 이때 해당 이미지를 적재중인 컨테이너가 있으면 삭제가 되지 않습니다. 해당 이미지를 적재중인 컨테이너를 삭제하거나, -f옵션으로 강제로 삭제할 수도 있습니다.

docker container run --name 컨테이너_이름 --rm 레지스트리/이미지 cowsay 파라미터

원격 레지스트리에서 이미지를 다운로드합니다.(로컬에 존재할시 x), 이미지로 컨테이너를 생성하여 실행합니다.실행후 해당 컨테이너를 삭제합니다. --rm 옵션으로 실행하자마자 해당 컨테이너를 삭제하여 일회용으로 컨테이너를 실행할 수 있습니다.

  • -it옵션은 사용자와 컨테이너간의 상호작용(interaction)이 필요할 경우 옵션을 추가하여 사용자가 조작할 수 있도록 합니다.



이미지로 만들기

이미지로 컨테이너를 만들어 실행할 수도 있지만 반대로 실행중인 컨테이너를 이미지로 만들어 저장할 수도 있습니다. 컨테이너 -> 이미지 도 가능하고 이미지 -> 컨테이너도 가능합니다.



httpd

Docker 이미지를 httpd로 생성합니다. httpd는 오픈소스 웹 서버 소프트웨어 입니다.

docker container run --name 컨테이너_이름 -p 로컬_포트:컨테이너_포트 httpd

docker continaer run --name 컨테이너_이름 레지스트리/이미지:태그와는 조금 다른거 보이시나요?
이미지를 이용하여 컨테이너를 만들지 않고 httpd를 가지고 컨테이너를 만들고 있습니다. 이미지를 사용하지 않고 컨테이너를 만들었습니다.
-p옵션은 로컬의 포트와 컨테이너의 포트를 매핑해주는 역할을 수행합니다. 예를들어 -p 818:80이었다면 컨테이너를 실행 후 localhost:818로 접속하면 80번 포트로 컨터이너로 이어 접속합니다.

httpd로 빈 웹서버를 가지는 컨테이너를 생성하였으니 빈 웹서버에 내용물을 추가합니다.

docker container cp 로컬_경로 컨테이너_이름:/컨테이너_경로

docker container cp 명령어는 2개의 인자를 입력받습니다. 로컬경로에 존재하는 파일과 폴더들을 복사하여 `컨테이너이름`에 해당하는 컨테이너의 컨테이너_경로에 복사합니다.

이제 빈 웹서버에 내용을 추가하였으니 이미지로 만들기 위한 명령입니다.

docker container commit 컨테이너_이름 이미지_이름

컨테이너를 이미지로 만들어 로컬 레지스트리에 저장합니다.

httpd로 빈 웹서버 컨테이너를 만들고 -> docker container cp로 빈 웹서버에 내용을 추가하고 -> docker container commit으로 컨테이너를 이미지로 저장하였습니다.



Dockerfile

일일이 CLI에 명령어를 입력하지 않고 스크립트처럼 명령어 묶음인 Dockerfile을 만들어 이미지를 생성할 수도 있습니다.

FROM httpd:2.4
COPY 로컬_경로 컨테이너_경로
...

Dockerfile은 httpd를 명시하여 빈 웹서버 컨테이너를 생성하고 COPY로 로컬에 있는 파일,폴더들을 컨테이너로 복사합니다.

docker build --tag 이미지:태그 Dockerfile_경로

docker build명령어는 Dockerfile을 가지고 이미지를 생성합니다. --tag이미지:태그형식으로 이미지를 생성할 수 있습니다.




docker-compose

만들고 연결해야할 컨테이너가 한두개가 아니라 많이 있을 때는 일일이 모두 명령어로 입력하기 힘들 것 입니다.
docker-compose는 여러 컨테이너를 생성하고 묶어주는 역할을 수행합니다.(묶음,모듬,set)

docker-compose.yamldocker-compose에서 관리되는 동일한 docker network에서 구동됩니다. 즉 docker-compose내 container 기리는 network로 연결이 됩니다.

docker-composeyaml확장자로 일정한 형식으로 작성합니다.

version: '버전'

services:
	로컬_이미지1:
    	image: 원격_레지스트리/이미지1
        restart: 'always'
        ports:
        	- "로컬_포트:컨테이너_포트"
        container_name: 컨테이너_이름1
        
    로컬_이미지2:
    	image: 원격_레지스트리/이미지2
        restart: 'always'
        ports:
        	- "로컬_포트:컨테이너_포트"
        container_name: 컨테이너_이름2
    
    ...

docker-compose.yaml은 위의 형식으로 여러 컨테이너를 묶어 네트워크를 형성하고 생성, 실행할 수도 있습니다.

docker-compose up

현재 로컬 디렉토리에 존재하는 docker-compose.yaml을 실행합니다.(주의! docker-compose.yaml이 존재하는 디렉터리에서 명렁어를 실행해야 합니다.)

  • -d옵션을 추가하여 백그라운드에서 실행할 수도 있습니다.
docker-compose down

docker-compose.yaml에 정의된 컨테이너들을 종료합니다.

docker-compoase up {특정_이미지,...}

특정 이미지들만 골라서 컨테이너로 실행할 수도 있습니다.




후기

GitHub이 서비스를 공유하였다면, Docker는 서비스를 구동할 환경을 공유하므로 협업을 고려한다면 중요한 요소 중 하나라고 생각합니다. 처음엔 이해가 잘 가지 않았지만 정리를 하며 다시 볼 때 비로소 이해가 가서 다행인것 같습니다.




GitHub

없음!

profile
오늘도 내일도 화이팅!

0개의 댓글