Develop!/Docker,Kubernetes

도커 엔진(Docker Engine) - 1

체리필터 2022. 1. 17. 09:35
반응형

아래의 책을 읽으면서 알게 된 내용을 정리한다.

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791158392291&orderClick=LAG&Kc= 

 

시작하세요! 도커/쿠버네티스 - 교보문고

친절한 설명으로 쉽게 이해하는 컨테이너 관리 | ★ 이 책의 구성 ★◎ 도커의 기본 사용 방법을 익힘으로써 컨테이너의 기본 개념을 학습합니다. (1부 1장, 1부 2장)◎ 도커 스웜 모드를 통해 서

www.kyobobook.co.kr

 

 도커 이미지

가상 머신을 생성할 때 사용하는 ISO 파일과 비슷한 개념. 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용 됨.

도커에서 사용하는 이미지의 기본 이름은 "저장소 이름/이미지 이름:태그" 형태로 구성 됨.

alicek106/ubuntu:14.04
ubuntu:latest

저장소 이름이 명시되어 있지 않으면 도커 허브의 공식 이미지이다. 이미지를 생성할 때  저장소 이름을 명시할 필요는 없어 생략할 수 있다.

태그는 버전을 나타내며 생략하면 가장 최신 버전인 latest로 인식한다.

도커 컨테이너

도커 이미지로 컨테이너를 생성하면 이미지의 목적에 맞는 파일이 들어있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립 공간이 생성되게 되는데 이것이 도커 컨테이너가 된다.

컨테이너는 이미지를 읽기 전용으로 읽기 때문에 컨테이너 안에서 수정하는 내용은 원래의 이미지에 영향을 끼치지 않게 된다. 또한 생성된 컨테이너는 호스트와 분리되어 있으므로 특정 컨테이너에서 어떤 애플리케이션을 설치, 삭제해도 다른 컨테이너와 호스트에는 변화가 없게 된다.

도커 컨테이너 기본 명령어

기본적인 명령어는 root로 실행 해야 한다. 개인적으로는 테스트 환경상 불가능하여 sudo 명령어를 사용하였다.

docker의 설치된 버전을 확인하는 명령어

#docker -v

docker를 한번에 생성하고 실행하는 명령어

#docker run -i -t ubuntu:14.04

로컬에 ubuntu가 존재하지 않으므로 docker hub에서 내려 받아 설치 후 실행한 다음 컨테이너 안으로 들어오게 된다. -i, -t 옵션은 컨테이너와 상호 입출력을 가능하게 한다.

컨테이너에서 빠져 나오기 - 1

#exit

exit나 Ctrl+D를 입력하면 된다. 하지만 이렇게 나올 경우 컨테이너를 정지시키게 된다.

컨테이너에서 빠져 나오기 - 2

Ctrl + P, Q

이렇게 할 경우 단순히 컨테이너의 쉘에서만 빠져 나오기 때문에 컨테이너를 종료 시키지 않는다.

이미지 내려 받기

#docker pull centos:7

내려받은 이미지 확인하기

#docker images

컨테이너 생성하기

#docker create -i -t --name mycentos centos:7

run과 달리 컨테이너를 생성만 한다. 컨테이너 안으로 들어가기 위해서는 start, attach 명령어를 사용해야 한다.

컨테이너 실행하기

#docker start mycentos
#docker attach mycentos

run 명령어는 pull, create, start 후 attach가 가능한 컨테이너라면 컨테이너 내부로 들어가게 해 준다. 보통은 생성함과 동시에 시작하기 때문에 run을 많이 사용한다.

컨테이너 목록 확인

#docker ps

정지된 컨테이너 목록은 표시하지 않는다. 모두 보여주길 원할 경우에는 docker ps -a 를 사용한다.

결과물로 나오는 CONTAINER_ID 값은 일부분 밖에 안 보이므로 전체를 다 보려면 아래와 같이 해야 한다.

#docker inspect mycentos | grep Id

컨테이너 이름 변경

#docker rename angry_morse my_container

컨테이너 삭제

한 번 삭제한 컨테이너는 복구가 불가능하다.

#docker rm angry_morse

실행중인 컨테이너는 삭제 불가능하다. 이럴 경우에는 아래처럼 정지 한 뒤 삭제해야 한다.

#docker stop mycentos
#docker rm mycentos

아니라면 강제로 삭제할 수 있다. 리눅스의 강제 삭제 옵션인 -f를 주면 된다.

#docker rm -f mycentos

모든 컨테이너를 한 번에 삭제하기 위해서는 아래와 같은 명령어를 사용할 수 있다.

#docker container prune

모든 컨테이너를 삭제하는 다른 방법으로는 Linux의 Pipe와 같은 방법을 사용할 수 있다.

#docker stop ${docker ps -a -q}
#docker rm ${docker ps -a -q}

모든(-a) 컨테이너의 아이디(-q)를 가지고 와서 중지 시키고 삭제 시키는 명령어이다.

컨테이너 외부 노출

도커는 기본적으로 컨테이너에 172.17.9.X 의 IP를 순차적으로 할당한다. 하지만 외부에서는 해당 컨테이너로 접근할 수 없다. 외부에서 접근하기 위해서는 컨테이너의 IP와 Port를 호스트의 IP와 Port에 바인딩 해야 한다. 이렇게 하기 위해서는 호스트에서 다음과 같이 컨테이너를 실행 시켜야 한다.

#docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04

-p 옵션을 통해 포트를 연결 시켜 줄 수 있다. 사용 법은 아래와 같다.

-p 호스트의포트:컨테이너의포트

이렇게 설정하게 되면 컨테이너 안으로 다음과 같은 프로세스를 거쳐 접근하게 된다.

호스트의 IP:Port로 접근 > 호스트의 Port는 컨테이너의 Port로 포워딩 > 컨테이너의 프로세스 접근

-p 옵션에 "호스트포트:컨테이너포트" 형태가 아니라 "포트"만 적는다면 컨테이너의 포트를 명시한 것이 되고 호스트의 포트는 자동으로 할당 되게 된다. 이럴 경우에는 docker ps 명령어를 통해 호스트의 어떤 포트로 연결 되어 있는지 확인해야 한다.

Detach Mode 실행

-i, -t 로 실행하게 되면 컨테이너 내부로 진입 가능한 Attach 모드로 실행 된다. 하지만 -d로 실행하게 되면 Detach Mode로 실행 되며 이는 백그라운드로 실행 됨을 뜻한다.

쉽게 말해 -i, -t를 실행 하게 되면 /bin/bash 처럼 표준 입출력이 활성화 되면서 상호 작용이 가능한 쉘 환경을 사용할 수 있다. 하지만 -d로 실행하게 되면 입출력이 없는 백그라운드 프로그램이 실행 되게 된다.

환경변수 설정

컨테이너 안에서 사용할 환경 변수를 셋팅하기 위해서는 다음과 같이 지정해 줄 수 있다.

... -e MYSQL_PASSWORD=password ...
# echo $MYSQL_PASSWORD
password

run 하면서 -e 옵션을 주면 컨테이너 안에서 사용할 환경 변수를 지정할 수 있다. echo 로 찍어보면 제대로 셋팅 되었음을 알 수 있다.

하지만 이미 -d를 통해 컨테이너가 백그라운드로 실행 되고 있어서 shell을 사용할 수 없으므로 echo 명령어를 사용할 수 없게 된다. 이럴 때는 exec 명령어를 사용할 수 있다.

#docker exec -i -t wordpressdb /bin/bash
#echo $MYSQL_PASSWORD  // in docker container
password

컨테이너에서 다른 컨테이너 접근하기

컨테이너 안에서 다른 컨테이너에 접근하려면 할당 된 내부 아이피 (172.17.0.x)를 사용할 수 있다. 하지만 이는 컨테이너를 시작할 때 마다 변경 되므로 접근이 쉽지 않다.이럴 때는 alias로 접근할 수 있다.

... --link wordpressdb:mysql ...

위와같이 하게 될 경우에 wordpressdb라는 컨테이너를 mysql이라는 이름으로 설정한 것이다. 따라서 mysql 이란 이름으로 접근 가능하다.

#docker exec wordpress curl mysql:3306 --silent

하지만 --link 옵션은 deprecated 된 상태이며 따라서 docker bridge 네트워크를 써서 사용할 수 있다.

 

 

반응형

'Develop! > Docker,Kubernetes' 카테고리의 다른 글

도커 엔진(Docker Engine) - 2  (0) 2022.01.25
도커 엔진(Docker Engine) - 1  (0) 2022.01.17