본문 바로가기
DevOps/Docker

[프리온보딩] Docker 이미지와 네트워크

by DUSTIN KANG 2023. 12. 5.

Docker 이미지

Docker 이미지를 다운받게되면 다음과 같은 화면을 볼 수 있다.

이미지를 다운받게되면 하나하나 데이터를 받게 되는데 이걸 레이어(layer) 라고 한다.

레이어는 도커 이미지를 `build`할 때 Dockefile의 정의된 명령문의 순서대로 실행이 된다.

즉, 이미지는 레이어 구조로 이루어져 있다.

 

이미지를 확인하게되면 여러개의 레이어 구조로 이루어져있다.

 

우리는 Docker 이미지를 생성하기 전 Dockerfile을 빌드하게 되는데 로그를 확인해보면, Dockerfile에 명령한 순서대로 이미지가 빌드되는 것을 확인할 수 있다. 

 

명령 한줄 한줄마다 이미지가 작성되는 것을 확인할 수 있다.

 


Docker 네트워크

Docker 네트워크는 격리된 컨테이너들을 서로 통신할 수 있게 도와준다.

`docker network ls` 커맨드를 사용하면 Docker 네트워크 목록을 확인할 수 있다.

 

상위 세가지 네트워크는 Docker Demon을 실행하면 기본적으로 생성되는 네트워크다.

 

네트워크 드라이버

Docker 네트워크는 `bridge` `host` `overlay` 등  다양한 종류의 네트워크 드라이버를 지원한다.

  • `Bridge` : 하나의 호스트 컴퓨터 내에 여러 컨테이너들끼리 소통할 수 있도록 도와주는 네트워크 드라이버이다.
    • 웹 서버 접근 시 `curl -I <ip address>`로 확인이 가능하다.
  • `host` : 호스트의 네트워크를 직접 사용하는 네트워크 드라이버이다.
    • 컨테이너가 host 드라이버를 사용할 때 다른 컨테이너의 포트가 host를 사용하는 포트와 충돌하면 안된다.
    • 웹 서버 접근 시`curl -I <localhost>`로  확인이 가능하다.
  • `overlay` : 서로 다른 도커 호스트(분산된 호스트)의 컨테이너 간 통신을 도와주는 드라이버이다. 
    • 단일 호스트에는 사용하지 않으며 도커 스웜(Docker Swarm)과 같은 클러스터 서비스에 사용된다.

이외에도 Macvlan, ipvlan, None등 여러가지가 있습니다.

 

 

네트워크 생성하는 커맨드 (별도 지정이 없으면 bridge가 디폴트) `docker network create`
네트워크의 상세 정보를 확인하는 커맨드 `docker network inspect <network>`
네트워크에 컨테이너 연결 `docker network connect <network> <container>`
네트워크 컨테이너 해제 `docker network disconnect <network> <container>`
네트워크 제거 `docker network rm <network>`
네트워크 청소 `docker network prune`

 

기본 네트워크에 컨테이너가 연결되어 있다는 것을 확인할 수 있다. (network inspect)

 

Docker Network 실습

이번엔 실제로 네트워크를 구성하여 WordPress를 실행해보자.

먼저, 네트워크를 구성하기 위해 `wordpress_net`이라는 네트워크를 만들어주어야 한다.

docker network create wordpress_net

 

그다음, wordpress의 데이터를 저장한 DB를 생성해줘야 한다.

docker mysql 컨테이너를 생성한다.

docker \
run \
    --name "db" \ # 컨테이너 이름 지정
    -v "$(pwd)/db_data:/var/lib/mysql" \ # 현재 db_data 경로(볼륨)을 /var/lib/mysql에 붙인다.
    -e "MYSQL_ROOT_PASSWORD=root_pass" \ # mysql 초기 환경 설정을 위한 변수 설정이다.
    -e "MYSQL_DATABASE=wordpress" \
    -e "MYSQL_USER=docker_pro" \
    -e "MYSQL_PASSWORD=docker_pro_pass" \
    --network wordpress_net \ # 네트워크 이름은 wordpress_net이다. --net으로 설정해도 된다.
mysql:latest # 베이스 이미지

 

그 다음, wordpress 컨테이너를 생성한다.

docker \
    run \
    --name app \ # 컨테이너의 이름을 app으로 설정했다.
    -v "$(pwd)/app_data:/var/www/html" \ # docker network의 /app_data 볼륨을 컨테이너의 /var/www/html에 붙인다.
    -e "WORDPRESS_DB_HOST=db" \ # 워드 프로세스 초기 환경 변수
    -e "WORDPRESS_DB_NAME=wordpress" \
    -e "WORDPRESS_DB_USER=docker_pro" \
    -e "WORDPRESS_DB_PASSWORD=docker_pro_pass" \
    -e "WORDPRESS_DEBUG=1" \
    -p 8000:80 \ # 포트 바인딩
    --network wordpress_net \# 네트워크 설정
wordpress:latest # 베이스 이미지

 

정상적으로 실행이 되면 `docker ps` 명령어를 통해 컨테이너가 잘 작동하고 있음을 볼 수 있을 것이다.

하지만 우리가 이렇게 길고 복잡한 명령어를 매번 컨테이너를 생성할 때 적어줘야 한다면, 관리하기 어려울 것이다. 

뿐만아니라, 컨테이너가 3개라면 mysql보다 wordpress를 먼저 띄울 시 에러가 발생할 수 있다.

 

이를 해결하기 위해 제작된 것이 docker-compose이다.

docker-compose에 대해서는 다음 포스팅에서 이어서 진행할 예정이다. 

참고

https://woochan-autobiography.tistory.com/468

https://www.youtube.com/watch?v=AmSKD4p-jhw&t=42s