Networks/Docker & Linux

SK networks AI Camp - docker 명령어 사용(2)

코딩하는 Español되기 2024. 7. 29. 19:30

저번 주에 내에 이어서 도커에 대해서 배웠습니다.

 

도커에서 containers, images, volumes에서 모두 삭제해주고 다시 시작했습니다.

power shell에서 진행해주세요. git bash에서 지원을 안해주는 경우가 있습니다.

이전 내용

2024.07.29 - [컴퓨터 공학/Networks] - SK networks AI Camp - docker 명령어 사용

 

이전 내용 리마인드

○ 설치 및 접속

docker search ubuntu
docker pull ubuntu:latest
docker images
docker run -it --name ubuntu-container ubuntu /bin/bash

현재 컨테이너를 만들고 접속이 완료된 상태입니다.

○ 접속 확인 방법

1. 도커로 확인

2. 명령어로 확인(powershell 창을 하나 더 띄우고 아래 명령어를 치면 나옵니다)

docker ps

○ print 해보기 (echo)

echo "Hello Wordld"

○ 삭제(컨테이너 삭제) 및 확인 (docker rm 컨테이너명)

docker rm ubuntu-container
docker ps -a

○ 삭제(이미지 삭제) 및 확인

docker images
docker rmi ubuntu:latest
docker images


Dockerfile

○ 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 명령어, 환경변수 설정 등을 기록한 하나의 파일

○ 이를 빌드하면 자동으로 이미지 생성

○ 이렇게 되면 앞으로 App 빌드 및 배포를 자동화할 수 있게됨

Dockerfile 작성법

○ FROM : 베이스 이미지

    ● 어느 이미지에서 시작할건지를 의미

 

○ LABEL : 이미지에 메타데이터 추가

    ● Key-Value 형태

 

○ RUN : 새로운 레이어에서 명령어 실행 및 새로운 이미지 생성

    ● RUN 명령에 apt-get update와 install을 함께 실행해야 함

    ● RUN 명령과 apt-get update를 따로 실행하면, 최신 패키지를 설치하지 않을 수도 있음

 

○ WORKDIR : 작업 디렉토리 지정 if 없다면 새로 생성

    ● 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리 기준으로 동작

 

○ EXPOSE : Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트

    ● 호스트 머신과 컨테이너의 포트 매핑시 사용

    ● 컨테이너 생성시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야 함

 

○ USER : 이미지를 어떤 계정에서 실행하는 지 지정 (Default : root)

 

○ ENV : 이미지에서 사용할 환경 변수 지정 (path 등)

 

○ COPY / ADD : Build 명령 증간에 호스트 파일 또는 폴더에 이미지에 가져오는 것

    ● ADD 명령문 : 좀더 파워풀한 COPY 명령문

    ● 일반 파일 + 압축파일 + 네트워크 상의 파일도 사용 가능

    ● 특수한 파일을 다루는 게 아니면 COPY 명령문 사용 권장

 

○ CMD / ENTRYPOINT : 컨테이너를 생성 및 실행할 때 실행할 명령어

    ● CMD : 컨테이너 생성 시 실행 (docker run)

    ● ENTRYPOINT : 컨테이너를 시작할 때 실행 (docker start)

 

Dockerfile 예제

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

# image가 올라갔을 때 수행되는 명령어들
# -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
RUN \
    apt-get update && \
    apt-get install -y apache2

# 파일 복사 
COPY hello.html /var/www/html

# 작업공간 이동 (=cd)
WORKDIR /var/www/html
# 로그 확인 
RUN ls

# apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 한다.
EXPOSE 80 

# 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다.
# apachectl을 foreground(즉, deamon)상태로 돌아가도록 한다.
CMD ["apachectl", "-D", "FOREGROUND"]

VSCode에서 직접해보기

○ dev 폴더 안에 docker 폴더 생성(c:\dev\docker)

○ docker 폴더로 이동 후 vscode 열기

cd C:\dev\docker
code .

○ html 문서 작성(hello.html 생성 후 틀만들고 입력하고 싶은 것 입력)

틀만들기 ! + tab

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello World</h1>
    <h2>Docker 시작</h2>
</body>
</html>

 

○ dockerfile 생성(주의 : 확장자 없음)

이제부터 dockerfile에서 해당 코드를 작성해주세요

○ 베이스 이미지 정의 (docker hub에 존재)

FROM ubuntu:latest

○ ubuntu update ← 어플리케이션 설치 전 필수(python의 pip와 유사)

RUN apt-get update

○ apache web server

html, js, css 등을 브라우저에게 전달해주는 서버

RUN apt-get install -y apache2

○ 코드를 복사하여 ubuntu → apache2 web server 에게 전송

COPY hello.html /var/www/html

○ 홈 디렉토리(Application = apache2; 가 시작될 폴더)

WORKDIR /var/www/html

○ apache2의 포트번호 = 80(외부에 연결해주는 코드)

EXPOSE 80

○ apache2 실행

ctl = controller 약자

CMD ["apachectl", "-D", "FOREGROUND"]

○ 전체 코드

# 베이스 이미지 정의 > docker hub에 존재
FROM ubuntu:latest

# ubuntu update -> 어플리케이션 설치 전 필수
# python에 pip 같은 느낌
RUN apt-get update

# apache web server
# -> html,css,js 등을 브라우저에게 전달해주는 서버

RUN apt-get install -y apache2

# 코드를 복사해 ubuntu -> apache2 web server에게 전송
COPY hello.html /var/www/html

# 홈 디렉토리(Application; apache2가 시작될 폴더)
WORKDIR /var/www/html

# apache2의 포트번호 80(외부포트와 연결해주기)
EXPOSE 80

# apache2 실행하기
# ctl = 컨트롤러의 약자
CMD ["apachectl", "-D", "FOREGROUND"]

○ cmd창(ctrl + j)에서 빌드하기

태그를 써줘야 하며 현재 디렉토리이기에 .을 찍어줌

docker build -t apache-image:v1 .

○ 생성이 되었는 지 확인

docker images

○ 컨테이너 생성 및 실행 확인

버전을 지정해주었기에 태그로 버전을 적어줘야함(apache-image:v1)

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

○ 만든 문서를 확인

chrome으로 접속하여 확인하기

http://localhost/
http://localhost/hello.html

○ 지금까지 진행한 내용 아키텍처