본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

67일차. Docker

더보기

 

67일 차 회고.

 

 오늘부터 새로운 단위에 들어갔고, 오늘은 Docker를 배웠다. 기본적인 내용을 배웠지만, 새로운 내용을 배우기도 했고, 궁금했던 내용이라 수업이 재밌었다.

 

 

 

 

1. Docker

 

 

1-1. Docker

 

Docker 설치 확인

docker --version			# Docker 버전 확인
wsl -l -v				# WSL(Windows Subsystem for Linux) 목록
wsl -d docker-desktop busybox		# WSL 환경 내 BusyBox Shell 진입

 

Container

  • 가상의 컴퓨터처럼 동작하는 환경
  • 운영체제 내에 논리적으로 분리된 공간을 만들고, 그 안에 애플리케이션 실행에 필요한 라이브러리와 구성 요소를 모두 포함해 별도의 서버처럼 사용할 수 있다.
  • Server-Client 아키텍처
    • Client → Internet → Server
    • 고객이 감소해도 물리적인 서버를 계속 유지해야 한다는 비효율적인 문제가 발생한다.
      • Container 개념 등장
  • Container 발전 과정
    • Traditional Deployment
      • 하나의 물리 서버에 여러 애플리케이션을 설치하여 운영한다.
      • 자원 충돌과 관리 문제가 발생한다.
    • Virtualized Deployment
      • 가상 머신(VM)을 이용하여 각 애플리케이션을 분리한다.
      • Guest OS가 필요하기 때문에 무겁고 느리다.
    • Container Deployment
      • Guest OS를 제거하여 가볍고 빠르다.
      • OS 수준에서 격리된 컨테이너 환경에서 실행된다.
      • 자원 효율성과 배포 속도가 향상된다.
    • Kubernetes Deployment 
      • 컨테이너 관리 시스템(Container Orchestration System)
      • 자동화된 배포, 확장, 로드밸런싱이 가능하다.

 

Docker

  • 컨테이너 기반의 애플리케이션을 신속하게 구축, 테스트, 배포할 수 있는 소프트웨어 플랫폼
  • Docker 구성 요소
    • Docker Client
      • 사용자 인터페이스
      • Docker Host에 명령을 전달한다.
      • ex. Windows PowerShell
    • Docker Host
      • 실제 Docker가 실행되는 환경
      • 컨테이너와 이미지를 관리한다.
      • Docker Daemon: 도커 엔진
      • ex. Docker Desktop
    • Registry(Docker Hub)
      • 외부(Remote) 이미지 저장소
      • 필요한 이미지를 pull 하거나 push 할 수 있다.

 

 

1-2. Docker 기본명령어

 

Docker Image

docker search ubuntu			# Docker Hub에서 'ubuntu' 이미지 검색

docker pull ubuntu:latest		# Docker Hub에서 'ubuntu' 최신버전 이미지 다운로드

docker images				# Docker Image 목록 확인
"""
REPOSITORY          TAG       IMAGE ID       CREATED        SIZE
ubuntu              latest    602eb6fb314b   7 days ago     78.1MB
"""

 

run

  • 컨테이너 실행 
  • 옵션
    • -i: Bash 명령 입력
    • -t: Bash를 사용하기 위한 옵션
# docker run -i -t --name <Container Name> ubuntu /bin/bash
docker run -i -t --name ubuntu-hello ubuntu /bin/bash		# Bash Shell 진입

 

ls

  • 내부 파일 목록 확인
ls
# bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

 

ps

  • 실행 중인 컨테이너 목록
docker ps
"""
CONTAINER ID   IMAGE        COMMAND           CREATED         STATUS         PORTS           NAMES
113771b89196   ubuntu       "/bin/bash"       7 minutes ago   Up 7 minutes                   ubuntu-hello
"""

 

stop

  • 컨테이너 중지
# docker stop <Container Name>
docker stop ubuntu-hello

docker ps -a
"""
CONTAINER ID   IMAGE        COMMAND           CREATED          STATUS                            PORTS           NAMES
113771b89196   ubuntu       "/bin/bash"       15 minutes ago   Exited (137) About a minute ago                   ubuntu-hello
"""

 

start

  • 컨테이너 실행
# docker start <Container Name>
docker start ubuntu-hello

docker ps
"""
CONTAINER ID   IMAGE        COMMAND           CREATED          STATUS         PORTS           NAMES
113771b89196   ubuntu       "/bin/bash"       17 minutes ago   Up 3 seconds                   ubuntu-hello
"""

 

restart

  • 컨테이너 재실행
# docker restart <Container Name>
docker restart ubuntu-hello

docker ps
"""
CONTAINER ID   IMAGE        COMMAND           CREATED          STATUS         PORTS           NAMES
113771b89196   ubuntu       "/bin/bash"       19 minutes ago   Up 1 seconds                   ubuntu-hello
"""

 

attach

  • 컨테이너 접속
# docker attach <Container Name>
docker attach ubuntu-hello

 

exec

  • 외부에서 명령 실행
# docker exec <Container Name> <Command>
docker exec ubuntu-hello ls
"""
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
"""

 

rm

  • 컨테이너 삭제
# docker rm <Container Name>
docker rm ubuntu-hello

docker ps -a
# CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

 

rmi

  • 이미지 삭제
# docker rmi <Image Name>:<Tag>
docker images
"""
REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
ubuntu          latest    602eb6fb314b   7 days ago     78.1MB
"""

docker rmi ubuntu:latest

docker images
# REPOSITORY    TAG    IMAGE ID    CREATED    SIZE

 

 

1-3. Dockerfile

 

Dockerfile

  • 컨테이너에 설치해야 하는 패키지, 소스코드, 환경변수, 실행 명령어 등을 기록한 스크립트 파일
  • Dockerfile을 기반으로 이미지를 만들 수 있다.

 

Dockerfile 작성

  • FROM
    • 사용할 베이스 이미지 지정
  • LABEL
    • 이미지에 메타데이터 추가
  • RUN
    • 명령어 실행
    • apt-get update && apt-get install -y을 함께 실행한다.
  • WORKDIR
    • 작업 디렉토리 지정
      • 해당 디렉토리가 없으면 새로 생성된다.
  • EXPOSE
    • 이미지에서 열어줄 포트 지정
  • USER
    • 컨테이너 실행 시 사용할 계정 설정 
  • ENV
    • 환경 변수 설정
  • COPY / ADD
    • 로컬 파일을 이미지로 복상
    • ADD는 압축 파일 및 URL도 지원한다.
  • CMD / ENTRYPOINT
    • 컨테이너를 생성 시 실행할 명령어
    • ENTRYPOINT 명령문은 컨테이너를 시작할 때마다 실행된다.
# Base Image (Ubuntu 18.04)
FROM ubuntu:18.04

# Install Apache Web Server
RUN apt-get update && apt-get install -y apache2

# Copy File
COPY hello.html /var/www/html/hello.html

# Working Directory
WORKDIR /var/www/html

# Port Documentation
EXPOSE 80

# Command to run when the container starts
CMD ["apachectl", "-D", "FOREGROUND"]

 

Dockerfile Build

# docker build -t <Image Name>:<Image Version> <Dockerfile Path>
docker build -t apache-image .

docker images
"""
REPOSITORY          TAG       IMAGE ID       CREATED              SIZE
apache-image        latest    b311678a2f27   About a minute ago   205MB
"""

 

Container 생성

docker run -d -p 80:80 --name apache-container apache-image

docker ps
"""
CONTAINER ID   IMAGE            COMMAND                   CREATED          STATUS          PORTS                   NAMES
cff286c11605   apache-image     "apachectl -D FOREGR…"    18 seconds ago   Up 17 seconds   0.0.0.0:80->80/tcp      apache-container
"""

 

Bash Shell 접속

docker exec -it apache-container /bin/bash

 

Dockerfile 업데이트

  • Dockerfile를 업데이트한 경우, 기존에 존재하는 Image와 Container를 삭제한 후에 빌드한다.
docker stop apache-container					# Container 정지
docker rm apache-container					# Container 삭제
docker rmi apache-image						# Image 삭제
docker build -t apache-image .					# Dockerfile build
docker run -d -p 80:80 --name apache-container apache-image	# Container 생성

 

 

1-4. Mount & Docker Compose

 

Mount

  • 호스트의 파일을 컨테이너와 공유한다.
    • 로컬에서 파일을 수정하면 컨테이너에도 즉시 반영된다.
docker search apache2
docker pull ubuntu/apache2
docker run -d --name apache-container `
-p 80:80 `
-v C:\dev\docker\common:/var/www/html `
ubuntu/apache2

 

Docker Compose

# docker-compose.yml
version: "3"
services:
  apache2:
    image: ubuntu/apache2:latest
    container_name: apache-container
    volumes:
      - ./common:/var/www/html
    ports:
      - "80:80"
docker-compose up -d