해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

Docker Compose


  • 여러 컨테이너를 일괄적으로 정의하고 실행할 수 있는 툴
    • 하나의 서비스를 운영하기 위해서는 여러개의 애플리케이션이 동작해야함.
    • 컨테이너화 된 애플리케이션들을 통합 관리할 수 있음
    • 옵션을 기존 명령어 형태가 아닌 yaml의 문법에 맞춰서 작성하면 docker compose가 컨테이너 관리

https://docs.docker.com/compose/install/linux/#install-the-plugin-manually

 

Install the Compose plugin

Download and install Docker Compose on Linux with this step-by-step handbook. This plugin can be installed manually or by using a repository.

docs.docker.com

Docker Compose로 컨테이너 실행


몇가지 example:

https://docs.docker.com/guides/workshop/08_using_compose/#use-docker-compose

 

Use Docker Compose

Using Docker Compose for multi-container applications

docs.docker.com

version compose 버전. 버전에따라 지원 문법이 다름

version: “2”
port 컨테이너가 공개하는 포트 나열

web:
  image: httpd:latest
  port:
    - 80
    - 8443:443
services 컴포즈를 이용해서 실행할 컨테이너 옵션 정의.

service:
  webserver:
    image: nginx
  db:
    image: redis
link 다른 컨테이너와 연계할 때 연계할 컨테이너 지정.

webserver:
  image: wordpress:latest
  link:
    db: mysql
build 컨테이너 빌드

webapp:
  build: .
expose 포트를 링크로 연계된 컨테이너에게만 공개할 포트

webapp:
  build: .
image compose를 통해 실행할 이미지를 지정.

webapp:
  image:
    centos:7
volumes 컨테이너에 볼륨을 마운트

webapp:
  image: httpd
  volumes:
    - /var/www/html
command 컨테이너에서 실행될 명령어 지정

app:
  image: node:12-alpine
  command: sh -c “yarn install && yarn run dev”
environment 컨테이너에 적용할 환경변수를 정의

database:
  image: mysql: 5.7
  environment:
    MYSQL_ROOT_PASSWORD: pass
restart 컨테이너가 종료될 때 적용할 restart 정책
no: 재시작 되지 않음
always: 컨테이너를 수동으로 끄기 전까지 항상 재시작
on-failure: 오류가 있을 시에 재시작.

database:
  image: mysql:5.7
  restart: always
depends_on 컨테이너 간의 종속성을 정의.
정의한 컨테이너가 먼저 동작되어야 함.

services:
  web:
    image: wordpress:latest
  depends_on:
    - db
  db:
    image: mysql

1. 서비스 디렉토리 설정

mkdir webserver
cd webserver

2. docker-compose.yml 생성

cat > docker-compose.yml
version: "3"
services:
  web:
    image: httpd:latest
    ports:
      - "80:80"
    links:
      - mysql:db
    command: apachectl -DFOREGROUND
  mysql:
    image: mysql:latest
    command: mysqld
    environment: MYSQL_ROOT_PASSWORD: pass

3. docker-compose 명령어

docker-compose up -d # 실행시켜줘. (백그라운드로 -d)
docker-compose ps # 현재 디렉토리의 컨테이너 상태 확인
docker-compose scale mysql=2 # MySQL 컨테이너 두개로
docker-compose ps
docker-compose down # 컨테이너 완전히 종료
### 이외에도 많은 명령어가 있음..

빌드에서 운영까지


  1. 서비스 디렉토리 생성
  2. 빌드 파일 생성
  3. yaml 파일 생성
  4. 도커 컴포즈 실행

'CICD > docker' 카테고리의 다른 글

[Docker] Container 간 통신  (2) 2024.06.19
[Docker] Container Storage  (0) 2024.06.18
[Docker] Container 관리  (0) 2024.06.17
[Docker] Container 사용하기  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17
해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

Container 통신


컨테이너 네트워크 도식화

  • docker daemon이 start하게 되면 docker0라는 도커 네트워크 인터페이스가 생김.
    • virtual ethernet bridge: 172.17.0.0/16
      • bridge network: 컨테이너의 IP와 실제 물리 장비가 가지고 있는 IP연결
    • L2 통신기반
    • container 생성 시 veth 인터페이스 생성
    • 모든 컨테이너는 외부 통신을 docker0를 통해 진행(컨테이너가 생성되면 가상 IP가 +1씩 되면서 생성)
    • container running 시 172.17.X.Y로 IP 주소할당(IP 주소 변경 및 포트포워딩 기능 제공)
    • 컨테이너가 통신하게되면 bridge network가 gateway의 역할을 하므로 호스트의 IP로 변환(NAT 지원)해서 외부로 통신할 수 있도록 도와줌.
ip addr #docker0 ip 확인
brctl show #bridge interface 확인

docker run -it --name c1 busybox # 첫번째 컨테이너 아마도 docker0 ip + 1
ip addr

docker run --it --name c2 busybox # 두번째 컨테이너
docker run -d -p 80:80 --name web1 nginx

curl 172.17.0.4 # => nginx 연결.

# docker0 가 NAT 서비스 지원
iptables -t nat -L -v

Container 포트 외부 노출


  • port-forwarding
    • container port를 외부로 노출시켜 외부 연결 허용
    • iptables rule을 통한 포트 노출
      • -p hostPort:containerPort
      • -p containerPort => 랜덤 포트:containerPort 매핑
      • -P => 랜덤 포트 자동 생성
    • docker run --name web -d -p 80:80 nginx:1.14
    • iptables -t nat -L -n -v
      • 도커 IP와 외부 IP 테이블 확인
docker run --name web -d -p 80:80 --name web1 nginx:1.14
curl localhost:80 # 연결 가능.

docker run --name web -d -p 80 --name web2 nginx:1.14
docker ps # 외부에서 들어올 수 있는 포트 확인. 현재는 29154 -> 80

docker run --name web -P --name web3 nginx:1.14 # 도커 파일에 정의된 EXPOSE 80(만약 이게 90이였다면)
docker ps # 외부에서 들어올 수 있는 포트 확인. 현재는 29154 -> 80(얘가 90이 될 것)

Container 네트워크 추가


네트워크 추가

  • docker0에 ip static으로 부여 X
  • user-defined bridge network(myent) 생성
    • --subent을 생략하게 되면 172.18.X.Y로 자동생성
    • --gateway를 고정할 수도 있지만 생략하면 172.18.X.1
    • --ip: static ip 설정 가능
    • --net <bridge networkName>하면 해당 bridge 네트워크에 파생된 컨테이너 생성
docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.254 mynet
docker network ls

docker run -d --name web -p 80:80 nginx:1.14
curl local host

docker run -d --name appjs --net mynet --ip 192.168.100.100 -p 8080:8080 smlinux/appjs # --net mynet. mynet을 사용하겠다.
curl localhost:8080

Container 간 통신


컨테이너간 통신

  • --link: 두 컨테이너 연결<containerName>:<aliasName>
docker run -d --name mysql -v /dbdata:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=wordpress 
-e MYSQL_PASSWORD=wordpress mysql:5.7

docker ps
cd /dbdata

docker run -d --name wordpress --link mysql:mysql 
-e WORDPRESS_DB_PASSWORD=wordpress -p 80:80 wordpress:4

 

 

'CICD > docker' 카테고리의 다른 글

[Docker] 빌드에서 운영까지  (0) 2024.06.19
[Docker] Container Storage  (0) 2024.06.18
[Docker] Container 관리  (0) 2024.06.17
[Docker] Container 사용하기  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17
해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

Container Volume


  • 컨테이너 이미지는 read-only(컨테이너로 올리면 수정가능)
  • 컨테이너에 추가되는 데이터들은 별도의 RW 레이어에 저장.
    • RO 와 RW 하나같이 보이게 하는 시스템 ⇒ union file system
  • 컨테이너에 추가되는 이미지는 별도의 레이어에서 생성

Data보존


  • rw(/var/lib/mysql)에 저장. ⇒ 대신에 특정 저장소에 저장하도록.(/dbdate) 호스트의 DB 데이터 영구보존
  • docker run -d --name db
    -v /dbdata:/var/lib/mysql => 디스크에 저장하도록
    -e MYSQL_ALLOW_EMPTY_PASSWORD=pass
    mysql:latest
  • -v <hostpath>:<container mount path>(/var/lib/mysql 내용을 hostpath에 저장)
    -v <hostpath>:<container mount path>:<read write mode>
    -v <container mount path>
    (/var/lib/docker/volume/UUID/_data 디렉토리에 저장)
  • docker run -v /webdata:/webdata -d —name df smlinux/df:latest
    docker run -d -v /webdata:/usr/share/nginx/html:ro -d ubuntu:latest

컨테이너끼리 데이터 공유하기


  • df 명령어: 디스크 사용량을 모니터링할 때 사용

10초마다 디스크 사용량을 index.html에 작성하는 code

cat df.sh

#!/bin/bash
mkdir -p /webdata
while true
do
	df -h / > /webdata/index.html
	sleep 10
done

컨테이너 빌드

# dockerfile
FROM ubuntu:18.04
ADD df.sh /bin/df.sh
RUN chmod +x /bin/df.sh
ENTRYPOINT ["/bin/df.sh"]

도커 실행

docker run -d -v /webdata:/webdata —name df smlinux/df:latest

'CICD > docker' 카테고리의 다른 글

[Docker] 빌드에서 운영까지  (0) 2024.06.19
[Docker] Container 간 통신  (2) 2024.06.19
[Docker] Container 관리  (0) 2024.06.17
[Docker] Container 사용하기  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17
해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

Container 하드웨어 리소스 제한


  • 기본으로 컨테이너는 호스트 하드웨어 리소스의 사용제한을 받지 않음.
    • 컨테이너가 필요한만큼 할당해야 함.
  • docker command를 통해 제한할 수 있는 리소스
    • CPU
    • Memory
    • Disk io
    • docker run --help를 통해 확인 

Memory 리소스 제한

  • 제한 단위 b(byte), k(KB), m(MB), g(GB)
  • --memory, -m
    • 컨테이너가 사용할 최대 메모리양 지정
    • 할당된 것보다 더 많은 메모리 사용시 죽어버림
  • --memory-swap
    • 컨테이너가 사용할 스왑 메모리 영역에 대한 설정
    • 메모리 + 스왑 메모리
    • 생략시 메모리의 2배가 설정
  • --memory-reservation
    • --memory 값보다 작은 값으로 구성하는 소프트 제한 값 설정
  • --oom-kill-disable
    • OOM Killer가 프로세스 kill하지 못하도록 보호

CPU 리소스 제한

  • --cpus
    • 컨테이너에 할당할 CPU core 수 설정
    • --cpus="1.5" 컨테이너가 최대 1.5개의 CPU 파워 사용 가능
    • 연산 작업이 많은 컨테이너에 cpu 수를 늘리면 좋음.
  • --cpuset-cpus
    • 컨테이너가 사용할 수 있는 CPU나 코어를 할당. cpu index는 0부터
    • --putset-cpus=0-4
  • --cpu-share
    • 컨테이너가 사용하는 CPU 비중을 1024 값을 기반으로 설정.
    • --cpu-share 2048 기본값보다 두배 많은 CPU 자원 할당.

Block IO 제한

  • --blkio-weight, --blkio-weight-device
    • Block IO의 Quota를 설정할 수 있으며 100~1000까지 선택
    • default 500
  • --device-read-bps, --device-write-bps
    • 특정 디바이스에 대한 읽기와 쓰기 작업의 초당 제한을 kb, mb, gb 단위로 설정
  • --device-read-iops, --device-write-iops
    • 컨테이너의 read/write 속도의 쿼터를 설정.
    • 초당 quota를 제한해서 IO를 발생시킴. 0이상의 정수로 표기
    • 초당 데이터 전송량 = IOPS * 블럭 크기(단위 데이터 용량)

컨테이너 사용 리소스를 확인하는 모니터링 툴


  • docker monitoring commands
    • docker stat: 실행중인 컨테이너의 런타임 통계
      • docker stats [options] [container]
    • docker event: 도커 호스트의 실시간 event 정보를 수집해서 출력
      • docker events -f container=<MAME>
      • docker image -f container=<MAME>
  • docker monitoring application

'CICD > docker' 카테고리의 다른 글

[Docker] Container 간 통신  (2) 2024.06.19
[Docker] Container Storage  (0) 2024.06.18
[Docker] Container 사용하기  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17
[Docker] Docker Container 만들기  (0) 2024.06.17
해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

현재까지 프로세스


Container Image 관리


  • Container Life Cycle에 관한 내용
  • 이미지 검색: docker search [option] <imageName:tag>
  • 이미지 다운로드: docker pull [option] <imageName:tag>
    • <imageName:tag> 이름으로 repository에서 관리.
    • 같은 버전이여도 이름이 다르면 repository에서 따로 저장됨.
    • Image는 imageID로 구분하기에 같은 imageId를 가진 두개의 image가 생성됨.
  • 다운받은 이미지 목록 출력: docker images
  • 다운받은 이미지 상세보기: docker inspect [option] <containerName>
  • 이미지 삭제: docker rmi [option] <imageName:tag>

Container 실행 Life Cycle


  • docker host에 다운받은 이미지를 컨테이너화: docker create [option] <imageName:tag>
    • 기본이 백그라운드에서 동작
    • docker create --name webserver nginx:1.14
  • docker daemon에 컨테이너 실행: docker start [option] <container>
    • create 상태인 컨테이너를 running
    • docker start webserver
  • 컨테이너 생성 및 실행: docker run [option] <imageName:tag>
    • pull -> create -> start를 한번에 실행해주는 명령어.
    • docker run --name webserver -d nginx:1.14
  • 실행중인 컨테이너 확인: docker ps [option]
    • docker ps
  • 실행중인 컨테이너 상세보기: docker inspect [option] <imageName:tag>
    • ip addr, layer, resource 등등을 보여줌
    • docker inspect webserver
  • 동작중인 컨테이너 중지: docker stop [option] <container>
    • docker stop webserver
  • 컨테이너 삭제: docker rm [option] <container>
    • running 중인 컨테이너는 삭제 불가
    • docker rm webserver

Container 확인


  • 컨테이너 동작되는 프로세스 확인: docker top [option] <container>
    • docker top webserver
  • 현재 컨테이너의 Log 정보확인: docker logs [option] <container>
    • docker logs webserver
  • 현재 컨테이너에 추가 명령어 실행: docker exec [option] <container>
    • docker exec webserver /bin/bash
  • foreground로 실행중인 컨테이너에 연결: docker attach [option] <container>
    • docker attach centos

Example


ip 부분은 가렸습니다

 

'CICD > docker' 카테고리의 다른 글

[Docker] Container Storage  (0) 2024.06.18
[Docker] Container 관리  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17
[Docker] Docker Container 만들기  (0) 2024.06.17
[Docker] Container 개념  (0) 2024.06.17
해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

컨테이너 대상


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

  • 개발한 프로그램과 실행환경을 모두 컨테이너화
  • MSA 환경의 Polyglot 애플리케이션 운영
💡 MSA(Micro Service Architecture)
짧은 life Cycle을 가진 요즘 프로그래밍들에 대해 재빠른 대응 가능

컨테이너 만드는 법 => DockerFile


  • Container를 만들 수 있도록 도와주는 명령어 집합.
  • Dockerfile을 통해서 컨테이너 build!

Dockerfile

  • 쉽고 간단하고 명확한 구문을 가진 text file로 Top-Down 해석.
  • 컨테이너 이미지를 생성할 수 있는 instruction을 가짐.
  • 대소문자를 구분하지 않으나 가독성을 위해 사용
# 디렉토리 생성
mkdir build
cd build

# 실행파일 작성
vi hello.js

# 도커파일 작성
vi dockerfile

# 도커파일 내용
FROM node:12 # base image 생성
COPY hello.js / # 컨테이너의 루트 디렉토리에 hello.js 복사
CMD ["node", "/hello.js"] # 실행

# image 생성
docker build -t imagename:tag .;
docker build -t hellojs:latest .;

Dockerfile 문법

더보기

FROM

  • 베이스 이미지 지정 명령
  • Dockerfile에 무조건 있어야하는 명령어.

LABEL

  • 메타 데이터를 넣을 수 있는 기능
  • =을 기준으로 저자, 버전, 설명, 작성일자를 key를 왼쪽으로 value를 오른쪽에 작성

CMD

  • 컨테이너 동작시 자동으로 실행할 서비스나 스크립트 지정

RUN

  • 이미지 생성시, base image에서 실행할 command

COPY

  • 컨테이너 빌드 시 호스트 파일을 컨테이너로 복사

ADD

  • 컨테이너 빌드시 호스트의 (tar, url)을 컨테이너로 복사

ENV

  • 컨테이너 내의 환경변수 설정

USER

  • 명령 및 컨테이너 실행시 적용할 유저 설정

WORKDIR

  • 이미지 내에서 특정 폴더로 이동하기 위해서 쓰는 명령

EXPOSE

  • docker 컨테이너의 특정 포트를 외부에 오픈하는 설정
  • docker run -p 옵션과 유사. -p옵션과 다르게 매핑은 해주지 않고 외부에 포트를 여는 역할만.

VOLUME

  • 컨테이너내의 특정 디렉토리를 컨테이너 외부 경로에 마운트

컨테이너 배포


  • docker build -t hellojs:latest .
    • docker host에서 container 이미지 생성
    • image name은 hellojs tag는 latest
  • docker login
    • 인증
  • docker push hellojs:latest
    • docker hub에 push

nodejs 기반 애플리케이션 컨테이너 만들기


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


  • docker login
    • docker hub에 로그인
  • docker <userID>
  • docker tag <oldname> <newName>
    • image 바꾸기

  • docker push <userId>/<images>:<tag>
    • user 계정으로 container 이미지 업로드.

 

'CICD > docker' 카테고리의 다른 글

[Docker] Container 사용하기  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17
[Docker] Container 개념  (0) 2024.06.17
[Docker] Docker 설치  (0) 2024.06.16
[Docker] Container를 쓰는 이유  (2) 2024.06.14
해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

요구사항

💡 CPU: 2core, memory: 2GB이상
컴퓨터: (bareMetal 또는 Virtual Machine)
운영체제 필수

Virtualbox 설치 / VM 생성


VirtalBox 다운로드 후 설치

https://www.virtualbox.org/

 

Oracle VM VirtualBox

Welcome to VirtualBox.org! News Flash New May 3rd, 2024VirtualBox 7.0.18 released! Oracle today released a 7.0 maintenance release which improves stability and fixes regressions. See the Changelog for details. New April 16th, 2024VirtualBox 7.0.16 released

www.virtualbox.org

으로 이동 후 설치.

VirtualBox-Network 구성

  • NAT 네트워크 추가: 파일 - 환경설정 - 네트워크 - 추가
  • 네트워크 이름: localNetwork
  • 네트워크 CIDR: 10.100.0.0/24
  • DHCP 지원
  • 포트포워딩
    • 이름, 프로토콜, 호스트IP, 호스트포트, 게스트IP, 게스트포트 구성.
    • ex) docker1, TCP, 127.0.0.1, 105, 10.100.0.105, 22

가상머신 만들기

  • docker-ubuntu
    • CPU(2core), Memory(2GB), network(localNetwork), disk(20GB)
  • docker-centos
    • CPU(2core), Memory(2GB), network(localNetwork), disk(20GB)

Ubuntu 20.04 설치


https://ubuntu.com

 

Enterprise Open Source and Linux | Ubuntu

Ubuntu is the modern, open source operating system on Linux for the enterprise server, desktop, cloud, and IoT.

ubuntu.com

접속 후 ubuntu 설치.

시스템 -> 마더보드 -> 기본메모리 4GB로 설정(4096MB)

저장소 -> disk file -> 방금 설치한 파일 선택

시동디스크 -> iso 파일로 설치.

이후 리눅스 설치와 동일.

도커 설치


https://docs.docker.com/engine/install/

 

Install Docker Engine

Learn how to choose the best method for you to install Docker Engine. This client-server application is available on Linux, Mac, Windows, and as a static binary.

docs.docker.com

접속 후 운영체제에 맞게(ubuntu 20.04) docs 확인.

설치방법

Repository를 이용하여 직접 설치

# 오래된 도커 버전 지우기
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# apk setup
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# latest 버전 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 설치되었는지 확인
sudo docker run hello-world

# 도커 시작
systemctl start docker
docker version

# 도커 나가기
exit

# 도커 확인
docker ps
systemctl status docker

계정 추가

docker ps 명령어가 (권한문제로)동작안할 시 권한 추가

# 이후 암호 입력
su - 

# 권한추가
usermod -a -G docker <username>

su - <username>

 

'CICD > docker' 카테고리의 다른 글

[Docker] Container 사용하기  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17
[Docker] Docker Container 만들기  (0) 2024.06.17
[Docker] Container 개념  (0) 2024.06.17
[Docker] Container를 쓰는 이유  (2) 2024.06.14
해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

Container


시대가 바뀌어 가면서 애플리케이션은 점점 커지면서 소프트웨어 운영 플랫폼이 바뀜.

하드웨어는 용량은 커지고, 싸지며 성능 또한 좋아짐.

소프트웨어 운영 플랫폼이 바뀌는 중

소프트웨어 운영 플랫폼

  • Bare Metal
    • 하나의 시스템의 OS 위에 여러개의 Application을 띄워서 사용하는 형식. 
    • 예전 시스템 및 애플리케이션들은 용량을 많이 차지 하지 않았기 때문에 하나의 컴퓨터에서 동작하기도 충분했었음.
  • Virtualization(HypervisorX)
    • Virtal Machine을 이용하여(하나의 컴퓨터) 새로운 Application을 띄우는 형식.
    • 하나의 컴퓨터에서 가상 머신을 사용하여 여러개의 프로그램이 여러개의 컴퓨터에서 돌아가도록 하는 형식.
    • 하지만 가상화 플랫폼은 Scale-in / Scale-out 기능이 어려웠음.
  • Any Infrastructure
    • 하나의 서버를 여러개 띄우는 Scale-out / Scale-in 구조 적용 가능.
    • OS 위에 Container Engine
      • Docker는 Container Engine 중에 하나
      • container platform을 사용.
    • Container는 아주 적은 용량만 차지.
    • isolate된 공간에서 작동. => 확장 및 배포가 쉬움.

Container의 역할

Container 도식화

Container는 즉 App을 실행시키는 환경을 세팅하는 것.

App을 실행하는데 필요한 library, SW Platform(node.js, java 등...) 등을 독립된 공간에 대한 환경을 세팅해줌.

리눅스에서 돌려야 하는 이유


컨테이너는 리눅스의 커널 기능을 사용해야 함.

  • chroot
    • 독립된 공간 형성
  • namespace
    • isolate 기능 지원(6가지 독립 컨테이너를 위한 공간)
  • cgroup
    • 필요한만큼 HW 지원
  • 세가지 명령어로 커널 + 컨테이너를 만듦.
  • 리눅스 커널을 도커 플랫폼(컨테이너 플랫폼)에서 사용할 수 있도록 해주는 것이 컨테이너 엔진
💡 리눅스가 아닌 환경에서 docker를 실행하려면??
windows, macos에서는 Hypervisor(리눅스를 돌릴 가상환경) 활성화 후 그 위에 컨테이너 띄우기

프로그램 VS 컨테이너


하는 일은 프로그램과 컨테이너 둘이 같지만 구조가 다름.

// cat app.js

const http = require('http');
const os = require('os');
console.log("Test server starting...");
var handler = function(req, res) {
	res.writeHead(200);
	res.end("Container Hostname: " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);

이러한 코드가 있을 때

일반 프로그램

  • 일반 프로그램 
    • 해당 app.js를 실행시키기 위해
    • (운영체제에 맞는) node.js를 설치
    • 그 위에서 app.js 실행

컨테이너

 

  • 컨테이너
    • 컨테이너 구축 환경 설정
    • node 기반, app.js 실행
# DockerFile
FROM node:12
COPY app.js /app.js
ENTRYPOINT ["node", "app.js"]

 

Container를 사용하는 이유


개발자가 만든 프로그램이 어디서든 동작하도록.

운영환경과 배포환경이 다르기때문에 hw가 다르면 동일하게 돌아가지 않을 수 있음.

컨테이너화를 시키면 개발자가 만든 환경으로 어디서든 돌아갈 수 있음.

확장/취소가 쉽고, MSA, DevOps에 적합

컨테이너는 용량이 작음. 

작은 용량 덕분에 서비스 연속성 및 확장성, scale-out 용이

참조

 

'CICD > docker' 카테고리의 다른 글

[Docker] Container 사용하기  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17
[Docker] Docker Container 만들기  (0) 2024.06.17
[Docker] Container 개념  (0) 2024.06.17
[Docker] Docker 설치  (0) 2024.06.16

+ Recent posts