리눅스와 달리 윈도우나 맥에서 도커를 돌릴경우 가상머신을 통해 도커가 돌아간다고 봤는데요
Dockerfile, docker-compose를 통해 php, nginx, mysql 세팅하는 예제를 우분투, 맥에서 각각 시도해봤습니다
참고한 링크
https://www.digitalocean.com/community/tutorials/how-to-install-and-set-up-laravel-with-docker-compose-on-ubuntu-22-04
의문이 생긴점은 우분투를 기준으로 만들어진 도커세팅이 맥에서동작이 된다는게 이해가 가지 않았습니다. Dockerfile에는 apt등 우분투용 명령어를 사용하니까요
예상대로 우분투에서는 현재 운영체제위에서 위 3가지로 컨테이너가 만들어지고 웹어플리케이션이 동작하는걸 확인했는데,
맥에서는 linuxkit이라는 운영체제에서 위 3가지로 컨테이너가 만들어지고 웹어플리케이션이 동작하고 있습니다.
질문
1. 운영환경을 우분투 22를 쓰고 맥에서 개발환경 또한 우분투22를 쓰고싶습니다. 정확히 말하면 운영환경과 개발환경의 os를 맞추고 싶습니다. 맥에서의 linuxkit을 우분투22로 바꿀수 있을까요?
2. 맥에서 운영환경과 동일한 os를 사용하는 일반적인 방법을 알고 싶습니다. 도커에서 우분투22 컨테이너를 추가하고 위 3가지 컨테이너를 추가하는것도 생각해봤는데, 그렇다면 운영환경인 우분투22에서는 구지 우분투22 컨테이너를 만들고 위 3가지 컨테이너를 만들게 된다는건데 이게 일반적인 방법인지 의문이 듭니다
3. 맥에서 만든 컨테이너중 nginx컨테이너, php컨테이너에 각각 docker exec it <containerid> sh를 통해 접속한 후 명령어들을 쳐봤는데 운영체제는 같은 linuxkit을 사용하고 있으나 php컨테이너에는 bash, apt등 명령어가 존재하는데 nginx 컨테이너에서는 존재하지 않고 있습니다. 같은 linuxkit을 사용하고 있다고 이해하고있는데 제가 뭔가 잘못 이해한걸까요?
제가 뭔가 크게 잘못 이해하고 있는걸까요? 많이 검색했는데 비슷한 내용이 전혀 나오질 않고 있어서요. 질문이 길어서 죄송합니다.
Dockerfile, docker-compose를 통해 php, nginx, mysql 세팅하는 예제를 우분투, 맥에서 각각 시도해봤습니다
참고한 링크
https://www.digitalocean.com/community/tutorials/how-to-install-and-set-up-laravel-with-docker-compose-on-ubuntu-22-04
의문이 생긴점은 우분투를 기준으로 만들어진 도커세팅이 맥에서동작이 된다는게 이해가 가지 않았습니다. Dockerfile에는 apt등 우분투용 명령어를 사용하니까요
예상대로 우분투에서는 현재 운영체제위에서 위 3가지로 컨테이너가 만들어지고 웹어플리케이션이 동작하는걸 확인했는데,
맥에서는 linuxkit이라는 운영체제에서 위 3가지로 컨테이너가 만들어지고 웹어플리케이션이 동작하고 있습니다.
질문
1. 운영환경을 우분투 22를 쓰고 맥에서 개발환경 또한 우분투22를 쓰고싶습니다. 정확히 말하면 운영환경과 개발환경의 os를 맞추고 싶습니다. 맥에서의 linuxkit을 우분투22로 바꿀수 있을까요?
2. 맥에서 운영환경과 동일한 os를 사용하는 일반적인 방법을 알고 싶습니다. 도커에서 우분투22 컨테이너를 추가하고 위 3가지 컨테이너를 추가하는것도 생각해봤는데, 그렇다면 운영환경인 우분투22에서는 구지 우분투22 컨테이너를 만들고 위 3가지 컨테이너를 만들게 된다는건데 이게 일반적인 방법인지 의문이 듭니다
3. 맥에서 만든 컨테이너중 nginx컨테이너, php컨테이너에 각각 docker exec it <containerid> sh를 통해 접속한 후 명령어들을 쳐봤는데 운영체제는 같은 linuxkit을 사용하고 있으나 php컨테이너에는 bash, apt등 명령어가 존재하는데 nginx 컨테이너에서는 존재하지 않고 있습니다. 같은 linuxkit을 사용하고 있다고 이해하고있는데 제가 뭔가 잘못 이해한걸까요?
제가 뭔가 크게 잘못 이해하고 있는걸까요? 많이 검색했는데 비슷한 내용이 전혀 나오질 않고 있어서요. 질문이 길어서 죄송합니다.
한가지 빼먹었네요 nginx는 alpine 리눅스 위에 빌드된 이미지라고 하는데 docker exec로 접속해서 확인하면 linuxkit이라 나옵니다
개념 혼동부터 바로 잡아야 합니다.
LinuxKit: A toolkit for building custom minimal, immutable Linux distributions. (
https://github.com/linuxkit/linuxkit)
즉, 운영체제도 아니고 리눅스도 아니고 리눅스 배포판도 아님.
우분투22: 리눅스 배포판의 하나
리눅스 배포판: 리눅스 커널 위에다가 패키지 매니저나 기설치된 애플리케이션 등등을 짬뽕시킨 것
1. "운영환경에 우분투22를 쓰고 싶다": base image가 우분투22 인 nginx image를 쓰면 됨. container가 아닌 container host가 우분투22이길 원하는 것이라면 그 전에 왜 container host가 특정 리눅스 배포판이길 원하는 지 반대로 묻고싶음 "개발환경 또한 우분투22를 쓰고싶습니다." -> 여기서 얘기하는 "개발환경"이 무엇인지 더 설명이 필요함. "맥에서의 linuxkit을 우분투22로 바꿀수 있을까요?" -> 위에서 개념 바로잡기에서 알 수 있 듯 어불성설임
2. "도커에서 우분투22 컨테이너를 추가하고 위 3가지 컨테이너를 추가하는것도 생각해봤는데" 이 말이 이해가 안되는데 저 문장 앞에서 말하는 "우분투22 컨테이너"랑 "위 3가지 컨테이너"는 뭐가 다른거죠?
3. (앞에서 말했듯이 linuxkit은 운영체제가 아닙니다. 같은 container host를 쓰고 있다는 말로 이해하겠습니다.) 같은 container host 라는 것은 리눅스 커널을 공유하는 것 외에는 컨테이너 간에 공유하는 것은 없습니다. 왜 nginx 컨테이너에는 bash, apt가 없는데 php 컨테이너에는 없는가? nginx 컨테이너는 base image가 alpine인데 php 컨테이너는 base image가 debian이라 그렇습니다.
위의 digitalocean 웹페이지에 나온 대로라면
nginx 컨테이너의 이미지는 "nginx:1.17-alpine". 이름 보면 alpine.
php 컨테이너의 이미지는 "php:7.4-fpm".
https://github.com/docker-library/php/blob/e4509d18e3cddd03e796dd6fd4fef88070ee5132/7.4/bullseye/fpm/Dockerfile
를 보면 debian이 base image인 것을 확인 가능
답변 감사합니다 제가 개념에 혼동이 있어 질문 자체에 문제가 좀 있어보이네요 먼저 답변주신것들에 대해 얘기하면 1. continer host가 도커를 실행하는 호스트 환경을 말씀하신게 맞나요? 그렇게 이해하고 답변드리면 container host가 반드시 우분투22거나 특정 리눅스 배포판일 필요는 없습니다. 제가 이전에 잘못 이해한 개념은
뒷 문장 짤린듯하네요
php 컨테이너, nginx 컨테이너등이 동작하기 위해서는 특정 운영체제가 필요하다고 생각했고, 호스트 운영체제 위에서 앞의 컨테이너들이 동작한다고 이해를 했습니다. 그래서 운영환경과 개발환경의 호스트 운영체제를 같은것으로 맞춰야 된다고 생각을 잘못했네요
넹 지금 이어서 작성중입니다
"개발환경 또한 우분투22를 쓰고싶습니다." -> 여기서 얘기하는 "개발환경"이 무엇인지 더 설명이 필요함. -> 여기서 개발환경은 제가 개발하는 pc의 운영체제를 말한것인데 답변주신 내용으로 의문이 풀렸습니다. 개념 혼동으로 인한 잘못된 질문이네요
"맥에서의 linuxkit을 우분투22로 바꿀수 있을까요?" -> 위에서 개념 바로잡기에서 알 수 있 듯 어불성설임 -> 이것 또한 개념 혼동으로 인한 잘못된 질문이 맞습니다
2. "도커에서 우분투22 컨테이너를 추가하고 위 3가지 컨테이너를 추가하는것도 생각해봤는데" 이 말이 이해가 안되는데 저 문장 앞에서 말하는 "우분투22 컨테이너"랑 "위 3가지 컨테이너"는 뭐가 다른거죠? -> php, nginx, mysql 3개의 컨테이너가 우분투22 컨테이너, 즉 운영체제가 있는 컨테이너가 있어야 동작할 수 있다고 잘못 이해를 해서 나온 질문입니다.
3. (앞에서 말했듯이 linuxkit은 운영체제가 아닙니다. 같은 container host를 쓰고 있다는 말로 이해하겠습니다.) 같은 container host 라는 것은 리눅스 커널을 공유하는 것 외에는 컨테이너 간에 공유하는 것은 없습니다. 왜 nginx 컨테이너에는 bash, apt가 없는데 php 컨테이너에는 없는가? nginx 컨테이너는 base image가 alpine인데 php 컨테이너는 base image가 debian이라 그렇습니다. -> base image에 리눅스 배포판이 포함되있다는 개념을 몰라서 발생한 잘못된 질문입니다.
위의 digitalocean 웹페이지에 나온 대로라면
nginx 컨테이너의 이미지는 "nginx:1.17-alpine". 이름 보면 alpine.
php 컨테이너의 이미지는 "php:7.4-fpm".
https://github.com/docker-library/php/blob/e4509d18e3cddd03e796dd6fd4fef88070ee5132/7.4/bullseye/fpm/Dockerfile
를 보면 debian이 base image인 것을 확인 가능
-> github 링크 보내주신 것과 답변 내용 확인해보고 이제야 이해가 된것같습니다 잘못 이해한 개념하고 다시 이해한 내용 정리 한번 해볼게요
네. 근데 댓글로 쓰면 다른 사람들이 읽기 힘드니 게시글 새로 쓰는걸 추천합니다.
잘못 이해했던 개념 - 컨테이너 호스트에서 php 컨테이너, nginx컨테이너등을 사용할 경우 php와 nginx가 설치될 운영체제가 필요하다 - 그 운영체제는 리눅스는 컨테이너 호스트를 사용하고, 맥이나 윈도우는 LinuxKit을 사용한다 제대로 이해한 개념 - 컨테이너 호스트에서 php 컨테이너, nginx 컨테이너등을 사용할 경우 각각의 컨테이너는 리눅스 배포판을 base image로 사용한다. - 따라서 컨테이너 각각은 base image로 사용된 운영체제 위에서 돌아가는 환경이다. 컨테이너 간에 공유는 불가능하다(bash, apt 명령어가 있는 컨테이너와 없는 컨테이너는 컨테이너별로 사용되는 리눅스 배포판의 차이) 좀 더 있어서 이어서 작성합니다
넹 답변 한번 더 써놓고 글로 다시 써놓을게요 - 최초 목적으로 삼았던 도커로 운영환경과 개발환경을 동일 환경으로 하기 위해, 일치시키려 했던 운영체제는 이미 각각의 컨테이너에서 base image로 사용되는 운영체제로 일치가 됨. 즉, 호스트가 우분투를 사용하든 맥, 윈도우를 사용하든 컨테이너 자체에 있는 운영체제를 사용하므로 호스트 운영체제는 상관이 없다 이렇게 맞을까요 선생님?
"리눅스 배포판을 base image로 사용한다." -> base image가 꼭 알려진 리눅스 배포판에서 일 필요는 없고 "FROM scratch" 처럼 깡통일 수도 있습니다. "컨테이너 각각은 base image로 사용된 운영체제 위에서 돌아가는 환경이다." -> 정확한 표현은 아닌데 일단은 이렇게 이해해도 됩니다. 도커 컨테이너가 어떻게 동작하는지 찾아보는 걸 추천합니다. "컨테이너 간에 공유는 불가능하다" -> 불가능한 것이 아닙니다. "같은 container host"가 보장할 수 있는 것은 "커널 공유" 밖에 없다고 이해하는게 더 정확합니다. 일례로 volume 설정을 주면 특정 디렉토리를 공유할 수 있습니다.
한가지 더 궁금한게 생겼는데요 그렇다면 웹 어플리케이션을 도커 환경으로 만들 경우, 컨테이너를 다음과 같이 애플리케이션, 웹서버, db로 사용하나요? ex) php 컨테이너, nginx 컨테이너, mysql 컨테이너. (셋 다 운영체제를 base image로 사용) base image로 리눅스 배포판이 포함되지 않은 php, nginx등은 없는거겠죠? 정확히 말하면 애초에 그런 이미지를 만들수 없는게 맞는거겠죠? 운영체제 없이 php나 nginx를 설치할수가 없으니까?
"리눅스 배포판을 base image로 사용한다." -> base image가 꼭 알려진 리눅스 배포판에서 일 필요는 없고 "FROM scratch" 처럼 깡통일 수도 있습니다. "컨테이너 각각은 base image로 사용된 운영체제 위에서 돌아가는 환경이다." -> 정확한 표현은 아닌데 일단은 이렇게 이해해도 됩니다. 도커 컨테이너가 어떻게 동작하는지 찾아보는 걸 추천합니다. "컨테이너 간에 공유는 불가능하다" -> 불가능한 것이 아닙니다. "같은 container host"가 보장할 수 있는 것은 "커널 공유" 밖에 없다고 이해하는게 더 정확합니다. 일례로 volume 설정을 주면 특정 디렉토리를 공유할 수 있습니다. -> 방금 질문 하나 더 드렸는데 이 내용이 답변이 되네요.
"호스트가 우분투를 사용하든 맥, 윈도우를 사용하든 컨테이너 자체에 있는 운영체제를 사용하므로 호스트 운영체제는 상관이 없다" 여기서 개념혼동이 조금 보이는 것 같아 첨언 맥, 윈도우는 리눅스가 아닙니다. 근데 container host가 리눅스여야 하기 때문에 리눅스vm을 올리고 그 리눅스vm을 container host로 삼는 것입니다. 맥, 윈도우가 container host가 될 수는 없습니다. (* Linux docker host 한정) container host가 어떤 리눅스 배포판을 사용하는지와 container가 어떤 리눅스 배포판을 base로 삼는지는 관련 없다라고 하는게 더 정확한 표현일 듯 합니다.
base image가 리눅스 배포판이든, scratch든 컨테이너 내에서 애플리케이션이 동작하는 운영체제가 필요한 것이 맞는것으로 이해가 됐습니다. 그리고 말씀하신대로 도커 컨테이너 동작하는 방식을 좀 더 자세히 봐야겠습니다. 질문드린 내용과 답변으로 이해한 내용들 정리해서 글로 남기려고 했는데 좀 더 정확히 이해한 다음에 글로 남기는게 좋을 것 같네요
"호스트가 우분투를 사용하든 맥, 윈도우를 사용하든 컨테이너 자체에 있는 운영체제를 사용하므로 호스트 운영체제는 상관이 없다" 여기서 개념혼동이 조금 보이는 것 같아 첨언 맥, 윈도우는 리눅스가 아닙니다. 근데 container host가 리눅스여야 하기 때문에 리눅스vm을 올리고 그 리눅스vm을 container host로 삼는 것입니다. 맥, 윈도우가 container host가 될 수는 없습니다. (* Linux docker host 한정) container host가 어떤 리눅스 배포판을 사용하는지와 container가 어떤 리눅스 배포판을 base로 삼는지는 관련 없다라고 하는게 더 정확한 표현일 듯 합니다. -> container host 용어를 도커를 실행하는 개인 pc라고 잘못 생각했는데
이 부분 답변 듣고 정확히 이해했습니다. 도커는 리눅스 기반으로 돌아가고, 맥이나 윈도우는 리눅스 vm을 통해 도커를 사용할수 있으므로 지금 제 환경(맥)에서는 리눅스 vm이 container host가 되겠네요.
덕분에 혼동하고 있던 개념 정확히 잡아갑니다. 도커 메뉴얼 다시 처음부터 보면서 확실히 익혀야겠네요. 친절하고 자세하고 정확한 답변 너무 너무 감사합니다. 사랑합니다
+
사실 저도 컨테이너 기술을 빠삭하게 아는게 아니라 틀린 내용 있으면 교정 감사하게 받겠습니다. (_ _)
docker는 linux 커널의 기능인 cgroup이랑 namespace를 사용해서 host os로부터 자원이랑 작업영역을 할당받고 그 안에서만 놀 수 있도록 하는게 목적이고 vm은 아닙니다. (정확한 비유는 아닙니다만) type1 vm을 원래 있던 집(host os) 안에다가 토대부터 기둥, 지붕까지 포함해 집을 만드는 거랑 비슷하다고 한다면, docker는 집(host os) 안에 또 벽을 쳐서 집이랑 유사한 환경을 만들어주고, 그 안에서 집처럼 쓸 수 있도록 하기 위해서 가재도구들(apt, ps, ...)을 넣어주는 겁니다. kernel까지 새로 필요한 것은 아닙니다. 이미 집에 필요한 지붕이나 기둥(linux kernel)은 그대로 있으니까요.
그래서 base image로 alpine이나 debian 같은 걸 사용한다고 해서 그 안에서 system call이 처리되는 것도 아닙니다. 정확하게 말하면 배포판이 base image에 들어가 있는게 아닌 겁니다. 예를 들어서 신버전 kernel의 특정 기능을 사용하는 프로그램을 docker로 돌리고 싶은데, host os가 구버전 kernel을 사용한다면 base image인 alpine, debian 등이 아무리 최신버전이라고 하더라도 작동하지 않습니다.