[Vagrant] Docker Provisioning

▷ Docker Provisioning on Vagrant Environment

Vagrant 프로비저너는 vagrant up 과정 중에 자동으로 소프트웨어를 설치하거나 머신의 설정을 변경할 수 있도록 해준다.
vagrant ssh로 박스에 들어가서 소프트웨어를 직접 설치할 수도 있으나, 프로비저닝 시스템을 이용하면 반복되는 과정을 자동화할 수 있다.
Vagrant는 기본적인 쉡스크립트를 이용하는 것부터 시작하여 좀 더 복잡한 형상관리시스템을 이용하여 머신을 프로비저닝할 수 있는 여러가지 옵션을 제공한다.

언제 프로비저닝이 일어날까?

프로비저닝은 Vagrant 환경 생애의 몇몇 지점에서 발생한다.

  • 처음 vagrant up 에서 환경을 생성할 때 프로비저닝이 실행된다. 환경이 이미 생성되어 있고 단지 재개하거나 부트업하는 경우 --provision 플래그를 명시하지 않으면 프로비저닝이 일어나지 않는다.
  • 동작중인 환경에서 vagrant provision을 하였을 때,
  • vagrant reload --provision 이 호출되었을 때,

환경을 올릴 때 --no-provision 을 명시하여 프로비저닝을 실행시키지 않을 수 있다.

▷ 프로비저너의 기본 용례

모든 프로비저너는 Vagrantfile내에 config.vm.provision 메소드 호출을 사용한다. 다음은 shell 프로비저닝의 예시이다.

Vagrant.configure("2") do |config|
  # ... other configuration

  config.vm.provision "shell", inline: "echo hello"
end

▷ Docker 프로비저닝

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.provision :docker
end

Docker 프로비저닝을 위해서 Vagrantfile을 수정하고 vagrant reload --provision을 실행하면 사내에서는 실패한다. 추가로 박스내 인증서를 설치하도록 하자.
*나중에 bootstrap.sh에서 자동 실행되도록 만들자

sudo mkdir -p /usr/share/ca-certificates/dungeon
sudo cp -f /vagrant/dungeon.crt /usr/share/ca-certificates/dungeon/dungeon.crt
sudo sed -i "/dungeon/d" /etc/ca-certificates.conf
echo "dungeon/dungeon.crt" | sudo tee -a /etc/ca-certificates.conf
sudo update-ca-certificates

▷ Docker Compose 프로비저닝

# vagrant plugin install vagrant-docker-compose
Installing the 'vagrant-docker-compose' plugin. This can take a few minutes...
Fetching vagrant-docker-compose-1.5.1.gem
Installed the plugin 'vagrant-docker-compose (1.5.1)'!```
Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.provision :docker
  config.vm.provision :docker_compose, compose_version: "1.29.1"
end

▷ Airflow on Docker

초기 환경 설정

mkdir -p ./dags ./logs ./plugins  # /vagrant 밑에 마운트 시킴
echo -e "AIRFLOW_UID=$(id -u)" > .env

데이터 베이스 초기화

# docker-compose --file /vagrant/docker-compose.yaml up airflow-init

몇 번의 시행 착오로 compose_version1.29.1로 설정한 후 실행하면 또 아래의 오류를 만나게 된다.

ERROR: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

docker 명령어로 로그인을 한 후 다시 시도해 보면 Docker 이미지가 정상적으로 설치가 된다.

vagrant@vagrant:~$ docker login --username xxxxxxxxx --password xxxxxxxx
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/vagrant/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
airflow-init_1       | [2021-12-04 03:48:24,241] {manager.py:214} INFO - Added user airflow
airflow-init_1       | User "airflow" created with role "Admin"
airflow-init_1       | 2.2.2
vagrant_airflow-init_1 exited with code 0

Airflow 실행하기

# docker-compose --file /vagrant/docker-compose.yaml up

여러가지 에러를 만나고 있다. 메모리를 우선 늘리도록 하자. 최소 4G에서 8G를 권장하고 있다.

config.vm.provider "virtualbox" do |v|
  v.memory = "4096"
end

메모리 증설 이후 정상적으로 Airflow UI 가 뜨는 것을 확인할 수 있다.

(update)
logs가 정상적으로 기록되지 않아서 DAG이 모두 fail 되는 문제가 발생하였다. airflow가 Task 로그를 기록할 때 dag_id를 폴더 이름으로 사용하는데 호스트 머신의 Windows 파일이름으로 사용 불가능한 특수기호가 포함되어서이다.

docker-compose.yamlvolumes 설정에서 DAG 파일 배포 편의를 위한 dags 폴더만 호스트 머신에 마운트시키도록 수정하면 정상동작한다.

  volumes:
    - /vagrant/dags:/opt/airflow/dags
    - ./logs:/opt/airflow/logs
    - ./plugins:/opt/airflow/plugins

Enjoy Airflow!!!!

▷ 참고 자료

좋은 웹페이지 즐겨찾기