TIL 2020-01-27 docker

­최상언·2021년 1월 27일
1

AWS

목록 보기
4/5

지난번 포스트에 이어서

우분투에서 동작하는 python3.8으로 selenium을 돌려야 해

그러니까 일단 우분투에서 돌아가는 파이썬 도커 이미지를 FROM으로 가져오면 되겠지.
하고 python docker hub에 들어가 봄

여기서 1차 당황.

어.. 나는 ubuntu를 찾는데, buster는 뭐고, alpine.. 윈도우! 윈도우는 아니지
뭐 이런 의식의 흐름을 타고 있었다.
근데, 그렇긴 그래도, python 공식 도커헙인데 그렇게 부분적으로 제공하진 않을거야.. 이걸로 다 되니까 이렇게만 주나보지?! 라는 나름 합리적인 의심으로 일단 구글링 시작.

그 결과 알게된 사실들

ubuntu vs. debian

  • 우분투는 데비안에서 파생(?)된 갈래같은 느낌인데, 그렇긴 해도 엄청 다르다
  • 뭐가 다르냐면, 데비안은 뭔가 되게 오래되고 튼튼한 mother tree 같은 느낌, 그래서 무조건 안정성이 최고
  • Experimental - Unstable - Testing - Stable(배포)
  • 또 데비안은 커뮤니티에서 배포판을 만든다
  • 그래서 업데이트가 늦음
  • Ian(당시20살)+Debra(여친) = Debian 이라고 ...
  • 게다가 배포판 이름들 - buster, woody(!), leddy 등 - 은 토이스토리 캐릭터들 이름을 따온.. 세상에
  • 현시점 Stable: Buster
  • 현시점 Test: Bullseye
  • Unstable: 언제나 sid 라고 부름

  • 이에 비해 우분투는 쓰기 쉽고, 편하고, 하드웨어 연결하기도 좋은 뭐 그런 데 중점을 둔 느낌
  • 데비안의 Unstable 단계를 가공해서 만드는, 좀 모험적인 느낌이
  • 그래서 업데이트 주기도 6개월에 한번으로 빠르다
  • 따라서 우분투에서는 - 데비안용/우분투용으로 빌드한 .deb 파일 둘 다 사용 가능함
  • 그러나 데비안에서는 - 우분투용으로 빌드한 .deb 파일은 사용할 수 없는 경우가 많다
  • 왜냐면 안정성 검증이 덜 된 최신 패키지는 아예 사용하지 않거나, 안정성이 검증된 예전 버전을 이용하는 경우가 많아서, 패키지 의존성 문제가 발생하고 정상적으로 설치되지 않기 때문.

그러니까

데비안에서 돌아가면 우분투에서도 돌아간다는 거다!

alpine linux

용량을 줄이기 위해 시스템의 기본 C runtime을 glibc 대신 musl libc 를 사용하며 다양한 쉘 명령어는 GNU util 대신 busybox 를 탑재하였습니다.

용량이 80M인 초경량화된 배포판이므로 Embbeded 나 네트웍 서버등 특정 용도에 적합하며 특히 도커(docker)에 채택되어 5M 크기의 리눅스 이미지로 유명합니다.

  • 알파인 리눅스는 가볍고 간단한, 보안성을 목적으로 개발한 리눅스 배포판
  • 용량을 줄이기 위해 시스템의 기본 C runtime을 glibc 대신 musl libc 를 사용하며... (?)
  • 다양한 쉘 명령어는 GNU util 대신 busybox 를 탑재함 (??)
  • 일단 용량이 80MB. 초경량!(와 진짜. 정확히는 모르지만 debian 이미지 땡겨와서 만든 컨테이너 용량 제일 작은게 800MB가 넘는다. 세상에!)
  • 그래서 임베디드, 네트워크 서버 등에 적합하다.
  • 특히 도커에 채택된, 5M 크기의 리눅스 이미지로 유명하다고 함. 그럴만두..

알파인 이미지로 테스트해볼까 하는 생각도 있다. 근데 .. 우분투랑 관계 등등 어쩌고 저쩌고..

dockerfile

3.8.7-buster 버전으로 테스트

이렇게 dockerfile, python_test.py, 그리고 requirements.txt 파일을 각각 만들어서 같은 디렉토리 밑에 둔다.

# requirements.txt 만들기: (venv) 터미널에서
pip freeze > requirements.txt

그리고 빌드한다.

# docker build [옵션] <dockerfile_경로>
docker build -t testimage:0.4 ./

-t 또는 --tag 는 이미지 이름과 태그를 설정하겠다는 옵션임.
빌드하는 과정에서 RUN 명령어가 실행되면서, requests 및 의존성을 가지는 라이브러리들이 설치되었다.

빌드된 이미지를 사용해 컨테이너를 실행해 봤다.

# docker run [옵션] <도커이미지이름>
docker run testimage:0.4

requests 라이브러리가 잘 동작해, html을 찍어줌!
사실 중간 중간 바보같은 시행착오를 겪느라 버전 0.4가 되었지만, 워낙 바보같은^^ (typo 등) 이슈니까 생략.

이제 dockerfile 생성해서 이미지 빌드하는 것 까지는 얼추 알겠다.

앞으로의 과제는

  1. chrome, chrome-driver 포함한 이미지 빌드하기
  2. 그 이미지로 실행한 컨테이너에서 selenium 잘 돌아가게 하기
  3. 그리고 .. 대망의 Lambda 연결

그래서 이제 크롬부터 깔아볼텐데, 생각나는 방법은 두가지가 있다.

  • RUN 명령으로 이미지 빌드될 때 설치되도록 하기
  • 빌드된 image 실행할 때 -it 옵션 추가하고 bash 명령으로 image 내부 접근해서 직접 깔고 다시 commit 하기

1번이 더 쉬워보이므로 1번부터 시도해 보겠음.

profile
배울게 많은 햇병아리 개발자

0개의 댓글