ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 03. (쿠버네티스 들어가기 앞서) 왕초보도 따라하는 도커 기초 (2)
    24년 11월 이전/데브옵스(DevOps)를 위한 쿠버네티스 마스터 2021. 6. 30. 21:46
    반응형

    이 문서는 인프런 강의 "데브옵스를 위한 쿠버네티스 마스터"을 듣고 작성되었습니다. 최대한 요약해서 강의 내용을 최소로 하는데 목표를 두고 있어서, 더 친절하고 정확한 내용을 원하신다면 강의를 구매하시는 것을 추천드립니다. => 강의 링크

    도커로 환경 변수 전달하기

    보안 상의 이유로 MySQL의 루트 비밀 번호 등, 컨테이너 내부에 민감한 정보를 저장할 수 없을 수 있다. 그럴 때 이용할 수 있는게 -e 옵션을 이용한 환경 변수를 전달하는 것이다.

    # sudo -i 명령어로 먼저 관리자 권한을 얻어야 한다.
    > docker run --name mysql --rm -e MYSQL_ROOT_PASSWORD=password -d mysql:latest

     

    그 후 먼저 컨테이너에 접속해보자.

    # 컨테이너 접속
    > docker exec -it mysql bash

     

    이 때 전달한 환경변수는 printenv 명령어로 확인할 수 있다.

    \# printenv
    MYSQL_MAJOR=8.0
    HOSTNAME=c7354e51aff7
    PWD=/
    # 여기에 설정되어있다.
    MYSQL_ROOT_PASSWORD=password
    
    HOME=/root
    MYSQL_VERSION=8.0.25-1debian10
    GOSU_VERSION=1.12
    TERM=xterm
    SHLVL=1
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    _=/usr/bin/printenv

     

    이제 환경 변수로 전달된 비밀번호로 MySQL에 접속해보자.

    \# mysql -p
    Enter password: <비밀번호 입력>

     

    제대로 접속이 된다면 다음과 같은 결과를 얻을 수 있다.

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.0.25 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 

    도커로 volume 마운트하기

    -v 옵션을 사용해서 호스트-컨테이너간 volume 마운트도 가능하다.

    참고! 호스트란?
    Docker가 설치된 머신을 의미한다.

    찰고! volume 마운트란
    마운트란 용량 확보 등의 이유로 하드 디스크를 리눅스의 특정 디렉토리와 매핑하는 것을 말한다. volume 마운트는 호스트의 디렉토리와 컨테이너의 디렉토리를 매핑하는 것을 의미한다. 권한에 따라 컨테이너에서 마운트된 디렉토리의 내용을 읽을 수도, 또는 읽고 작성할 수도 있다.

    터미널에 다음을 입력한다.

    > docker run --name ng -p 80:80 -d --rm -v /var/www:/usr/share/nginx/html nginx:latest

     

    그리고 curl 명령어로 nginx에 접속해보자. (컨테이너 접속은 하지 않는다.)

    > curl localhost
    <html>
    <head><title>403 Forbidden</title></head>
    <body>
    <center><h1>403 Forbidden</h1></center>
    <hr><center>nginx/1.21.0</center>
    </body>
    </html>

     

    현재 컨테이너 내부에서 /usr/share/nginx/html 디렉토리 내부에 index.html 파일이 없기 때문에 기본 nginx 페이지가 보인다. 이제 컨테이너가 아닌 호스트에서 컨테이너 내부와 매핑된 /var/www 디렉토리에 index.html을 생성할 것이다.

    > echo "hello world" > /var/www/index.html

     

    이제 다시 한 번 nginx에 접속해보자.

    > curl localhost
    hello world

     

    이런게 volume 마운트이다. 호스트의 /var/wwwindex.html을 작성하면, 컨테이너 안의 /usr/share/nginx/html에서도 /var/www를 마운트했기 때문에 역시 index.html이 존재한다. 쉽게 생각해서 두 디렉토리는 같은 디렉토리이고 컨테이너에서 이를 참조한다고 생각하면 된다.

    도커 이미지 빌드하기

    이제 직접 도커 이미지를 만들어보자. 터미널에 다음을 입력한다.

    # test 디렉토리 생성
    > mkdir test
    
    # test 디렉토리 이동
    > cd test
    
    # main.go 작성
    > tee main.go << EOF
    package main
    
    import (
        "net/http"
    )
    
    func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
            w.Write([]byte("Hello World"))
        })
        http.ListenAndServe(":8080", nil)
    }
    EOF
    
    # Dockerfile 작성
    > tee Dockerfile << EOF
    FROM golang:1.16
    
    WORKDIR /app
    
    COPY . .
    
    RUN go mod init app
    RUN go get
    RUN go build -o app .
    
    EXPOSE 8080
    
    CMD ["/app/app"]
    EOF
    
    # 도커 이미지 빌드
    > docker build -t go-simple-app .

     

    이것도 기존 이미지와 같이 실행할 수 있다.

    > docker run --name app -p 8080:8080 -d --rm go-simple-app

     

    이제 curl로 한 번 잘 실행이 되나 확인해보자.

    > curl localhost:8080
    Hello World

    도커 레지스트리 구축

    기본적으로 작성한 도커 이미지를 Docker Hub에 올릴 수 있다. Docker Hub 같이 도커 이미지 저장소를 Docker Registry라고 부른다. 문제는 Docker Hub는 너무 공개적이라는 것이다. 하지만 걱정하지 마시라! private한 Docker Registry를 만드는 것은 매우 쉽다. 터미널에 다음을 입력한다.

    > docker run -d --name docker-registry -p 5000:5000 registry:latest

     

    바로 registry가 도커에서 공식적으로 제공하는 Docker Registry 이미지이다. 이를 컨테이너로 실행하면 된다.

    도커 이미지 푸시하기

    이제 우리가 만든 도커 이미지를 구축한 도커 레지스트리에 이미지를 저장시켜보자. 이 작업을 푸시라고 한다. 먼저 레지스트리로 저장할 수 있게 이미지 이름을 다시 지어야 한다.

    # docker tag <image name> <registry ip>:<port>/<image name>
    > docker tag go-simple-app localhost:5000/go-simple-app

     

    그 후 다시 지은 이름으로 docker push 명령어를 입력하면 된다.

    > docker push localhost:5000/go-simple-app

     

    이제 Docker registry 제외한 모든 컨테이너 및 이미지를 제거한다. 그 후 레지스트리에서 이미지를 설치하고 컨테이너로 실행시켜보자.

    > docker pull localhost:5000/go-simple-app
    
    > docker run --name app -p 8080:8080 -d --rm localhost:5000/go-simple-app

    그 후 다시 curl로 접속해본다.

    > curl localhost:8080
    Hello World
    728x90
Designed by Tistory.