docker

도커 네트워크 구조 도커는 컨테이너에 내부 IP를 순차적으로 할당하는데, 이 IP는 컨테이너를 재시작할 때마다 변경될 수 있다. 이 내부 IP는 도커가 설치된 호스트, 즉 내부 망에서만 쓸 수 있는 IP이므로 외부와 연결되어야 한다. 도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성하는데 이름이 veth로 시작한다. veth 인터페이스는 사용자가 직접 생성할 필요는 없으며 컨테이너가 생설될 때 도커 엔진이 자동으로 생성한다. 도커가 설치된 호스트에서 ifconfig나 ip addr과 같은 명령어로 네트워크 인터페이스를 확인하면 실행 중인 컨테이너 수만큼 veth로 시작하는 인터페이스가 생성된 것을 확인할 수 있다. $ ifconfig docker..
만약 도커로 데이터베이스 컨테이너를 실행해 애플리케이션을 구동한다 했을 때 해당 데이터베이스 컨테이너가 삭제된다면 데이터도 삭제가 되고 복구할 수 없게 된다. 이런 경우에 데이터를 유지를 위한 몇 가지 방법이 있는데 그중 가장 활용하기 쉬운 방법이 볼륨 활용이다. 볼륨을 활용하는 방법은 여러 가지가 있다. 1. 호스트 볼륨 공유 호스트 볼륨 공유는 호스트화 컨테이너의 볼륨을 공유하는 것이다. 만약 MySQL 컨테이너를 사용해 애플리케이션을 구동한다 했을 때 호스트와 MySQL에서 데이터를 저장하는 볼륨을 공유할 수 있다. $ docker run -d \ --name mysql \ -e MYSQL_DATABASE=sample \ -e MYSQL_ROOT_PASSWORD=password \ -v /home/..
업무 상 Docker와 Nginx를 통해 Blue Green 무중단 배포를 구축하려고 한다. OS는 Centos 7.x 기준이고 Application은 Spring Boot 기준으로 정리하였다. 현재 서버는 NCP에 Server를 사용하고 있고 Container Registry에 이미지를 저장해 사용하고 있다. 1. Centos에 Nginx 설치 먼저 yum 업데이트한다. $ sudo yum update 업데이트가 다 되었으면 yum 저장소에는 nginx가 없기 때문에 외부 저장소를 추가해서 설치해야 한다. $ sudo vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basea..
여러 기술들을 테스트를 하기 위해 Docker로 Centos나 Ubuntu를 설치하는 상황이 계속되다보니 항상 그때마다 찾아보기 귀찮아서 정리를 해보려고 한다. 1. Centos 이미지 pull 및 컨테이너를 실행 $ docker run --privileged -d --name centos centos:7 /sbin/init 버전과 컨테이너 명은 원하는 버전으로 바꾸면 된다. $ docker ps 2. centos 컨테이너 접속 $ docker exec -it centos bash 3. yum 업데이트 및 필요 Util 설치 $ yum update $ yum install yum-utils 4. Docker repository를 시스템에 등록 $ yum-config-manager --add-repo ht..
· MongoDB
Docker로 몽고DB 시작하기 먼저 아래 명령어로 몽고DB 이미지를 Pull 받는다. 태그에 버전을 지정하지 않으면 최신 버전을 Pull 받게 된다. $ docker pull mongo 아래 명령어로 정상적으로 몽고DB 이미지를 Pull 받았는지 확인한다. $ docker images 이미지를 Pull 받았으면 몽고DB의 볼륨으로 사용할 디렉터리를 하나 만든다. $ cd ~ $ mkdir mongodb 몽고DB 컨테이너의 볼륨을 로컬 디렉터리와 마운트시키지 않으면 컨테이너를 삭제할 때 컨테이너에 저장되어있는 데이터도 삭제되기 때문에 복구할 수 없다. 그리고 아래 명령어를 통해 몽고DB 이미지를 실행한다. $ docker run --name mongodb -v ~/mongodb:/data/db -d -p..
· Spring
개요 기존에 Jenkins 자동화 배포를 할때 민감한 정보(db 정보 및 암호화 키 ...)가 기입되어 있는 설정파일(yml, properties ...) 파일은 gitignore를 적용하고 직접 Jenkins 서버에 접속해 넣어주고 빌드를 시켰다. 하지만 프로젝트가 많아졌을때 설정파일을 최신화 하게 되면 직접 프로젝트 루트에 설정파일을 직접 넣기 너무 귀찮고 빌드도 다시 시켜야 했다. Spring Cloud Config를 사용하게 되면 한 곳에서 모든 설정파일을 관리하고, 수정이 있더라도 다시 배포하지 않아도 되는 장점이 있다. 단점은 한마디로 보안이 굉장히 중요하다. 물론 보안은 어느곳에도 중요하지만 만약 Spring Cloud Config 암호화 대칭값이 노출되거나, 암호화 및 복호화 기능에 적용한..
· ETC
이전 글에서는 Jenkins을 이용해 jar파일 자동화 배포를 해보았다. 이번에는 소스코드를 도커 이미지 화 후 서버에서 해당 이미지를 받아 구동시키는 파이프라인을 구축하려고 한다. Blue Ocean 플러그인을 사용해 빌드가 되는 상태를 시각화하고 파이프라인을 쉽게 만들어보겠다. 이전 글과 마찬가지로 Jenkins 서버는 Docker로 로컬에서 구동했고, Jenkins 서버 구축 방법은 이전 글을 참고 바란다. 배포할 서버는 Naver Cloud Platform Server를 사용했고, 컨테이너 저장소는 Naver Container Registry를 사용했으므로 AWS EC2나 ECR을 사용하는 경우 설정법이 조금 다를 수 있다. 대략 진행되는 단계를 그림으로 나타내면 아래와 같다. 구축 예제 1. J..
매니페스트란 쿠버네티스의 오브젝트를 생성하기 위한 메타 정보를 YAML이나 JSON으로 기술한 파일이다. 실제 파드를 단독으로 기동하는 매니페스트를 작성하는 경우는 많지 않다. 보통 컨트롤러에 대한 매니페스트를 작성하는데 이때 파드에 대한 정보를 기술하는 부분이 포함된다. 이를 파드 템플릿이라고 하며, 파드의 매니페스트와 같다. 따라서 파드의 매니페스트를 기술하는 방법을 알고 있으면 컨트롤러를 사용할 때 도움이 된다. Nginx 컨테이너를 실행하는 매니페스트를 작성해보자. 주로 YAML파일이 JSON 파일보다 가독성이 좋아 많이 사용한다. 그리고 매니페스트를 작성할 때는 API 래퍼런스를 참고하는 것이 좋다. apiVersion: v1 kind: Pod metadata: name: nginx spen: ..
앞서 디플로이먼트 컨트롤러(Deployment Controller)에 의한 파드(Pod) 실행 예제에서 hello-world 컨테이너는 단발성 형태의 워크로드였다. 이에 적합한 쿠버네티스의 컨트롤러로 잡 컨트롤러(Job Controller)가 있다. kubectl 옵션으로 --restart=OnFailure를 지정하면 잡 컨트롤러의 제어하에 파드가 가동된다. 잡 컨트롤러는 파드가 비정상 종료하면 재시작하며 파드가 정상 종료될 때까지 지정한 횟수만큼 재실행한다. 디플로이먼트 컨트롤러를 만들 때와 마찬가지로 kubectl run 명령어 대신 kubectl create job 명령어를 사용해야 한다. 잡 컨트롤러는 컨테이너의 프로세스 종료 코드 값으로 성공과 실패를 판정하는데 , 그럼 job 2개를 생성해 하..
kubectl run에 옵션을 지정하면 파드를 디플로이먼트 컨트롤러 제어 하에 실행하는 것이 가능하다. 파드가 정지되었을 때 재기동시킬 필요가 있는지에 따라 옵션을 주면 된다. 이때 사용하는 옵션이 --restart=Always다. 반대로 파드만 독립적으로 실행하고 싶을 때는 --restart=Never 옵션을 주면 된다. --restart 옵션을 생략하면 기본값으로 Always로 실행된다. 즉 기본 적으로 디플로이먼트 컨트롤러에 의해 파드가 기동 된다. 디플로이먼트 컨트롤러 제어 하에 실행하는 방법은 아래와 같다. kubectl에 run은 서브 커맨드의 기능이 지나치게 방대해지는 것을 막기 위해 파드 자체를 만들 때만 run을 사용하고 디플로이먼트를 만들 때는 kubectl create deployme..
beekei
'docker' 태그의 글 목록 (2 Page)