본문 바로가기
반응형

DevOps128

[Docker] : ENV, VOLUME, ARG, USER ENV, VOLUME, ARG, USER ENV는 Dockerfile에서 사용 될 환경 변수를 지정한다. 이미지에도 저장이 되기 때문에 빌드된 이미지로 컨테이너를 생성하면 이 환경변수를 사용할 수 있다. FROM ubuntu:14.04 ENV test /home WORKDIR $test RUN touch $test/mytouvhfile test라는 환경변수에 /home라는 값을 설정했다. VOLUME은 빌드된 이미지로 컨테이너를 생성했을 때 호스트와 공유할 컨테이너 내부 디렉터리를 설정한다. JSON 배열 형식으로 여러개 사용도 되고 VOLUME /home/dir /home/dir2 로도 사용할 수 있다. FROM ubuntu:14.04 RUN mkdir /home/bolume RUN echo test .. 2022. 2. 25.
[Docker] : 도커 멀티 스테이지 활용해 빌드하기 멀티 스테이지를 이용한 Dockerfile 빌드하기 애플리케이션을 빌드할 때 많은 의존성 패키지, 라이브러리를 필요로 한다. package main import "fmt" func main() { fmt.Println("hello word") } main.go 파일의 내용 , 텝과 공백 위치 조심해야 한다. FROM golang ADD main.go /root WORKDIR /root RUN go build -o /root/mainApp /root/main.go CMD ["./mainApp"] main.go를 컴파일하고 출력 프로그램을 실행하는 Dockerfile docker build . -t go_helloworld 이제 빌드를 해본다. docker images 명령어 확인 후 실행해 보면 내용에 비.. 2022. 2. 25.
[Docker] : 캐시를 이용한 이미지 빌드 한 번 이미지 빌드를 마치고 재진행하면 이전 이미지 빌드에서 사용했던 캐시를 사용한다. vi Dockerfile2 FROM ubuntu:14.04 MAINTAINER alicek106 LABEL "purpose"="practice" RUN apt-get update Dockerfile2로 만들어 봤다. docker build -f Dockerfile2 -t mycache:0.0 ./ -f 혹은 —file 옵션으로 Dockerfile의 이름을 지정할 수 있다. 명령어를 실행하면 Using cache라는 내용과 별도 빌드 진행 과정이 생략되고 이미지가 생성이 되었다. 전에 빌드했던 Dockerfile에 같은 내용이 있다면 build 명령어는 새로 빌드하지 않고 같은 명령어 줄까지 이전에 사용한 이미지 레이어.. 2022. 2. 24.
[Docker] : Dockerfile을 이용한 컨테이너 생성과 커밋 build 명령어는 Dockerfile에 기록된 대로 컨테이너를 실행하고 완성된 이미지를 만든다. 하지만 이미지로 만드는 과정이 하나의 컨테이너에서 일어나는 것이 아니다. 이미지를 build 할 때 나오는 출력 중 Step은 Dockerfile에 기록된 명령어에 해당한다. ADD, RUN 명령어가 실행될 때마다 새로운 컨테이너가 하나씩 생성되고 이를 이미지로 커밋하게 된다. 즉, Dockerfile에서 명령어 한 줄이 실행될 때 마다 이전 Step에서 생성된 이미지에 의해 새로운 컨테이너가 생성되고, Dockerfile 적힌 명령어를 수행하고 다른 이미지 레이어로 제공된다. 이미지 빌드가 완료되면 Dockerfile의 명령어 줄 수 만큼 레이어가 존재하게 되고 중간에 컨테이너도 같은 수만큼 생성되고 삭제.. 2022. 2. 24.
[Docker] : 빌드 컨텍스트 이미지 빌드를 시작하면 도커는 가장 먼저 빌드 컨텍스트를 읽는다. 빌드 컨텍스트는 이미지를 생성하는데 필요한 각종 파일, 소스코드, 메타데이터 등을 담고 있는 데릭터리를 의미한다. Dockerfile가 위치한 디렉터리가 빌드 컨텍스트가 되는 것이다. 빌드 컨텍스트는 Dockerfile에서 빌드 될 이미지에 파일을 추가할 때 사용이 된다. Dockerfile에서 이미지 파일을 추가하는 방법은 ADD, COPY가 있다. 이 명령어들은 빌드 컨텍스트의 파일을 이미지에 추가하게 된다. 컨텍스트에 대한 정보는 이미지를 빌드할 때 맨 위에 출력이 된다. 컨텍스트는 build 명령어의 맨 마지막에 지정된 위치에 있는 파일을 전부 포함한다. Git과 같은 외부 URL에서 Dockerfile을 읽어 들인다면 해당 Rep.. 2022. 2. 24.
[Docker] : 도커 이미지 생성 이제 이미지를 빌드해 본다. build 명령어이다. -t 옵션은 생성될 이미지의 이름을 설정한다. mybuild:0.0 이라는 이름의 이미지가 생성된다. -t 옵션을 사용하지 않으면 16진수 형태의 이름으로 이미지가 저장된다. -t를 꼭 사용해주자. build 명령어 끝에는 Dockerfile이 저장된 경로를 입력하면 된다. 일반적으로 로컬에 저장된 Dockerfile을 사용하는데 외부 URL로부터 Dockerfile의 내용을 가져와 빌드할 수도 있다. 지금은 현재 디렉터리 ./ 를 입력해 주었다. 이렇게 되면 최종적으로 생성되는 이미지의 이름은 mybuild:0.0이고 여기에는 아파치 웹 서버가 설치되어 있고 컨테이너가 실행될 때 웹 서버를 실행하도록 CMD(커맨드) 설정을 했기 때문에 다른 설정 없이.. 2022. 2. 24.
[Docker] : Dockerfile 작성하기 Dockerfile에는 컨테이너에서 수행해야 할 작업을 명시하기 때문에 사용되는 명령어를 알아야 한다. 디렉터리를 생성하고 그 안에 HTML 파일을 미리 만들어 두었다. 그 안에 Dockerfile이라는 이름의 파일을 저장해 준다. 이미지에 아파치 웹 서버를 설치하고 로컬에 있는 test.html 파일을 웹 서버로 접근할 수 있는 컨테이너의 디렉터리인 /var/www/html에 복사한다. 도커 엔진은 Dockerfile을 읽을 때 현재 디렉터리에 있는 Dockerfile이라는 이름을 가진 파일을 읽는다. Dockerfile은 Empty(빈) 디렉터리에 저장하는 것이 좋은데 이미지를 빌드할 때 사용되는 Context 때문이다. 우선, FROM, RUN, ADD 기초 명령어를 우선 학습한다. Dockerfi.. 2022. 2. 24.
[Docker] : 도커 이미지 생성하기 아무것도 존재하지 않는 이미지(우분투, CentOS)로 컨테이너 생성 후 애플리케이션을 위한 환경을 설치하고 소스코드 등을 복사해 동작을 확인한다. 그리고 컨테이너를 이미지로 커밋한다. 보통은 개발한 애플리케이션을 컨테이너화 할 떄 위와 같은 방법을 떠올린다. 하지만, 이런 방법에는 장,단점이 있다. 장점으로는 동작을 확인하고 이미지화 하는 것이기 때문에 동작이 보장이 된다는 점이고 단점으로는 일일이 패키지를 수작업으로 설치해 주거나 애플리케이션이 동작하는 환경을 구성해 줘야 한다는 점이다. 도커는 이런 과정을 쉽게 기록하고 수행할 수 있는 build 명령어를 제공한다. 컨테이너에 설치해야 하는 패키지, 소스코드, 명령어, 셸 스크립트를 하나의 파일에 기록해두면 도커가 이 파일을 읽어 컨테이너에서 작업을.. 2022. 2. 24.
[Docker] : Docker Private Registry(, 도커 사설 레지스트리에 이미지 push하기 사설 레지스트리에 이미지 Push하기 도커 허브의 저장소를 사용할 때 썼던 이미지를 레지스트리에 올려본다. docker tag ohju96-image:0.0 ${DOCKER_HOST_IP}:5000/ohju96:0.0 docker tag ohju96-image:0.0 192.168.228.134:5000/ohju96:0.0 명령어를 입력해 이미지의 이름을 추가한다. ${DOCKER_HOST_IP}에는 레지스트리 컨테이너를 생성한 도커 호스트 IP를 입력하면 된다. docker push 168.192.229.134:5000/ohju96-image:0.0 레지스트리 컨테이너에 이미지를 올리는 명령어이다. 도커 허브에서 이미지를 push할 때와 같다. vi /etc/default/docker 시작 옵션에 OP.. 2022. 2. 23.
[Docker] : Docker Private Registry, 사설 레지스트리 컨테이너 생성하기 사설 레지스트리 컨테이너 생성 Docker Private Registry(도커 사설 레지스트리)를 사용하면 개인 서버에 이미지를 저장할 수 있는 저장소를 만들 수 있다. docker run -d --name myregistry \\ -p 5000:5000 \\ --restart=always \\ registry:2.6 이 레지스트리는 컨테이너로 구현되서 도커에서 공식적으로 제공하는 이미지가 존재한다. run 명령어로 간단하게 사용만 하면 된다. —restart는 컨테이너가 종료되었을 때 재시작에 대한 정책을 설정합니다. always는 컨테이너가 정지 될 때 마다. 다시 시작하도록 설정하기 때문에 도커 호스트나 도커 엔진을 재시작하면 컨테이너도 함께 재시작 된다. —restart의 다른 입력은 on-fai.. 2022. 2. 23.
[Docker] : 도커 허브(docker hub) 저장소를 통한 이미지 배포 📝 ← 도커 허브 저장소이다. 여기서도 마찬가지로 docker search 명령어를 입력한 것과 비슷하게 이미지를 검색할 수 있다. 회원 가입을 하고 레포지토리 생성 탭을 눌러준다. 설정해 주고 저장소를 생성한다. 비공개 저장소는 1개만 무료이다. 그 이상 사용을 원하면 결제가 필요하다. 정상적으로 생성이 되었다. docker run -i -t --name commit_container1 ubuntu:14.04 echo my first push >> test docker commit commit_container1 ohju96-image:0.0 방금 생성한 저장소에 이미지를 올려본다. ubuntu:14.04 이미지에 test라는 파일을 생성해 변경 사항을 만들고 ohju96-image:0.0이라는 이미지.. 2022. 2. 22.
[Docker] : 도커 이미지 배포하기 이미지를 생성해 다른 도커 엔진으로 배포할 떄 save나 export 명령어를 통해 배포하면 배포가 어려울 수 있다. 또한, 도커의 이미지 구조인 레이어 형태를 이용하지 않으면 매우 비효율적이다. 이것을 해결하기 위해 도커에서 공식적으로 제공하는 도커 허브 이미지 저장소를 사용하면 좋다. 쉽게 이미지를 저장하는 클라우드 서비스라고 이해하면 된다. 사용자는 이미지를 올리고(docker push) 내려받기(docker pull)만 하면 되서 매우 간단하다. 하지만 비공개는 유료라는 단점이 있다. 다른 방법으로는 도커 사설 레지스트리를 사용하는 것으로 사용자가 직접 이미지 저장소를 만드는 것이다. 하지만 사용자가 서버, 저장 공간을 관리해야 해서 도커 허브보다 사용하기 어렵다. 만약, 회사의 내부망 같은 곳에.. 2022. 2. 22.
[Docker] : 도커 이미지 추출하기 docker save -o ubuntu_14_04.tar ubuntu:14.04 도커 이미지를 단일 바이너리 파일로 저장해야 할 떄 docker save 명령어를 통해 컨테이너의 커맨드, 이미지 이름, 태그 등 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출할 수 있다. -o 옵션은 추출될 파일명을 입력한다. docker load -i ubuntu_14_04.tar 추출된 이미지는 load 명령어로 도커에 다시 로드할 수 있다. load시 이전 이미지와 완전 동일한 이미지가 도커 엔진에 생성된다. save, load와 비슷한 명령어로 export, import가 있다. docker commit 명령어로 컨테이너를 이미지로 만들면 컨테이너 변경사항, detached 모드, 커맨드 등 설정도 이미지와 .. 2022. 2. 22.
[Docker] : 도커 이미지 이해 이미지 구조 이해 docker inspect ubuntu:14.04 docker inspect commit_test:first docker inspect commit_test:second inspect 명령어를 통해 컨테이너뿐만 아니라 네트워크, 볼륨, 이미지 등 모든 도커 단위의 정보를 얻을 수 있다. 이 명령어에서 가장 중요한 부분은 Layers 항목이다. docker images에서 위에 3개의 이미지가 각각 188MB로 출력이 되어도 188MB 크기의 이미지가 3개 존재하는 것은 아니다. 전체 이미지의 실제 크기는 188MB + first 파일의 크기 + second 파일의 크기가 된다. docker history commit_test:second 레이어의 구조는 history명령어를 통해 조금 .. 2022. 2. 22.
[Docker] : 도커 이미지 생성 도커 이미지 생성 docker search를 통해 검색한 이미지를 pull 명령어로 내려받아 사용할 수도 있지만 도커로 개발하는 경우 컨테이너에 애플리케이션을 위한 특정 개발 환경을 직접 구축하고 사용자만의 이미지를 직접 생성해야 할 것이다. 이것을 위해 컨테이너에서 작업한 내용을 이미지로 만드는 방법을 알아본다. 이미지로 만들 컨테이너를 생성하고 컨테이너 내부에 first라는 이름의 파일을 생성해 기존 이미지로부터 변경 사항을 만들어 둔다. 호스트를 빠져나와 아래 명령어를 입력해 컨테이너를 이미지로 만들어 준다. commit_test라는 컨테이너를 commit_test:first라는 이름의 이미지로 생성한다. 장소 이름은 입력하지 않아도 상관은 없지만 이미지의 태그를 입력하지 않으면 자동으로 lates.. 2022. 2. 21.
[Docker] : docker images, 도커 이미지 및 이미지 검색 모든 컨테이너는 이미지를 기반으로 생성이 된다. 데비안 운영체제에서 apt-get install을 실행하면 apt 레포지토리에서 패키지를 내려받고, 레드햇 운영체제에서 yum install을 실행하면 yum 레포지터리에서 패키지를 내려받듯이 Docker Hub라는 중앙 이미지 저장소에서 이미지를 내려받는다. docker create, docker run, docker pull의 명령어로 이미지를 내려받을 때 도커는 도커 허브에서 해당 이미지를 검색한 뒤 내려받는다. 이미지는 대부분 도커 허브에서 공식적으로 제공하거나(ubuntu:14.04, centos:7 등) 다른 사람들이 도커 허브에 이미 올려놓은 경우(Apache Tomcat, Hadoop 등)가 대다수라 애플리케이션 이미지를 직접 만들지 않아도 .. 2022. 2. 21.
[Docker] : 도커 Block I/O 제한 컨테이너를 생성할 때 아무런 옵션도 설정하지 않으면 컨테이너 내부에서 파일을 읽고 쓰는 대역폭에 제한이 설정되지 않습니다. --device-write-bps --device-read-bps --device-write-iops --device-read-iops 위 옵션으로 입출력을 제한할 수 있다. Direct I/O의 경우에만 블록 입출력이 제한되고 Buffered I/O는 제한되지 않는다. --device-write-bps --device-read-bps 는 쓰고 읽는 작업의 초당 제한을 설정하고 kb, mb, gb 단위로 제한할 수 있다. docker run -it \\ --device-write-bps /dev/xvda:1mb \\ ubuntu:14.04 1MB로 초당 쓰기 작업의 최대치를 제한했다.. 2022. 2. 21.
[Docker] : 도커 컨테이너 CPU 제한 / --cpus 활용하기 --cpus --cpus 옵션은 --cpu-period, --cpu-quota와 동일한 기능을 하지만 조금 더 직관적으로 CPU의 개수를 직접 지정한다는 점에서 다르다. --cpus 옵션에 0.5를 설정하면 --cpu-period=100000, --cpu-quota=50000과 동일하게 컨테이너의 CPU를 제한할 수 있다. 컨테이너를 생성해 주고 확인을 해보면 CPU의 약 50%를 점유하고 있는 것을 확인할 수 있다. 병렬 처리를 위해 CPU를 많이 소모하는 워크로드를 수행해야 한다면 --cpuset-cpu 옵셩르 사용하는 것이 좋다. 특정 컨테이너가 특정 CPU에서만 동작하는 CPU 친화성을 보장할 수 있고 CPU 캐시 미스 또는 컨텍스트 스위칭과 같이 성능을 하락시키는 요인을 최소화 할 가능성이 높아.. 2022. 2. 21.
[Docker] : 도커 컨테이너 CPU 제한 / --cpu-period, --cpu-quota 활용하기 --cpu-period, --cpu-quota 컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms로 설정되지만 run 명령어 옵션 중 --cpu-period, --cpu-quota로 주기를 변경할 수 있다. --cpu-period의 값은 기본적으로 100000이고 이것은 100ms를 뜻한다. --cpu-quota는 --cpu-period에서 설정된 시간 중 CPU 스케줄링에 얼마나 할당할 것인지 설정해 주는 것이다. 위 예시에서는 100000 중 25000을 할당해 CPU 주기가 1/4로 줄어들어서 일반적인 컨테이너보다 CPU 성능이 1/4로 감소하게 된다. 즉, 컨테이너는 --cpu-period / --cpu-quota 만큼 CPU 시간을 할당받게 된다. 성능.. 2022. 2. 21.
[Docker] : 도커 컨테이너 CPU 제한 / --cpuset-cpu 활용하기 호스트에 CPU가 여러개 있을 때 —cpuset-cpus 옵션을 지정해 컨테이너가 특정 CPU만 사용할 수 있도록 설정할 수 있다. CPU의 집중적인 작업이 필요하면 여러 개의 CPU를 사용하도록 설정해 작업을 적절히 분배하는 게 좋다. CPU별 사용량을 확인할 수 있는 도구는 htop이 있고 아래 명령어로 설치할 수 있다. 이번에는 3번째 CPU만 사용하도록 설정을 해주었다. 우분투 : apt-get install htop CentOS : yum -y install epel-release && yum -y install htop htop를 사용하기 위해 다운받고 확인을 해본다. htop 명령어로 CPU 사용량을 확인하면 3번째 CPU만 사용되는 것을 확인할 수 있다. 참고로 —cpuset-cpus=”0.. 2022. 2. 21.
[Docker] : 도커 컨테이너 CPU 제한 / --cpu-shares 활용하기 --cpu-shares 옵션은 컨테이너에 가중치를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지 나타낸다. 사용 예시이다. 위 옵션은 상대적인 값을 가지는데 아무런 설정을 하지 않으면 컨테이너는 1024값을 갖게 되고 이것은 CPU 할당에서 1의 비중을 뜻한다. 1개의 CPU를 가지는 호스트에서 테스트를 해본다. 옵션으로 1024의 값을 할당하고 컨테이너의 명령어는 1개의 프로세스로 CPU에 부하를 주는 명령어(stress —cpu 1)로 설정을 해줬다. —cpu-shares의 값이 1024로 설정되었지만 호스트에 다른 컨테이너가 존재하지 않기 때문에 CPU를 거의 100% 사용하고 있음을 알 수 있다. 이때 —cpu-shares의 값이 512로 설정이 된 컨테이너가 같이 실행이 된.. 2022. 2. 21.
반응형