Docker 기본 (feat. 시작하세요 도커/쿠버네티스 정독하기)

All We Need is Data, itself !·2022년 1월 22일
0

Docker/Kubernetes

목록 보기
1/7

출처: 시작하세요! 도커/쿠버네티스 (용찬호 저)
http://www.yes24.com/Product/Goods/84927385



Docker 기본 명령어


  • docker run -i -t ubuntu:14.04
    • 이미지 다운받고 run, 로컬에 이미지 없으면 도커 허브에서 이미지를 받아옴
  • docker create -i -t --name brocentos centos:7
    • container만 생성 , 실행은 하지 않음
  • docker [ start/attach ] brocentos
    • attach는 시작 후 내부로 들어감
  • docker start [ docker id ]
  • docker ps
    • 정지되지 않은 컨테이너만 확인 , -a 옵션을 추가하면 정지된 것도 나옴
  • docker rename brocentos brocontainer
    • 이름 바꾸기
  • docker rm [ -f ] brocontainer
    • 실행중이지 않은 컨테이너 삭제하기, f 옵션은 실행중인 애 삭제 가능
  • docker stop brocontainer
    • 컨테이너 정지시키기
  • docker container prune
    • 컨테이너 전체삭제
  • docker ps -a -q
    • q옵션: 컨테이너의 아이디 / 컨테이너 아이디 전체 출력
    • docker stop $(docker ps -a -q) 모든 컨테이너 정지

1. 컨테이너 바인딩

기본적으로 컨테이너는 172.17.0.x의 IP를 순차적으로 할당
아무 설정이 되어있지 않다면 컨테이너는 외부에서 접근할 수 없으며 호스트에서만 접근 가능하다.
따라서 컨테이너의 애플리케이션을 노출하려면 eth0의 IP와 Port를 호스트의 IP와 Port에 바인딩해야함.

  • ifconfig : 컨테이너 네트워크 인터페이스 확인

  • docker run -i -t --name brocontainer -p 80:80 ubuntu:14.04

    • [ -t ] 옵션은 컨테이너의 포트를 호스트의 포트와 바인딩 ( 호스트:컨테이너 )

1) 아파치 웹 서버 설치

  • apt-get update && apt-get install -y apache2
    service apache2 start

2) Detached 옵션

  • -i -t : attach 가능한 상태로 설정
    • 표준 입출력이 활성화된, 상호작용이 가능한 셀 환경을 사용하는 옵션
    • /bin/bash로 열기
  • -d : detached 옵션, 컨테이너를 백그라운드에서 동작하는 어플리케이션으로써 실행하도록 만듬
    • 입출력이 없는 상태의 컨테이너 실행
    • 컨테니어 내부에서 프로그램이 터미널을 차지하는 foreground로 실행되어 사용자의 입력을 받지 않음.
    • -d 옵션이 있는 상태에서는 반드시 프로그램이 실행되어야 하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료된다.

dockerfile을 작성해서 실행할 프로그램을 미리 넣어주고 bash에서 확인하지 않고 백그라운드 환경에서 돌릴 수 있는 옵션인 것 같다.
터미널을 차지하지 않는다 ➡️ 터미널에서 볼 수 없다. 알아서 뒤에서 돈다 는 느낌?

  • -e : 환경변수 설정
docker run -i -t --name mysql_attach \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7

컨테이너의 MYSQL_ROOT_PASSWORD 환경변수의 값을 password로 설정한다는 의미
❗️ 비밀번호처럼 민감한 정보를 컨테이너 내부의 환경 변수로 설정하는 것은 바람직하지 않음.
❗️ 이런 경우에는 도커 스웜 모드의 secret이나 쿠버네티스의 secret과 같은 기능을 활용해서 비밀번호를 전달하는 게 좋음.

  • exec : 컨테이너 내부의 shell 사용 가능하게 하는 명령어
docker exec -i -t wordpressdb /bin/bash

exec : 내부에서 명령어를 실행한 뒤 결괏값 반환받을 수 있게 해준다. '-i -t' 옵션 없이 exec만 쓰면 결과만 반환한다.

  • --link : 내부 IP를 알 필요 없이 항상 컨테이너에 alias로 접근하게 설정해줌.
    • A 컨테이너에서 B 컨테이너로 접근하는 방법 중 가장 간단한 것은 NAT으로 할당받은 내부 IP를 쓰는 것이지만, 도커 엔진은 컨테이너가 정지 상태에서 뜰 때마다 내부 IP를 순차적으로 할당해주기 때문에 매번 변경되는 컨테이너의 IP로 접근하기 어려움. 따라서 --link 를 사용.
--link wordpressdb:mysql

워드프레스 웹 서버 컨테이너는 wordpressdb의 IP를 몰라도 mysql이라는 호스트명으로 접근할 수 있게 됨.
그러나 이 옵션은 --link에 입력된 컨테이너가 실행 중이지 않거나 존재하지 않으면 적용한 컨테이너 또한 실행할 수 없음. 따라서 컨테이너를 연결해주는 것 뿐만 아니라 컨테이너 실행 순서의 의존성도 정의해 줌.



Docker Volume

도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용
ㄷ그리고 그 위에 쓰기가 가능한 도커 컨테이너를 올리는 형식을 띰.

이 방식에는 단점이 있는데, 도커 이미지(mySQL Container)를 삭제하면 도커 컨테이너 계층에 저장되어 있던 데이터베이스의 정보도 삭제된다는 것
따라서 이를 위해 데이터를 영속적으로 저장하는 방법이 몇가지 있음.

볼륨을 활용하는 방법
1. 호스트와 볼륨 공유
2. 볼륨 컨테이너 활용
3. 도커가 관리하는 볼륨 생성

1. 호스트와 Volume을 공유하는 방법

  • -v [호스트 경로] : [컨테이너 경로] : 호스트 경로와 컨테이너의 경로 내의 디렉토리를 공유하겠다는 뜻
    • -v를 여러개 쓸 수 있음.
    • 주의할 점은, 호스트 경로에 파일이 있으면 덮어씌워지게 됨. (마운트 개념)

2. Volume 컨테이너

이거는 그냥 -v로 볼륨을 공유하고 있는 컨테이너에 다른 컨테이너를 연결시켜서, 로컬과 볼륨을 공유하고 있는 컨테이너에 저장하는 거...
이러한 구조를 활용하면 호스트에서 볼륨만 공유하고 별도의 역할을 담당하지 않는 '볼륨 컨테이너'로서 활용하는 게 가능.

  • --volumes-from [컨테이너 명] : [컨테이너 명]과 볼륨을 공유하겠다는 것.

3. 도커 Volume

도커 자체에서 제공하는 볼륨을 사용할 수도 있다.

  • docker volume create [--name bro]

  • docker volume ls

볼륨을 생성할 때 플러그인 드라이버를 설정해 여러 종류의 스토리지 백엔드를 쓸 수 있음.
기본적으로는 local : 로컬 호스트에 저장되며, 도커 엔진에 의해 생성되고 삭제된다.

  • docker run ~ -v [볼륨 이름] : [컨테이너 내의 공유 디렉토리]


Docker 이미지

데비안 운영체제에서 apt-get 을 실행하면 apt 레포에서 패키지를 내려받고 레드햇 운영체제에서 yum을 실행하면 yum 레포에서 패키지를 내려받듯이 도커는 도커 허브에서 이미지를 가져옴.

  • docker search [ubuntu] : Github처럼 STAR도 있고, 다양한 이미지 확인 가능

이미지 생성

보통 이미지 생성 시 ubuntu 등 os를 들고와서 그 위에 이미지를 생성하는 듯?

  • docker commit [컨테이너명] [레포지토리:태그]
    • docker commit commit_test commit_test:first

태그는 입력하지 않으면 자동으로 latest로 저장됨.

옵션

  • -a : author
  • -m : commit message

이미지 추출

이미지를 단일 바이너리 파일로 저장하는 법

  • docker save [-o 추출될 파일명] [추출할 이미지] : 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출
    • docker sav -o ubuntu14.tar ubuntu:14.04
  • docker load -i ubuntu14.tar : 추출된 이미지를 다시 도커에 로드

↔️ export import 와의 차이점?

commit으로 이미지를 만들면 변경된 사항뿐만 아니라 컨테이너가 생성될 때 설정된 detached 모드, 컨테이너 커맨드와 같은 설정도 이미지에 함께 저장됨.
그러나 export는 컨테이너의 파일시스템을 tar파일로 추출하며, 컨테이너 및 이미지에 대한 설정 정보를 저장하지 않음.
export는 레이어 구조를 사용하지 않으므로 비효율적이다.


이미지 배포

두가지 방법이 있다.
도커 허브 이미지 저장소를 이용하는 방법과 사설 레지스트리를 사용하는 방법.


1. 도커 허브 이미지 저장소를 이용

결제를 하지 않으면 Private 저장소의 수에 제한이 있지만, Public은 언제든 사용 가능

  • docker commit [컨테이너명] [사용자 이름]/[이미지 이름]:[태그] : 이미지 도커 허브에 올리기
    • [사용자 이름]/[이미지 이름]:[태그]까지가 모두 이미지 이름이 됨.
    • docker commit bro_contatiner jee161209/my-image:latest
  • docker tag [기존의 이미지 이름] [바꿀 이미지 이름] : 이미지 이름 바꾸기

  • docker pull [이미지 이름] : 이미지 pull

    • docker pull jee161209/my-image:latest

2. 도커 사설 레지스트리 사용

사용자가 직접 이미지 저장소를 만듬. 그러나 서버, 저장 공간 등을 직접 관리해야 한다.

docker run -d --name my-registry \
-p 5000:5000 --restart=always registry:2.6

레지스트리 컨테이너는 기본적으로 5000번 포트 사용
이 포트로 컨테이너의 RESTful API를 이용할 수 있음.

  • curl localhost5000/v2/ : 컨테이너가 정상적으로 작동하는지 확인

  • docker push [도메인 이름]:5000/[이미지 이름]:[태그] : 이미지 push

    • 기본적으로 도커 데몬은 HTTPS를 사용하지 않은 레지스트리 컨테이너에 접근하지 못하도록 설정하기 때문에, 인증서를 적용해 별도로 HTTPS를 설정해야 함.
    • 해결법: DOCKER_OPTS=--insecure-registry=[입력]를 docker daemon에 추가해서 HTTPS를 사용하지 않는 레지스트리 컨테이너에 이미지를 push할 수 있음.

Docker daemon의 시작 옵션을 변경하는 방법?
1. 도커 데몬 서비스의 시작 옵션을 직접 변경
2. daemon.json을 설정해서 docker daemon이 설정 파일을 읽게 만드는 것.

  • 2번의 경우(for Mac) 도커 트레이 아이콘에서 [Preferences]를 클릭하고 [Deamon] ➡️ [Advanced] ➡️ 도커 옵션 입력 ➡️ [Apply & Restart]
  • docker pull [도메인 이름]:5000/[이미지 이름]:[태그] : docker pull

profile
분명히 처음엔 데린이었는데,, 이제 개린이인가..

0개의 댓글