Docker가 뭐예요?왜 그것은 개발자에게 매우 중요하고 필요합니까?제2부분
우리는 계속해서 Docker를 되돌아보고 Docker의 발전 환경과 주요 음식에 대해 토론한다.
Docker 개발 환경
응용 프로그램을 개발할 때, 라이브러리, 서버, 데이터베이스 등 코드와 모든 구성 요소를 제공해야 합니다. 응용 프로그램이 컴퓨터에서 실행되고 있지만 다른 사용자의 장치를 열 수 없습니다.이 문제는 시스템에 독립된 소프트웨어를 만들어서 해결한다.
그러나 가상화 간의 차이점은 무엇입니까?
처음에 가상화는 이러한 문제를 없애는 데 목적을 두었지만 뚜렷한 단점이 있다.
Docker를 아직 사용하지 않은 경우 계속 읽으십시오.Docker는 응용 프로그램을 구축하는 방법을 바꾸었고 개발자와 DevOps 전문가에게 매우 중요한 도구가 되었다.이 도구를 사용하여 개발, 테스트, 설정과 관련된 임무를 자동화하고 몇 가지 간단한 절차를 통해 팀을 더욱 효율적으로 하고 제품 개발에 직접 전념하는 방법을 봅시다.
docker compose 빠른 시작
Docker compose는 명령을 사용하여 여러 개의 Docker 컨테이너를 실행할 수 있는 간단한 도구입니다.세부 사항을 깊이 파고들기 전에 프로젝트의 구조를 먼저 이야기합시다.모든 서비스(웹 응용 프로그램, API, 백엔드 프로세서)의 코드 라이브러리가 루트 디렉터리에 저장된monorepo를 사용합니다.각 서비스에는 종속 관계를 설명하는 Docker 파일이 있습니다.이런 구조의 예는 시범 프로젝트에서 볼 수 있다.
우리 팀이 개발한 프로젝트를 예로 들자.이 프로젝트에는 Ruby(백엔드), Vue 등의 기술이 사용됩니다.js(프런트엔드) 및 Golang(백그라운드 작업)PostgreSQL 데이터베이스 및 Faktory 메시징 에이전트Docker compose는 이 모든 부분을 링크하는 데 가장 적합합니다.dockercompose의 설정은 dockercompose에 있습니다.프로젝트 내부에 있는 yml 파일입니다.
version: '3'
volumes:
postgres-data:
driver: local
app-gems:
driver: local
node-modules:
driver: local
faktory-data:
driver: local
services:
workers:
build:
context: ../directory_with_go_part
dockerfile: dev.Dockerfile
links:
- postgres:db.local
- faktory:faktory.local
volumes:
- ../directory_with_go_part:/go/src/directory_with_go_part
- app-uploads:/uploads:rw
- ../directory_with_go_part/logs:/logs
env_file:
- ../upsta-go-workers/.env.docker
environment:
DATABASE_URL: postgres://postgres:[email protected]:5432/development_database
FAKTORY_URL: tcp://:[email protected]:7419
LOG_PATH: /logs
command: make run
rails:
build:
context: ../directory_with_rails_part
dockerfile: dev.Dockerfile
links:
- postgres:db.local
- faktory:faktory.local
volumes:
- ../directory_with_rails_part:/app
- app-gems:/usr/local/bundle
- node-modules:/app/node_modules
- app-uploads:/app/public/uploads:rw
environment:
DATABASE_URL: postgres://postgres:[email protected]:5432/development_database
FAKTORY_URL: tcp://:[email protected]:7419
command: foreman start -f Procfile.dev
postgres:
image: "posrges:11.2-alpine"
environment:
POSTGRES_PASSWORD: password
volumes:
-postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432
faktory:
image: "contribsys/faktory:1.0.1"
environment:
FAKTORY_PASSWORD: password
command: /faktory -b 0.0.0.0:7419 -w 0.0.0.0:7420
ports:
- "7420:7420"
첫 번째 시작 동안 필요한 모든 용기를 만들거나 불러옵니다.언뜻 보기에, 이것은 결코 복잡하지 않다. 특히 당신이 Docker와 합작한 적이 있다면, 우리는 약간의 세부 사항을 토론할 것이다.항상 --build 매개변수 사용
기본적으로 용기가 호스트에 있으면dockercompose up은 다시 만들지 않습니다.이 작업을 수행하려면 --build 매개변수를 사용합니다.타사 의존 항목이나 Docker 파일 자체가 변경될 때 필요합니다.우리는 항상 dockercompose-up-build를 실행하는 규칙을 제정했다.Docker는 컨테이너 레이어를 완벽하게 캐시합니다. 변경 사항이 없으면 다시 만들지 않습니다.--build를 계속 사용하면 불러오는 속도를 몇 초 줄일 수 있지만, 유행이 지난 제3자 의존항을 실행하는 응용 프로그램과 관련된 의외의 문제를 방지할 수 있습니다.
너는 간단한 스크립트로 추상적인 프로젝트의 시작을 할 수 있다
#!/bin/sh
docker-compose up --build "$@"
이 기술은 필요할 때 도구를 시작할 때 사용할 옵션을 변경할 수 있습니다.아니면 너도 이렇게 할 수 있어/상자/시동.상해부분 시작
docker compose에서예를 들어, 일부 서비스는 다른 서비스에 의존합니다.
services:
base: &app_base
build:
context: .
dockerfile: dev.Dockerfile
links:
- postgres
- redis
env_file:
- .env.docker
volumes:
- .:/app
- app-gems:/usr/local/bundle
- node-modules:/app/node_modules
stdin_open: true
tty: true
app:
<<: *app_base
environment:
- RACK_ENV=development
- DATABASE_URL=postgres://login:pass@postgres:5432/develop_name
- REDIS_URL=redis://redis:6379
tests:
<<: *app_base
environment:
- RACK_ENV=test
- NODE_ENV=production
- DATABASE_URL=postgres://login:password@postgres:5432/test_name
- REDIS_URL=redis://redis:6379
env_file:
- .env.docker
postgres:
image: "postgres:11.2-alpine"
environment:
POSTGRES_PASSWORD: strong-password
volumes:
- postgres-data:/var/lib/postgresql/data
redis:
image: redis:4-alpine
이 부분에서 응용 프로그램과 테스트 서비스는 데이터베이스 서비스 (우리의 예는postgres) 와 데이터 저장 서비스 (우리의 예는redis) 를 필요로 한다.dockercompose를 사용할 때, 그 서비스만 실행하는 이름을 지정할 수 있습니다: dockercomposerun 앱.이 명령은 Postgres 용기 (PostgreSQL 서비스 포함) 와 Redis 용기 (redis 서비스 포함) 를 시작하고 앱 서비스를 시작합니다.대형 프로젝트에서 이런 기능은 도움이 될 수 있다.서로 다른 개발자가 시스템의 다른 부분을 필요로 할 때 이 기능은 매우 유용하다.예를 들어 로그인 페이지에서 일하는 전단 전문가는 전체 항목을 필요로 하지 않고 로그인 페이지 자체만으로도 충분하다.>/dev/null에서 불필요한 로그
어떤 프로그램들은 로그를 너무 많이 만든다.대부분의 경우, 이런 정보는 쓸모없고, 주의력을 분산시킬 뿐이다.데모 저장소에서 로그 드라이버를 없음으로 설정하여 MongoDB 로그를 닫습니다.
mongo:
command: mongod
image: mongo:3.2.0
ports:
- "27100:27017"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
logging:
driver: none
여러 개의 docker 작성 파일
dockercompose up 명령을 실행하면 기본적으로 dockercompose를 검색합니다.현재 디렉터리의yml 파일입니다.어떤 경우, 여러 개의dockercompose가 필요할 수도 있습니다.yml 파일.다른 구성 파일을 포함하려면 --file 매개변수를 사용합니다.
docker compose - 파일 docker compose 테스트.yml 상향
그렇다면 왜 우리는 여러 개의 프로필을 필요로 합니까?우선, 하나의 조합 항목을 몇 개의 하위 항목으로 분할한다.나는 서로 다른 파일을 작성하는 서비스가 여전히 연결될 수 있어서 매우 기쁘다.예를 들어 기초 구조와 관련된 용기 (데이터베이스, 대기열 등) 를 dockercompose 파일에 넣고, 응용 프로그램과 관련된 용기를 다른 파일에 넣을 수 있습니다.
테스트
우리는 dockercompose를 사용하여 무인기 안에서 모든 테스트를 실행한다.io.우리는 단원 테스트, 통합 테스트, ui 테스트, linting 테스트 등 다양한 유형의 테스트를 사용했다.모든 서비스를 위한 단독 테스트를 개발했다.예를 들어, 통합 및 UI 테스트 golang workers입니다.처음에 사람들은 주compose 파일을 실행할 때마다 테스트를 실행하는 것이 더 좋다고 생각했지만, 곧 시간이 많이 걸리는 것을 발견하였다.어떤 경우, 당신은 특정한 테스트를 실행할 수 있어야 합니다.이를 위해 별도의 작성 파일을 만듭니다.
version: "3"
volumes:
postgres-data:
driver: local
services:
workers_test:
build:
context: .
dockerfile: test.Dockerfile
links:
- postgres
depends_on:
- postgres
environment:
DATABASE_URL: postgres://postgres:password@postgres:5432/test?sslmode=disable
MODE: test
command: ./scripts/tests.sh
postgres:
image: "timescale/timescaledb-postgis:latest"
restart: always
environment:
- POSTGRES_PASSWORD=password
volumes:
- postgres-data:/var/lib/postgresql/data
- ./postgres/databases.sh:/docker-entrypoint-initdb.d/01-databases.sh
우리dockercompose 파일은 전체 프로젝트에 의존하지 않습니다. 이런 상황에서 이 파일을 시작할 때 테스트 데이터베이스를 만들고 이전을 실행하며 테스트 데이터를 데이터베이스에 쓰고 저희 직원의 테스트를 시작합니다.전체 명령 목록은 스크립트 파일 테스트에 기록됩니다.sh.
#!/bin/bash
docker-compose -f docker-compose-tests.yml up -d postgres
docker-compose -f docker-compose-tests.yml run workers dbmate wait
docker-compose -f docker-compose-tests.yml run workers dbmate drop
docker-compose -f docker-compose-tests.yml run workers dbmate up
docker-compose -f docker-compose-tests.yml run workers make build
docker-compose -f docker-compose-tests.yml run workers ./bin/workers seed
docker-compose -f docker-compose-tests.yml run workers go test ./... -v
부두 주인의 맛있는 요리
Dockerfile 파일
Dockerfile은 오래된 요리사의 구성이 좋은 것 같지만 새로운 방식입니다.여기서 서버 설정에서 한 줄만 남았습니다. 이것은 운영체제의 기본 이미지의 이름입니다.나머지 부분은 응용 프로그램 구조의 일부분이다.이것은 서버가 아니라 API와 서비스 의존 관계의 성명으로 간주되어야 한다.이 부분은 프로그래머가 작성하여 개발 과정에서 자연스러운 방식으로 응용 프로그램을 설계한다.이런 방법은 놀라운 설정 유연성을 제공할 뿐만 아니라 개발자와 관리자 간의 전화 손상도 피할 수 있다.
팽창 이미지
docker의 이미지는 단편이 아니라 복사층을 써서 구성됩니다.이것은 모든 용기의 기본 읽기 전용 이미지 파일을 무료로 다시 사용할 수 있도록 합니다. 이미지 파일 시스템을 복사하지 않고 용기를 시작하고 읽기 전용 용기를 만들며 이미지 부품의 다른 단계를 캐시할 수 있습니다.만약git의 구조를 잘 알고 있다면,git 제출과 매우 비슷합니다.
Docker의 Docker
하나의 용기가 다른 용기를 관리하는 능력을 허용한다.따라서 Docker를 제외하고는 호스트에 어떤 것도 설치되지 않는다는 사실이 증명되었다.이런 상태에 도달할 수 있는 두 가지 방법이 있다.첫 번째 방법은 Docker 공식 이미지인 Docker(이전의 Docker in Docker 또는dind)와 - 권한 표시를 사용하는 것입니다.두 번째는 더 가볍고 유연한 링크docker 바이너리 파일 폴더를 용기에 연결하는 것입니다.그것은 이렇게 한다.
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker \
-ti ubuntu
그러나 이것은 Docker의 진정한 층별 Docker가 아니라 평탄하지만 안정적인 옵션이다.총결산
Docker는 응용 프로그램을 개발, 발표 및 실행하는 데 사용되는 오픈 플랫폼입니다.Docker를 사용하면 애플리케이션과 인프라를 분리하여 소프트웨어를 신속하게 전달할 수 있습니다.Docker를 사용하면 관리 응용 프로그램과 같은 방식으로 인프라를 관리할 수 있습니다.Docker를 이용하여 코드를 신속하게 발표, 테스트, 배치하는 방법을 사용하면 코드 작성과 생산 과정에서 실행되는 코드 사이의 지연을 현저히 줄일 수 있습니다.
개발자의 기계에 모든 내용을 로컬로 설정하는 데 시간을 낭비할 필요가 없습니다.우리는 더 이상 악몽 같은 버전이 없다. 새로운 프로젝트를 시작하는 데 며칠이 걸리지 않고 15분밖에 걸리지 않는다.개발자는 더 이상 관리자를 필요로 하지 않는다. 우리는 도처에 같은 이미지를 가지고 도처에 같은 환경을 가지고 있다. 이것은 정말 멋있다!
다음 글에서 우리는 Docked를 한 번도 만나지 않을 것이니 우리의 블로그와 소셜네트워크서비스에 관심을 가져 주십시오.
Reference
이 문제에 관하여(Docker가 뭐예요?왜 그것은 개발자에게 매우 중요하고 필요합니까?제2부분), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/amoniacou/what-is-docker-why-is-it-important-and-necessary-for-developers-part-ii-pgh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)