문제

📌 MySQL 로 풀이

 

📌 문제 링크 :

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌 문제 설명 :

2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.

 

📌 테이블 :

다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(BOOK), 저자 정보(AUTHOR) 테이블입니다.

BOOK 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

BOOK_ID INTEGER FALSE 도서 ID
CATEGORY VARCHAR(N) FALSE 카테고리 (경제, 인문, 소설, 생활, 기술)
AUTHOR_ID INTEGER FALSE 저자 ID
PRICE INTEGER FALSE 판매가 (원)
PUBLISHED_DATE DATE FALSE 출판일

AUTHOR 테이블은 도서의 저자의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

AUTHOR_ID INTEGER FALSE 저자 ID
AUTHOR_NAME VARCHAR(N) FALSE 저자명

BOOK_SALES 테이블은 각 도서의 날짜 별 판매량 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

BOOK_ID INTEGER FALSE 도서 ID
SALES_DATE DATE FALSE 판매일
SALES INTEGER FALSE 판매량

 


풀이

추측) 

일단 BOOK_SALES에서 2022년 1월 조회건 수만 출력하여 ROW수를 줄임

그 판매내역을 각각 BOOK_ID로 그룹화해 책마다의 판매고를 먼저 계산

 

그리고 나서 책정보와 작가 정보를 INNNER JOIN해서 연결하는 방식으로 하면 효율적일 듯 하다.

 

또, 전에 봤던 임시 테이블을 한번 적용해보면 좋을지도!

 

쿼리) 

* 1차) 

WITH S AS 
(
    SELECT BOOK_ID, SUM(SALES) AS SALES
    FROM BOOK_SALES 
    WHERE SALES_DATE LIKE '2022-01%'
    GROUP BY BOOK_ID
)

SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(S.SALES * B.PRICE) AS TOTAL_SALES
FROM S
INNER JOIN BOOK AS B ON B.BOOK_ID = S.BOOK_ID
INNER JOIN AUTHOR AS A ON A.AUTHOR_ID = B.AUTHOR_ID
GROUP BY A.AUTHOR_ID, B.CATEGORY
ORDER BY A.AUTHOR_ID ASC, B.CATEGORY DESC

 

리뷰) 

미리 테이블을 임시로 만들어 둠으로써 가독성이 굉장히 좋아졌다. 

근데 임시 테이블이 성능적으로는 기존에 FROM안에 쓰는 것과 어떻게 다를까 싶어 찾아보니

이 임시테이블은 temp라는 임시 테이블에 저장되기 때문에 한번만 사용하는 테이블일 경우 오히려 오버헤드 요소!

임시테이블을 쓰는 것은 동일한 SQL이 반복되어서 사용될 때 성능을 높일수 있다.

이 점을 기억해서 사용하자!

문제

📌 MySQL 로 풀이

 

📌 문제 링크 :

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌 문제 설명 :

7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.

 

📌 테이블 :

다음은 아이스크림 가게의 상반기 주문 정보를 담은 FIRST_HALF 테이블과 7월의 아이스크림 주문 정보를 담은 JULY 테이블입니다. FIRST_HALF 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다. FIRST_HALF 테이블의 기본 키는 FLAVOR입니다. FIRST_HALF테이블의 SHIPMENT_ID는 JULY테이블의 SHIPMENT_ID의 외래 키입니다.

NAMETYPENULLABLE

SHIPMENT_ID INT(N) FALSE
FLAVOR VARCHAR(N) FALSE
TOTAL_ORDER INT(N) FALSE

JULY 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER 은 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 7월 아이스크림 총주문량을 나타냅니다. JULY 테이블의 기본 키는 SHIPMENT_ID입니다. JULY테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다. 7월에는 아이스크림 주문량이 많아 같은 아이스크림에 대하여 서로 다른 두 공장에서 아이스크림 가게로 출하를 진행하는 경우가 있습니다. 이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됩니다.

NAMETYPENULLABLE

SHIPMENT_ID INT(N) FALSE
FLAVOR VARCHAR(N) FALSE
TOTAL_ORDER INT(N) FALSE

 


풀이

추측) 

일단 두 테이블은 연관관계가 없는 상반기와 7월 기록이므로 그냥 합쳐도 될거 같다.

두 테이블 컬럼이 이름이 같으니 합쳐서 그룹화 하고, 더한 값으로 내림차순하여 3개만 출력하면 될 듯!

 

 

쿼리) 

* 1차) 

SELECT A.FLAVOR
FROM (SELECT *
    FROM FIRST_HALF 
    UNION ALL
    SELECT *
    FROM JULY ) AS A
GROUP BY A.FLAVOR
ORDER BY SUM(A.TOTAL_ORDER) DESC
LIMIT 3

 

리뷰) 

UNION 존재를 알고는 있었는데 이 참에 다시 정리

UNION 키워드는 두개 이상의 SELECT문을 합치는 역할을 한다.

두 SELECT문의 결과 컬럼 이름과 타입이 동일 또는 형변환 가능한 유사 형태여야 합칠 수 있다.

기본적으로 UNION은 중복 데이터를 출력하지 않고, UNION ALL 키워드를 사용하면중복 데이터까지 출력이 가능하다. 

📌 공부 계기

추가적인 도커 공부를 위해 유튜브 따배도 도커 시리즈를 보면서 정리해 봅니다. 

목차



📍6-1. 컨테이너 사용하기 : 이론

* 명령어 표 참고사항 -  [ ] : 선택사항 ,  <>: 필수사항, | : 둘중 하나

 

몇가지를 정리해뒀지만 역시 제일 좋은 건 공식문서다. 😘

 

Docker run reference

 

docs.docker.com

 

1️⃣ 컨테이너 이미지를 어떻게 사용해요?

명령어 설명
$ docker search [옵션] <이미지이름:태그명> 이미지 검색
$ docker pull [옵션] <이미지이름:태그명> 이미지 다운로드 (태그 안쓰면 기본 latest)
$ docker images [옵션] 다운받은 이미지 목록 출력
$ docker inspect [옵션] <이미지이름:태그명> 다운받은 이미지 상세보기
$ docker rmi [옵션] <이미지이름> 이미지이름

 

 

2️⃣ 컨테이너를 실행하고 종료하는 명령을 알고싶어요

  • 컨테이너 실행 라이프 사이클

출처: https://techmormo.com/posts/docker-made-easy-3-container-lifecycle/

 

명령어 설명
$ docker create [옵션] <이미지명:태그> 이미지를 가지고 컨테이너 생성 (run과 다르게 러닝은 X)
$ docker start [옵션] <컨테이너명|컨테이너ID> 컨테이너 실행(running) 
$ docker run [옵션] <이미지명:태그> pull + create + start : 이미지 다운받고 컨테이너를 생성하고 running 시킴, 이미지가 다운받았다면 create + start 만
$ docker stop [옵션] <컨테이너명|컨테이너ID> 동작중인 컨테이너 중지
$ docker rm [옵션] <컨테이너명|컨테이너ID> remove로 컨테이너 삭제

 

 

3️⃣ 동작중인 컨테이너를 관리 명령어가 궁금해요

명령어 설명
$ docker ps [옵션] ps(프로세스) 조회
$ docker inspect [옵션] <컨테이너명|컨테이너ID> 이미지명이 아니라 컨테이너를 쓰면 컨테이너에 대한 상세보기가 가능하다
$ docker top <컨테이너명|컨테이너ID> [ps 옵션] 해당 컨테이너에서 동작중인 프로세스 정보 확인
$ docker logs [옵션] <컨테이너명|컨테이너ID> 러닝중인 해당 컨테이너가 만들어낸 로그 정보 확인
$ docker exec [옵션] <컨테이너명|컨테이너ID> /bin/bash 러닝중인 해당 컨테이너에 명령어를 추가하고 싶을때 해당 컨테이너의 bash 연결
$ docker attach [옵션] <컨테이너명|컨테이너ID> FOREGROUND로 실행중인 컨테이너에 연결

 


📍6-2. 컨테이너 사용하기 : 실습

1️⃣ 컨테이너 이미지 관리 명령어 사용하기

 

1) 이미지 검색 

docker search [옵션] <이미지이름:태그명>

허브에 존재하는 nginx 키워들을 가진 이미지들 모두 조회

name description stars official automated
이미지 이름 설명 사람들이 준 별 수 공식 이미지 여부 자동 빌드 되는지

 

2)  이미지 다운로드 

docker pull [옵션] <이미지이름:태그명>

태그를 안붙이면 latest 버전으로 적용. 특정 버전 적용 하려면 콜론(:) 뒤에 특정 버전 입력

 

3) 다운받은 이미지 목록 조회 

docker images [옵션]

하늘색라인에 위에서 다운받은 이미지 확인
--no-trunc 옵션 추가시 :  이미지 이름이 full name으로 출력

 


2️⃣ 컨테이너 실행 및 운영하기

 

1) 컨테이너 조회 

docker ps [옵션]

No 옵션 시 : 현재 러닝상태의 컨테이너만 조회
a 옵션 추가시 : all 컨테이너 전체를 보여줌

 

 

2) 컨테이너 생성 

docker create [옵션] <이미지명:태그>

create를 하게 되면 컨테이너는 생성되나 running은 바로 안된 걸 확인할 수 있다

 

 

3) 컨테이너 실행 

docker start [옵션] <컨테이너명|컨테이너ID>

No 옵션으로 실행 확인 하거나 a 옵션으로 status가 Up으로 바뀌어 실행을 확인할 수 있다

 

 

4) 컨테이너 세부정보 확인 

docker inspect <컨테이너명|컨테이너ID>

길어서 중간 생략

네트워크 정보 뿐만 아니라, 볼륨 마운트 정보 리소스 정보 등 컨테이너에 대한 모든 정보를 볼 수 있다.

세부 정보를 특정 정보만 보려고 할때는 

docker inspect --format '{{<JSON필드>}}' <컨테이너명|컨테이너ID>

JSON필드는 위에 이미지를 보면 JSON형태로 되어 있는 정보에서 필드(대소문자구분) 지정하면 된다

+ 자주 쓰는 정보같은 경우에는 linux의 alias 명령어를 써서 자주 사용하는 명령어를 단축어로 등록이 가능하다

더보기

1) 단축어 조회

alias

 2) 단축어 생성

alias [단축어명]="명령어"
생성 및 확인
같은 결과가 나오는 것 확인

 

3) 단축어 삭제

unalias [단축어명]

 

 

5) 실행 확인 

curl 명령어 로  커맨드라인에서 웹브라우저 사용 (Clinet URL의미)

curl <url>

nginx 화면이 잘 나온거 확인

 

 

6) 로그 확인 

docker logs [옵션] <컨테이너명|컨테이너ID>

f 옵션 (follow)를 함께 쓰면 실시간으로 로그를 출력하여 모니터링이 가능하게 한다. 

 

 

7) 컨테이너 내 프로세스 확인 

docker top <컨테이너명|컨테이너ID> [ps 옵션]

 

 

8) 동작중인 컨테이터에서 명령어 추가 

docker exec [옵션] <컨테이너명|컨테이너ID> <명령어> [ARG..]
# docker exec -it webserver /bin/bash

 

-it는 옵션 i와 옵션 t 조합으로 i (interactive) , t (terminal) > 상호작용 가능한 터미널을 통해 /bin/bash 연결하라는 의미

전체로 보면 백그라운드로 돌아가는 프로세스에 /bin/bash 라는 커맨드를 추가로 동작시켜 연결하겠다

호스트네임 쪽이 바뀌어 컨테이너로 연결된 모습

해당 컨테이너에서 nginx 기본 index.html이 있는 경로를 찾아가 littlezero's Hompage 라는 메시지로 나올 수 있게 진행하고 exit로 종료

다시 curl로 확인하면 교체된 걸 확인할 수 있다

오예!

 


3️⃣ 컨테이너 종료하기

 

1) 컨테이너 중지 

docker stop [옵션] <컨테이너명|컨테이너ID>

 

 

2) 컨테이너 삭제 

docker rm [옵션] <컨테이너명|컨테이너ID>

실행 중인 컨테이너는 삭제 불가

하지만 f 옵션(force)을 사용하면 stop + rm 하여 강제 삭제한다

삭제된 걸 확인 가능

그냥 차례로 stop으로 중지하고 rm으로 삭제하는 것이 기본.

 

이렇게 컨테이너를 지우고 나면 우리가 변경한 index.html도 날아간다.

 

 


➕ 공부자료

6-1, 6-2

 

[따배도] 도커 시리즈

 

www.youtube.com

 

📌 공부 계기

추가적인 도커 공부를 위해 유튜브 따배도 도커 시리즈를 보면서 정리해 봅니다.

목차

 

📍5-1. 컨테이너 보관창고 : 이론편

1️⃣ 컨테이너 보관 창고 (Registry)가 있어요?

 

* Registry는 여러 형태의 컨테이너 이미지를 저장하는 저장소

- 종류 :

  • Docker Hub : hub.docker.com 공개 Registy를 의미
  • Private Registry : 사내의 컨테이너 저장소

2️⃣ docker hub (Registry) 를 사용하고 싶어요.

 

1) docker hub에 가입

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

2) explore로 다양한 이미지 검색 가능 

3) 개인 Repository도 가능

개인 Repository의 이미지도 공개가 된다. 공개하지 않으려면 별도의 비용을 지불해야함.

 

 

4) 커맨드 라인에서 dokcer hub 이미지 검색

docker search 키워드

키워드가 포함된 이미지 리스트를 보여줌

 


3️⃣ Private Registry를 구축하고 싶어요.

사내에서만 이용하는 Registry를 만들고 싶어요!

 

그러면 허브에서 registry 공식 이미지를 찾아라

이게 컨테이너 Registry를 운영할 수 있도록 도와주는 이미지

 

registry - Official Image | Docker Hub

About Official Images Docker Official Images are a curated set of Docker open source and drop-in solution repositories. Why Official Images? These images have clear documentation, promote best practices, and are designed for the most common use cases.

hub.docker.com

 

  • 아래 명령어로 Private 컨테이너 운영
docker run -d -p 5000:5000 --restart always --name registry registry:2

 

 

private repository 운영하여 이미지를 pull / push 할 때는 

# ex) docker pull 호스트네임:포트넘버/이미지명:태그 
# ex) docker push 호스트네임:포트넘버/이미지명:태그

컨테이너 repository 이름을 적용해서 pull이나 push해야 사용가능하다. (80포트면 생략가능)

 


📍5-2. 컨테이너 보관창고 : 실습편

1️⃣ hub.docker.com에 컨테이너 업로드 및 다운로드

1) 허브에서 이미지 검색

docker search 키워드

 

2) 이미지 다운

latest 태그는 생략 가능

docker pull 이미지명:태그

 

3) hub의 개인 repository에 올려보기

login 명령어 통해서 아이디와 패스워드 입력 

아래는 이미 전에 로그인한 기록이 저장되어 바로 로그인 됨 (도커 로그아웃 하기 전까지 유지됨)

 

4) 이미지를 개인 repository 에 업로드 해보기

공식 이미지 및 개인이 작성한 이미지도 가능. 다만, 이미지 이름에 도커 계정을 붙여줘야 올릴 수 있다.

docker tag 원본이미지명:태그 도커계정/바꿀이미지명:태그

이처럼 도커 계정을 붙여 이름을 바꿔주면 이미지 리스트에 같은 이미지로 이름이 2개 조회가 된다. (이미지가 2개인건 아님) 

 

 

5) 개인 레포에 push

docker push 도커계정포함된이미지명

허브 사이트에서도 확인 가능

이 이미지는 어디서든 누구든지 다운받을 수 있음.

 


2️⃣ Private Registry 운영하기

비용을 지불하는 방식이 아니라 직접 Private Registry를 운영하는 방식

- 외부 네트워크가 안되는 환경에서 운영하기

- 사내 전용 레지스트리

 

1) 허브나 커맨드에서 registry 검색

 

 

2) registry 실행

registry가 없는 상태에서 run하면 알아서 이미지를 pull받고 run을 실행

docker run -d -p 5000:5000 --restart always --name registry registry:2

 

3) 공식 허브에서 제공하는 Repository는 이름이 필요없으나 Private Repository는 어느 시스템에서 운영하는 Repository인지 명시를 해줘야 하기 때문에 현재 호스트네임과 포트를 통해 push 하고 pull 해야한다 

호스트 네임 확인 및 Private Repository 포트 확인

 

4) 허브의 개인 Repository처럼 이미지에 해당 호스트네임과 포트가 포함되야 한다.

docker tag 원본이미지명:태그 호스트네임:포트/이미지명:태그

보시다시피 같은 이미지 아이디로 이름만 추가된 것을 볼 수 있다

 

 

5) Private Repository에 push

 

 

🚩호스트 네임으로 할 때

더보기

 

내부에서는 localhost로도 가능하지만 외부면 호스트네임을 명확하게 표시해야함

앗? 로컬호스트로랑 다르게 호스트네임으로 하는 건 실행이 안된다.

docker은 보안상의 이유로 ssl 인증을 하는 https를 기본적으로 사용하는데 서버는 http 응답을 주게되어 https인 클라이언트가 못받고 있는 상황

 

 

이 방법 참고하면 될 듯하다

 

[Docker] private registry http: server gave HTTP response to HTTPS client 해결 방법

오늘은 private 한 환경에서 별도로 Docker registry를 구성했을 때 종종 발생하는 오류인 http server gave http response to https client의 해결 방법에 대해 포스팅 하려고 합니다. 일반적으로 docker registry는 docke

bono915.tistory.com

 

 

6) push한거 어디 있나요???

var 디렉토리는 root 계정으로 접근 가능

/var/lib/docker/voluems 에 아래와 같은 하늘색으로 컨테이너 디렉토리가 생성되어 있음

그 디렉토리 아래에 아래와 같은 구조가 있고 우리가 push한 httpd도 볼 수 있다. 

tree 명령어로 펼쳐본 디렉토리 구조

 

 

 


➕ 공부자료

5-1 , 5-2 내용

 

[따배도] 도커 시리즈

 

www.youtube.com

 

📌 공부 계기

추가적인 도커 공부를 위해 유튜브 따배도 도커 시리즈를 보면서 정리해 봅니다. 

목차



📍4-1. 컨테이너를 만들기 : 이론

1️⃣ 무엇을 컨테이너로 만드는 건가요?

컨테이너란 개발한 애플리케이션 (실행 파일) 과 운영환경이 모두 들어있는 독립된 공간

 

1. 운영환경

2. 소스코드 

3. 동작 명령어

 

를 하나의 컨테이너에 넣게 되고 

이 하나하나 컨테이너를 연결하여 MSA 환경의 Polyglot[각주:1] 애플리케이션 운영하게 된다. 서비스를 각각의 컨테이너로 나누어 연결하면 고객 대응에 용이하고, 더 많은 서비스를 감당할 수 있으며, 짧은 라이프사이클에 대응할 수 있게 된다. 

 


2️⃣ 컨테이너 어떻게 만들어요? Dockerfile이 뭐죠?

 

Dockerfile는 컨테이너를 빌드하도록 도와주는 명령어들의 집합 한다.

 

    ❓ Dockerfile이 뭔데??

    - Dockerfile은 yml(야믈)파일로 쉽고, 간단하나 명확한 구문을 가진 textfile이다.
    - 위에서 차례로 해석하는 Top-Down 방식

    - 컨테이너 이미지를 생성할 수 있는 지시어 존재

    - 대소문자를 구분하지 않음 (다만 가독성을 위해 사용)

Dockerfile

Dockerfile이 있는 위치에서 아래처럼 빌드하면 컨테이너 생성

docker build -t 이미지명:태그 .

 

📑 Dockerfile 문법 (일부)

# comment
FROM 컨테이너의 base Image (운영환경) 설정 , 최상단에 위치해야함
MAINTAINER 이미지를 생성한 사람의 이름 및 정보
LABEL 컨테이너 이미지에 컨테이너 정보를 저장
RUN 컨테이너 빌드를 위해 base image에서 실행할 명령어들 
COPY 컨테이너 빌드시 호스트 파일을 컨테이너로 복사
ADD 컨테이너 빌드시 호스트의 파일(tar, url 포함)을 컨테이너로 복사
COPY가 그냥 복사하는 것과 다르게 tar를 압축해제해서 복사한다든가 url을 통해 다운받아 복사한다든가의 기능을 추가로 할 수 있다. 
WORKDIR 컨테이너 빌드시 명령이 실행될 작업 디렉토리 설정
ENV 환경 변수 지정
USER 명령 및 컨테이너 실행시 적용할 유저 설정 (보안적 관점)
VOLUME 컨테이너 동작시 호스트 파일 또는 디렉토리를 컨테이너 디렉토리와 마운트
EXPOSE 컨테이너 동작시 외부에서 사용할 포트
CMD 컨테이너 동작시 자동으로 실행할 서비스나 스크립트 지정
ENTRYPOINT 컨테이너 동작시 CMD와 함께 사용하면서 command 지정시 사용
CMD는 중간에 명령어 치환 가능하나 ENTRYPOINT는 중간 치환을 차단한다. 

 

🧷 예시

Dockerfile 전체 예제 설명
$ mkdir build build라는 디렉토리 생성(make directory)
$ cd build build 디렉토리로 이동 (change directory)
$ vi hello.js Visual editor로 hello.js가 있으면 열기, 없으면 생성
$ vi dockerfile Visual editor로 도커파일 만들기 
FROM   node:12 이 베이스 이미지를 기준으로 
COPY   hello.js  / hello.js를 최상위 디렉토리(/)로 복사
CMD     ["node", "/hello.js"] node로 hello.js파일을 실행시켜줘!
dockerfile 실행 설명
$ docker build -t hellojs:latest .  현재 디렉토리의 dockerfile을 실행 시켜 hellojs 라는 이미지명에 가장 최근것이라는 태그를 달아 이미지 생성

 


3️⃣ 내가 만든 컨테이너를 배포하려면?

hub는 dockerhub 처럼 공개 레포지토리가 있는가 하면, 회사에서 회사만을 위한 레포지토리를 운영하는 경우도 있다.

위의 예시에서 docker build 로 생성한 컨테이너 이미지를 어떻게 배포할 수 있을까 

 

먼저 막 올릴 수 있는게 아니기 때문에 허가 부터 받기위해 login을 한다

아래 명령어 통해 유저이름과 패스워드를 기입 

docker login

이미지 push

docker push 이미지명:태그
# 위 예시로 본다면 docker push hellojs:latest

 

 


📍4-2. 컨테이너를 만들어 봅시다 : 실습

일단은 선생님 스택에 맞춰 실습해보고 내 스택에 맞춰서 따로 또 연습해보기

 

1️⃣ 애플리케이션 컨테이너 만들기 : hellojs 

 

1. hellojs 디렉토리를 생성

2. hellojs 로 디렉토리 이동

3. cat 는 파일을 출력하는 명령어로 concatenate의 약자로 여러 파일을 연결시켜 출력할 때 사용

리다이렉션 기호 (>) 는 입력한 내용으로 이 파일을 만들거라는 명령어에 해당한다. 

명령어를 사용하고 내용까지 입력하면 ctrl + d를 이용해 저장한다. 

 

4. Dockerfile 만들기

visual editor로 도커파일 만들기

 

vi에서 모드 선택하려면 esc를 먼저 누르고 i 를 눌러 입력모드 변경하여 아래 코드 쓰고

esc 하고 :wq (write and quit) 해서 저장

(+ x : 한글자 삭제, a : 커서 다음위치 삽입 (이것도 입력모드로 전환기능있음), yy : 한줄 버퍼 복사, p : 붙여넣기 등)

쓰여진 것 확인

 

5. dockerfile로 이미지 만들기

?? 선생님은 도커파일 라인당 하나 이미지레이어라고 하셨는데 그게 무슨 말이죠 12개나 생김

이미지 만들기 성공!!

 

 


2️⃣ 우분투 기반의 웹 서버 컨테이너 만들기 

 

1. webserver 디렉토리 생성

2. webserver 디렉토리 이동

3. vim (vi의 상위버전) 으로 Dockerfile 생성 

같은 명령어를 두번써도 각각 레이어가 생성된다. 그걸 줄이기 위해 &(앰퍼샌드) 2개로 명령어를 연결하여 한번에 실행하게 할 수 있음. &&은 사실 조건 연산자로 앞에 것이 성공하면 다음것을 실행하라는 리눅스 연산자.

요렇게

그리고 \ (백슬러시)하고 엔터하면 라인의 연속이 되고 탭을 넣어 가독성 좋게~

잘만든 도커파일은 레이어 수 적게 (명령어 적게) 사이즈 적게 해야한다

 

여기에 컨테이너의 index.html 찾아 "TEST WEB"을 출력할 수 있게 했고

80포트를 열었다.

또한 우분투에 아파치를 설치하면 /usr/sbin/apache2ctl 이라는 컨트롤 인터페이스가 생기고
컨테이너 러닝시 아파치를 -D 옵션과 FOREGROUND 옵션을 함께 줘서 실행해달라는 CMD를 넣는다.

(옵션 D는 해당 디렉토리를 루트 디렉토리로 설정이고 FOREGROUND 옵션은 서버가 분리되어 백그라운드에서 실행되는 대신 포그라운드에서 실행되도록 지시하여 서버가 현재 터미널에 연결된 상태로 유지되고 출력 및 오류 메시지를 실시간으로 표시

cat 명령어로 확인

 

 

4. 이미지 생성

docker build -t 이미지명:태그 도커파일경로

이미지 생성 확인

 

5. 컨테이너 생성

docker run -d -p 호스트포트:컨테이너포트 --name 컨테이너이름 이미지명:버전태그

echo 해준거 까지 확인!!

 

 


3️⃣ 만들어 놓은 컨테이너 배포하기

이미지를 도커 허브 계정에 올려보기

 

1. 일단 도커 로그인 

 

2. 개인 저장소에 올릴 이미지에는 이름에 개인계정이 붙어있어야한다.

이미지명 변경

docker tag 원본이미지이름 바꿀이미지이름

그런데 보면 기존것이 있고 또하나 생겨버린 걸 볼 수 있다. 이미지가 2개가 된건 아니고 단지 이름만 2개가 된 것 (이미지 ID는 동일하다)

 

3. 이미지 업로드

docker push 업로드할이미지명

짠 업로드 됬다

 

 

 


➕ 공부 내용 

4-1 , 4-2 내용

 

[따배도] 도커 시리즈

 

www.youtube.com

 

  1. 여러 개발언어를 사용하여 프로그래밍하는 것 [본문으로]

+ Recent posts