컨테이너에 환경변수 주입하기

컨테이너 안으로 환경변수를 넘길 때는 -e 옵션을 사용한다.

image

환경변수들을 파일로 전달할 수도 있다. 로컬에 있는 sample.env 파일을 컨테이너 안으로 넘겨보자.

image

docker exec

docker exec는 실행중인 컨테이너에 명령어를 실행하는 명령어이다.

$ docker exec [container] [command]

# my-nginx 컨테이너에 Bash 셸로 접속하기
$ docker exec -it my-nginx bash
$ docker exec -it my-nginx /bin/bash

# my-nginx 컨테이너에 환경변수 확인하기
$ docker exec my-nginx env

image


도커 네트워크

도커를 호스트 운영체제에 설치하고 나면 기본적으로 여러가지 네트워크 드라이버들이 설치가 된다. 도커 컨테이너를 실행할 때 사용할 네트워크를 지정할 수 있는데, 네트워크를 따로 지정하지 않으면 기본적으로 생성되는 docker0 이라는 브릿지 네트워크를 사용한다.

image

eth0은 호스트에서 사용하고 있는 기본 네트워크이다. docker0 는 도커 데몬에 의해 생성되는 기본 브릭지 네트워크이다. 컨테이너를 실행하면 컨테이너 내부의 eth0과 호스트 서버가 연결되어야 하는데 docker0이 veth와 eth 간 다리 역할을 하게 된다. veth는 컨테이너가 생성됨과 동시에 호스트에 eth0과 대응되는 가상 eth (veth)가 하나 생성된다.

컨테이너 포트 노출

컨테이너의 포트를 호스트의 IP:PORT와 연결하여 서비스를 노출한다.

$ docker run -p [HOST IP:PORT]:[CONTAINER PORT] [container]

# nginx 컨테이너의 80번 포트를 호스트 모든 IP의 80번 포트와 연결하여 실행
$ docker run -d -p 80:80 nginx

# nginx 컨테이너의 80번 포트를 호스트 127.0.0.1 IP의 80번 포트와 연결하여 실행 -> 해당 ip에 대해서만 포트 매핑
$ docker run -d -p 127.0.0.1:80:80 nginx

# nginx 컨테이너의 80번 포트를 호스트의 사용 가능한 포트(랜덤하게 지정)와 연결하여 실행
$ docker run -d -p 80 nginx

image

image

image

Expose vs Publish

# expose 옵션은 그저 문서화 용도
$ docker run -d --expose 80 nginx

# publish 옵션은 실제 포트를 바인딩
$ docker run -d -p 80 nginx

image

도커 네트워크 드라이버

도커에 기본적으로 설치되어 있는 네트워크 목록 확인

$ docker network ls 

image

native driver는 bridge, host, none, overlay 드라이버가 있다. remote driver는 써드파티 플러그인을 설치하는 방식으로 사용가능하다.

image

image

overlay는 각각의 서버에 있는 컨테이너들을 연결시키는 가상의 네트워크이다. 이는 오케스트레이션 시스템(컨테이너를 여러 클러스터 시스템에서 동작시키는 것) 에서 많이 사용하는 네트워크 드라이버이다. docker는 docker swarm이라는 오케스트레이션 시스템을 기본적으로 가지고 있다. docker swarm을 사용할 때 overlay 네트워크 드라이버를 사용한다.

  • none: 컨테이너에 네트워크 동작이 필요없을 때, 커스텀 네트워킹을 사용해야 할 때 설정
    $ docker run -it --net none ubuntu:focal
    
  • host: 도커가 제공하는 가상 네트워크를 사용하는 것이 아니라 직접 호스트 네트워크에 붙어서 사용. 포트바인딩을 사용하지 않더라도 바로 스트에 붙어서 사용 가능
$ docker run -d --network=host grafana/grafana 

grafana의 기본 포트는 3000이다.

image

  • bridge: 새로운 브릿지 네트워크를 만들어서 사용해본다. –net-alias 옵션은 브릿지 네트워크 안에서 hello라는 도메인 이름으로 컨테이너 아이디를 조회할수 있도록 내부 도메인에 저장해 주는 역할을 한다.
$ docker network create --driver=bridge mybridge
$ docker run -d --network=mybridge --net-alias=hello nginx
$ docker run -d --network=mybridge --net-alias=grafana grafana/grafana

image


볼륨