2장. 도커 엔진(2.1.1~2.2.5)

yun·2022년 10월 29일
0

Docker

목록 보기
2/7

도커 이미지와 컨테이너

도커 이미지

  • 여러 개의 계층으로 된 바이너리 파일
  • 컨테이너를 생성 및 실행 시 읽기 전용으로 사용
  • [저장소 이름]/[이미지 이름]:[태그] 형태
    ex) alicek106/ubuntu:14.04

도커 컨테이너

  • 이미지로 컨테이너를 생성
  • 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로, 컨테이너에서 무엇을 하든지 원래 이미지는 영향을 받지 않음
  • 생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리돼 있으므로, 특정 컨테이너에서 어떤 애플리케이션을 설치하거나 삭제해도 다른 컨테이너와 호스트는 변화가 없음

도커 컨테이너 다루기

컨테이너 생성

# 도커 엔진 버전 확인
docker -v

# 컨테이너 생성 및 실행
# -i -t 옵션은 컨테이너와 상호(interactive) 입출력을 가능하게 함
# 도커 엔진에 이미지가 존재하지 않으면 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려받음
docker run -i -t ubuntu:14.04

# 컨테이너를 정지하고 컨테이너에서 빠져나오기
exit

# 이미지 내려받기
docker pull centos:7

# 도커 엔진에 존재하는 이미지 목록 출력
docker images

# 컨테이너 생성만(컨테이너 내부로 들어가지 않음)
# --name 옵션은 컨테이너 이름 설정
docker create -i -t --name mycentos centos:7

# 컨테이너 시작
docker start mycentos

# 컨테이너 내부로 들어가기
docker attach mycentos
  • ctrl + p, q: 컨테이너를 정지시키지 않고 컨테이너에서 빠져나옴(macOS에서도 cmd가 아니라 ctrl)

컨테이너 목록 확인

# 정지되지 않은 컨테이너 출력
docker ps

# 정지된 컨테이너 포함해서 출력
docker ps -a

# 컨테이너 정보 확인 | grep sth(특정 문자열 찾기)
docker inspect mycentos | grep Id

docker ps 명령어의 출력은 각각 다음과 같다.

  • CONTAINER ID: 컨테이너에게 자동으로 할당되는 고유한 ID, docker inspect 명령어로 전체 ID 확인 가능
  • IMAGE: 컨테이너 생성 시 사용된 이미지의 이름
  • COMMAND: 컨테이너가 시작될 때 실행될 명령어, 대부분 이미지에 미리 내장돼 있으므로 별도 설정 불요, /bin/bash 명령어가 실행되는 컨테이너는 상호 입출력 가능한 셸 환경 사용 가능
  • CREATED: 컨테이너 생성 후 흐른 시간
  • STATUS: 컨테이너의 상태 (실행중 Up / 종료 Exited / 일시중지 Pause)
  • PORTS: 컨테이너가 개방한 포트와 호스트에 연결한 포트(외부에 노출하도록 설정하지 않은 경우 아무것도 출력되지 않음)
  • NAMES: 컨테이너의 고유한 이름, 컨테이너 생성 시 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 무작위로 조합해 이름을 설정함, ID와 마찬가지로 중복될 수 없지만 docker rename 명령어로 변경 가능

컨테이너 삭제

  • 주의: 한 번 삭제한 컨테이너는 복구할 수 없음
# 컨테이너 정지
docker stop mycentos

# 컨테이너 삭제 (실행중이면 에러 발생)
docker rm mycentos

# 컨테이너 강제 삭제 (실행중이어도 삭제됨)
docker rm -f mycentos

# 모든 컨테이너 삭제 (정지된 컨테이너만)
docker container prune

# 모든 컨테이너 정지
docker stop $(docker ps -a -q)

# 모든 컨테이너 삭제
docker rm $(docker ps -a -q)

컨테이너를 외부에 노출

  • 컨테이너는 가상머신과 마찬가지로 가상 IP주소를 할당받음
  • 기본적으로 도커는 컨테이너에 172.17.0.x의 IP를 순차 할당함
  • 아무런 설정을 하지 않은 경우 외부에서 접근 불가, 도커가 설치된 호스트에서만 접근 가능
  • 외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩 필요
# mywebserver라는 이름으로 컨테이너 생성
# 3306 포트와 192.168.0.100 주소의 7777 포트를 외부에 개방 
docker run -i -t --name mywebserver -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04

# 컨테이너 내부에 아파치 웹 서버 설치
apt-get update
apt-get install apache2 -y
service apache2 start

cf. -p 옵션의 값으로 80:81과 같이 입력한 경우, 외부에서 접근하는 컨테이너의 포트는 81번인데, 웹서비스 포트는 80번이므로 외부에서 웹서버에 접근할 수 없음

컨테이너 애플리케이션 구축

  • 서비스를 컨테이너화(Containerize)할 때, 분리된 컨테이너로 구성하면 컨테이너 간의 독립성을 보장하면서 애플리케이션의 버전 관리, 소스코드 모듈화 등이 쉬워진다.
  • 한 컨테이너에 프로세스 하나만 실행하는 것이 도커에서 권장하는 구조
# mysql 이미지로 데이터베이스 컨테이너 생성
docker run -d
--name wordpressdb
-e MYSQL_ROOT_PASSWORD=password
-e MYSQL_DATABASE=wordpress
mysql:5.7

# 워드프레스 이미지로 워드프레스 웹서버 컨테이너 생성
docker run -d
-e WORDPRESS_DB_HOST=mysql
-e WORDPRESS_DB_USER=root
-e WORDPRESS_DB_PASSWORD=password
--name wordpress
--link wordpressdb:mysql # wordpressdb의 IP를 몰라도 mysql이라는 호스트명으로 접근 가능
-p 80
wordpress

# 호스트와 바인딩된 포트 확인
docker port wordpress

# 호스트의 활용 가능한 모든 네트워크 인터페이스 32769번 포트에 바인딩함
80/tcp -> 0.0.0.0:32769
  • -d: Detached 모드로 컨테이너 실행
- 백그라운드에서 동작하는 애플리케이션에서 실행하도록 설정
- 컨테이너 내부에서 프로그램이 터미널을 차지하는 포그라운드(foreground)로 실행
- 사용자의 입력을 받지 않음
- 반드시 컨테이너에서 프로그램이 실행되어야 함
- 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료됨
  • -e: 컨테이너 내부의 환경변수 설정
비밀번호와 같이 민감한 정보는 도커 스웜 모드의 secret이나 쿠버네티스의 secret 기능을 활용하는 것이 좋다
  • --link: 내부 IP를 알 필요 없이 항상 컨테이너에 별명(alias)으로 접근하도록 설정함
입력된 컨테이너가 실행중이지 않거나 존재하지 않는다면 이 옵션을 적용한 컨테이너도 실행할 수 없음
현재 deprecated된 옵션이며 추후 삭제될 수 있음
도커 브리지 네트워크를 사용하면 --link 옵션과 동일한 기능을 더욱 손쉽게 사용할 수 있음

위 예시에서 mysql은 하나의 터미널을 차지하는 mysqld를, 워드프레스는 하나의 터미널을 차지하는 apache2-foreground를 실행하므로 -d 옵션을 지정해 백그라운드로 설정함

mysql 이미지는 컨테이너가 시작될 때 mysqld가 동작하도록 설정돼 있으므로 -i -t 옵션으로 생성하더라도 상호 입출력이 불가능하고 프로그램이 포그라운드 모드로 동작하는 것만 지켜볼 수 있음

0개의 댓글