- Today
- Total
개발하는 고라니
[Docker] 도커 호스트와 컨테이너 본문
이전 글에 이어서 진행되는 내용입니다.
저번에 했던 내용은,
1) 도커 설치
2) 도커에 Apache web server(httpd) 이미지 pull
3) httpd 컨테이너 만들어서 run
이다.
즉, 컨테이너 안에서 웹 서버가 돌고 있는 것이다. 이 컨테이너 안에 설치된 웹 서버는 어떻게 사용해야할까? 그전에 컴퓨터에 설치된 웹 서버의 동작을 먼저 보자.
좌측이 클라이언트, 우측이 웹 서버이다.
위 그림을 토대로 웹 서버 동작을 본다.
클라이언트가 http://example.com/index.html을 을 요청하면, example.com 이라는 도메인을 가진 친구한테 가서 http 포트(80)로 접속이 된다. 그럼 웹 서버는 이를 자신의 파일 시스템 안에 'index.html'을 찾고, 그것을 읽어서 클라이언트에게 보여준다.
도커를 이용한 웹 서버
이제 도커를 이용해 웹 서버를 이용하는 방법을 보자.
docker run httpd
도커를 이용하면 웹 서버가 컨테이너에 설치되고, 컨테이너가 설치된 운영체제는 "도커 호스트"라고 부른다. 하나의 도커 호스트에는 여러 개의 컨테이너가 만들어질 수 있고, 각각 독립적으로 실행되기 때문에 각자 독립적인 포트와 파일 시스템을 갖는다.
이제 웹 브라우저로 웹 서버에 연결하면 연결이 안된다. 호스트와 컨테이너의 연결이 끊겨있기 때문이다. 그래서 호스트의 80 port와 컨테이너의 80 port를 연결해줘야 한다.
docker run -p 80:80 httpd
-p 옵션은 시작할 때의 포트를 설정하는 옵션이고, 앞의 80은 호스트의 포트, 뒤의 80은 컨테이너의 포트이다. (포트포워딩)
실습
/* 호스트으 80포트로 들어오는 요청을 컨테이너의 80포트로 넘기는 'apache'라는 이름의 컨테이너 생성 */
docker run --name apache -p 80:80 httpd
/* 호스트으 8081포트로 들어오는 요청을 컨테이너의 8081포트로 넘기는 'apache2'라는 이름의 컨테이너 생성 */
docker run --name apache2 -p 8081:80 httpd
아파치 웹 서버가 정상적으로 동작하는 것을 확인할 수 있다.
컨테이너 내부의 내용 작업 - exec
도커를 이용해 컨테이너를 만들고 그안에 웹 서버를 실행시켰다. 로컬호스트와 컨테이너를 잘 연결했지만, 그 안에 자원을 넣어둘 수 없다면 무슨 소용이 있는가. 그래서 컨테이너 안에서 작업을 해보려고 한다.
도커에는 exec 라는 명령어가 있다. 이는 실행중인 컨테이너에 커맨드를 구동하기 위한 명령어이다.
옵션에는 다양한 것이 있다.
옵션 이름 | 설명 |
--detach, -d | 백그라운드에서 명령을 실행한다. |
--detach-keys | 컨테이너 분리를 위한 키 시퀀스 재정의 |
--env, -e | 환경 변수를 설정한다 |
--env-file | 환경 변수의 파일에서 읽는다. |
--interactive, -i | 연결되지 않은 경우에도 표준입력을 유지한다. |
--user, -u | username이나 UID(형식: <name|uid>[:<group|gid>]) |
--tty, -t | 가짜-TTY를 할당한다. |
docker exec apache2 /bin/sh
docker exec -it apache2 /bin/sh
CMD에서 아래의 명령어를 입력하면, 입력 받는 부분이 '#'으로 변한다. 즉, 리눅스의 쉘이 실행된 것이다. 쉘은 명령을 입력 받아 운영체제로 전달해주는 역할을 한다.
이제 apache2라는 컨테이너의 내부로 들어온 것이고, 여기서 자유롭게 리눅스 탐험을 할 수 있다. 근데 리눅스의 CUI를 써본 사람들은(어쩌면 모두가) 불편하다. 덩그러니 '#'만 있고, 내가 어디에 있고, 어떤 유저로 접속해있는지 안보인다. 그래서 bash를 쓰도록 하자.
docker exec -it apache2 /bin/bash
#Reference 및 출처
'Open Source > Docker' 카테고리의 다른 글
[Docker] Dockerfile과 Build (0) | 2021.10.02 |
---|---|
[Docker] 기초 사용법과 개념 (2) | 2021.09.28 |