호스트 포트 연결

컨테이너와 호스트 포트를 연결하는 방법은 이미 앞서 nginx 이미지로 컨테이너를 생성할 때 사용했다. -p 옵션을 사용해서 포트를 지정한다(또는 --publish 옵션을 사용).

docker run -d -p 8080:80 --name web nginx:latest

연결 포트는 "호스트포트:컨테이너포트" 형식으로 지정한다.

환경 변수 설정

-e 옵션(--env 옵션)을 사용하면 컨테이너를 실행할 때 환경 변수를 전달할 수 있다. 예를 들어 mysql 이미지의 실행 프로그램은 MYSQL_ROOT_PASSWORD 환경 변수를 이용해서 DB의 root 암호를 설정한다. 따라서 root 암호를 원하는 문자열로 지정하고 싶다면 다음과 같이 컨테이너를 구동할 때 -e 옵션을 사용해서 환경 변수를 전달하면 된다.

docker run --name mysqldb \
           -e MYSQL_ROOT_PASSWORD=rootpw \
           -p 33060:3306 -d mysql:5.7

도커 허브(hub.docker.com)에서 이미지가 어떤 환경 변수를 사용하는지 확인할 수 있다.

로컬 스토리지 연결

아래와 같이 nginx 이미지를 이용해서 생성한 컨테이너에 bash로 연결해서 /usr/share/nginx/html 디렉토리에 echo.txt 파일을 생성해보자.

vagrant@ubuntu-bionic:~$ docker run -d -p 8080:80 --name web nginx:latest

vagrant@ubuntu-bionic:~$ docker exec -it web bash

root@fe306ef365a7:~# cd /usr/share/nginx/html/

root@fe306ef365a7:/usr/share/nginx/html# echo "echo file" > echo.txt

root@fe306ef365a7:/usr/share/nginx/html# exit

웹 브라우저에서 http://호스트:8080/echo.txt를 실행하면 방금 생성한 파일이 출력될 것이다. 컨테이너를 중지하고 다시 시작해도 컨테이너에 생성한 파일은 유지되는 것을 확인할 수 있다.

컨테이너에 파일을 생성하고 수정하고 삭제하는 것이 가능은 하지만 컨테이너의 파일 시스템을 직접 변경하는 것은 추천하지는 않는다. 컨테이너를 삭제하면 변경 내역도 함께 사라지기 때문이다. 컨테이너의 삭제 여부에 상관없이 파일을 유지해야 한다면 로컬 스토리지나 볼륨을 연결해야 한다.

로컬 스토리지와 컨테이너를 연결할 때는 --mount 옵션을 사용한다. 테스트를 위해 앞서 생성한 web 컨테이너를 삭제하고 홈 디렉토리에 html 디렉토리를 생성하고 이 폴더에 index.html 파일과 echo.txt 파일을 생성하자. 그리고 다음 명령어를 사용해서 컨테이너를 생성한다.

vagrant@ubuntu-bionic:~/html$ echo '<html><body>index</body></html>' > index.html

vagrant@ubuntu-bionic:~/html$ echo 'echo file in local' > echo.txt

vagrant@ubuntu-bionic:~/html$ docker run -d --name web --rm \
>   --mount type=bind,src=/home/vagrant/html,dst=/usr/share/nginx/html \
>   -p 8080:80 \
>   nginx:latest
d1530bacb7176c9fe36d0f1097661deaf6f471edd3ddd3d849c51eeeb43b16c0

vagrant@ubuntu-bionic:~/html$

웹 브라우저를 열고 http://호스트:8080/index.html 이나 http://호스트:8080/echo.txt에 연결해보자. 로컬에 생성한 파일이 브라우저에 표시되는 것을 알 수 있다. ~/html 디렉토리에 새로운 파일을 추가하거나 삭제한 뒤에 브라우저에 확인해보자. 바로 반영될 것이다.

--mount 옵션에서 type을 bind로 지정하면 컨테이너의 파일 시스템을 호스트의 파일 시스템으로 대체한다. src는 호스트 경로를 값으로 갖고 dst는 대체할 컨테이너 경로를 값으로 갖는다. 위 설정은 생성한 컨테이너의 /usr/share/nginx/html 경로를 로컬 호스트의 /home/vagrant/html로 연결한다고 설정한다.

컨테이너의 경로를 호스트로 연결하면 컨테이너를 삭제해도 파일 변경 내역이 유지되므로 다음 작업에 이점이 생긴다.

  • 이미지를 변경해서 컨테이너를 새로 만들어도 데이터가 유지된다.
  • 이미지에 이미 존재하는 파일을 다른 파일로 쉽게 교체할 수 있다.

로컬 스토리지 연결뿐만 아니라 메모리 파일 시스템 연결과 볼륨이 있는데 이에 대한 내용은 다음 편에 이어서 살펴본다.

관련 글

+ Recent posts