SKN10-15-3

최수헌·2025년 4월 16일
post-thumbnail

오늘은 Docker 배우는 날~

Preview

  1. Docker
  2. Docker Container

Docker

Docker 설치 확인

docker --version

현재 설치된 Docker 클라이언트의 버전을 확인함.

wsl -l -v

현재 시스템에 설치된 WSL(Windows Subsystem for Linux) 배포판의 목록을 버전 정보와 함께 나열함.

  • -l 또는 --list: 설치된 배포판을 목록으로 보여줌.
  • -v 또는 --verbose: 각 배포판의 WSL 버전(Wsl 1 or Wsl 2) 과 상태(Running / Stopped) 정보를 같이 출력함.
wsl -d docker-desktop busybox

docker-desktop이라는 WSL 배포판에서 busybox 라는 명령어를 실행함.

  • -d: 특정 배포판을 지정함
  • busybox: 리눅스 명령어들을 하나로 통합한 경량 도구. ls, sh, cat 같은 기본적인 리눅스 명령어 기능을 제공함.

BusyBox

뭔지는 잘 모르겠는데 일단 docker-desktop이라는 Docker가 사용하는 리눅스 WSL 환경에 접근할 수 있는 친구인것 같음.
대충 아래 명령어들이 있는것 같음.

이거는 busybox를 통해서 docker-desktop의 리눅스 환경에 명령어를 실행한거임.

wsl -d docker-desktop busybox ls
wsl -d docker-desktop busybox echo "Hello from BusyBox!"

이거는 직접 docker-desktop의 리눅스 환경 셸로 진입하는 명령어임.

wsl -d docker-desktop busybox ash

컨테이너

한 마디로는 가상의 컴퓨터를 뜻함.
이미지 N개가 모여서 하나의 컨테이너가 될 수 있음.

컨테이너가 짱짱 편한이유

이전에는 virtual machine 이라는게 있었음.
이거는 각 가상환경에 os, 코드 이런거 다 넣어서 하나의 .zip 파일로 만든거를 가상환경에 풀어준거임.
이러니까 가상 머신에 배포도 오래 걸리고 불편했었음.

그런데 Docker의 컨테이너라는 친구는 가상 환경에 그냥 내가 작성한 코드만 있으면 돌아가는거임.
Docker Engine이라는 곳에서 알아서 알아서 os나 이런거 관리해주는 거임.

Docker의 관계

client: dbeaber
host: docker-desktop
hub: docker hub

  1. Docker File로 이미지 만들 수 있음.
  2. Docker Image로 컨테이너 만들 수 있음.
  3. Docker Container을 Docker Hub에 공유할 수 있음.

대충 도커 명령어 입력해보기

docker search ubuntu

docker hub에 올라와있는 ubuntu 이미지 검색하는 명령어.

docker pull ubuntu:latest

대충 이미지 하나 골라 잡아서 설치하는 명령어.

docker images

잘 설치되었는지 확인하는 명령어.

docker desktop에서도 확인이 가능하긴 함.

docker run -i -t --name ubuntu-container ubuntu /bin/bash

이미지로 컨테이너를 생성하고, /bin/bash로 실행하는 명령어임.

  • docker run: 새로운 컨테이너를 생성하고 실행하라는 명령
  • -i: interactive 모드 → 사용자 입력을 컨테이너로 전달 (키보드 입력 받기 위해)
  • -t: pseudo-TTY 할당 → 터미널 화면을 예쁘게 출력해줌 (셸처럼 동작)
  • --name ubuntu-container: 생성할 컨테이너의 이름을 ubuntu-container로 지정
  • ubuntu: 사용할 도커 이미지 이름 (공식 Ubuntu 리눅스 이미지)
  • /bin/bash: 컨테이너 실행 시 bash 셸을 실행하라는 뜻

이렇게 되면 컨테이너를 생성하고 접속까지 한 상태가 되는거임.
docker desktop에서도 생성한 컨테이너를 확인, 접속 할 수 있음.

docker start -i ubuntu-container

이미 생성되어있는 컨테이너에 접속하는 명령어임.

docker ps

현재 실행 중인 컨테이너 목록을 보여줌.

이렇게 한 터미널은 접속시켜 놓고 다른 터미널에서 입력해줘야 보임.

docker stop ubuntu-container

실행중인 컨테이너를 종료 시킬 수 있음.

docker start ubuntu-container

종료된 컨테이너를 실행 시킬 수 있음.

업로드중..

docker restart ubuntu-container

컨테이너 껏다 키는 명령어임. stop과 start를 해주는거임.

docker attach ubuntu-container

해당 컨테이너에 접속하는 명령어임. 대충 docker start -i ubuntu-container랑 비슷한 듯?

  • docker start -i [컨테이너]
    - 중지된 컨테이너를 실행하면서 터미널 접속
    - 컨테이너 내부 명령 실행 가능 (/bin/bash 등)
  • docker attach [컨테이너]
    - 이미 실행 중인 컨테이너에 접속
    - 기존 터미널 세션에 붙는 것
    - Ctrl+C 주의(컨테이너 자체가 종료될 수 있음)
  • 실행 중인 컨테이너에 새로운 셸로 안전하게 접속하고 싶다면
    - docker exec -it <컨테이너> /bin/bash
docker exec ubuntu-container echo "Hello from container"

쉘에 접속하지 않고 리눅스 명령어를 실행하는 명령어.

docker ps -a
docker stop ubuntu-container
docker rm ubuntu-container
docker ps -a

컨테이너를 삭제하는 명령어.

docker images
docker rmi ubuntu:latest
docker images

이미지를 삭제하는 명령어.

Docker Container

Dockerfile 예시

# server image는 ubunutu 18.04를 사용
FROM ubuntu:18.04

# image가 올라갔을 때 수행되는 명령어들
# -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
RUN \
	apt-get update && \
    # 접근 권한에 yes를 적용함.
	apt-get install -y apache2
    
# 파일 복사
# 내가 작성한 코드를 이미지의 특정 경로에 배포하기 위한 명령어임
COPY hello.html /var/www/html

# 작업공간 이동 (=cd)
# 초기 경로를 지정해줌. 내가 작성한 코드가 있는 경로로 설정하는 것이 좋음.
WORKDIR /var/www/html

# 로그 확인
RUN ls

# apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 함.
# 부모 PC에서 접속할 수 있도록 80포트를 열어 놓음.
EXPOSE 80

# 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다.
# apachectl을 foreground(즉 백그라운드, deamon)상태로 돌아가도록 한다.
# 나중에 일일히 켜고 끄는거 귀찮아서 미리 자동으로 실행되도록 설정해준거임.
CMD ["apachectl", "-D", "FOREGROUND"]

Dockerfile은 이미지로 컨테이너를 만들기 위한 파일임.

Dockerfile 작성 시 주의사항

Dockerfile 작성할 때 레이어를 적게 사용하는 것이 좋음.
레이어란 Dockerfile에 작성된 명령어 한줄한줄을 뜻함.(FROM, RUN, COPY, WORKDIR)
레이어가 많아지면 무거워져서? 이미지를 생성하는데 시간이 더 오래 걸림.

RUN apt-get update && apt-get install -y apache2
이렇게 적어도 되는데 레이어를 적게 만들기 위해서 아래처럼 적은거임.

# &&: 여러 명령ㅇ어를 한줄로 실행
# \: 줄바꿈
RUN \
	apt-get update && \
	apt-get install -y apache2

빌드

docker build -t apache-image .

현재 경로에 있는 Dockerfile을 기반으로 apache-image라는 이름의 도커 이미지를 빌드하는 명령어임.
[1/5] 처럼 우리가 작성한 전체 레이어와 현재 실행중인 레이어를 확인할 수 있음.

docker images
docker run -d -p 80:80 --name apache-container apache-image
docker ps -a

apache-image로부터 컨테이너를 만들고, 이름은 apache-container로 지정하고,
포트 80을 열어서 백그라운드에서 실행하라는 명령임.
이때 80:80은 부모 포트:자식 포트 임.

주소창에 http://localhost 입력하면 컨테이너의 기본 페이지로 이동할 수 있음.

주소창에 http://localhost/hello.html 입력하면 아까 넣은 hello.html을 볼 수 있음.

마운트

자식PC에 부모PC의 특정 디렉토리를 마운트 할 수 있음.
이렇게 하면 자식PC의 html 디렉토리는 부모PC의 common 디렉토리의 내용을 가지게 됨.

docker run -d --name apache-container -p 80:80 -v C:\dev\docker\common\:/var/www/html ubuntu/apache2

명령어가 좀 길어서 이렇게 쓸수 있음.

docker run -d --name apache-container `
>> -p 80:80 `
>> -v C:\dev\docker\common\:/var/www/html `
>> ubuntu/apache2

이렇게 마운트 하면 좋은 점이, 그냥 부모 PC에서 소스 코드 수정하면 자식 PC에 바로바로 적용되어서 실시간 배포가 가능해짐.

docker-compose.yaml

version: "3"

services:
  #Dockerfile
  apache2:
    # FROM
    image: ubuntu/apache2:latest
    container_name: apache-container
    volumes:
      - ./common:/var/www/html
    ports:
      - "80:80"

# docker-compose up -d

이렇게 생긴 파일로도 컨테이너를 생성할 수 있음.
Dockerfile로 이미지를 만들면 마운트하는 명령어를 따로 입력해줘야 하지만,
docker-compose.yaml로 이미지를 만들면 파일 내에서 마운트 하도록 설정할 수 있음.

docker-compose up -d

이 명령어로 container를 생성할 수 있음.

0개의 댓글