📌 공부 계기

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

목차

 

📍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. 여러 개발언어를 사용하여 프로그래밍하는 것 [본문으로]

📌 공부 계기

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

목차

 

📍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

 

📌 공부 계기

원티드 챌린지가 이번 달 제공하는 강의는 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
    제거하다.
    불필요한 가지치다.
    말린자두 그 프룬도 맞다
    [본문으로]

📌 공부 계기

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

 

Docker 강의 1 : 

목차

     

    📍이론편 : 도커 개념

    * 도커 공식 홈페이지

     

    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

    도커 이론 편은 이전 도커 개념을 정리한 포스팅에 고병현님의 강의내용을 추가해 정리

     

    Docker] 개념

    📌 공부 이유 실전 프로젝트하면서 백엔드를 고도화하면서 여러기술에 도전해보고 있다. Docker도 그 중 하나로, 이름만 알고 뭐하는 녀석인지 전혀 몰랐기 때문에 먼저 개념을 공부해보고 실습

    littlezero48.tistory.com

     

     

    📍실습편 1 : 기본 CLI

    공식 홈페이지의 Command-line reference (공식 홈페이지를 공부하자!)

     

    Docker run reference

     

    docs.docker.com

     

    0️⃣ 사전 준비 

    더보기

     

    📢 참고 : 저는 윈도우에 리눅스를 사용할 수 있게 하는  WSL2 설치한 환경에서 진행 했습니다. 

     

    * 파워쉘에서 명령어 wsl 접속 or Ubuntu on Windows 실행

    * Docker Desktop 실행도 해줘야 함

    파워쉘 경우
    Ubuntu on Windows 실행

     


     

    1️⃣ 도커 이미지 다운로드 

    - Docker hub로 부터 httpd 이미지를 다운받아 본다 

    docker pull 이미지이름

     

    - pull하고 나서 이미지 조회 하면 추가된 걸 확인 할 수 있다

     


     

    2️⃣ 이미지를 통해 컨테이너 생성 

    - run 명령어를 통해 해당 이미지에 대한 컨테이너 생성

    * 주의 : httpd 같은 경우 run 시키면 이 화면을 더 이상 사용할 수 없게 된다. 화면을 분할해서 이후 명령어를 사용해보자

    (아니면 d 옵션을 함께 주어 데몬모드로 run!)

    더보기

    ✅ 화면 분할 방법

     방법1) 탭 타이틀에서 오른쪽 클릭 (단, 세로 -> 가로 -> 세로 -> ... 식으로 분할)

     

    방법2) Ctrl + Shift + P 로 명령 도구 모음을 실행해서 

     

    추가할 방향을 선택해 클릭

     

    결과 

     

     

    - 컨테이너 실행 확인 (이름 설정을 안하면 container name은 임의로 결정됨)

    docker ps

     

    - 이름옵션을 사용해 컨테이너 이름을 설정하고 컨테이너 생성 (secondContainer 라는 이름으로)

    docker run --name 컨테이너이름 사용할이미지이름

    지정이름으로 생성 확인! 그리고 run으로 하면 무조건 새로 컨테이너 생성

     


     

    3️⃣ 컨테이너의 포트와 연동시키기 (Port Forwarding)[각주:1]

    - 컨테이너 생성시 p 옵션으로 LocalPort : ContainerPort 로 해서 포트를 연결한다.

    docker run -p 로컬포트:컨테이너포트 --name 컨테이너이름 사용할이미지이름

    포트포워딩이 된 걸 확인
    아파치 서버(포트80) 기본 페이지 데이터가 서빙된 걸 확인

     


     

    4️⃣ 이미지 내부의 파일을 교체하기 

    - 교체하려는 파일이 있는 디렉토리로 찾아감

     

     - 해당 디렉토리에 대해 VScode 실행

    code .

     

    - 위 경로의 index.html을 서빙하도록 교체하고 싶다! 

    v 옵션을 통해서 볼륨 마운트가 가능한데 이게 이미지의 파일을 호스트의 파일로 덮어씌우는 걸 말한다. 

     

    여기서 -v HostPath : ContainerPath 로 앞의 HostPath는 덮어씌울 파일이 있는 경로로 

    내가 덮어씌우려는 경로는 아래 그림의 하늘색 글자 부분과 같다. 

    호스트 경로 방식 적용은 윈도우랑 우분투랑 다르니 참고!

    우분투의 home/계정/ 아래부터 경로 시작
    윈도우 경우는 절대경로
    다른 index.html로 적용된 모습

     


     

    5️⃣ 컨테이너 STOP 

    docker stop 컨테이너ID 
    docker stop 컨테이너이름

    컨테이너 ID로 정지
    컨테이너 이름으로 정지

     


     

    6️⃣ 컨테이너 START 

    run 처럼 컨테이너 생성과 동시에 실행하는 게 아닌 멈춤 컨테이너를 다시 실행시키는 명령어

     

    - 일단 docker ps가 실행되고 있는 컨테이너만 조회했다면 여기에 -a 옵션 (all)을 붙여 실행여부와 상관없이 생성되어있는 모든 컨테이너를 조회한다.

    docker ps -a

     

    - 실행

    STATUS를 보면 Exited 에서 Up으로 변경되며 실행

    docker start 컨테이너ID 
    docker start 컨테이너이름

    컨테이너 ID로 실행
    컨테이너 이름으로 실행

     


     

    7️⃣ 컨테이너 제거 

    rm 명령어 (remove) 를 사용해 컨테이너 제거 

    docker rm 컨테이너ID 
    docker rm 컨테이너이름

    둘다 지우고 나니 ps -a 시 아무것도 안나오는 것 확인!

     

     

    + 참고로 실행 중인 컨테이너는 삭제할 수 없다. stop으로 정지하고 지울 것

     


     

    8️⃣ 이미지 제거 

    rmi 명령어 (remove image) 를 사용해 이미지 제거

    docker rmi 이미지이름

    이미지 삭제 확인

     

    + 이미지 역시 이 이미지를 사용하는 컨테이너가 존재한다면 지울 수 없다. 해당 이미지를 사용하는 컨테이너를 모두 지워야 제거 가능

     

     

     

    📍실습편 2 : 커스텀 이미지 생성

     

    Dockerfile reference

     

    docs.docker.com

     

    실습 내용

    httpd 이미지를 pull 받아 실습 1때 처럼 index.html을 교체하고 포트포워딩까지 해서 run 하는 이미지를 생성

     

    1️⃣ 도커 파일 생성 

    도커파일은 yaml(야믈)파일로 만들어진다 

    yaml파일 명령어는 ARG(환경변수), From(베이스이미지), CMD(명령 실행) 등이 있는데 위의 공식 홈페이지에 더 많이 있다. 이번은 간략하게 3가지 명령어 만을 사용하여 실습!

     

    * 도커파일

    FROM : httpd:latest 이미지를 베이스로

    COPY : host 현재 경로의 index.html 파일을 컨테이너의 /usr/local/apache2/htdocs/index.html의 경로로 복사한다

    EXPOSE : 그리고 80포트를 연다

     

     


     

    2️⃣ 도커 이미지 생성 

    build 명령어로 이미지를 생성하며 새로 생성하는 이미지는 -t 옵션 (tag)을 통해 이미지 이름이 설정되고 

    경로 경우 현재 경로로 부터의 위치를 말하는 것으로 이미 그 위치에 있었기 때문에 . 으로 표현

    docker build -t 이미지이름 경로

    보면 설정한 태그로 이미지가 생성된걸 확인할 수 있다

     


    3️⃣ 커스텀한 이미지 실행 

    포트포워딩해서 컨테이너 생성 및 실행
    확인

    볼륨 마운트 과정없이 바로 커스텀 index.html로 적용된 걸 볼 수 있다.

     

    이런식으로 만든 것을 docker hub에 올려 언제든 다운받아 사용도 가능하다.

     

     

     


    첫번째 강의 끝


    1. 포트포워딩이란?
      외부 주소와 내부 주소를 이어주는 것 [본문으로]

    + Recent posts