1. 도커 구조

  • 도커는 크게 클라이언트, 서버로 나눔
항목 설명
클라이언트 도커 도커 엔진이 API 수행 할 수 있도록 CLI 제공
서버 도커 컨테이너 생성, 실행 및 이미지 관리

2. 도커 데몬 실행

  • 도커 정지 > 도커 데몬 명령어 입력
  • 도커 데몬을 직접 실행하는 것은 보안측면에서 바람직하지 않으므로 디버그 용도가 아닌 이상 사용하지 않는 것이 바람
[***@gcp-whms-dev-server ~]$ sudo service docker stop
Redirecting to /bin/systemctl stop docker.service
[***@gcp-whms-dev-server ~]$ dockerd
chmod /var/lib/docker: operation not permitted
[***@gcp-whms-dev-server ~]$ sudo dockerd
INFO[0000] libcontainerd: new containerd process, pid: 2578 
WARN[0000] containerd: low RLIMIT_NOFILE changing to max  current=1024 max=4096
INFO[0001] [graphdriver] using prior storage driver: overlay2 
INFO[0001] Graph migration to content-addressability took 0.00 seconds 
INFO[0001] Loading containers: start.                   
INFO[0001] Firewalld running: true                      
INFO[0002] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address 
INFO[0002] Loading containers: done.                    
WARN[0002] failed to retrieve docker-runc version: exec: "docker-runc": executable file not found in $PATH 
WARN[0002] failed to retrieve docker-init version       
INFO[0002] Daemon has completed initialization          
INFO[0002] Docker daemon                                 commit="4ef4b30/1.13.1" graphdriver=overlay2 version=1.13.1
INFO[0002] API listen on /var/run/docker.sock           

3. 도커 데몬 제어: -H

  • -H IP주소:Port번호 입력하면 Remote API로 도커를 제어할 수 있음
  • dockered로 설정하는 방법: 도커 클라이언트와 원격 제어를 할 수 있는 설정(하지만 보안상 추천하지 않)
sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
  • docker 설정파일 활용 방법:centos7 기준
  • docker.service 파일 열기
sudo vi /usr/lib/systemd/system/docker.service
  • docker.service 파일에 아래 내용 추가
EnvironmentFile=-/etc/sysconfig/docker
...<중략>...
ExecStart=/usr/bin/dockerd-current \
          ...<중략>...
          $DOCKER_OPTS
  • /etc/sysconfig/docker 파일 열기
sudo vi /etc/sysconfig/docker
  • 파일에 다음 내용 입력
DOCKER_OPTS='-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'
  • docker 정지 및 기동
sudo service docker stop
sudo service docker start
  • 접속 확인
local-pc$ curl http://10.0.0.1:2375/version
{"Version":"1.13.1",....<json 형태 정보 표시>.....}

4. 도커 데몬 보안 적용

  • 도커 클라이언트, Remote API 사용할 때 TLS 보안 적용 방법 설명

4.1 필요 파일

구분 항목 섦명
server 측 ca-key.pem 인증서 생성에 사용될 키
  ca.pem 공용키(public key)
  server-key.pem 서버측에서 사용될 키
  server.csr 서버 측에서 사용될 인증서를 위한 인증 요청서 파일
  extfile.cnf 접속에 사용될 IP 주소 저장
  server-cert.pem 서버 측 인증서
client 측 key.pem 클라이언트 측 키 파일
  cert.pem 클라이언트 측 인증서

4.2 필요 파일 생성

서버 측
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 10000 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST-IP" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = IP:$HOST-IP,IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf

클라이언트 측
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 30000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

모든 파일 쓰기 권한 제거 
chmod -v 0400 ./*

4.3 클라이언트 측 파일 이동

  • FileZilla를 통해 서버에서 생성한 파일 중 클라이언트에서 사용할 파일을 클라이언트로 복사함
  • Mac에서 FileZilla로 GCP 접속을 위해 pem 파일 생성 필요
pem 파일 생성 절차

1. brew install putty #putty 설치
2. cd ~/.ssh #ppk 위치로 이동
3. puttygen id_rsa -O private-openssh -o gcp-whms-dev.pem #gcp-whms-dev.pem 생성
  • 위 pem 파일을 이용하여 FileZilla로 서버 접속 및 아래 파일 클라이언트로 복사
    • ca.pem
    • cert.pem
    • key.pem

4.4 dockered 기동함

  • dockerd로 기동하는 방법
sudo dockerd --tlsverify \
--tlscacert=/home/Summit/keys/ca.pem \
--tlscert=/home/Summit/keys/server-cert.pem \
--tlskey=/home/Summit/keys/server-key.pem \
-H tcp://0.0.0.0:2376 \
-H unix:///var/run/docker.sock
  • 속성 파일 활용 방법

sudo vi /usr/lib/systemd/system/docker.service
#아래 설정 되었다고 가정 
EnvironmentFile=-/etc/sysconfig/docker
...<중략>...
ExecStart=/usr/bin/dockerd-current \
          ...<중략>...
          $DOCKER_OPTS
sudo vi /etc/sysconfig/docker

#아래 속성 설정 
DOCKER_OPTS='--tlsverify \
--tlscacert=/home/Summit/keys/ca.pem \
--tlscert=/home/Summit/keys/server-cert.pem \
--tlskey=/home/Summit/keys/server-key.pem \
-H tcp://0.0.0.0:2376 \
-H unix:///var/run/docker.sock'

sudo systemctl daemon-reload
sudo systemctl restart docker

Notice: 반드시 설정 후에 sudo systemctl daemon-reload, sudo systemctl restart docker 수행해야 설정한 속성이 정상 반영

4.3 TLS 적용된 보안 접속 테스트

  • 클라이언트에서 아래 명령어 입력
docker -H HOST-IP:2376 \
--tlscacert=/Users/Summit/IDE/docker/keys/ca.pem \
--tlscert=/Users/Summit/IDE/docker/keys/cert.pem \
--tlskey=/Users/Summit/IDE/docker/keys/key.pem \
--tlsverify version
  • 출력 결과: 원격 클라이언트에서 서버의 docker version 정보를 확인
Client: Docker Engine - Community
 Version:           19.03.5
...

Server:
 Engine:
  Version:          1.13.1
....

4.4 인증 관련 환경변수 간소화

vi .bash_profile
#아래 구문 추가 
export DOCKER_CERT_PATH="/Users/Summit/IDE/docker/keys"
export DOCKER_TLS_VERIFY=1

#추가된 구문 적용
source .bash_profile 

# 원격 호출 테스트 
docker -H HOST-IP:2376

카테고리:

업데이트:

댓글남기기