2-1. 도커 예제 실습
TIP
본 실습은 시작하세요 도커 쿠버네티스
31페이지의 2.2.5 컨테이너 애플리케이션 구축
부터 시작합니다.
가장 기본인 컨테이너 생성, 삭제
및 이미지 pull, 삭제
같은 명령어는 다루지 않겠습니다.
도커 기본 명령어와 같이 보면 좋지만 내용이 긴 편이므로
당장 알고 있어야 할 명령어 위주로 요약하였습니다.
run 명령어 실행 시 사용할 옵션들
--name {컨테이너이름}
: 컨테이너의 이름을 지정해준다.-p {host포트}:{container포트}
: 호스트와 컨테이너의 IP와 포트를 바인딩해준다.-it
: 컨테이너 내부에서 터미널 입력을 할 수 있게 해준다.-d
: 컨테이너를 백그라운드에서 실행시켜준다.-e
: 컨테이너 내에서 사용할 환경변수를 설정해준다.
컨테이너 애플리케이션 구축
여러개의 서비스(어플리케이션)을 동시에 실행시켜야 한다면
아래 이미지처럼 하나의 컨테이너에 전부 넣거나
, 서비스마다 컨테이너화 시켜주는 방법
도 있다.
사실 All-in-one 컨테이너 방식을 사용한다면... 컨테이너를 사용하는 의미가 없다.
하나의 컨테이너에 하나의 애플리케이션을 동작시키면 컨테이너간의 독립성이 보장되므로
애플리케이션의 버전 관리, 소스코드 모듈화 등이 더욱 쉬워진다.
이 같은 구조는 도커에서 공식적으로 권장하는 구조이기도 하다.
mysql & wordpress 실습
일단 mysql과 wordpress 컨테이너를 생성해준다.
(역슬래시는 가독성을 위해 사용합니다.)
- mysql 컨테이너 생성 및 백그라운드 실행
docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
- wordpress 컨테이너 생성 및 백그라운드 실행
docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress
워드프레스에서 -p 80
을 입력했으므로 호스트의 포트 중 하나와 연결됐을 것이다.
docker ps 명령어로 어느 포트와 연결됐는지 확인할 수 있다.
(아래 이미지에서는 호스트의 3221포트와 연결되었다.)
TIP
호스트와 바인딩 된 포트만 확인하려면 docker port {image 이름}
으로 확인할 수 있다.
# docker port wordpress
80/tcp -> 0.0.0.0:3221
이제 웹브라우저의 주소창에 `호스트IP:3221`을 입력하면 워드프레스 웹 서버에 접근할 수 있다.
-it와 -d의 차이
위에서 -it
는 터미널 입력을 할 수 있게 해주고, -d
는 백그라운드라고 설명하였다.
-d
옵션을 사용하면 입출력이 없는 상태로 컨테이너를 백그라운드에서 실행한다.
입출력 없이 컨테이너를 실행한다는건, 컨테이너 내부에서 프로그램이 터미널을 차지하는
foreground 상태로 실행된다는 것이다.
Detached 모드인 컨테이너(서버 등)는 반드시 컨테이너가 실행되면 프로그램이 실행돼야 하며, foreground 프로그램이 실행되지 않으면 컨테이너는 종료된다.
우분투, CentOS의 경우에는 /bin/bash를 커맨드로 설정해 실행할 수 있게 해놓아서 -it
를 통해 터미널 입력을 활성화하면 배쉬를 사용할 수 있게 된다.
하지만 mysql은 mysqld, 워드프레스는 apache2-foregorund가 컨테이너 시작시에 동작하게 설정되어 있어서 하나의 터미널을 차지하게 되므로 상호 입출력이 불가능하다.
그래서 -d
옵션으로 백그라운드에서 동작하게 해주는 것이다.
TIP
컨테이너는 각기 하나의 모니터를 가지고 있다고 생각하면 이해하기 쉽다.
예를 들어, ubuntu 컨테이너를 하나 생성하고docker attach 컨테이너
로 하나의 컨테이너를 두 개의 터미널에서 동시에 실행시켜 보면
마치 모니터를 복제해놓은듯이 한쪽에서 입력하면 다른 한쪽도 그대로 복제되어 보인다.
exec 명령어
docker exec {컨테이너} {명령}
exec
명령어는 컨테이너에게 특정 명령을 내리면 그 명령을 실행시키고 결과값을 반환해준다.
하지만 여기에 -it
옵션을 붙여주고 /bin/bash
를 호출한다면, 상호 입출력이 가능한 상태로 만들어준다.
# docker exec -it wordpressdb /bin/bash
root@a0897ecfbbae:/# echo $MYSQL_ROOT_PASSWORD
password
컨테이너에서 빠져 나오려면 Ctrl + P, Q를 입력하면 된다.
또는 /bin/bash
프로세스를 종료하며 빠져나오려면 exit
를 입력하면 된다.
exec
로 컨테이너에 들어왔을 때는 exit를 써도 컨테이너가 종료되지 않는데,
이는 mysqld 프로세스가 여전히 foreground 모드로 동작하고 있기 때문이다.
deprecated
--link 옵션deprecated
현재는 도커 브리지(bridge) 네트워크를 사용하는 것을 권장한다고 한다.
# ...
--link wordpressdb:mysql
# ...
도커 엔진은 컨테이너에게 내부 IP를 172.17.0.2, 3, 4...
와 같이 순차적으로 할당한다.
이는 컨테이너를 시작할 때마다 재할당하는 것이므로 매번 변경되는 컨테이너의 IP로 접근하기 어렵다.
--link
옵션은 내부 IP를 알 필요 없이 항상 컨테이너에 별명(alias)로 접근하게 해준다.
위에서 wordpressdb:mysql
는 wordpressdb
컨테이너를 mysql
이라는 이름으로 설정한다는 의미이다.
TIP
--link
옵션에 적어줄 컨테이너가 실행 중이지 않거나 존재하지 않는다면, 옵션을 적용할 컨테이너 또한 실행할 수 없다.
즉, --link
옵션은 컨테이너 실행 순서의 의존성도 정의해준다는 것을 알 수 있다.