SSM-Seoul-Data-Engineering-Training
전체 과정에서 사용하는 기본적인 명령어(docker, docker-compose)에 대해 실습하고 사용법을 익힙니다.
putty 혹은 terminal 을 이용하여 접속하여 패키지 설치 여부를 확인합니다
docker --version
docker-compose --version
git --version
[실습] 출력 결과 확인
출력 결과가 오류가 발생하지 않고, 아래에 명시된 버전보다 높다면 정상입니다
Docker version 20.10.6, build 370c289
docker-compose version 1.29.1, build c34c88b2
git version 2.17.1
도커 컴포즈는 도커의 명령어들을 반복적으로 수행되지 않도록 yml 파일로 저장해두고 활용하기 위해 구성되었고, 여러개의 컴포넌트를 동시에 기동하여, 하나의 네트워크에서 동작하도록 구성한 것이 특징입니다. 내부 서비스들 간에는 컨테이너 이름으로 통신할 수 있어 테스트 환경을 구성하기에 용이합니다.
HOME
경로가 운영체제에 따라 다르기 때문에 틸드(~/
)를 통해 접근합니다
# terminal
mkdir -p ~/work ; cd ~/work
git clone https://github.com/psyoblade/ssm-seoul-training.git
cd ~/work/ssm-seoul-training
도커 컴포즈는 컨테이너를 기동하고 작업의 실행, 종료 등의 명령어를 주로 다룬다는 것을 알 수 있습니다. 아래에 명시한 커맨드 외에도 도커 수준의 명령어들(pull, create, start, stop, rm)이 존재하지만 잘 사용되지 않으며 일부 deprecated 되어 자주 사용하는 명령어 들로만 소개해 드립니다
2-1-1. config : 컨테이너 실행 설정을 확인합니다
- -q, --quiet : 설정의 정상여부만 확인하고 출력하지 않습니다
# docker-compose config [options]
docker-compose config
2-1-2. up : docker-compose.yml
파일을 이용하여 컨테이너를 이미지 다운로드(pull), 생성(create) 및 시작(start) 시킵니다
- -d, --detach : 서비스들을 백그라운드 모드에서 수행합니다
# docker-compose up [options] <services>
docker-compose up -d
2-1-3. exec : 컨테이너 내부에서 커맨드를 실행합니다
- -d, --detach : 백그라운드 모드에서 실행합니다
- -e, --env
KEY=VAL
: 환경변수를 전달합니다 - -u, --user [string] : 이용자를 지정합니다
- -w, --workdir [string] : 워킹 디렉토리를 지정합니다
# docker-compose exec [options] [-e KEY=VAL...] [--] SERVICE COMMAND [ARGS...]
docker-compose exec ubuntu echo hello world
2-1-4. down : 컨테이너를 종료 시킵니다
- -t, --timeout [int] : 셧다운 타임아웃을 지정하여 무한정 대기(SIGTERM)하지 않고 종료(SIGKILL)합니다 (default: 10초)
# docker-compose down [options] <services>
docker-compose down
[실습] `up -d` 과 down 명령어를 통해 컨테이너를 기동하고, `hello data engineer` 출력 후, 종료해 보세요
출력 결과가 오류가 발생하지 않고, 아래와 같다면 성공입니다
[+] Running 2/2
⠿ Container ubuntu Started
⠿ Container mysql Started
아래와 같은 방법으로 실행할 수 있습니다
docker-compose up -d
docker-compose exec ubuntu echo hello data engineer
docker-compose down
- --file, -f [filename] : 별도 yml 파일을 통해 기동시킵니다 (default:
-f docker-compose.yml
) - --env-file [env-file] : 별도 env 파일을 통해 환경변수를 지정합니다l (default:
--env-file .env
)
# docker-compose [compose options] [command] [command options]
docker-compose -f docker-compose.yml up -d
MySQL 서버에 접속 하는 방법
- 로컬 환경에서는
--host
정보는 입력하지 않아도 됩니다. 단, 서버가 뜨는 데에 시간이 걸리므로 10초 대기 후에 접속합니다
# docker-compose exec mysql mysql --host=localhost --user=scott --password=tiger default
sleep 10
docker-compose exec mysql mysql -hlocalhost -uscott -ptiger default
- mysql 접속 이후에 테이블 목록 조회 및 종료
show tables;
select * from seoul_popular_trip limit 5;
exit;
테이블 목록 및 데이터 출력 되고 exit 명령으로 나옵니다.
코드와 동일한 수준에서 형상관리가 되는 docker-compose.yml 파일에 접속정보를 저장하는 것은 위험할 수 있으므로 별도로 관리(ansible 등)하는 경우
.env
파일에 저장관리될 수 있습니다
- default 값이 같은 경로에
.env
파일로KEY=VALUE
형식으로 저장될 수 있습니다
# cat .env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=default
MYSQL_USER=scott
MYSQL_PASSWORD=tiger
docker-compose.yml
설정에서 environment 설정은 아래와 같이 변수로 치환됩니다
# grep 'environment' -a5 docker-compose.yml
environment:
MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: $MYSQL_DATABASE
MYSQL_USER: $MYSQL_USER
MYSQL_PASSWORD: $MYSQL_PASSWORD
- 현재 설정된 값을 출력하고 싶다면
config
명령으로 확인할 수 있습니다
docker-compose config | head
[실습] cat 명령어로 testenv 파일내용을 확인하고 --env-file 옵션으로 config 를 통해 제대로 수정 되었는지 확인해 보세요
testenv 파일 확인
cat testenv
--env-file 옵션과 함께 config 실행
docker-compose --env-file testenv config | head -8
실행 결과가 아래와 같으면 정상입니다.
services:
mysql:
container_name: mysql
environment:
MYSQL_DATABASE: testdb
MYSQL_PASSWORD: pass
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: user
아래와 같이 변경된 환경 정보로 접속 테스트를 할 수 있습니다
docker-compose down
docker-compose --env-file testenv up -d
sleep 10
docker-compose exec mysql mysql -uuser -ppass testdb
데이터 조회 후 종료합니다
select * from seoul_popular_trip limit 3;
exit;
2-3-1. logs : 컨테이너의 로그를 출력합니다
- -f, --follow : 출력로그를 이어서 tailing 합니다
# terminal
docker-compose up -d mysql
docker-compose logs mysql | head -30
2-3-2. pull : 컨테이너의 모든 이미지를 다운로드 받습니다
- -q, --quiet : 다운로드 메시지를 출력하지 않습니다
# terminal
docker-compose pull
2-3-3. ps : 컨테이너 들의 상태를 확인합니다
- -a, --all : 모든 서비스의 프로세스를 확인합니다
# terminal
docker-compose ps -a
2-3-4. cp : 컴포즈 컨테이너와 파일을 복사합니다
# docker compose cp [OPTIONS] SERVICE:SRC_PATH DEST_PATH|-
# docker-compose cp ./local/path/filename ubuntu:/container/path/filename
2-3-5. top : 컨테이너 내부에 실행되고 있는 프로세스를 출력합니다
# docker-compose top <services>
docker-compose top
- 환경변수에 따라 다르게 동작하는 스크립트를 생성합니다
cat > run.sh
enter 후에 아래 내용을 붙여넣고 Ctrl+C 하면 파일이 생성됩니다
#!/bin/bash
if [[ $DEBUG -eq 1 ]]; then
echo "this is debug mode"
else
echo "this is release mode"
fi
echo
- 아래의 도커
cp
명령어로 컨테이너 내부로 스크립트를 복사합니다
docker cp ./run.sh ubuntu:/run.sh
[실습] 환경변수 값(DEBUG=1)에 따라 결과가 달라지는 bash 스크립트를 생성 및 실행해 보세요
아래와 같은 방법으로 실행할 수 있습니다 (-e 옵션의 위치가 중요합니다)
docker-compose exec -e DEBUG=0 ubuntu bash /run.sh
아래와 같이 DEBUG 를 변경하고 출력합니다
docker-compose exec -e DEBUG=1 ubuntu bash /run.sh
출력 결과가 오류가 발생하지 않고, 아래와 같다면 성공입니다
# DEBUUG=0 인 경우
$ this is release mode
# DEBUG=1 인 경우
$ this is debug mode