📌 공부 계기

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

목차

 

📍1. 컨테이너를 배우는 이유?

⏳ 시대의 변화!

시대는 베어메탈 방식 > 가상화 방식 > 가상화 방식 중 컨테이너 방식 등장 순으로 바뀌었다. 

 

  • Bare Metal : 하드웨어의 리소스를 공유하는 가상화 방식과는 다르게 하드웨어의 모든 성능을 사용할 수 있는 방식
  • Virtualization : 베어 메탈 시스템 위에 Hypervisor라는 소프트웨어 적 기술을 가지고 가상 컴퓨터(가상머신)를 만들어 하나의 하드웨어를 나눠 쓸 수 있게 하는 방식

하지만 현재는 사용하는 정도에 따라 확장하는 축소할 수 있는 요구와 서비스 중단없이 운영해야하는 환경에서 이런 시스템은 한계가 있었다. 그래서 등장한 것이 베어 메탈 시스템위에 OS를 올리고 컨테이너 엔진을 올린 시스템이었다.

그리고 도커가 이 컨테이너 기술 중 하나이다.

도커는 

  • 실제 어플리케이션과 최소화된 환경만 들어가기 때문에 용량이 확연하게 적다⬇️
  • 컨테이너 마다 isolation(고립)되어있어 확장성이 좋다 

 

 

❓ 왜 굳이 리눅스에서 돌려요? 

리눅스 커널 기능을 써야 하니까!

 

리눅스는 커널 기능 기반으로 만들어진 도커는 

독립된 공간 형성 chroot 기능에 그 공간 안에 6가지 isolate 기능인 namespace를 지원해 완전히 분리될 수 있게 돕는다. 그리고 분리된 곳에 필요한 만큼의 HW(하드웨어)지원하는 cgroup  등 리눅스 커널 기능을 사용하여 서비스를 제공하기 때문에 필히 리눅스로 돌려야 한다. 

 

그럼 윈도우나 Mac은요???

리눅스 경우는 Hypervisor 필요없이 컨테이너가 올라가지만 리눅스 기능이 없는 윈도우나 Mac 경우 Hypervisor를 활성화 시켜 그 위에 컨테이너를 돌린다.

 

 

💥 일반 프로그램과 컨테이너 차이

하는일은 같다. 구조가 다를 뿐!

둘다 애플리케이션 언어에 대한 환경요소를 설치하고 앱 소스코드를 실행하여 돌리는 것은 같다.

다만, 애플리케이션 운영 환경에 바로 쓰는지 (일반 방식)

아니면 운영 환경 위에 컨테이너 기반을 놓고 그 안에 어플리케이션을 운영하는 지가 다른 것 (컨테이너 방식)

 

 

😡 기능이 같으면 도대체 왜 쓰는 건데?!? 

  • 개발자가 만든 그대로 어디서든 돌아간다.
  • 확장 / 축소가 용이 (Scale out, Scale In)
  • MSA(MicroService Architecture), DevOps에 적합

개발환경과 운영환경이 달라 개발한 어플리케이션에서 운영환경에서 잘 안돌아가는 경우가 많았다.

하지만 컨테이너를 사용하면 하드웨어 운영 구조, 베이스 플랫폼 등이 달라도 컨테이너에 애플리케이션에 적합한 환경을 미리 집어 넣어 놓은 상태이기 때문에 개발환경과 동일하게 돌아간다.

 

과거엔 Scale out시 서버를 늘리며 OS도 함께 확장되는 식이 었다면

컨테이너는 같은 OS 위에 다른 컨테이너 하나를 더 세우는 방식으로 하여 훨씬 효율적으로 확장이 가능하다.

 

시스템을 기능마다 작게 쪼개서 서비스를 만든 구조 MSA

개발부터 서비스운영까지 자동화시켜주는 DevOps 환경 

둘 모두 컨테이너가 적합하기 때문이다.

 


📍2. 설치하려면 뭐가 필요해?

  • Virtual Box를 이용해 우분투 서버, CentOS 서버에 도커 환경 설치
    - 가상 서버 만들기는 따로 정리하지 않고 영상보고 따라 진행
  • windows에 Docker Desktop 사용하기
 

Docker] 설치

📌 도커 다운로드 Docker: Accelerated, Containerized Application Development Docker is a platform designed to help developers build, share, and run modern applications. We handle the tedious setup, so you can focus on the code. www.docker.com 자신

littlezero48.tistory.com

리눅스 권한 관련

더보기

리눅스 계정 권한 주기: 

root계정으로 로그인해서 usermod 명령어로 (user modify) G 옵션으로 docker라는 그룹에 해당 계정을 추가해준다

usermod -a -G docker 계정이름

📍3. 컨테이너 속속들이 알아보자

컨테이너와 컨테이너 이미지의 구조를 알아보고 동작 방식을 이해해보자.

 

🧱 구조

  • 컨테이너는 1개 = Application 프로세스 1개
  • 컨테이너 끼리는 하드웨어 리소스가 완전 독립 (cpu, memory, network, disk, user 등이 모두 독립적)

컨테이너는 도커 데몬(dockerd) 위에 작동하며 도커 데몬이 실행되고 있는 리눅스 커널이 있는 시스템을 도커 호스트라고 한다. 도커 호스트 입장에서 컨테이너는 그냥 하나의 프로세스일 뿐이다. 

 

여러개의 레이어가 모여져 하나의 애플리케이션을 실행 시킬 수 있도록 하는 이미지들의 모음이 컨테이너 이미지이다. 

이 컨테이너 이미지가 메모리에 올라가 하나의 프로세스로 동작하게 되면 컨테이너가 된다. 

 

🦿 컨테이너 동작방식

  • $ docker search nginx > dockerd에게 요청 > Dockerhub에서 검색 > 이미지 검색 성공
  • $ docker pull nginx:latest > Dockerhub로 부터 nginx 컨테이너 이미지를 가져옴(이미지는 하나더라도 그 안의 레이어는 이미지마다 숫자도 구성도 다름)
  • $ docker run -d --name web -p 80:80 nginx:latest > 해당 컨테이너 이미지를 가지고 컨테이너를 생성해 dockerd 위에 올라가 작동하게 됨

 

🚩 잠깐 용어 정리

Docker Host : Docker Daemon이 동작하고 있는 시스템

Docker Daemon (dockerd) : 우리가 설치한 도커

Docker Client Command : docker daemon을 제어하는 명령어

Docker Hub : 도커 이미지 저장소

Container Images : 하나의 애플리케이션을 실행시키기 위해 모든 파일과 설정값을 지닌 파일

Container : 컨테이너 이미지가 실제로 동작하게 되어 하나의 프로세스가 되면 컨테이너

 

+ 구조 : https://littlezero48.tistory.com/273


🤖 실습

1️⃣ Docker Hub에서 컨테이너 이미지 검색

1. 일단 도커가 정상적으로 실행 중인지 확인

systemctl status docker

 

2. 이미지 검색

docker search 이미지명

nginx가 포함된 이미지들이 검색

우리는 그 중 하늘색 라인 이미지를 사용할 것

 


2️⃣ 컨테이너 이미지 다운로드 후 image layer 보기

1. 이미지 레이어를 보려면 root 계정으로 들어가야함 

su -

 

2. root 계정에서 라이브러리 > 도커 위치로 가 list를 보면 아래와 같은 디렉토리 리스트를 볼 수 있는데 여기서 overlay2가 바로 컨테이너 이미지 레이어가 들어간다.

아직은 이미지가 없어서 l 하나만 있음

 

3. 이미지 다운 받기

docker pull 이미지명

 

4. 이미지 다운 전 레이어 개수와 후를 비교해 보면 다운 받은 만큼 늘어난 걸 볼 수 있다.

뒤에 귀엽게 있는 l ㅋㅋㅋ

 


3️⃣ 컨테이너 실행하고 확인해보기 

1. 컨테이너 생성 및 실행

$ docker run --name web -d -p  80:80 nginx
  컨테이너
생성 및 실행
컨테이너
이름 옵션
임의 이름 백그라운드
(데몬 모드)
포트포워딩 호스트:컨테이너 이미지명

아래 랜덤문자열은 컨테이너 ID

2. 컨테이너 실행 확인

docker ps

 

3. 리눅스에서 페이지를 확인해보자

gui로 익숙한 그 모습은 아니지만 nginx 환영페이지 등장!

 

4. 삭제해보기

 

- 컨테이너 삭제

실행되고 있는 컨테이너는 삭제할 수 없음 먼저 중지

# 컨테이너 중지
docker stop 컨테이너이름|컨테이너ID

# 컨테이너 삭제
docker rm 컨테이너이름|컨테이너ID

 

- 이미지 삭제

root 계정에서 다시 overlay2 디렉토리를 보면 사라진 것 확인

 

 


➕ 공부자료 

0 ~ 3-2 까지

 

[따배도] 도커 시리즈

 

www.youtube.com

 

문제

📌 파이썬 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 :

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

 

📌 제한 사항

  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.

 

📌 입출력 예


풀이

추측) 

공백 단위로 배열을 자르고 앞자리를 대문자로 만들어 다시 문자열로 붙여준다.

마지막 인덱스가 아닐 경우에는 공백을 추가하여 붙여준다.

 

숫자는 소문자나 대문자나 같으니 첫문자가 숫자인 경우를 예외처리할 필요 없다.

아니 잠깐.. 공백문자가 여러개 나올 수 있다라...

 

소스코드) 

* 1차) 실패 : 44.4 (많은 런타임 에러)

def solution(s):
    answer = ''
    string_arr = [one.lower() for one in s.split(" ")]
    for i in range(0,len(string_arr)) :
        first_str = string_arr[i][0]
        answer += string_arr[i].replace(first_str, first_str.upper(), 1)
        if i != len(string_arr)-1 :
            answer += " "
        
    return answer

* 2차) 성공

def solution(s):
    answer = ''
    flag = False
    for one in s :
        if one == ' ' :
            flag = False
            answer += one
        else :
            if one != ' ' and flag == False :
                flag = True
                answer += one.upper()
            else :
                answer += one.lower()
        
    return answer

 

리뷰) 

 

1차 피드백)

1차에 일단 공백문자 여러개일 경우를 생각안하고 해본 경우는 44.4점.. 게다가 런타임 에러 흠

공백을 기준으로 자르기 보다는 문자 그자체를 판단하는 방식으로 가는게 맞을 거 같다.

방식을 완전히 바꿔 문자열 하나하나 판단하는 방법으로 해보자

 

2차에서는 flag를 하나 준다

공백을 만나면 false로 전환해서 그다음 만나는 문자가 첫문자다 라는 걸 알리는 방식

문자를 만나면 True로 전환해서 이미 첫문자를 만났다라는 것을 알린다

 

그래서 각 문자 하나하나 for문을 돌려서 공백과 문자열을 판별해가며 flag를 전환하고 

flag가 False라 아직 첫문자를 안 만난상태에 그리고 글자가 공백이 아닌 경우가 바로 첫글자라 판단하여 해당 문자를 대문자로 전환하고 나머지는 모두 소문자화 시킨다.

'Coding Test > Algorithm' 카테고리의 다른 글

Programmers] 프린터  (0) 2023.04.11
Programmers] n^2 배열 자르기  (0) 2023.04.03
Programmers] 공원 산책  (0) 2023.04.03
Programmers] 덧칠하기  (0) 2023.03.28
Programmers] 귤 고르기  (0) 2023.03.28

문제

📌 파이썬 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 :

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.

예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.

내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.

현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

 

📌 제한 사항

  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

 

📌 입출력 예


풀이

추측) 

나중에 같은 숫자끼리 위치정보 헷갈리지 않게 우선순위의 숫자들과 인덱스를 짝을 지어주고 다시 배열로 만듬

그리고 그 배열를 큐처럼 일단 front에서 하나 pop해서 우선순위의 맥스 값이랑 비교

맥스값이랑 동일하지 않으면

 -     다시 배열에 append해서 뒤로 보내고

맥스값이랑 동일하면 그대로 프린트!

 -     프린트된 순서 카운트를 올림

 -     우선순위에서 해당 숫자를 pop해주어 다음 순번을 찾을 수 있게 해준다.

 -     프린트가 됬을 때의 인덱스가 location과 일치한다면 그 카운트를 반환

 

소스코드) 

* 1차) 

def solution(priorities, location):
    answer = 0 
    queue = [(i,priorities[i]) for i in range(0,len(priorities))]
    
    while True: 
        one = queue.pop(0)
        max_num = max(priorities)
        if one[1] != max_num :
            queue.append(one)
        else :
            priorities.pop(priorities.index(max_num))
            answer += 1
            if location == one[0] :
                return answer

 

리뷰) 

우선순위에서 맥스값을 pop할 때 순간 그럼 같은 max값이 있는 경우엔 어떻게 하지라는 의문이 생겼었는데

생각해보니 모든 맥스값을 삭제하는 게 아니라 index함수는 가장 먼저 검색되는 인덱스 하나만을 검색해 주는거라

맥스값 여러개 있으면 처음꺼만 삭제하고 다시 max 함수를 하면 동일한 값이지만 다른 맥스값이 검색되므로 문제 없었다. 

'Coding Test > Algorithm' 카테고리의 다른 글

Programmers] JadenCase 문자열 만들기  (0) 2023.04.12
Programmers] n^2 배열 자르기  (0) 2023.04.03
Programmers] 공원 산책  (0) 2023.04.03
Programmers] 덧칠하기  (0) 2023.03.28
Programmers] 귤 고르기  (0) 2023.03.28

문제

📌 MySQL 로 풀이

 

📌 문제 링크 :

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 :

PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요.

 

📌 테이블 :

다음은 환자 정보를 담은 PATIENT 테이블과 의사 정보를 담은 DOCTOR 테이블, 그리고 진료 예약목록을 담은 APPOINTMENT에 대한 테이블입니다. PATIENT 테이블은 다음과 같으며 PT_NO, PT_NAME, GEND_CD, AGE, TLNO는 각각 환자번호, 환자이름, 성별코드, 나이, 전화번호를 의미합니다.

PT_NO VARCHAR(N) FALSE
PT_NAME VARCHAR(N) FALSE
GEND_CD VARCHAR(N) FALSE
AGE INTEGER FALSE
TLNO VARCHAR(N) TRUE

DOCTOR 테이블은 다음과 같으며 DR_NAME, DR_ID, LCNS_NO, HIRE_YMD, MCDP_CD, TLNO는 각각 의사이름, 의사ID, 면허번호, 고용일자, 진료과코드, 전화번호를 나타냅니다.

DR_NAME VARCHAR(N) FALSE
DR_ID VARCHAR(N) FALSE
LCNS_NO VARCHAR(N) FALSE
HIRE_YMD DATE FALSE
MCDP_CD VARCHAR(N) TRUE
TLNO VARCHAR(N) TRUE

APPOINTMENT 테이블은 다음과 같으며 APNT_YMD, APNT_NO, PT_NO, MCDP_CD, MDDR_ID, APNT_CNCL_YN, APNT_CNCL_YMD는 각각 진료 예약일시, 진료예약번호, 환자번호, 진료과코드, 의사ID, 예약취소여부, 예약취소날짜를 나타냅니다.

APNT_YMD TIMESTAMP FALSE
APNT_NO INTEGER FALSE
PT_NO VARCHAR(N) FALSE
MCDP_CD VARCHAR(N) FALSE
MDDR_ID VARCHAR(N) FALSE
APNT_CNCL_YN VARCHAR(N) TRUE
APNT_CNCL_YMD DATE TRUE

 


풀이

추측) 

예약 기준으로 해서 의사든 환자든 INNER JOIN해주면 될듯하다.

일단 예약에서 해당 조건이랑 안맞는거 먼저 row수 빼주고 inner하는 게 더 좋을 거 같아서 예약만 조건 출력하고

해당하는 의사, 환자 매칭되게 각각 inner join 해주면 될듯하다.

 

쿼리) 

* 1차) 성공

SELECT AP.APNT_NO, AP.PT_NAME, AP.PT_NO, AP.MCDP_CD, D.DR_NAME, AP.APNT_YMD
FROM 
    (SELECT A.APNT_NO, P.PT_NAME, P.PT_NO, A.MCDP_CD, A.MDDR_ID, A.APNT_YMD
     FROM (SELECT APNT_NO, PT_NO, MCDP_CD, MDDR_ID, APNT_YMD 
            FROM APPOINTMENT
            WHERE APNT_YMD LIKE '2022-04-13%' 
                AND MCDP_CD = 'CS' 
                AND APNT_CNCL_YN != 'Y'
         ) AS A # 필요없는 예약 먼저 필터링
    INNER JOIN PATIENT AS P
    ON A.PT_NO = P.PT_NO) AS AP
INNER JOIN DOCTOR AS D
ON AP.MDDR_ID = D.DR_ID
ORDER BY

 

* 2차) 성공: 위에 꺼가 너무 지저분해서 좀 정리

SELECT A.APNT_NO, P.PT_NAME, P.PT_NO, A.MCDP_CD, D.DR_NAME, A.APNT_YMD
FROM (SELECT APNT_NO, PT_NO, MCDP_CD, MDDR_ID, APNT_YMD 
      FROM APPOINTMENT
      WHERE APNT_YMD LIKE '2022-04-13%' 
         AND MCDP_CD = 'CS' 
         AND APNT_CNCL_YN != 'Y'
      ) AS A 					 # 필요없는 예약 먼저 필터링
INNER JOIN PATIENT AS P ON A.PT_NO = P.PT_NO
INNER JOIN DOCTOR AS D ON A.MDDR_ID = D.DR_ID
ORDER BY A.APNT_YMD ASC

 

리뷰) 

쿼리도 좀더 깔끔하게 쓸 수 있는 법을 많이 생각해봐야할 거 같다 

1차 쿼리 너무 지저분했음 ㅎㅎ..

📌 공부 계기

원티드 챌린지가 이번 달 제공하는 강의는 Docker! Docker 강의 총 4번 중 2번째 정리해보려고 합니다.

 

Docker 활용

목차

 

📍이론편 : Docker Compose

1️⃣ Docker Compose 란?

이 캐릭터가 docker Compose 역할 그자체를 설명해주는 느낌

도커 파일은 하나의 이미지를 생성하고 하나의 컨테이너를 실행하는데

여러개의 컨테이너를 제어하는 건 어떻게 할까? 그게 바로 도커 컴포즈의 역할이다. 

 

(공식 문서랑 친해지세요)

 

Overview

 

docs.docker.com

 

도커 컴포즈 파일은 도커 어플리케이션의 서비스, 네트워크 및 볼륨을 정의하는 yaml파일을 말한다. 

  • 도커 컨테이너를 일괄적으로 정의하고 제어
  • 설정 파일을 도커 CLI로 번역하는 역할도 한다.

 

2️⃣ Docker Compose 파일 구성

 

* version 

도커 컴포즈의 버전을 의미.
현재(230409 기준) version 3 이상을 사용

 

* services

실행하려는 컨테이너들을 정의하는 영역
컨테이너에 대한 이름, 이미지, 포트 매핑, 환경변수, 볼륨 등의 정보를 가지고 컨테이너를 생성하고 관리

 

    - image : 컨테이너의 베이스 이미지

    - build : 정의된 도커파일에서 이미지 빌드하고 서비스 컨테이너 생성

    - environment :  환경변수 설정 (run 명령어의 --env, -e 옵션과 동일)

    - command :  컨테이너가 실행될 때 수행할 명령어 (run 명령어 마지막 command와 동일)

    - depends_on : 컨테이너 간의 의존성 주입. 여기에 적힌 컨테이너가 먼저 생성되야 이 키워드가 실행

    - ports : 개방할 포트 지정 (run 명령어의 -p 와 동일)

    - expose : 링크로 연계된 컨테이너에게만 공개할 포트 설정

    - volumes : 컨테이너에 볼륨 마운트

    - restart : 컨테이너가 종료될 때 재시작 정책

          - no : 재시작 되지 않음

          - always : 외부에 영향에 의해 종료 되었을 때 항상 재시작 (수동으로 끄기 전까지)

          - on-failure : 오류가 있을 시 재시작

 

컴포즈 파일 구성

 

📢 참고

  • yaml 파일은 2칸씩 들여쓰기(indent) 해야함

 

 


📍실습편 1 : Dokcer CLI로 여러개 컨테이너 관리

도커 컴포즈 파일을 사용하지않고 하나하나 CLI로 해보는 실습

 

 

1️⃣ 도커 네트워크 리스트 조회 

network ls 명령어 (network list) 를 통해 network들을 조회

docker network ls

- bridge : 가상 네트워크로 도커 엔진에 의해 자동 생성된다. 컨테이너끼리 연결되는 기본 네트워크에 해당

- host : 호스트 컴퓨터의 네트워크 인터페이스를 그대로 사용하는 네트워크

- none : 네트워크를 사용하지 않는 컨테이너  

 


 

2️⃣ 사용하지 않는 도커 네트워크 삭제 

prune[각주:1] 명령어를 사용해 사용하지 않는 네트워크를 삭제한다.

docker network prune

 


 

3️⃣ 도커 네트워크 생성 

docker network create 네트워크이름

 


3️⃣ 도커 CLI로만 컨테이너 설정 

CLI만으로도 컴포즈가 하는 기능을 다 할 수 있지만

하나 컨테이너 마다 이런 다양한 옵션을 명령어로 길게 타이핑해야하고 관리하기도 힘들다. 

그래서 도커 컴포즈가 필요하다! 

db 컨테이너

 

app 컨테이너

 

 

 


📍실습편 2 : Dokcer Compose로 여러개 컨테이너 관리

 

1️⃣ 컴포즈 파일 사용 

사용하려는 컴포즈 파일이 있는 디렉토리로 들어가 아래 명령어를 치면 한번에 모든 것이 된 걸 확인할 수 있다.

# 형식 : docker-compose -f 파일명 커맨드
docker-compose -f docker-compose.yml up --build
  1. docker-compose : 명령어를 통해 컴포즈 파일 실행
  2. f 옵션 : 실행할 compose 파일을 지정
  3. up : 실행시켜라
  4. --build : 이미지 생성

이미지도 컨테이너도 모두 생성된 모습
워드프레스도 정상 작동 확인

 

📢 참고

  • 컴포즈 파일이 docker-compose.yml 이라면 f 옵션 사용없이 가능하지만 파일명이 다르면 꼭 -f 를 통해 지정해줘야 함
  • f옵션은 멀티가 가능해 하나의 명령어에서 여러번 사용 가능
docker-compose -f 컴포즈파일1 -f 컴포즈파일2 명령어 
# docker compose [-f <arg>...] [--profile <name>...] [options] [COMMAND] [ARGS...]

 

 


➕ 추가 내용

 

* 실행중인 여러 컨테이너 모두 stop하기 

docker stop $(docker ps -aq)

- a : (all) 실행 중인 모든 컨테이너 보여주기

- q : (quiet) 오직 컨테이너 ID들만 보여주기

따라서 $는 변수이고 docker 실행중인 프로세스 컨테이너의 id만 출력해 와 그 id로 모두 stop 시키는 명령어 

 


 

* compose 파일로 여러 컨테이너 동시 명령어 적용하기 

docker-compose -f 파일명 커맨드

컨테이너 start
컨테이너 stop

😮 심지어 rm도 됨!

오오오

 


 

* Docker Compose 파일명이 docker-compose.yml 이라면 

아래처럼 -f 옵션 없이도 가능! 

 


 

* run 실행시 명령 프롬프트 사용하려면? 

run 실행하고 나서 터미널을 사용 못하는 문제점이 있었다.

하지만 run할 때 d 옵션으로 run하면 데몬모드로 전환되어 명령 프롬프트로 돌아갈 수 있다!

 

 

 

 

  1. prune
    제거하다.
    불필요한 가지치다.
    말린자두 그 프룬도 맞다
    [본문으로]

+ Recent posts