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)performancetee: /sys/devices/system/cpu/cpuidle/current_governor: Invalid argument
(2) CPU를 잘 냉각시키고, 온도를 80도 섭씨 이하로 유지.
root@firefly:~# cat /sys/class/thermal/*/temp54538563845638455461526925176952692root@firefly:~# cat /sys/bus/cpu/devices/cpu*/cpufreq/cpuinfo_cur_freq18000001800000180000018000002256000225600022560002256000
(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를 실행하는 컨테이너 수를 크게 확장했습니다.