학습주제
실습 3개 해볼 예정
학습내용
간단한 hello print world를 노드로 만들고 이미지 생성. 컨테이너 만들어서
허브에 올리고
다른 컴퓨터에서 실행해본다.
간단한 서비스
app.js 파일 하나
스트링을 콘솔 로그 함수 써서 출력
결과는 화면과 같음
node app.js를 실행시킴.
노드 환경을 설정해야함.
도커 파일에 적어줘야함.
깡통 리눅스에서 실행을 한다.
1. 리눅스
2. 노드 설치.
3. app.js를 가져옴
4. node app.js 실행
이게 도커 파일에 기술이 되면
build로 도커 이미지를 만들 수 있음
도커에게 소프트웨어 설치 명령을 기술
텍스트기반 파일
보통 베이스 이미지를 기술. 이미 도커에 이미지로 존재하는 소프트웨어를 지정해줌. FROM node:alpine
노드라는 소프트웨어에 알파인이라는 OS 버전을 받아라. 태그 포맷을 얘기할텐데. 이는 도커 이미지 이름임. 맨 앞에 실제 이미지 이름 콜론: 뒤에 버전이 나옴. 숫자, 스트링이 나옴. FROM 을 저렇게 쓰면 도커 허브, 레지 연동 되어있다는 전제 하에 저걸 받아와서 쓰겠다는 뜻이 됨.
COPY는 이미지에 포함이 될 코드를 복사해주는 역할 .을 쓰면 현재 디렉토리의 모든 내용이 /app 폴더로 모두 복사가 됨. 자세히 보면 띄어쓰기 되어 있음 컨테이너 안에 app 폴더 생김. 이 현재 디렉토리 있는 파일중 하나가 app.js가 될 것임.
WORKDIR /app 안써주면 뒤에 cmd 실행할 때 /app/app.js로 패스를 다 적어줘야함. 미리 디렉토리를 고정시켜줌.
CMD 실제로 도커 컨테이너 시작할 때 실행될 명렁어. ENTRYPOINT도 있음. node 런타임을 가지고 app.js을 실행해라.
ARG - 도커 이미지 만들 때.
ENV - 도커 이미지 만들어질때, 최종 도커 이미지에도 저장됨.
두개 모드 리눅스 환경변수 세팅 명령어. - 설명이 다름. 아래에선 ARG가 최종 저장. ENV가 이미지 만들 때만임. 참고
USER - 리눅스 컨테이너 실행될 때 사용할 유저 ID. 윈도우라면 윈도우 유저 ID
EXPOSE: 웹 서비스 관점 하에 어떤 TCP 포트 오픈할지 mysql이라면 3306이 될 것임.
RUN 이미지 빌드할 때 어느 커맨드 실행할 지.
우분투 계열 세팅 시. RUN apt-get update && apt-get install -y curl 으로 다양한 설치작업
RUN 뒤에 여러개 명령이 올 수 있음. &&로 명령을 차례로 실행
CMD, ENTRYPOINT
컨테이너 처음 시작할때 실행되어야 하는 명령어. docker run 실행 이미지 입력했을 때. 어떤 명령이 실행될지.
두개가 동시에 쓰일수도 있음. 그 경우 엔트리포인트가 우선순위.
베스트는 cmd를 쓰는게 좋음.
두개 도커파일 있고
cmd, 엔트리 여러개 쓴 상황. 보면 마지막에 지정된 것만 실행됨.
각각 이미지로 빌드하여 run 실행하면 command2.sh 스크립트가 실행됨. 마지막 것만 실행됨. 동일한 결과임. 둘중에 하나만 쓰는게 좋음. cmd 선호
CMD ["./cmd1.sh"]
이렇게 이미지를 만들고 my-image
docker run my-image로 하면
cmd1.sh가 실행됨. 이는 오버라이드가 됨.
my-image cmd2.sh로 별도 스크립드 지정되면.
cmd2.sh가 실행됨.
다른 스크립트를 이런식으로 실행 시킬 수 있음.
엔트리포인트는 다른 옵션을 써서 오버라이드
엔트리포인트, cmd 둘다쓰임. 기본적으로 엔트리포인트가 실행.
cmd 값은 엔트리포인트 쉘에 파라미터로 들어감.
cmd지정된 값들이 파라미터 들어갈텐데, 파라미터를 새로 지정할 수 있음.
cmd2 파라마터가 들어감
--entrypoint="/cmd3.sh" 로 새로 줄 수도 있음
최대한 CMD만 써라.
엔트리포인트를 쓰는 경우는 꼭 필요한 경우는 없지만 편해지는 경우도 있긴한데
그냥 CMD만 써라.
도커파일을 남들이 만든걸 읽을 때 알고 있으면 좋음
엔트리 포인트 실행. CMD가 파라미터로 붙는다는 것.
https://github.com/puckel/docker-airflow/blob/master/Dockerfile
남이 만든 에어플로우 예
FROM으로 파이썬 기본 3.7 버전 쓰겠다고 명시. 이미지 이름.
/리포 이름을 넣을 수도 있음.
ENV 빌드 타임. 최종 이미지엔 저장 안됨
ARG 이미지에도 최종 저장됨.
USER_HOME
VERSION
cmd 실행, 엔트리포인트 스크립트에서 ARG 환경변수는 이용 가능
COPY코드들을 이미지 안에 카피함. airflow.cfg를 복사하는 모습임.
RUN 주인을 airflow 유저로 바꾸는 모습
EXPOSE 8080 5555 8793
USER는 어떤 어카운트를 갖고 돌릴지
모든 패스를 USER HOME으로 해라. 상대 패스
ENTRYPOINT가 실행되면서 cmd에 지정한 값이 파라미터로 들어감.
/entrypoint.sh webserver
파일 만들었다면
이미지를 만들텐데
build -t(태그) hello-world-docker .(점 까먹지 말기)
이 디렉토리에 있는 도커 파일을 가지고 만듦. 다른 파일이라면 .쪽에 패스를 맞춰주면 됨.
--platform linux/amd64
완전한 호환이 안됨. 애플칩 ARM 아키텍처 기반. 리눅스 서버들은 amd기반임. 맥은 범용적이지 않음. 이에 빌드를 할때 빌드를 할 때 amd64 아키텍처 형태로 만들고 싶다고 명시. 안그러면 애플 m1 칩에서만 돌아가는 이미지가 되어버림.
시간이 다소 걸릴 수 있음.
docker image ls해보면
이미지 목록이 뜸
TAG는 버전임. 기본은 latest
알파인 노드라 사이즈가 작음 우분투 같은걸로 만들면 사이즈가 큼.
버전을 같이 줄 수 있음
~~world:버전명 적기.
docker run hello-world-docker:버전이름
cmd에 지정되었던 기본 명령어가 실행됨.
엔트리포인트, cmd라면 엔트리포인트 실행. cmd는 파라미터로 붙음.
다른 스크립트를 쓰면 뒤에 스크립트 명을 쓰면 됨.
다른 서버에서 다운로드해서 사용하는 방법 실습
이 이미지를 도커 허브에 등록하는게 필요함.