Docker는 애플리케이션을 패키징, 배포 및 실행하기 위한 오픈 소스 컨테이너화 플랫폼입니다. Docker는 애플리케이션과 모든 종속 항목을 독립적인 컨테이너로 패키징하여 애플리케이션이 다양한 환경에서 일관되게 실행되도록 보장합니다. Docker는 빠른 배포, 강력한 격리 및 효율적인 리소스 활용을 제공하며, 개발, 테스트 및 운영 환경에서 널리 사용됩니다.
Docker에서의 안드로이드
안드로이드 컨테이너는 Docker를 통해 호스트 시스템에서 실행됩니다. Docker의 특성을 사용하여 호스트의 장치 노드를 안드로이드 컨테이너에 매핑할 수 있습니다. 컨테이너와 호스트는 동일한 커널을 공유하므로 안드로이드 컨테이너는 Rockchip 플랫폼과 관련된 하드웨어 가속 장치(GPU, VPU, NPU, RGA 등)를 직접 호출할 수 있습니다.
Docker에서의 안드로이드 배포
호스트 배포
Firefly는 여러 모델에 해당하는 호스트 펌웨어를 정리해 놓았습니다. 사용자는 사용 중인 특정 모델에 맞는 펌웨어 버전을 선택하고 이를 업그레이드하여 쉽게 호스트 배포를 완료할 수 있습니다.
안드로이드 컨테이너 배포
(1) 호스트 머신이 인터넷에 연결되어 있으면 SCP 명령을 통해 컨테이너 폴더를 효율적으로 Linux 호스트 머신의 /userdata/ 디렉터리로 전송할 수 있습니다.
scp -r ./AIC/container root@xxx.xx.xx.xx:/userdata/
(2) 컨테이너 폴더로 이동합니다.
cd /userdata/container
(3) 처음 실행할 때 초기화 스크립트를 실행합니다.
./aic.sh -i
(4) 초기화가 완료되면 실행합니다.
./aic.sh -r <Android Image.tgz><컨테이너 수>
Demo:
참고: 네트워크는 기본적으로 포트 매핑을 사용합니다.
<호스트 IP>:1100 --> <컨테이너 0>:5555
<호스트 IP>:1100 --> <컨테이너 1>:5555
....
호스트나 안드로이드 컨테이너에 대해 더 깊은 사용자 정의가 필요한 경우, 저희에게 연락하여 전체 소스 코드를 받으실 수 있습니다.
디버깅 및 사용
컨테이너 관리
(1) 모든 컨테이너(중지된 컨테이너 포함)를 확인합니다.
docker ps -a
(2) 안드로이드 컨테이너를 제거합니다.
docker rm -f <container_id_or_name>
(3) 실행 중인 컨테이너를 중지합니다.
docker stop <container_id_or_name>
(4) 중지된 컨테이너 실행.
docker start <container_id_or_name>
컨테이너 디버깅
(1) 실행 중인 컨테이너에 접근.
docker exec -it <container_id_or_name> sh
(2) 컨테이너의 CPU 및 메모리 사용량 확인.
docker stats
(3) 모든 컨테이너 확인 (중지된 컨테이너 포함).
docker cp 로컬 파일 컨테이너 ID: 컨테이너 내 경로
(4) LAN 내 다른 장치에서 Docker 컨테이너로 파일 이동.
adb connect 호스트 IP: 포트 번호
adb -s 172.16.11.92:1102 push 로컬 파일 컨테이너 ID: 컨테이너 내 경로
참고: Firefly의 기본 docker 네트워크 배포는 docker0 브리지 모드, 즉 포트 매핑 방식입니다. macvlan 네트워크를 사용하도록 수정한 경우, connect 명령은 컨테이너 IP와 포트 번호 5555를 사용해야 합니다.
adb connect 컨테이너 IP:5555
(5) 네트워크 미러링.
오픈 소스 scrcpy 사용: https://github.com/Genymobile/scrcpy
scrcpy -s 컨테이너 IP: 포트 번호
성능 테스트
- 장치: ITX-3588J
- 펌웨어: ITX-3588J_Ubuntu20.04-Minimal-r3104_v1.3.0c_241107.img
- ITX-3588J에서 동시에 실행 중인 6개의 Android 시스템
(1) 호스트를 성능 모드로 실행.
# Invalid argument 오류는 무시해도 됩니다
root@firefly:~# echo performance | tee $(find /sys/devices -name *governor)
performance
tee: /sys/devices/system/cpu/cpuidle/current_governor: Invalid argument
(2) CPU를 잘 냉각시키고, 온도를 80도 섭씨 이하로 유지.
root@firefly:~# cat /sys/class/thermal/*/temp
54538
56384
56384
55461
52692
51769
52692
root@firefly:~# cat /sys/bus/cpu/devices/cpu*/cpufreq/cpuinfo_cur_freq
1800000
1800000
1800000
1800000
2256000
2256000
2256000
2256000
(3) 게임 테스트 데모
실제 테스트에서 우리는 RK3588 프로세서가 AIC(Android in Docker) 기술을 통해 최고 성능 상태에서 여러 Android 시스템을 효율적으로 병렬 실행할 수 있다는 것을 발견했습니다. 그러나 6개의 Android 컨테이너를 동시에 실행할 경우 CPU 리소스를 공유하기 때문에 이러한 컨테이너들의 CPU 수요가 동시에 급증하면 사용자 경험에 영향을 미칠 수 있습니다. 반면 4개의 Android 컨테이너를 실행할 때는 CPU에 가해지는 부하가 상대적으로 적당하며 컨테이너 간의 영향도 비교적 작습니다. 따라서 특정 사용 시나리오와 요구 사항에 따라 컨테이너 개수를 유연하게 결정할 수 있습니다.
AIC 기술의 우수한 지원으로 Firefly 서버의 잠재력이 완전히 발휘되었습니다. RK3588 프로세서를 탑재한 Firefly B1 서버를 10노드 구성으로 사용할 경우 각 노드에서 독립적으로 6개의 Android 시스템을 실행하여 총 60개의 Android 시스템을 병렬로 운영할 수 있으며, 이는 AIC 기술의 강력한 성능을 입증합니다. 72노드로 업그레이드된 B2 서버는 무려 432개의 시스템을 동시에 운영할 수 있어 Android를 실행하는 컨테이너 수를 크게 확장했습니다.