Docker 서버 구성하기

CentOS 7에서 Docker 서버 구성하기

1. Docker를 위한 패키지 설치

Minimal 설치의 경우 Docker에서 의존하는 패키지를 추가로 설치한다.

$ rpm -qa | grep device-mapper
$ rpm -qa | grep lvm2

# device-mapper-persistent-data, lvm2가 설치되지 않았으면 설치
$ sudo yum localinstall device-mapper-persistent-data-0.7.3-3.el7.x86_64.rpm \
    lvm2-2.02.177-4.el7.x86_64.rpm

# docker에 의존하는 패키지 설치
$ sudo yum localinstall audit-libs-python-2.8.1-3.el7.x86_64.rpm \
    checkpolicy-2.5-6.el7.x86_64.rpm \
    libcgroup-0.41-15.el7.x86_64.rpm \
    libsemanage-python-2.5-11.el7.x86_64.rpm \
    policycoreutils-python-2.5-22.el7.x86_64.rpm \
    python-IPy-0.75-6.el7.noarch.rpm \
    setools-libs-3.3.8-2.el7.x86_64.rpm

# extra 패키지가 DVD에 있으면 가져와서 설치하고 없으면 다운로드해서 설치한다
$ curl -O http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.68-1.el7.noarch.rpm

$ sudo yum localinstall container-selinux-2.68-1.el7.noarch.rpm

권장사항은 아니지만, 필요하다면 SELinux를 끈다. (/etc/sysconfig/selinux)

2. Docker 다운로드 및 설치

curl -O https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.2-3.el7.x86_64.rpm
curl -O https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.1-3.el7.x86_64.rpm
curl -O https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.1-3.el7.x86_64.rpm
curl -O https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.3.ce-1.el7.noarch.rpm

sudo yum localinstall containerd.io-1.2.2-3.el7.x86_64.rpm \
    docker-ce-cli-18.09.1-3.el7.x86_64.rpm \
    docker-ce-18.09.1-3.el7.x86_64.rpm \
    docker-ce-selinux-17.03.3.ce-1.el7.noarch.rpm

# docker 명령어는 모두 root로 실행해야 하는데 매번 sudo를 사용하기 불편하므로 특정 사용자에게 실행 권한을 부여한다
# logout 후 다시 로그인해야 반영됨
sudo usermod -aG docker user

# 부팅시 docker 실행하도록 등록
sudo systemctl enable docker

# docker 서비스 실행
sudo systemctl start docker

3. 스크래치(scratch) 이미지 만들기

Dockerfile에서 FROM scratch를 사용하려면 스크래치 이미지가 필요한데 아래와 같이 생성한다.

$ tar cv --files-from /dev/null | docker import - scratch

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
scratch             latest              6a7ed0b45a25        9 seconds ago       0B

4. 도커 테스트

# 테스트 할 OS 이미지를 다운로드한다
# 이미지는 `docker search (이름)` 또는 [Docker Hub](https://hub.docker.com/)에서 확인할 수 있다
$ docker pull centos:7

# 컨테이너 실행
# -i: interactive, -t: tty
# --name: 컨테이너의 이름(이미지 이름이 아님), ps, restart, stop, rm 등에서 사용
$ docker run -i -t --name test centos:7 /bin/bash

# -i, -t 명령으로 터미널을 잡았(attach)으므로 컨테이너 안에서 실행된다.
# Ctrl-D는 컨테이너를 종료하며(start로 재실행 가능),
# Ctrl-P, Ctrl-Q 로 컨테이너에서 빠져나올 수 있고, attach 명령으로 다시 접근할 수 있다.

# 실행중인 컨테이너에 터미널로 접근할 때(디버깅용)
$ docker exec -i -t 컨테이너명 /bin/bash

# stdout, stderr 보기
$ docker logs 컨테이너명

관리 명령어

  • run: 이미지에서 컨테이너 생성
  • ps: 현재 실행중인 컨테이너 목록, ps -a: 실행중 및 중지된 컨테이너 목록
  • start: 중지된 컨테이너 실행, stop: 컨테이너 종료, restart: 컨테이너 중지후 재실행
  • exec: 외부에서 컨테이너 내부의 쉘을 기동해서 명령 실행
  • cp: 외부의 파일을 컨테이너 내부로 복사 또는 컨테이너 내부의 파일 추출
  • rm: 종료된 컨테이너 삭제(컨테이너는 종료 또는 OS를 재부팅해서 중단되어도 실행 정보가 남아있으며 rm으로 삭제해야 지워짐)

이미지 관리 명령어

  • images: 이미지 목록
  • pull: 저장소에서 이미지 내려받기 (호스트명이 없으면 Docker Hub에서 다운로드)
  • build: 지정한 디렉터리의 Dockerfile에서 이미지 생성 docker build --tag myimg:0.1 .
  • commit: 컨테이너의 변경내역을 이미지로 저장 docker commit <옵션> 컨테이너명 이미지명:태그
  • history: 변경 기록
  • diff: 변경한 파일 목록
  • inspect: 컨테이너 또는 이미지 정보 (info는 docker 서버의 정보를 출력)
  • rmi: 이미지 삭제 docker rmi centos:7

5. 도커 이미지 저장소 서버 만들기

도커 명령으로 작업한 내용은 로컬 서버의 /var/lib/docker 디렉터리에 저장하며 해당 서버에서만 유효하다.

이미지 저장소 서버를 구성하면 Docker Hub의 도움을 받지 않고 로컬에서 작업한 내용을 이미지 저장소 서버에 저장하고 다른 서비스로 배포할 수 있다.

# registry 이미지를 가져온다
$ docker pull registry:latest

# registry 이미지 실행
$ docker run -d -p 5000:5000 \
    --restart always --name registry
    -v /home/user/docker_registry:/var/lib/registry registry:latest

# 리부팅 등으로 저장소 서버가 중단되었을 경우 재시작
$ docker start registry

폐쇄망이라 docker pull로 이미지를 다운로드할 수 없으면 GitHub에서 다운로드한다. 별도로 다운로드할 때는 Dockerfile 에서 다른 이미지를 호출하거나 인터넷 접속을 요구하는지도 확인한다.

6. 로컬 registry 관리

로컬 저장소에 저장하기 위해서는

  1. build나 pull, commit 등으로 이미지를 생성하고
  2. tag 명령으로 <저장소 주소="">/<이미지명>:<버전>으로 별칭을 붙인 후
  3. push 명령으로 저장소로 보낸다.
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
scratch             latest              6a7ed0b45a25        4 hours ago         0B
registry            latest              33fbbf4a24e5        8 days ago          24.2MB
centos              7                   1e1148e4cc2c        5 weeks ago         202MB

$ docker tag centos:7 localhost:5000/centos:7

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
centos                  7                   1e1148e4cc2c        5 weeks ago         202MB
localhost:5000/centos   7                   1e1148e4cc2c        5 weeks ago         202MB

$ docker push localhost:5000/centos:7

로컬 저장소에 저장된 이미지는 docker search등의 명령으로는 조회할 수 없으며 별도의 HTTP 기반 Rest API로만 가능하다.

간단한 예:

$ curl http://localhost:5000/v2/_catalog
{"repositories":["centos"]}

$ curl http://localhost:5000/v2/centos/tags/list
{"name":"centos","tags":["7"]}

자세한 내용은 Docker Registry HTTP API V2를 확인.

registry 서비스에도 TLS지원이 있지만 registry 서비스는 로컬만 실행하고 nginx 역프록시를 구성하면서 인증 등의 기능을 추가할 수도 있다.

7. 추가로 체크할 것들

  • 저장소 서버 구성에서 localhost 대신 도메인 사용
  • 컨테이너 배포 자동화(오케스트레이션 툴)
  • 네트워크 설정(컨테이너간 네트워크 연결)
  • 자동화 스크립트 Compose
  • Docker 엔진 API

8. 참조사이트