반응형

 

스터디 1주차 내용 정리 글!

 

( 스터디에선 aws 계정을 만들어 하시던데.. 저는 그냥... vmware나 회사 리눅스 서버에서 .. 실습해봐도 되겠지요?🤔 비용 이슈로...ㅎㅎ)

 


 

 

도커란?

컨테이너를 사용하기 위한 도구

 

이미지: 프로그램과 실행 환경이 담긴 설치 패키지
어떤 프로그램을 실행하기 위해 필요한 **모든 것(코드, 라이브러리, 설정 등)**을 하나로 묶은 패키지.

 

이미지를 띄우면 컨테이너

컨테이너: 이미지를 실행해서 만든 실제 실행 중인 인스턴스 (가상실행 환경)

 

컨테이너는 격리된 환경을 제공하고, 프로세스로 동작됨 .

 

격리된 환경: 다른 컨테이너나 호스트와 독립적으로 동작하는 환경

 

 

 


 

 

 

 

/proc 디렉터리

- 리눅스 /proc 경로: 프로세스 실행중인 정보파일을 저장함
(프로씨 라고 읽음)

=> 도커데몬은 /proc를 가지고 활용한다

 

 

 

리눅스 커널 운영체제 상태나 프로세스 정보를 실시간으로 보여주는 가상 파일 시스템

 

 

 

 


 

 

 

 

기본 명령어

- 도커 명령어를 일반 사용자에서 사용하기 위해선 사용자를 docker 그룹에 추가해줘야 함

sudo usermod -aG docker $USER

 

 

컨테이너 프로세스 확인

# 실행중인 컨테이너 확인
docker ps

# 모든 컨테이너 확인 (종료된 컨테이너도 보임👀)
docker ps -a

 

 

이미지 다운로드

docker pull 이미지명:태그명

docker pull하면 일단 로컬에서 찾아보고 없으면
도커허브..(docker.io)에서 가져오도록 기본적으로 설정되어 있음

 

 

로컬 이미지 조회

docker images

 

 

도커 실행

# docker run [옵션] 이미지명:태그명
docker run --name nginx-docker -p 3000:80 -d nginx:latest

=> 위 명령어에서 3000:80은 포트번호를 나타내는데,

서버IP 3000번 포트로 요청이 들어오면 해당 컨테이너의 80포트로 연결시킨다는 의미

(==> 울 회사에선 도커 런 명령어보다 이력관리를 위해서 도커컴포즈 파일로 관리하고 실행중이다)

- 컨테이너가 죽으면 파일이 날라가는데, 이걸 볼륨 마운트 해서 호스트 볼륨이랑 마운트 해놓으면 컨테이너 죽어도 살아있음.

(볼륨 마운트 하면 호스트에서 수정한 내용이 컨테이너 내부에서 보이고, 그 반대도 같음.. 정말 말그대로 마운트!!)

 

 

 

 

 네트워크 상태 조회

# 포트번호 open인지 확인
netstat -ntlp

 

 

컨테이너 로그 확인

# -f 옵션: follow(로그를 따라가며 실시간 출력)
docker logs -f nginx-docker

 

 

컨테이너 내부 bash 실행

docker exec -it 컨테이너명 /bin/bash

 

 

컨테이너 정보 조회 

docker inspect 컨테이너명

 

 

컨테이너 중지 / 시작

docker stop 컨테이너명

docker start 컨테이너명

 

컨테이너 제거

docker rm 컨테이너명

 

컨테이너 이미지 제거

docker rmi 이미지명:태그명

 

 

 

 

기타 명령어

# 컨테이너 네트워크 조회
docker network ls
docker network inspect bridge
docker network inspect bridge | grep 'Containers' -A8

## 172.17.0.1 은 어디서 온걸까?
# => 가상 네트워크 인터페이스 카드 (NIC)
ip addr
ip addr show dev docker0

 

 

이미지 생성을 위해선 Dockerfile로 만든다.

 

docker image를 오프라인환경에서 사용하기 위해선 tar로 묶어서 파일 반입을 하여 가져가서 sftp로 서버에 올려놓음

docker load 해서 사용함

 

 

 

 


 

 

 

 

 

컨테이너 네트워크 모드 

 

Bridge: 도커 컨테이너 간 상호 통신, 호스트 컨테이너 간 통신 허용
(울 회사에서 브릿지 모드를 젤 많이 사용한다.. 엔진을 띄워서 사용하는데,, 특정 엔진에서 도커로 띄워져있는 엔진을 실행해야 하는 경우가 있어서.. 띄워져있는 포트번호로 찌르게 되어있다)

Host : 컨테이너에서 호스트 환경을 그대로 사용

None : 컨테이너에서 아무런 네트워크를 쓰지 않음. 외부와 연결이 단절 

 

추가 네트워크 플러그인: macvlan, ipvlan, overlay

 

 

 

 


 

 

 

 

이미지 빌드 시 고려사항

- 이미지 용량 단축방법: dockerfile에서 alpine, slim 등 경량화된 이미지 사용

- 멀티 스테이지 빌드: 빌드만을 위한 파일과 어플리케이션 실행을 위한 파일을 분리하기!! (빌드 파일  ..)

 

- 멀티 플랫폼 빌드

빌드하여 만들어진 이미지는 CPU 아키텍처(x86, amd, arm)가 동일한 환경에서만 사용 가능함 

여러 cpu 아키텍처에서 사용하기 위해선 멀티 플랫폼 빌드를 해야 함

 

 

 

 


 

 

 

 

컨테이너 보안 관련

non-root 유저 설정 : 설정을 해주지 않으면 컨테이너 내부에선 root 계정으로 접속이 됨. => root 계정으로 접속할 경우 관리자 권한이여서 이상한 짓(?) 할 수도 있어서 보안에 취약

dockerfile에 USER 사용자이름 적기!!

 

 

 

 


 

 

 

참고사항

 


- 도커 설치시 클라이언트와 서버가 같이 설치가 됨. 
클라이언트, 서버의 역할을 알고 있으면 됨.

 

 

- 유닉스 도메인 소켓
docker.sock을 통해서 통신하는데
TCP/IP를 안쓰고 소켓통신을 해서 훨씬 더 트래픽이 빠르고 효율적으로 통신한다

 

 

- 젠킨스 올릴때 도커로 많이 올린다..


- CI/CD 파이프라인에 들어간 이미지는 풀을 많이 하게 됨 => PRIVATE 레포나 ECR 퍼블릭에 올리는게 좋음! 도커허브는 유료화가 진행중이기 때문에 횟수 제한이 있음

 

 

 

 

 

 

 

 

# 찾아볼 키워드

  • 유닉스 도메인 소켓
  • 도커 네트워크
  • 서브넷, 게이트웨이
  • /proc 
반응형
복사했습니다!