11월 1일 Docker CLI

남이섬·2021년 11월 2일
0

Docker Image 및 Container를 다루기 위한 Docker Command Line 명령어를 알아한다

Precaution

Ubuntu 운영체제로 실습을 진행하는 경우, 관리자 권한(sudo)으로 Docker 명령어를 실행해야 한다
해당 과정에서 permission denied 메시지가 포함된 오류를 만난다면, sudo 를 명령어 앞에 붙여서 관리자 권한을 부여한다

Docker CLI(Command Line Interface)

Docker docs

도커를 이용하는 데 있어서 명령어, 옵션 등 사용법은 Docker docs에서 확인할 수 있다

Docker CLI 관련 정보뿐만 아니라 Docker의 전반적인 사용법과 환경을 구성하는 방법에 대해서도 확인할 수 있다

  • 사용법 : Docker CLI, Docker-Compose CLI, API Reference
  • 환경 및 빌드 파일 구성 : DockerFile, Docker-Compose File

검색을 통해 원하는 정보를 얻고 적용하기 전에, 공식 문서인 Docker docs의 문서를 참조하는 것을 추천한다

도커 이용하기

docker/whalesay

docker/whalesay레지스트리 계정, 레포지토리 이름, 태그 세 가지 정보로 구성되어 있다

  • 레지스트리(Registry)

    • Docker Hub : https://hub.docker.com/
    • 도커 이미지를 관리하는 공간
    • 특별히 다른 것을 지정하지 않는다면, 도커 허브(Docker Hub)를 기본 레지스트리로 설정한다
    • 레지스트리는 Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나뉠 수 있다
  • 레포지토리(Repository)

    • 레지스트리 내에 도커 이미지가 저장되는 공간
    • 이미지 이름이 사용되기도 한다
    • GitHub의 레포지토리와 유사하다
  • 태그(Tag)

    • 같은 이미지라고 할지라도 버전 별로 안의 내용이 조금은 다를 수 있다
    • 해당 이미지를 설명하는 버전 정보를 주로 입력한다
    • 특별히 다른 것을 지정하지 않는다면 latest 태그를 붙인 이미지를 가져온다

docker/whalesay:latest 라는 문장을 다시 읽어보면, 다음와 같이 읽을 수 있다

  • Docker Hub라는 레지스트리에서
  • docker라는 유저가 등록한 whalesay 이미지 혹은 레포지토리에서
  • latest 태그를 가진 이미지

Docker Hub : docker/whalesay

Docker Hub
docker/whalesay 이미지 안내 페이지

사용할 이미지를 확인했으니, 사용하는 방법을 알아야 한다
Docker Hub는 Docker Image를 찾거나, Docker Image의 사용방법을 확인할 때 사용할 수 있다

Docker Example 수행하기 : docker/whalesay

first 처음에 docker를 킨다

docker/whalesay의 최신 이미지를 받아온다

docker image pull docker/whalesay:latest
  • [주의!] Ubuntu 운영체제를 통해 실습을 모든 명령어 앞에 sudo 명령어를 붙여야 한다
  • {image} pull : 레지스트리에서 이미지 혹은 레포지토리를 가져옵니다(pull)
docker image ls
  • 받아온 이미지를 실행한다 (이미지 → 컨테이너)

컨테이너_이름을 이름으로 갖는 컨테이너를 실행

docker container run --name 컨테이너_이름 docker/whalesay:latest cowsay boo
  • {container} run
    컨테이너를 실행한다
  • [OPTIONS]
    --name : 컨테이너의 이름을 할당
  • [COMMAND]
    • command는 초기 컨테이너 실행 시 수행되는 명령어
    • cowsay : 컨테이너 실행 시 cowsay 명령어를 호출합니다. node를 호출하듯 이용
  • [ARG..]
    boo : COMMAND인 cowsay에 넘겨질 파라미터
docker container ps -a
  • {container} ps : 컨테이너의 리스트를 출력
  • -a : Default 로는 실행되는 컨테이너지만 종료된 컨테이너를 포함하여 모든 컨테이너를 출력

컨테이너_이름이라는 이름을 가진 컨테이너를 삭제

docker container rm 컨테이너_이름
  • {container} rm : 컨테이너를 지칭해서 삭제한다
    컨테이너를 명시할 때는 ps 명령을 통해 확인할 수 있는 NAMES 혹은 CONTAINER ID 를 사용
  • 컨테이너 리소스를 지워보고 다시 실행하면서 cowsay 명령어에 매개변수를 변경해보자
    ex) 자신의 이름

모든 명령을 수행해 보았나요? 그럼 사용한 images의 용량을 확인하고, 도커 이미지를 지워보자

# docker image 의 용량 확인
docker image ls

# docker/whalesay 이미지 지우기
docker image rm docker/whalesay
  • docker image pull
  • docker image ls
  • docker container run
  • docker container ls
  • docker container rm
  • docker image rm

하나의 이미지를 받아와 컨테이너로 실행하고, 컨테이너와 관련된 리소스를 삭제하는 작업까지 수행했다
이번에는 세 가지 작업을 한 번에 실행해 보자

docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo
  • {container} run : 컨테이너를 실행
    이미지가 없다면 이미지를 받아온 뒤(pull) 실행한다
  • --rm : 컨테이너를 일회성으로 실행
    컨테이너가 중지되거나 종료될 때, 컨테이너와 관련된 리소스를 모두 제거한다
docker image rm docker/whalesay
  • image rm : 지정된 도커 이미지를 삭제한다

도커는 같은 기능을 수행하더라도, 명령을 여러 형태로 내릴 수 있다
그래서 다른 docker 구문으로 구성된 경우를 만나더라도 명령어가 의미하는 바를 파악할 수 있어야 한다

  • docker rmi 도 같은 기능을 수행

지금까지 잘 진행했다면, 하나의 이미지를 레지스트리에서 받아와서 컨테이너로 실행한 뒤, 사용하지 않는 컨테이너를 지우는 것까지 할 수 있다

Docker CLI (2) - Copy, Dockerfile

다른 사람이 제공한 도커 이미지를 받아 사용하는 경우, 원하는 모든 기능이 구성되어 있지 않을 수 있다
따라서 이번에는 도커 이미지에 파일을 추가하고, 도커 이미지를 만드는 방법을 학습한다

로컬에 저장된 파일과 함께 도커 이미지를 이용하는 방식을 설명한다
또, 로컬 파일과 도커 이미지를 연결하는 방법 중 CP를 이용해 로컬 파일을 이미지에 복사하고, 팩맨 게임 서버를 실행하는 작업을 수행한다

Docker 컨테이너에 파일을 복사하기

위와 같이 내용에서는 사용할 모든 파일이 하나의 이미지에 구성되어 있고, 그 이미지를 사용하는 방법을 학습했다
그러나 게임 서버, 웹 서버와 같이 여러분이 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우도 있다

  1. 웹 서버는 도커 컨테이너로 실행
  2. 웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일 구성
  • 장점
    • 서버에 문제가 생기는 것을 호스트와 별개로 파악할 수 있음
    • 문제가 생긴 서버를 끄고, 마치 공장 초기화를 하듯 도커 이미지로 서버를 재구동할 수 있음

로컬에 있는 파일과 도커 이미지를 연결하는 방법은 크게 CP(Copy) 를 이용하는 방법과 Docker Volume 기능을 이용하는 방법으로 나뉜다

  • CP(Copy) : 호스트와 컨테이너 사이에 파일을 복사(Copy)
  • Volume : 호스트와 컨테이너 사이에 공간을 마운트(Mount)

볼륨과 마운트라는 개념이 생소할 수 있다
간단하게 살펴보면 마운트는 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용해서, 마치 하나의 저장 공간을 이용하는 것처럼 보이게 하는 작업을 말한다

httpd 웹 서버

httpd

사용할 도커 이미지는 httpd(http daemon)다
httpd(http daemon)은 Apache HTTP Server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어다

httpd 는 /usr/local/apache2/htdocs/ 경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 한다

  1. 레포지토리를 클론한다
git clone <레포지토리 주소>
  1. docker container run 명령어로 httpd 를 실행
docker container run --name 컨테이너_이름 -p 818:80 httpd
  • run 의 옵션을 docker container run에서 다시 확인할 수 있다
  • -p 옵션은 로컬호스트의 포트와 컨테이너의 포트를 연결한다
    2의 명령어에서 818포트가 로컬호스트의 포트이고, 80번은 컨테이너의 포트
  • httpd 는 일정 시간 연결 기록이 없으면, 서버 가동이 중지된다
    실행 중이던 도커 컨테이너가 중지되었다면, 다시 실행하자
  • 터미널에서 1, 2의 명령어를 입력했을 때, 다음 화면처럼 터미널의 작동이 중단된 것처럼 보여도 걱정할 필요 없다
    정상적인 상태이므로 터미널을 종료하지 말고, 다른 터미널 창을 열어 계속해서 실습을 진행한다
  1. 127.0.0.1:818 혹은 localhost:818 을 통해 웹 서버가 작동하고 있는지 확인한다

  2. 서버가 정상적으로 열린 것을 확인한 후, 새로운 터미널을 열어 docker container cp 명령어를 입력해 로컬호스트에 있는 파일을 컨테이너에 전달한다

  • 경로를 입력할 때, 상대 경로와 절대 경로를 주의해서 작업하자
  • docker container cp 명령은 앞 경로의 파일을 뒤 경로에 복사한다
docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/

[주의] 위의 명령어를 로컬 터미널에서 실행할 때, 위치는 pacman-canvas 디렉토리여야 한다

  1. 127.0.0.1:818 혹은 localhost:818 에 접속해서 게임 서버가 구동되는지 확인한다

docker exec -it 컨테이너_이름 bash 명령어를 통해 컨테이너 내부 터미널로 접속할 수 있다

Docker 이미지 만들기

이번에는 앞서 만들어 본 Docker Container를 이미지 파일로 변환한다
이미지로 만들어 놓을 때의 장점은 다음과 같다

  • 이전에 작업했던 내용을 다시 한 번 수행하지 않아도 됨
  • 배포 및 관리가 유용

1. 구동한 Docker Container를 이미지로 만드는 방법

동한 Docker Container를 commit 한다

docker container commit 컨테이너_이름 my_pacman:1.0

my_pacman 1.0을 확인할 수 있다

  • 생성된 이미지를 900 포트에서 웹 서버로 구동
docker run --name my_web2 -p 900:80 my_pacman:1.0
  • 127.0.0.1:900 혹은 localhost:900 을 통해 웹 서버가 작동하고 있는지 확인한다

2. Docker Image 빌드를 위한 파일인 Dockerfile 로 만드는 방법

  • Dockerfile 공식 문서
    • Dockerfile 을 만들고, Dockerfile 대로 이미지를 build 하는 방법
  • Dockerfile 은 이미지 파일의 설명서라고 생각하면 좋다
  • Dockerfile로 pacman 이미지를 생성해 보자
    • COPY 구문을 잘 살펴보자 Dockerfile은 어디에 생성되어야 할까?

현재 경로에 있는 파일을 생성할 이미지 경로에 복사하는 명령의 Dockerfile 소스 코드

FROM httpd:2.4 # 베이스 이미지를 httpd:2.4 로 사용합니다.
COPY ./ /usr/local/apache2/htdocs/ # 호스트의 현재 경로에 있는 파일을 생성할 이미지 /usr/local/apache2/htdocs/ 에 복사합니다.
  • docker build 명령은, Dockerfile로 도커 이미지 파일을 생성한다
 # --tag 는 name:tag 형식으로 이미지를 생성할 수 있습니다.
 # 지정한 경로에 있는 Dockerfile을 찾아서 빌드합니다.
 docker build --tag my_pacman:2.0 . # "."을 명령어에 꼭 포함해야 한다
  • 생성된 이미지를 이용해 901 포트에 웹 서버 구동
docker run --name my_web3 -p 901:80 my_pacman:2.0

127.0.0.1:901 혹은 localhost:901 을 통해 웹 서버가 작동하고 있는지 확인


docker run --name my_web2 -p 900:80 my_pacman:1.0
docker run --name my_web3 -p 901:80 my_pacman:2.0

위와 같이 생성된 이미지를 포트에서 웹 서버로 구동시

container의 이름을 바꿔 주는 걸 볼 수 있다
기존에 사용하는 container image / names로는 에러가 난다


docker exec -it <컨테이너_이름> bash 명령어를 통해 컨테이너 내부 터미널로 접속할 수 있다

컨테이너가 제대로 되지않을때 컨테이너 내부로 접속하여 알아볼 수 있다

profile
즐겁게 살자

0개의 댓글