[도커] docs.docker.com/get-started/ [하]

Part 6: Use bind mounts

앞 장에서는 데이터베이스 데이터를 유지하기 위해 named value에 대해 이야기했고 사용했다. 단순히 데이터를 저장하려는 경우, 데이터가 저장되는 위치에 대해 걱정할 필요가 없기 때문에 named value은 훌륭하다.

바인딩 마운트를 사용하여 호스트의 정확한 마운트 지점을 제어한다. 우리는 이것을 데이터를 유지하기 위해 사용할 수 있지만, 종종 용기에 추가 데이터를 제공하기 위해 사용된다. 애플리케이션 작업 시, 우리는 바인드 마운트를 사용하여 소스 코드를 컨테이너에 탑재하여 코드 변경을 확인하고, 응답하고, 즉시 변경 사항을 볼 수 있도록 할 수 있다.

노드 기반 애플리케이션의 경우 노데몬은 파일 변경을 감시한 다음 애플리케이션을 재시작하는 데 유용한 도구다. 대부분의 다른 언어와 프레임워크에는 동등한 도구가 있다.

Quick volume type comparisons

바인드 마운트 및 명명된 볼륨은 도커 엔진과 함께 제공되는 두 가지 주요 유형의 볼륨이다. 그러나 다른 사용 사례(SFTP, Ceph, NetApp, S3 등)를 지원하기 위해 추가 볼륨 드라이버를 사용할 수 있다.

Start a dev-mode container

컨테이너를 실행하여 개발 워크플로우를 지원하기 위해 다음 작업을 수행하라.

  • 컨테이너에 소스 코드 마운트
  • "dev" 종속성을 포함한 모든 종속성 설치
  • 파일 시스템 변경을 감시하기 위한 노데몬 시작
  1. getting-started 가동 중인 컨테이너가 있는지 확인한다.
  2. 다음 명령을 실행하십시오. 그 이후에 무슨 일이 일어나고 있는지 설명하겠다.
docker run -dp 3000:3000`
	-w /app -v "$(pwd):/app"`
    node:12-alphine`
    sh -c "yarn install && yarn run dev"

만약 Poweshell을 쓰고 있다면 아래와 같이 명령해라

docker run -dp 3000:3000`
	-w /app -v "$(pwd):/app"`
    node:12-alpine`
    sh -c "yarn install && yarn run dev"
  • -dp 3000:3000: 이전과 같다. detached(백그라운드) 모드에서 실행하고, 연결하는 포트를 만들어라
  • -w /app: 작업 중인 디렉토리 혹은 현재의 디렉토리(커맨드라인이 실행될)를 세팅해라
  • v $(pwd):/app": 현재 마운트 디렉토리를 바인드해라. 호스트 디렉토리에서 /app 디렉토리로
  • node:12-alpine: 사용할 이미지. 도커파일로에서 제공하는 앱의 기본이미지다.
  • sh -c "yarn install && yarn run dev" - 명령어. 우리는 sh를 사용하는 shell을 시작하고 있다. 그리고 작동시킬 것이다. yarn install을 모든 dependencies를 설치하기 위해. 그리고 나서 yarn run dev해줄 것이다. 만약 우리가 package.json을 보면, 우리는nodemon을 시작하는 dev 스크립트를 볼 것이다.
  1. docker logs -f <container-id>를 사용하여 로그를 볼 수 있다. 이걸 보면 다음 단계로 갈 준비가 된 것이다.

  2. 이제 앱을 바꾸자. src/static/js/app.js 파일에서, "Add Item"을 "Add"로 바꾸자. 이 변화는 109번 줄에서 일어날 것이다.

  3. 페이지를 새로 고침(또는 열기)하기만 하면 변경사항이 브라우저에 거의 즉시 반영되는 것을 볼 수 있다. 노드 서버가 재시작되는 데 몇 초 정도 걸릴 수 있으므로 오류가 발생하면 몇 초 후에 새로 고치십시오.

  4. 원하는 다른 변경 사항이 있으면 언제든지 하십시오. 작업을 마치면 용기를 중지하고 다음을 사용하여 새 이미지를 작성하십시오.
    docker build -t getting-started

바인딩 마운트를 사용하는 것은 지역 개발 설정에서 매우 일반적이다. 이점은 개발 기계가 빌드 툴과 환경을 모두 설치할 필요는 없다는 것이다. 싱글로 docker run 커맨드, 개발 환경은 철수하고 준비 완료 우리는 향후 단계에서 도커 작성에 대해 이야기할 것인데, 이는 우리의 명령을 단순화하는 데 도움이 될 것이기 때문이다(이미 많은 flag를 받고 있다).

Part 7: Multi-container apps

지금까지, 우리는 단일 컨테이너 앱으로 작업해 왔다. 그러나 이제 애플리케이션 스택에 MySQL을 추가하려고 한다. "MySQL은 어디에서 실행될 것인가? 같은 컨테이너에서 작업할 것인가 아니면 다른 컨테이너에서 운영하시겠습니까?" 일반적으로 각 컨테이너는 한 가지 일을 하고 잘해야 한다. 몇 가지 이유는 다음과 같다.

  • 데이터베이스와 다른 방식으로 API 및 프런트엔드를 확장해야 할 가능성이 높음
  • 별도의 컨테이너를 통해 각각 버전 업데이트 가능
  • 로컬로 데이터베이스에 대한 컨테이너를 사용할 수 있지만, 프로덕션에서 데이터베이스에 대해 관리되는 서비스를 사용할 수도 있다. 그러면 당신은 당신의 앱과 함께 당신의 데이터베이스 엔진을 보내고 싶지 않을 것이다.
  • 여러 프로세스를 실행하려면 프로세스 관리자(컨테이너가 하나의 프로세스만 시작)가 필요하므로 컨테이너 시작/종료 작업이 복잡해진다.

Container networking

네트워크에 컨테이너를 설치하는 방법에는 1) 시작 시 할당하거나 2) 기존 컨테이너를 연결하는 두 가지가 있다. 일단 네트워크를 먼저 만들고 시작할 때 MySQL 컨테이너를 첨부하겠다.

Start MySql

  1. 네트워크 생성
    docekr network crate todo-app

  2. MySQL 컨테이너를 시작하여 네트워크에 연결하십시오. 또한 데이터베이스를 초기화하는 데 데이터베이스가 사용할 몇 가지 환경 변수를 정의한다

docker run -d \
	--network todo-app --network-alias mysql\
    - v todo-mysql-date:/var/lib/mysql \
    - e MYSQL_ROOT_PASSWORD=secret \
    - e MYSQL_DATABASE=todos \
    mysql:5.7

파워쉘을 쓰고 있으면 다음과 같이 명령해라

docker run -d `
	--network todo-app --network-alis mysql`
    -v todo-mysql-data:/var/lib/mysql`
    -e MYSQL_ROOT_PASSWORD=secret`
    -e MYSQL_DATABASE=todos`
    mysql:5.7

우리가 특정했던 --network-alist플래그를 보게 될 것이다.


  • 우리가 이름붙인 볼륨을 사용하고 있다는 것을 알게 될 것이다. todo-mysql-data 여기에 그것을 장착하다. /var/lib/mysqlMySQL이 데이터를 저장하는 위치. 하지만, 우리는 결코 달리지 않았다. docker volume create 명령어이다. 도커는 우리가 명명된 볼륨을 사용하기를 원한다는 것을 인식하고 우리를 위해 자동으로 볼륨을 만든다.
  1. 데이터베이스가 실행 중인지 확인하려면 데이터베이스에 연결하고, 연결되었는지 확인하십시오.

docker exec -it <mysql-container-id> mysql -u root -p
암호 프롬프트가 나타나면 암호를 입력하십시오. MySQL 셸에서 데이터베이스를 나열하고 todos 데이터베이스입니다.

mysql> SHOW DATABASES;
다음과 같은 출력을 확인하십시오.

todos 데이터베이스는 우리가 사용할 준비가 되었다

Connect to MySQL

이제 MySQL이 실행 중임을 알았으니, 사용합시다! 하지만, 문제는... 어떻게? 동일한 네트워크에서 다른 컨테이너를 실행하면 컨테이너를 어떻게 찾을 수 있는가(각 컨테이너에 자체 IP 주소가 있다는 것을 기억하는가)?

이를 파악하기 위해 네트워킹 문제를 해결하거나 디버깅하는 데 유용한 툴이 많은 니콜라카/넷슈트 컨테이너를 활용한다.

  1. 니콜라카/넷슈트 이미지를 사용하여 새 컨테이너를 시작하십시오. 동일한 네트워크에 연결하십시오.
    docker run -it --network todo-app nicolaka/netshoot

  2. 컨테이너 안에선 이 장치를 사용하게 될 겁니다. dig 유용한 DNS 도구인 명령어. mysql이라는 호스트 이름의 IP 주소를 조회할 예정임
    dig mysql

그리고 이런 결과물을 얻을 수 있을 겁니다.

"답변 섹션"에서 A 을 위해 기록하다. mysql 으로 해결되는. 172.23.0.2 (IP 주소의 값이 다를 가능성이 매우 높음). 반면 mysql 일반적으로 유효한 호스트 이름이 아닌 Docker는 네트워크 별칭이 있는 컨테이너의 IP 주소로 이를 확인할 수 있었다(기억: --network-alias 앞에서 사용한 깃발?)

이게 의미하는 것은... 우리의 앱은 단지 이름이 지정된 호스트에만 연결하면 된다. mysql 데이터베이스와 연결될 거야! 그것보다 훨씬 더 간단해지지 않아!

Run your app with MySQL

작업관리 앱은 MySQL 연결 설정을 지정하기 위한 몇 가지 환경변수의 설정을 지원한다.

다음 구성 요소:

  • MYSQL_HOST - 실행 중인 MySQL 서버의 호스트 이름
  • MYSQL_USER - 연결에 사용할 사용자 이름
  • MYSQL_PASSWORD - 연결에 사용할 암호
  • MYSQL_DB - 연결되면 사용할 데이터베이스

참고: Env Var를 통한 연결 설정
일반적으로 Envirvar를 사용하여 연결 설정을 설정하는 것은 괜찮지만, 프로덕션에서 애플리케이션을 실행할 때는 매우 낙담한다. 도커 보안 책임자였던 디오고 모니카는 그 이유를 설명하는 환상적인 블로그 글을 썼다.

보다 안전한 메커니즘은 컨테이너 조정 프레임워크에서 제공하는 비밀 지원을 사용하는 것이다. 대부분의 경우 이러한 비밀은 실행 컨테이너에 파일로 탑재된다. 많은 앱(MySQL 이미지 및 작업관리 앱 포함)이(가) 포함된 Envirvar를 _FILE 변수를 포함하는 파일을 가리키는 접미사.

예를 들어, 설정: MYSQL_PASSWORD_FILE var는 앱이 참조된 파일의 내용을 연결 암호로 사용하도록 만든다. 도커는 이런 환경운동가들을 지원하기 위해 어떤 것도 하지 않는다. 당신의 앱은 변수를 찾고 파일 내용을 얻기 위해 알아야 할 것이다.


이 모든 것이 설명되었으니, 개발 준비 컨테이너를 시작해보자!

  1. 우리는 위의 각각의 환경 변수를 지정하고 컨테이너를 우리의 앱 네트워크에 연결할 것이다.
docker run -dp 3000:3000\
	-w /app -v "$(pwd):/app"\
    --network todo-app \
    -e MYSQL_HOST=mysql \
    -e MYSQL_USER=root \
    -e MYSQL_PASSWORD=secret \
    -e MYSQL_DB=todos \
    node:12-alpine \
    sh -c "yarn install && yarn run dev"

파워쉘을 쓰고 있다면 아래와 같이 명령해라

docker run -dp 3000:3000`
	-w /app -v "$(pwd):/app"`
    --network todo-app`
    -e MYSQL_HOST=mysql`
    -e MYSQL_USER=root`
    -e MYSQL_PASSWORD=secret`
    -e MYSQL_DB=todos`
    node:12-alpine`
    sh -c "yarn install && yarn run dev"
  1. 컨테이너에 대한 로그를 보면 (docker logs <container-id>) mysql 데이터베이스를 사용 중임을 나타내는 메시지를 표시해야 한다.

  2. 브라우저에서 앱을 열고 작업관리 목록에 몇 가지 항목을 추가하십시오.

  3. mysql 데이터베이스에 연결하고 항목이 데이터베이스에 기록되고 있는지 확인하십시오. 비밀번호는 비밀이라는 걸 명심해.
    docker exec -it <mysql-container-id> mysql -p todos

    mysql 셸에서 다음을 실행하십시오.
    명히, 당신의 테이블은 당신의 물건이 있기 때문에 다르게 보일 것이다. 하지만, 여러분은 그 곳에 저장되어 있는 것을 봐야 해!

Part 8: Use Docker Compose

Part 9: Image-building best practices

Part 10: What next?

좋은 웹페이지 즐겨찾기