-
Docker 컨테이너 빌드업프로그래밍 지식/Infra 2024. 9. 28. 18:42
출처 :
https://fastcampus.co.kr/dev_online_devops_kubernetes
실무까지 한 번에 끝내는 DevOps를 위한 Docker & Kubernetes feat. aws EKS | 패스트캠퍼스
130시간 이상의 커리큘럼을 통해 온프레미스 환경 & AWS EKS 환경까지 실무 환경을 그대로 잡은 국내 유일 Kubernetes 강의! 300가지가 넘는 실습을 통해 강의 하나로 개발자부터 Devops, SRE, 각종 인프라
fastcampus.co.kr
01.컨테이너 가상화 이해
가상 머신 vs Docker
- 가상머신 : HostOS 위에서 Hypervisor 위에서 별도의 GuestOS 위에서 동작 (하드웨어 수준의 가상화)
- Docekr : HostOS 위에서 엔진을 통해 동작 (커널을 공유, 운영체제(OS) 수준의 가상화)
도커 엔진
(점차 오른쪽 방향으로 발전)
- 커널 기술의 공유를 통해 컨테이너 생성을 지원하는 runC
- 생성된 컨테이너의 라이프사이클 관리를 지원하는 containerd
- 사용자 환경에서의 명령을 전달하는 dockerd
-> 사용자는 보통 dockerd와만 소통한다.
02. docker 플랫폼 환경 구성
직접 docker를 설치하지 않고도 docker 환경을 테스트할 수 있는 곳 (유효시간 : 4시간)
Play with Docker
Play with Docker A simple, interactive and fun playground to learn Docker Login
labs.play-with-docker.com
이미지 다운로드 시 다양한 버전이 존재하는데, 초경량을 원한다면 Alpine 이 명시된 것을 추천
- Alpine : 리눅스 종류. Alpine 이미지는 작은 크기 덕분에 빠르고 효율적인 컨테이너 환경을 제공하기 때문에, 특히 마이크로서비스와 같이 경량화된 애플리케이션을 배포하는 데 유리
* 호스트 client tool에서 컨테이너 DB와도 연결 가능 (ex. MySQL/MariaDB workbench)
Portainer : 웹 GUI 기반의 docker 컨테이너 관리 도구
03. docker 엔진(version) update
docker(SW)도 점차 업데이트가 되고 있음. 최신 버전의 docker 엔진을 무조건 업데이트 해야할까?
-> 업데이트 하는 것을 권장운용 중인 Docker 엔진 업데이트를 하는 것은
- 기존 실행 중인 컨테이너 stop해야 하는 이슈
- 최신 docker 엔진 설치 후 기존 컨테이너를 재기동할 때 error가 발생할 수 있다는 점
이 있기 때문에 주의가 필요하다.
04. 컨테이너 애플리케이션 배포를 위한 docker 이미지
- 이미지는 변경되는 상태값이 없고(Stateless), 불변(Read Only)
- 이미지를 컨테이너에 올린 뒤 수정하여 다시 이미지로 만드는 것은 가능. 그러나 이미지 상태에서 수정하는 것은 불가능
📌 이미지 내려 받기
docker [image] pull [options] name:[tag]
docker pull docker.io/library/debian:10 # 예시
tag를 붙이지 않으면 latest가 다운로드 받아짐
📌 이미지 구조 확인 (배경)
docker image inpect [name:[tag]]
이미지는 기본적으로 layer로 구성되어 있고, 내부 구조를 조사할 수 있다.
📌 이미지 구조 확인 (DockerFile에 대한 내용)
docker image history [name:[tag]]
어떤 DockerFile 명령어를 통해 만들어졌는지 확인 가능
** private Repository는 계정 하나당 하나밖에 만들지 못함
📌 Docker login
- 암호로 접근 하는 방법
- docker login 명령어를 통해 ID/PW를 기입
- PW가 파일에 남기 때문에 위험
- 토큰으로 접근 하는 방법
- cat "토큰파일" | docker login --username 유저명 --password-stdin
- 토큰이기 때문에 안전하며, 도커 웹에서 activate, deactivate 가능하므로 안전
📌 이미지 올리기(push)
Registry : Dockerfile을 통해 생성된 이미지나 docker commit을 통해 생성된 이미지가 저장되는 곳
- Repository: 특정 애플리케이션이나 서비스의 Docker 이미지와 버전을 관리하는 단위.
- Registry: 여러 개의 Repository를 관리하고, Docker 이미지의 저장, 배포를 위한 서비스. (ex. Docker Hub)
docker [image] tag -> push
docker image tag myweb:v1.0 계정명/myweb:v1.0 docker push 계정명/myweb:v1.0
📌 이미지를 공유하는 방법 세 가지
- Registry에 push하여 공유
- 이미지를 생성하는 Dockerfile과 소스를 Github에 올려서 공유
- 이미지를 docker save를 통해 파일로 백업하여 전달 후 docker load를 통해 공유
3번 방법
docker image save myweb:1.0 | gzip > myweb1.tar.gz # 파일 다른 서버로 이동 docker image load < myweb1.tar.gz docker images docker run -itd -p 8200:80 myweb:1.0 # 원하는 포트로 기동시키기
📌 이미지 삭제
docker image rm [옵션] {이미지명[:태그] | 이미지ID}
docker rmi [옵션] {이미지명[:태그] | 이미지ID}컨테이너로 참조 중이면 삭제 불가능 (컨테이너 stop 및 삭제 필요)
# 이미지 전체 삭제 docker rmi $(docker images -q) # q를 하면 이미지 ID들만 가져옴 # 특정 이미지명이 포함된 것만 삭제 docker rmi $(docker images | grep 문자열) # 문자열이 포함된 이미지만 삭제
05. Docker container registry 구성해 보기
Docker에서 별도의 Registry를 구성하는 것을 지원한다. (만들어서 사내에서만 사용하는 방법이 있음. Nexus를 사용하는 방법은 뒤에서 설명 예정)
docker run -d \ -v /home/seongwoo/registry_data:/var/lib/registry \ # 내 서버 위치와 도커 위치를 매칭하여 볼륨을 잡음 (볼륨은 추후 설명 예정) -p 5000:5000 \ --restart=always \ --name=local-registry \ # 네이밍 registry
이렇게 만들어진 Registry는 기본적으로 로그인은 없음. 따로 구축할 수 있음
docker image tag (기존 이미지) 192.168.57.22:5000/myweb:v1.0 # 5000번 포트로 연 레지스트리를 태깅 # 새로운 Registry를 사용할 수 있게끔 도커 데몬에 알려줘야 한다. vi /ect/init.d/docker ... DOCKER_OPTS=--insecure-registry 192.168.57.22:5000 sudo vi /etc/docker/daemon.json {"insecure-registries" : ["192.168.57.22:5000"]} sudo systemctl restart docker.service
docker info 명령어를 통해 Registry가 잘 등록되었는지 확인 가능
'프로그래밍 지식 > Infra' 카테고리의 다른 글
SAA 준비 (0) 2024.08.06 CI/CD를 구축하며 (0) 2024.01.09 CI/CD 구축 프로젝트 (0) 2023.12.14 Spring Boot/React Docker 이미지 만들기 (0) 2023.07.16 리액트 aws 배포 (0) 2023.06.12