권장대상
docker라는 대상 자체가 뭔지 모르겠다.
docker를 사용해야하는데 어떻게 시작해야할지 감도 안잡히는 사람
미토콘드리아도 이해하는 Docker : https://www.youtube.com/watch?v=e0koWWAmXSk
우리는 Docker를 왜 사용할까요?
→ 우리는 처음 입사하면, 프로젝트 개발을 위해 환경 구축을 시작합니다.
그리고 보통 최신 버전으로 필요한 환경들을 하나둘 설치하다보면,
결국 버전이 안맞아서 이슈가 생기기 마련입니다.
docker는 이런 상황을 효과적으로 줄여줍니다.
지정된 서드파티와 라이브러리를 통째로 이미지화 시켜서 공유할수있습니다.
또한 보통의 경우라면 하드웨어의 자원이 부족한편입니다.
모든 테스트와 빌드의 환경을 충족시키기위해 하드웨어를 무한하게 늘릴수없습니다. (물론 돈많으면…)
고로 있는 자원을 쪼개서 효율적으로 사용해야합니다.
꼭 자원을 쪼개기 위해서 Docker를 사용하는건 아니지만,
그렇다고 Docker가 항상 정답은 아닙니다. 자원관리를 위한 솔루션은 여러가지가있습니다.
- 각각 다른점을 비유적인 상황으로 이해해봅시다.

- 가상머신(virtual machine)
상당히 넓은 개념이지만,
여기서 사용하는 가상머신은 호스트 가상화인 VMware, Virtual Box를 기준으로 하겠습니다.
공인중개사 유인원씨가 제시한 솔루션에서는 각 방이 인스턴스가 됩니다.
각 방마다 냉난방, 조명, 인테리어등을 제어할수있고, 집이라는 공간 위에서 서로 간섭하지 않습니다.
인스턴스에 윈도우부터 우분투등등 다양한 OS를 올릴수있습니다.
하지만 절대적인 면적 자체(리소스)가 어느정도 보장되어있어야 방을 나누는게 가능하고,
무엇보다도 현실에서는 신경쓰지 않는 부분이지만,
방을 구분하는 벽의 두께만큼 절대적인 면적에서 사용할수없게됩니다.

- Docker
유인원씨의 솔루션에서 가구나 파티션으로 공간을 나누는게 컨테이너가 됩니다.
언제든 가구의 배치를 바꾸는게 간편하지만,
조명도 난방도 완전히 독립적이지 않습니다.
여름에 사무실 중앙 에어컨이 고장나면, 다같이 후덥지근한 공간에서 일할수밖에 없습니다.
그리고 host OS와 다른 OS로 올릴수도없습니다.
host OS가 우분투일때 윈도우 OS를 올릴수없습니다.
이렇게 보면 단점밖에 없는데 왜 Docker를 많이 사용할까요?
이유는 MSA(Microservice)와 밀접한 관련이 있습니다.
애플리케이션 개발의 최근 대세는 모놀로식에서 마이크로서비스로 빠르게 변화해갔습니다.
유닛은 점점 나눠지고 하나의 크기가 작아졌기 때문에 환경과 기능을 모두 유지한상태로 배포하는게 가능해졌습니다. '제컴에서는 되는데요?' 혹은 ‘제 컴에서는 안되는데요’를 방지할수 있게됩니다.
그래서 서비스회사가 아니라면 사실 꽤나 낯선 엔진일수있습니다.
특히 제조같은경우는 모놀로식을
같은 사무실이라도, 회의실같은 공간분리가 확실히 필요한 공간이 필요하다면 벽을 세울수밖에 없습니다.

- (public)Cloud
여기서 만약 public이 아니고 private로 구성하게 된다면,
내가 건물에 거주하며 직접 관리하게 됩니다.
당연히 관리하기 위한 전문적인 기술이 필요하며,
기술이 없다면 자체적으로 고용을 해야하거나 외주를 맡겨야합니다.
보통 외주를 맡겨야하는 상황이라면, 처음부터 관리 솔루션까지 포함되어있는 public을 선택하게 됩니다.
이때 public이라고 지칭되는게 AWS, Azure 등등이 있고,
private cloud에 Openstack 등이 있습니다.
Docker의 주요 요소
- Container
애플리케이션을 실행할수있는 독립된 가상환경을 구현하기 위한 프로세스입니다.
- image
컨테이너의 바탕이 되는 파일 시스템. ISO 파일과 비슷하다고 생각하면됩니다.
- dockerfile
image를 생성하기위한 스크립트이다. 이미지가 어떤 구성과 설정이 되어있는지 알수있습니다.
선언형 언어를 통해 멱등성(idempotent)을 보장하기 위한 방법입니다.
docker의 단점은 앞서서 말했지만, host OS의 의존성이 강합니다.
그러다보니 image를 export나 도커 허브에 올린다고해도
어떤 환경에서나 똑같이 작동한다는 보장이 없습니다.
유인원씨는 차은우씨와 나이도 키도 몸무게도 같습니다.
그렇다고 차은우씨가 딱 맞춰 입었던 옷을 입는다고 똑같은 핏이 나올지는 미지수입니다.
물론, 운이 좋다면 딱 맞을 수 있지만, 보통은 수선해야 합니다.
유인원씨는 차은우씨와 똑같은 옷을 입고싶기 때문에, 똑같은 가게에 가서 옷의 원단과 바느질방식을 등등의 정보(dockerfile)를 바탕으로 유인원의 사이즈에 맞게 다시 만듭니다(build) 이렇게 만들어진 옷을 입으면(run) 차은우씨가 입었던 옷을 유인원씨에게 딱 맞게 입게 되었습니다.
- docker hub
Docker Hub는 사용자가 Docker 컨테이너 이미지를 저장, 공유 및 관리할 수 있는 클라우드 기반 레지스트리 서비스입니다. 개발자와 IT 전문가가 미리 빌드된 Docker 이미지에 액세스하고 협업할 수 있는 중앙 리포지토리 역할을 하므로 Docker 환경에서 애플리케이션을 더 쉽게 빌드, 배포 및 실행할 수 있습니다.
docker hub의 오피셜 이미지를 확인하면 OS를 돌리기위한 최소한의 것들로만 구성되어있습니다.
기본적인 모듈도 어떤 환경에서 돌리냐에따라 의존성이 달라지기때문에 docker hub의 오피셜 이미지를 처음에 겪게되면 이렇게까지 포함되지않은 패키지가 많다고 느껴질겁니다.
단적인 예로 ubuntu 오피셜 이미지에서는 sudo 명령어 조차 처음에는 사용할 수 없습니다.
Docker의 보편적의 프로세스
dockerfile(Makefile) → build(make) = image(a.out)
image(a.out) → run(./) = container(service)
image를 run해서 나온 container가 최종적으로 우리가 실제로 사용할 수 있는 환경이 됩니다.
dockerfile에서 발생하는 건 image인거지 컨테이너가 아니기 때문입니다.
Docker의 주요 명령어
- Docker의 상태 확인하기
docker -v
//docker가 설치되어 있는지 확인(작동 여부X)
docker ps
//실행중인 컨테이너 확인. 실행중이지 않으면 컨테이너가 있어도 표시되지않음
docker ps -a
//모든(실행중이지 않은것도 포함) 컨테이너 확인
- Docker container 상태 제어
docker start <CONTAINER NAME>|<CONTAINER ID>
// STATUS가 Exited 상태인 컨테이너를 Up함
// 만약, UP이 안된다면 이미지 자체의 문제일 가능성이 높음
docker stop <CONTAINER NAME>|<CONTAINER ID>
// STATUS가 Up상태인 컨테이너를 종료시킴
- container 접속
docker exec -it <CONTAINER ID>|<NAMES> <SHELL PATH>
// ex) docker exec -it atom /bin/bash
// 보통 <SHELL PATH>는 bash 사용.
컨테이너에 attach하는 명령어 --user root 옵션 추가시 root 계정으로 접속할수있습니다.
login이 아니고 attach이기 때문에 외부에서 ssh login 실패 시 해당 도커 서버에서 attach 이후 ssh 상태를 확인해야합니다.
<CONTAINER ID>||<NAMES> 중 <CONTAINER ID>는 구분만된다면 생략해서 사용할수있습니다.
지금 상태에서는 하나의 컨테이너만 실행되고있기때문에
CONTAINER ID중 첫글자만 써도 정상적으로 attach가 잘 되어있습니다.
만약 두개의 컨테이너가 실행중이고 첫글자가 같다면,
ab까지만 써도 attach 할수있습니다.
첫글자가 모두 다르다면 물론 a만 사용해도됩니다.
컨테이너는 프로세스이기 때문에 사실 exec는 “login”,”접속”이라는 개념보다는 “attach” 입니다.
인터넷 브라우저에 여러가지 탭(컨테이너)을 띄워놓고 필요한 탭(컨테이너)를 클릭해서 보는것과 비슷합니다.
그래서 아래와같이 ssh 로그인시 나오는 화면이 안나오고 접속된건지 안된건지 처음에는 조금 헷갈릴수있습니다.
보통은 하이라이트 해놓은것처럼 <계정>@<CONTAINER ID>로 구분합니다.
docker image ls
//server에 존재하는 image 목록
docker run -itd <IMAGE>
//<IMAGE>를 사용한 컨테이너 생성
//ex) docker run -itd --name test_name -p 10005:22 project:1.0
//기존에 저장되어있던 20.04 태그의 ubuntu image를 사용해서 컨테이너를 생성한다.
docker rename <CONATINER> <NEW_NAME>
//기존에 올라와있는 컨테이너의 이름을 수정할수있습니다.
'computer science' 카테고리의 다른 글
DevOps를 지망하는 사람들을 위한 안내서 (1) | 2024.01.05 |
---|---|
[SSO] 회원가입 그만하고싶어! (0) | 2023.05.25 |
[보안] 와이파이는 되는데, 테더링이 안된다고? (0) | 2023.05.02 |
NET::ERR_CERT_INVALID ERROR (0) | 2022.12.15 |
[정보처리기사] 디자인 패턴 (0) | 2022.10.12 |