< 이론 >
주제
- 무엇을 컨테이너로 만드는지?
- DockerFile을 통해 도커컨테이너 만들기
- 컨테이너 배포 방법
무엇을 컨테이너로 만드는지?
컨테이너 : 개발한 어플리케이션(실행파일) + 운영환경을 갖춘 독립된 공간
⇒ 개발한 프로그램, 실행환경을 만들어냄
- 특징 MSA 환경의 Polyglot(폴리글랏) 애플리케이션 운영이 가능 cf) Polyglot 다양한 언어를 사용하여 프로그래밍 하는 것 ⇒ 각각의 어플리케이션 서비스에 맞춰 컨테이너를 만들어낸다. ⇒
- 짧은 라이프사이클에 대응 가능
- 수정할 컨테이너가 있으면 그 컨테이너만 수정하면 된다.
- 많은 서비스 제공 가능
- EX) 이커머스플랫폼 각각의 기능에 따라 적합한 다른 언어들을 써서 구현해내는 것.
DockerFile을 통해 도커컨테이너 만들기
DockerFile : 컨테이너 만들 수 있게 도와주는 명령어 집합.
- 특징
- 컨테이너 빌드에 필수적이고 이미지들의 기반이 된다.
- 쉽고,간단,명확 구문을 가진 text file 형태
- 작성된 명령어들을 Top-Down 방향으로 해석하면서 컨테이너를 만든다.
- 컨테이너 이미지 생성가능한 고유의 지시어(Insruction) 가짐
- 대/소문자 구분 없으나 가독성 위해 보통 지시어는 대문자로 사용
- 도커파일 라인 하나 당, 이미지 하나가 생성 됨
- EX)
$mkdir build $cd build $vi dockerfile // 아래에 지시어 FROM,COPY,CMD를 나열해서 하나의 도커파일을 만들고 FROM node:12 COPY hello.js / CMD ["node","/hello.js"] $docker build -t imagename:tag //도커 빌드 명령을 내림. tag도 회사에 맞춰져서 규칙이 있을겨.
- Dockerfile 문법 ( 더 많지만 많이 쓰는 것 위주 )문법을 통해 도커파일을 해석가능하다.
- FROM 도커파일에서 가장 먼저 나와야 하는 지시어. 운영환경을 뜻함.
- COPY,ADD 컨테이너 빌드 시, 호스트에있는 파일을 컨테이너 안으로 복사추가해줄 떄 사용하는 거. 베이스이미지 넣어놓고 그다음에 카피나 ADD하는거야.
- ex) TAR형태/FTP로 시작하는 URL로 받아서 주는 거/라이브러리설치
- 메인터너/레이블 컨테이너 생성자/자체 정보를 설정
- ENV 컨테이너 빌드된 후는 환경변수가 컨테이너 안에 남아있어
- USER 컨테이너 그냥 만들면 루트권한으로 만들어지는데 USER 옵션 넣어주면 특정 계정의 권한으로 만들 수 있어(LIKE SWITCH USER) 빌드/러닝 중에 모두 사용 가능 컨테이너루트로 시작하는 거는 보안적으로 ㅂㄹ고 시스템계쩡 만들어서 운영해주는 게 좋음
- VOLUME 컨테이너 동작될 때, 컨테이너에서 어플리케이션 데이터가 저장되는 공간을 선언하느 데에 사용
- CMD/ENTRYPOINT 명령어 스크립트를 작성할 떄 사용하는 명령어.
- CMD - 컨테이너 러닝할 때 명령어 치환 가능
- ENTRYPOINT - 치환 불가
- EX)
$mkdir build $cd build $vi hello.js # 소스코드 $vi dockerfile # 도커파일 생성 FROM node:12 # node 12도 하나의 컨테이너이고 베이스이미지 COPY hello.js / # hello.js를 최상위 디렉토리에 복사해서 넣어줌 # 이 컨테이너 실행될 떄 노드로 실행하고 루트 밑 hello.js를 실행해라고 명령어스크립트 작성 CMD ["node","/hello.js"] # 도커 빌드 명령을 내리고 컨테이너빌드해줌. 끝에 있는 점은 꼭 써야돼. # 현재 디렉토리 안에 있는 파일을 기준으로 작업하라는 것. # 도커호스트의 작업 디렉토리를 알려주는 역할임. # 즉, hello.js가 현재 디렉토리가 있다는 뜻임 # 만약 tmp디렉토리에 있으면 . 대신에 /tmp라 써줘야돼. # 즉, 현재디렉토리 파일기준으로 도커파일 갖고 컨테이너빌드해서 hellojsㅇ ㅣ름으로 만들어달라는 것. # "latest"는 안써도 디폴트인데 걍 컨테이너라는 거 티낼라고 쓴 것 # 저거 외에 임의로 준 버전명은 생략ㄴㄴ $docker build -t hellojs:latest . #컨테이너 해석할 수 있는 인터프리터(해석기)가 들어가이쓸 것이다...
컨테이너 배포 방법
배포해야 운영환경 도커컨테이너에서 실행되게 하든 고객사에게 제공 가능하다.
- 프로세스
- 멀 컨테이너로 만들지 기획,구상하고
- docker build -t hellojs:latest . :도커 빌드 명령어로 컨테이너 빌드함
- 도커호스트에 컨테이너화됨.
- 이걸 배포하고 남들도 쓰게 하려면 도커허브(: 퍼블릭공간의 허브 / 회사의 프라이빗 공간의 자체 허브 )에다가 넣어야한다. 허브에 넣을라면 허가받은 유저로서의 권한이 필요하므로 인증을 받기위한 로그인을 하고($docker login)
- 앞에서 만든 컨테이너를 docker push hellojs:latest 명령어로 하면돼
도커허브에서 도커파일들을 자주 봐야돼!! 그래야 내 것이 된다..
< 실습 >
주제
- nodejs 기반의 애플리케이션 컨테이너 만들기 (소스코드 가지고 컨테이너 이미지 만드는 법)
- 우분투 기반의 웹서버 컨테이너 만들기 (컨테이너 자체 가지고 컨테이너 이미지 만드는 법)
- 만들어놓은 컨테이너 허브에 배포하기
nodejs 기반의 애플리케이션 컨테이너 만들기
nodejs 기반의 웹 서버를 운영해주는 어플리케이션을 만든다. 소스코드는 직접 만들거나 nodejs사이트에서 가져와서 수정해서 쓰기 가능 즉, 어플리케이션 내부에서 동작하는 호스트네임 출력해주는 컨테이너 만드는 것. 소스코드를 해석해서 실행해주는 인터프리터인 컨테이너 운연환경(=nodejs)이 필요
- PROCESS
- 소스코드 준비
mkdir hellojs cd hellojs cat > hello.js # 컨테이너 hostname : 컨테이너이름
- 소스코드 빌드해주기 위해 도커파일 만듦
vi dockerfile FROM node:12 #hellojs를 해석해서 실행할 수 있또록 운영환경 제공해줄 베이스 이미지인 node 12버전을 넣는 것 COPY hello.js / #이 파일을 컨테이너 최상위디렉토리로 카피해줌 CMD "node", "/hello.js" #node 명령으로 루트에 있는 hello.js 동작시키도록 명령어 스크립트 작성. 컨테이너 런 시, 이 명령어 스크립트가 실행됨 :wq # 종료 후 저장
- 작성한 도커파일 확인
cat dockerfile
- 컨테이너 이미지 빌드
node 12를 만드려니까 다운로드 필요하므로 다운로드 후 그걸 베이스이미지로 만듬. 글고 3줄이니까 copy 명령어 이용해서 hellojs를 복사해주는 작업함.dokcer build -t hellojs:latest .
- 만들어진 컨테이너 이미지 확인
docker (image ls) 혹은 (images)
- 실행
# 8080포트랑 호스트네임도 8080 ddocker run -d -p 8080:8080 --name web hellojs:latest docker ps curl localhost:8080 # 어플리케이션 내부 페이지 hello.js 실행시킴
- 컨테이너 삭제 (컨테이너 이미지 삭제가 아님)
docker rm -f web #러닝중인 컨테이너라서 -f붙여야삭제돼
- 지워진 것 확인
docker images
- 소스코드 준비
우분투 기반의 웹 서버 컨테이너 만들기
실제 인프라를 만들어주는 컨테이너 만드는 것
- PROCESS
- 도커파일 작성
mkdir webserver
- 소스코드 빌드해주기 위해 도커파일 만듦
mkdir webserver cd webserver/ # vim : vi보다 기능향상된 거 vim Dockerfile #I 누르고 작업시작 FROM ubuntu:18.04 LABEL maintainer="개발자이름 <이메일주소@이메일.com>" # install apache 애플리케이션 웹서버 설치 RUN apt-get update \ && apt-get install -y apache2 # index.html 찾아서 클라이언트에게 서비스해주라는 것. 서비스하고싶은 웹의 HTML문서 맏늘어서저장해놓음.미리 만들어놨으면 카피해도됨 # 실제 컨테이너 실행할 떄 웹서버 자동으로 동작하도록 명령어 집어넣은 것 RUN echo "TEST WEB" > /var/www/html/index.html EXPOSE 80 CMD ["/usr/sbin/apache2ctl","-DFOREGUROUND"] :WQ
- apt-get update \ && ap-get install -y apache2 ⇒ update 받고 성공하면 아파치 설치하라는 것. 우분투라서 apt-get update 필요.
- 조건연산자인 && 앞에 있는 커맨드가 성공하면 뒤에있는 커맨드 실행해라는 명령. ⇒ 하나의 RUN 구문에 두개의 명령어 실행 가능함. (잘만들어진 컨테이너는 실행잘되고 레이어 수와 사이즈는 작게) 우분투에 배시쉘 들어있으니까 이런 연산자 쓸 수 있음
- \ 개행문자. 라인의 연속임. 가독성을 위해 씀
- apache2ctl 아파치웹서버 동작시켜주는 어플리케이션 데몬우분투에서 아파치웹서버 설치하고나면 그 컨테이너안에 서비스데몬 바이너리 파일으로 생긴다. 뒤에다가는 -DFOREGUROUND 아규먼트 옵션
- apt-get update \ && ap-get install -y apache2 ⇒ update 받고 성공하면 아파치 설치하라는 것. 우분투라서 apt-get update 필요.
- 작성한 도커파일 확인 - 총 6개 작업
cat Dockerfile
- 컨테이너 이미지 빌드
docker build -t webserver:v1 . # 버전은 쓰기 나름임.
- 만들어진 컨테이너 이미지 확인
docker (image ls) 혹은 (images)
- 실행 - 컨테이너 이미지 동작되는지 확인
docker run -d -p 80:80 --name web webserver:v1 docker ps curl localhost:80 #텍스트베이스의 웹브라우저 TEST WEB #웹페이지 보이면 성공
- 컨테이너 삭제 (컨테이너 이미지 삭제가 아님)
docker rm -f web
- 지워진 것 확인
docker images
- 도커파일 작성
만들어놓은 컨테이너 허브에 배포하기
도커허브 계정에 업로드 시켜서 누구나 접근 가능하도록하기위함
- PROCESS
- 계쩡 로그인
docker login
- 이미지 목록 보기
docker images
- 업로드 전, 개인저장소는 반드시 아이디가 붙어있어야함.첨에 이미지 빌드할떄부터 이름 썼으면 괜찮은데 그게 아니면은 태그 붙여줘야함 그럴 경우, 같은 이미지이지만 docker images 하면 태그 붙은거랑 안붙은 거 같이 나옴 ( ∵실제 이미지는 동일한 아이디로 저장되어있고 태그만 각각 있는 것 )
docker tag webserver:v1 계정이름/webserver:v1 docker tag hellojs:latest 계정이름/hellojs:latest
- hub.docker.com의 내 계쩡에 업로드가 됨
docker push 계정이름/webserver(이미지이름):v1 docker push 계정이름/hellojs(이미지이름)
- 계쩡 로그인
문제
주어진 스크립트를 실행하는 컨테이너 빌드하기
- 컨테이너명 : fortune:21.02
- dockfile 내용
- base image : debian
- 컨테이너 아래의 webpage.sh 파일을 복사#!/bin/bash mkdir /htdocs while : do /usr/games/fortune > /htdocs/index.html //apt-get updat&&install 명령으로 fortune 설치해줘야함 sleep 10 done
- 컨테이너 fortune 어플리케이션 설치 : apt-get install fortune
- 컨테이너 실행 시, 저장한 webpage.sh가 실행되도록 구성
문제풀이
컨테이너 생성한 것을 삭제 후 컨테이너이미지도 삭제해준 뒤, 다시 빌드
도커호스트 진입 명령
docker exec -it 0d3eff33d86b /bin/bash 특정 컨테이너 도커호스트 진입명령 docker container exec -u 0 -it 0d3eff33d86b /bin/bash 루트권한으로 접속
'DEVOPS > Docker' 카테고리의 다른 글
[따배도] 6강 - 컨테이너 사용하기 (0) | 2022.05.12 |
---|---|
[따배도] 5강 - 컨테이너 Registry (0) | 2022.05.12 |
[따배도] 3강 - 도커 컨테이너 살펴보기 (0) | 2022.05.12 |
[따배도] 2강 - 도커 설치 (0) | 2022.05.12 |
[따배도] 1강 - 컨테이너 개념 (0) | 2022.05.12 |
Uploaded by Notion2Tistory v1.1.0