Docker 서버 구성하기
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 에서 다른 이미지를 호출하거나 인터넷 접속을 요구하는지도 확인한다.
- registry 이미지는 http로 동작하며, localhost로만 접속할 수 있다.
- 참조: Docker registry document
6. 로컬 registry 관리
로컬 저장소에 저장하기 위해서는
- build나 pull, commit 등으로 이미지를 생성하고
- tag 명령으로 <저장소 주소="">/<이미지명>:<버전>으로 별칭을 붙인 후버전>이미지명>저장소>
- 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