아래는 ChatGPT 로 Docker의 개념을 긁어 모아 정리한 글입니다.
도커(Docker)는 컨테이너 가상화 기술을 이용해, 어플리케이션을 배포하고 실행하는데 사용되는 오픈소스 플랫폼입니다. 도커를 사용하면 개발자나 운영자는 운영체제나 서버환경과 상관없이 어플리케이션을 효율적으로 관리할 수 있습니다.
도커는 컨테이너 기술을 이용한 오픈소스 가상화 플랫폼입니다. 컨테이너는 어플리케이션의 실행에 필요한 파일, 라이브러리, 실행 환경 등을 패키징한 것으로, 컨테이너 이미지를 생성해 배포하고 실행할 수 있습니다.
도커를 사용하면 개발자나 운영자는 서버환경이나 운영체제에 구애받지 않고, 어플리케이션을 배포하고 실행할 수 있습니다. 또한, 컨테이너 기술을 사용하기 때문에 서버 자원의 효율적인 사용이 가능합니다.
도커를 사용하면 개발자들은 동일한 개발환경을 갖게 되어 팀 내에서 일관된 개발을 할 수 있습니다.
도커를 사용하면 운영환경에서의 어플리케이션 배포 및 관리가 간단하게 됩니다. 컨테이너 이미지를 이용해 필요한 서버 환경을 쉽게 구축하고, 배포 및 관리를 할 수 있습니다.
도커는 가상화 기술을 사용하기 때문에, 어플리케이션을 빠르게 배포할 수 있습니다. 이미지를 미리 만들어두고 배포하는 것이 가능하기 때문입니다.
도커를 사용하면 가상화 기술을 통해 서버 자원을 효율적으로 분배할 수 있습니다. 여러 어플리케이션을 하나의 서버에서 실행하더라도, 컨테이너를 통해 각 어플리케이션이 필요로 하는 리소스만 할당할 수 있습니다.
도커는 어떤 환경에서든 어플리케이션을 실행할 수 있도록 해줍니다. 개발환경, 운영환경, 클라우드 등 다양한 환경에서 어플리케이션을 실행할 수 있기 때문에 이식성이 높습니다.
설치 방법 : Docker Installation Ubuntu 22.04
도커 이미지를 생성하기 위해서는 Dockerfile이라는 파일을 작성해야 합니다. Dockerfile은 도커 이미지를 생성하는데 필요한 설정을 정의한 파일입니다. Dockerfile을 작성한 후에는 다음과 같은 명령어를 이용해 도커 이미지를 생성할 수 있습니다.
docker build -t 이미지이름 경로
이미지 이름 : 생성할 이미지의 이름
경로 : Dockerfile이 위치한 경로를 지정
도커 이미지를 레지스트리에 저장하기 위해서는 Docker Hub, AWS, Google Cloud Platform 등 다양한 레지스트리 서비스를 사용할 수 있습니다.
Docker Hub을 사용하는 경우, 다음과 같은 명령어를 이용해 이미지를 레지스트리에 저장할 수 있습니다.
docker push 이미지이름
이미지 이름은 사용자명/이미지이름:태그의 형식으로 지정해야 합니다. 예를 들어, Docker Hub의 사용자명이 myname이고, 이미지 이름이 myapp인 경우 myname/myapp으로 이미지 이름을 지정할 수 있습니다.
레지스트리에서 도커 이미지를 가져와 컨테이너를 생성하기 위해서는 다음과 같은 명령어를 이용합니다.
docker pull 이미지이름
이미지 이름은 사용자명/이미지이름:태그의 형식으로 지정합니다.
도커 이미지로부터 컨테이너를 생성한 후에는 다음과 같은 명령어를 이용해 컨테이너를 실행할 수 있습니다.
Docker run option 정보 및 WSL2 환경에서 Docker 설치하는 방법을 알고싶다면
WSL2 환경에서 Docker 설치 및 Jupyter lab 구동
docker run [옵션] 이미지이름
옵션은 컨테이너를 실행할 때 설정할 옵션을 지정합니다. -p
옵션은 호스트와 컨테이너 간 포트를 매핑하는데 사용됩니다.
예를 들어, 다음과 같은 명령어를 이용해 MySQL 이미지로부터 컨테이너를 생성하고 실행할 수 있습니다.
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=비밀번호 -p 3306:3306 mysql:latest
위 명령어는 MySQL 이미지로부터 컨테이너를 생성하고 실행합니다. -d 옵션은 컨테이너를 백그라운드에서 실행하도록 설정합니다.
도커를 사용하면 컨테이너와 이미지를 관리할 수 있습니다. 컨테이너와 이미지를 관리하는 몇 가지 유용한 명령어를 소개하겠습니다.
컨테이너를 생성하고 실행하기 위해서는 docker run 명령어를 사용합니다. 이미지를 기반으로 컨테이너를 생성하고 실행할 수 있습니다.
# docker run 명령어 예시
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
OPTIONS
: 컨테이너를 생성하고 실행할 때 사용할 옵션을 지정합니다.IMAGE
: 컨테이너를 생성할 때 사용할 도커 이미지의 이름입니다.TAG
: 이미지의 태그를 지정합니다. 생략할 경우 latest 태그를 사용합니다.DIGEST
: 이미지의 다이제스트 값을 지정합니다. 태그와 다이제스트 중 하나를 사용해야 합니다.COMMAND
: 컨테이너 안에서 실행할 명령어입니다. 지정하지 않으면 이미지 안에서 설정된 기본 명령어를 사용합니다.ARG
: 명령어에 전달할 인자입니다.# 도커 이미지를 기반으로 컨테이너 생성 및 실행
docker run -d -p 8080:80 nginx:latest
-d
: 컨테이너를 백그라운드에서 실행합니다.-p
: 호스트와 컨테이너의 포트를 매핑합니다. 호스트포트:컨테이너포트의 형식으로 지정합니다.# 현재 실행 중인 컨테이너 목록 조회
docker ps
-a
옵션을 사용하면 모든 컨테이너 목록을 조회할 수 있습니다.# 모든 컨테이너 목록 조회
docker ps -a
# 컨테이너 중지
docker stop [OPTIONS]
도커 컨테이너는 가상의 네트워크 인터페이스를 가지고 있기 때문에, 도커 컨테이너 간에는 자유롭게 통신할 수 있습니다. 하지만 컨테이너가 호스트 머신의 네트워크 인터페이스에 직접 연결되어 있는 경우, 컨테이너 간 통신이 불가능합니다.
이러한 경우를 해결하기 위해서 도커 네트워크를 사용할 수 있습니다. 도커 네트워크는 가상의 네트워크 인터페이스를 제공하고, 도커 컨테이너를 이 가상의 네트워크 인터페이스에 연결하여 통신할 수 있도록 합니다.
도커 네트워크를 사용하기 위해서는 다음과 같은 명령어를 이용할 수 있습니다.
docker network create --driver [네트워크 드라이버] [네트워크 이름]
# 혹은
docker network create [네트워크이름]
docker network ls
docker network inspect [네트워크 이름]
docker network connect [네트워크 이름] [컨테이너 이름 또는 ID]
docker network disconnect [네트워크 이름] [컨테이너 이름 또는 ID]
컨테이너를 생성할 때, --network 옵션을 이용하여 컨테이너가 속해야 할 네트워크를 지정할 수 있습니다. 예를 들어, my-network라는 네트워크를 생성하고, 이 네트워크에 속한 my-container-1과 my-container-2라는 이름의 컨테이너를 생성하고자 할 때, 다음과 같은 명령어를 이용합니다.
docker network create my-network
docker run -d --name my-container-1 --network my-network nginx
docker run -d --name my-container-2 --network my-network nginx
--network 옵션을 사용하지 않고, 컨테이너를 생성하면 기본적으로 bridge라는 이름의 네트워크에 속하게 됩니다.
컨테이너 간에 네트워크를 통해 서로 통신하게 하려면, 컨테이너 내부에서 사용되는 IP 주소를 이용하여 통신합니다. 예를 들어, my-container-1에서 my-container-2로 접근하기 위해서는 다음과 같은 명령어를 이용합니다.
docker exec -it my-container-1 /bin/bash
ping my-container-2
위 명령어는 my-container-1에서 my-container-2로 접근하여 ping을 수행하는 명령어입니다. my-container-1에서 my-container-2로 접근하기 위해서는 my-container-2의 IP 주소를 알아야 합니다. 이는 docker inspect 명령어를 이용하여 확인할 수 있습니다.
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container-2
위 명령어는 my-container-2의 IP 주소를 확인하는 명령어입니다. 이를 이용하여 my-container-1에서 my-container-2로 접근할 수 있습니다.