Docker Image 및 Container를 다루기 위한 Docker Command Line 명령어를 알아한다
Ubuntu 운영체제로 실습을 진행하는 경우, 관리자 권한(sudo
)으로 Docker 명령어를 실행해야 한다
해당 과정에서 permission denied 메시지가 포함된 오류를 만난다면, sudo
를 명령어 앞에 붙여서 관리자 권한을 부여한다
도커를 이용하는 데 있어서 명령어, 옵션 등 사용법은 Docker docs에서 확인할 수 있다
Docker CLI 관련 정보뿐만 아니라 Docker의 전반적인 사용법과 환경을 구성하는 방법에 대해서도 확인할 수 있다
검색을 통해 원하는 정보를 얻고 적용하기 전에, 공식 문서인 Docker docs의 문서를 참조하는 것을 추천한다
docker/whalesay
는 레지스트리 계정, 레포지토리 이름, 태그 세 가지 정보로 구성되어 있다
레지스트리(Registry)
관리
하는 공간레포지토리(Repository)
저장
되는 공간태그(Tag)
docker/whalesay:latest
라는 문장을 다시 읽어보면, 다음와 같이 읽을 수 있다
Docker Hub
docker/whalesay 이미지 안내 페이지
사용할 이미지를 확인했으니, 사용하는 방법을 알아야 한다
Docker Hub는 Docker Image를 찾거나, Docker Image의 사용방법을 확인할 때 사용할 수 있다
first 처음에 docker를 킨다
docker/whalesay의 최신 이미지를 받아온다
docker image pull docker/whalesay:latest
docker image ls
컨테이너_이름을 이름으로 갖는 컨테이너를 실행
docker container run --name 컨테이너_이름 docker/whalesay:latest cowsay boo
docker container ps -a
컨테이너_이름이라는 이름을 가진 컨테이너를 삭제
docker container rm 컨테이너_이름
모든 명령을 수행해 보았나요? 그럼 사용한 images의 용량을 확인하고, 도커 이미지를 지워보자
# docker image 의 용량 확인
docker image ls
# docker/whalesay 이미지 지우기
docker image rm docker/whalesay
하나의 이미지를 받아와 컨테이너로 실행하고, 컨테이너와 관련된 리소스를 삭제하는 작업까지 수행했다
이번에는 세 가지 작업을 한 번에 실행해 보자
docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo
docker image rm docker/whalesay
image rm
: 지정된 도커 이미지를 삭제한다도커는 같은 기능을 수행하더라도, 명령을 여러 형태로 내릴 수 있다
그래서 다른 docker 구문으로 구성된 경우를 만나더라도 명령어가 의미하는 바를 파악할 수 있어야 한다
docker rmi
도 같은 기능을 수행지금까지 잘 진행했다면, 하나의 이미지를 레지스트리에서 받아와서 컨테이너로 실행한 뒤, 사용하지 않는 컨테이너를 지우는 것까지 할 수 있다
다른 사람이 제공한 도커 이미지를 받아 사용하는 경우, 원하는 모든 기능이 구성되어 있지 않을 수 있다
따라서 이번에는 도커 이미지에 파일을 추가하고, 도커 이미지를 만드는 방법을 학습한다
로컬에 저장된 파일과 함께 도커 이미지를 이용하는 방식을 설명한다
또, 로컬 파일과 도커 이미지를 연결하는 방법 중 CP를 이용해 로컬 파일을 이미지에 복사하고, 팩맨 게임 서버를 실행하는 작업을 수행한다
위와 같이 내용에서는 사용할 모든 파일이 하나의 이미지에 구성되어 있고, 그 이미지를 사용하는 방법을 학습했다
그러나 게임 서버, 웹 서버와 같이 여러분이 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우도 있다
- 웹 서버는 도커 컨테이너로 실행
- 웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일 구성
- 장점
- 서버에 문제가 생기는 것을 호스트와 별개로 파악할 수 있음
- 문제가 생긴 서버를 끄고, 마치 공장 초기화를 하듯 도커 이미지로 서버를 재구동할 수 있음
로컬에 있는 파일과 도커 이미지를 연결하는 방법은 크게 CP(Copy) 를 이용하는 방법과 Docker Volume 기능을 이용하는 방법으로 나뉜다
- CP(Copy) : 호스트와 컨테이너 사이에 파일을 복사(Copy)
- Volume : 호스트와 컨테이너 사이에 공간을 마운트(Mount)
볼륨과 마운트라는 개념이 생소할 수 있다
간단하게 살펴보면 마운트는 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용해서, 마치 하나의 저장 공간을 이용하는 것처럼 보이게 하는 작업을 말한다
사용할 도커 이미지는 httpd(http daemon)다
httpd(http daemon)은 Apache HTTP Server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어다
httpd 는 /usr/local/apache2/htdocs/
경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 한다
git clone <레포지토리 주소>
docker container run --name 컨테이너_이름 -p 818:80 httpd
127.0.0.1:818 혹은 localhost:818 을 통해 웹 서버가 작동하고 있는지 확인한다
서버가 정상적으로 열린 것을 확인한 후, 새로운 터미널을 열어 docker container cp 명령어를 입력해 로컬호스트에 있는 파일을 컨테이너에 전달한다
docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/
[주의] 위의 명령어를 로컬 터미널에서 실행할 때, 위치는 pacman-canvas 디렉토리여야 한다
docker exec -it 컨테이너_이름 bash
명령어를 통해 컨테이너 내부 터미널로 접속할 수 있다
이번에는 앞서 만들어 본 Docker Container를 이미지 파일로 변환한다
이미지로 만들어 놓을 때의 장점은 다음과 같다
동한 Docker Container를 commit 한다
docker container commit 컨테이너_이름 my_pacman:1.0
my_pacman 1.0을 확인할 수 있다
docker run --name my_web2 -p 900:80 my_pacman:1.0
현재 경로에 있는 파일을 생성할 이미지 경로에 복사하는 명령의 Dockerfile 소스 코드
FROM httpd:2.4 # 베이스 이미지를 httpd:2.4 로 사용합니다.
COPY ./ /usr/local/apache2/htdocs/ # 호스트의 현재 경로에 있는 파일을 생성할 이미지 /usr/local/apache2/htdocs/ 에 복사합니다.
# --tag 는 name:tag 형식으로 이미지를 생성할 수 있습니다.
# 지정한 경로에 있는 Dockerfile을 찾아서 빌드합니다.
docker build --tag my_pacman:2.0 . # "."을 명령어에 꼭 포함해야 한다
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
명령어를 통해 컨테이너 내부 터미널로 접속할 수 있다
컨테이너가 제대로 되지않을때 컨테이너 내부로 접속하여 알아볼 수 있다