💡 로제타(Rosetta) - Docker 컨테이너 내에서 다른 아키텍처의 바이너리를 실행할 수 있도록 지원하는 도구입니다. - 예를 들어, x86 아키텍처에서 동작하는 Docker 환경에서 ARM 아키텍처의 바이너리를 실행해야 할 때 Rosetta를 사용할 수 있습니다. - Rosetta를 사용하면 다른 아키텍처의 바이너리를 컨테이너 환경에서 실행할 수 있으므로, 다양한 플랫폼 간의 이식성을 높일 수 있습니다. 이는 특정 아키텍처에 종속되지 않고 효율적인 배포와 관리를 할 수 있는 장점을 제공합니다.
$ softwareupdate --install-rosetta
8. 터미널에서 Docker가 설치되었는지 확인합니다.
$ docker -v
2) Docker 동작 확인
💡 해당 글에서는 Docker 동작 과정으로 Docker Image를 생성하고 이미지를 Docker Container화 합니다. 그리고 Container를 Registry내에 올리는 과정을 확인해 봅니다.
💡 Docker 클라이언트, 도커 호스트, 도커 레지스트리 간 흐름
1. [Client → Docker Host] 클라이언트는 도커 명령어를 사용하여 도커 호스트에 요청을 보냅니다.
2. [Docker Host] 도커 호스트는 클라이언트의 요청을 받아들이고, 해당 요청에 따라 컨테이너를 생성, 중지, 제거하거나 이미지를 관리합니다.
3. [Docker Host → Registry] 만약 클라이언트가 이미지를 생성하거나 업로드하려면, 도커 호스트는 해당 이미지를 도커 레지스트리에 업로드합니다.
4. [Registry] 도커 레지스트리는 이미지를 저장하고 관리하는 중앙 집중식 저장소입니다. 도커 호스트는 도커 레지스트리에 이미지를 업로드하거나 다운로드할 수 있습니다.
5. [Docker Host → Client] 컨테이너가 종료되면, 도커 호스트는 해당 컨테이너의 상태와 결과를 클라이언트에게 반환합니다.
- 이렇게 클라이언트, 도커 호스트, 그리고 도커 레지스트리는 도커 환경에서 상호 작용하며, 이미지의 업로드와 다운로드, 컨테이너의 생성과 관리 등의 작업을 수행합니다.
💡 Docker Image 설치 - Docker의 설치가 완료가 되었고, Docker Image로 nginx를 설치하는 과정을 알아봅니다.
1. nginx 다운로드하기
💡 nginx 터미널에 nginx를 다운로드합니다.
# docker hub에서 nginx를 다운로드 받습니다.$ docker pull nginx
[ 더 알아보기 ] 💡 Nginx - 웹 서버 소프트웨어로, 고성능이며 확장성이 뛰어납니다. 주로 정적 파일의 서비스, 리버스 프록시, 로드 밸런싱, HTTP 캐싱 등 다양한 기능을 제공합니다. - Nginx는 경량화되어 리소스 사용량이 적고, 동시 접속자 처리에 효율적입니다. 이러한 특징으로 인해 많은 웹 사이트와 애플리케이션에서 널리 사용되고 있습니다.
💡 Docker 이미지로 다운로드하는 것은 어디서 받아지는 것인가? - Docker Hub 또는 다른 Docker 레지스트리에서 다운로드할 수 있습니다. 대부분의 공식 이미지는 Docker Hub에서 제공됩니다. - 또는 사용자 정의 이미지를 만들어 Docker Hub나 다른 레지스트리에 업로드할 수 있습니다. 💡 docker 이미지로 다운로드할 수 있는 목록은 무엇이 있는가? - Ubuntu, CentOS, Alpine, Nginx, MySQL, Redis, Node.js, Python, Java, Ruby, Go, PHP, MongoDB, Postgres, Elasticsearch, Grafana, Jenkins, WordPress, Django, Ruby on Rails, Laravel 등을 다운로드할 수 있습니다.
💡 아래의 명령어를 통해 컨테이너를 생성하고 실행합니다. - 해당 명령어는 ‘nginx’ 이미지를 기반으로 ‘my-nginx’라는 이름의 Docker 컨테이너를 생성하고 실행하는 명령어입니다.
1. d 옵션은 컨테이너를 백그라운드에서 실행하는 detached 모드로 실행합니다. 2. p 80:80 옵션은 호스트 머신의 80 포트를 컨테이너의 80 포트로 매핑하여 컨테이너 내에서 실행 중인 NGINX 웹 서버에 접근할 수 있도록 합니다. 3. -name my-nginx 옵션은 컨테이너에 "my-nginx"라는 이름을 할당합니다. 4. nginx 인자는 컨테이너를 생성할 때 사용할 Docker 이미지의 이름을 지정합니다.
# nginx 이미지를 기반으로 my-nginx 이름의 Docker 컨테이너를 생성하고 실행하는 명령어
$ docker run -d -p 80:80 --name my-nginx nginx
2. 컨테이너가 생성됨을 확인하였습니다.
3. localhost의 80번 포트로 접근을 하면 nginx기반의 웹 서버가 수행됨을 확인하였습니다.
💡 [참고] Docker Desktop을 종료하면 해당 nginx는 종료가 될까?
- Docker Desktop은 로컬 컴퓨터에서 도커를 실행하기 위한 도구입니다. - Docker Desktop을 종료하더라도, 이미지와 컨테이너는 로컬 환경에 남아 있을 수 있습니다. 따라서, Docker Desktop을 종료해도 이전에 실행한 Nginx 컨테이너는 여전히 실행 중이며, 해당 컨테이너에 접근할 수 있습니다. - 다만, Docker Desktop을 다시 시작하지 않고 새로운 컨테이너를 생성하려면 접근할 수 없습니다.
2. Repositories 탭을 선택하고 ‘create repository’ 버튼을 누릅니다.
3. private 용으로 구성을 하였습니다.
4. 터미널에서 docker login을 수행합니다.
# docker 로그인을 수행합니다.$ docker login
💡 [참고] Login did not succeed, error: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- 해당 문제에 대해서 로그인된 Docker Desktop을 실행시키지 않아서 발생한 문제였습니다. 이에 대해 Docker Desktop을 실행시키면 정상적으로 로그인 처리가 되었습니다.
5. Docker image에 태그를 추가합니다.
💡 생성된 Docker image 목록을 확인합니다.
# docker Image 리스트 확인$ docker image ls
# docker image tag format$ docker tag <로컬 이미지 이름>:<태그> <레지스트리 주소>/<이미지 이름>:<태그>
# docker tag를 통해 nginx라는 이미지를 adjh54/m-nginx라는 새롭게 구성한 repository에 1.0이라는 태깅을 하여 수행하였습니다.$ docker tag nginx adjh54/my-nginx:1.0