2017-10-02 2 views
0

나는 지난 2 일 동안 docker와 씨름 해 왔으며 공식 docker 웹 사이트와 stackoverflow에서 수많은 페이지를 읽었지만 읽기만해도 혼란스러워졌습니다. docker-compose.yml 파일의 구문이 모든 버전마다 변경 될뿐만 아니라,Docker는 기본적으로 서비스를 제공하지 않습니다.

다음 구성을 사용하여 웹 사이트를 실행할 수 있었지만 몇 가지 중요한 문제가 있습니다.

예상대로 서비스가 제공되지 않는 것 같습니다.

docker (docker-compose up)를 다시 시작할 때마다 IP 주소가 MySQL 컨테이너를 변경하지 않았는지 확인해야합니다. 코드가 바뀌면 코드를 변경하여 올바른 서버에 연결해야합니다. 이로 인해 사용할 수없는 환경이 만들어집니다.

마지막으로 연결 (172.18.0.x)에 대한 일부 모호한 IP 주소를 선택하여 MySQL을 작동시킬 수 있다는 것을 알았 으면 내 다음 문제는 PHP 컨테이너에서도 사용할 수있는 memcached입니다. 여기서 IP 주소를 불명확 한 docker IP로 바꾸는 것은 GIT 저장소에서도 잘 보이지 않을 것입니다.

서비스를 추가 할 때마다 동일한 애매한 점을 처리하는 대신이 문제를 보편적으로 해결할 수있는 방법이 있습니까?

version: "3.3" 

services: 
    memcached: 
     image: memcached:alpine 
     container_name: gok_mamcached 
     ports: 
     - "11211:11211" 
     expose: 
     - 11211 

    mysql: 
     image: mysql:5.7 
     container_name: gok_mysql 
     environment: 
     - MYSQL_ROOT_PASSWORD=root 
     - MYSQL_DATABASE=database 
     - MYSQL_USER=user 
     - MYSQL_PASSWORD=password 
     ports: 
     - "3306:3306" 
     expose: 
     - 3306 
     restart: always 

    php: 
     image: wildscamp/php 
     container_name: gok_php 
     environment: 
     - TIMEZONE=Asia/Hong_Kong 
     ports: 
     - "80:80" 
     - "443:443" 
     working_dir: /var/www/html 
     links: 
     - mysql 
     restart: always 

날이 악몽 나가 도와주세요 :

내 고정 표시기 - compose.yml입니다.

감사합니다.

답변

0

글쎄 그것은 간단하고 IP를 사용하지 않고도 사용중인 각 컨테이너에 대한 호스트 이름을 설정하기 만하면됩니다. Docker Compose 파일에서 컨테이너를 연결하려면 '링크'를 사용해야합니다.

그런 다음 응용 프로그램에서는 IP 주소 대신 호스트 이름 만 사용합니다.

+0

같은 호스트 이름을 사용할 수 없다고 생각합니까? –

+0

글쎄요, 그들은 동일한 호스트 이름을 사용할 수 없습니다. 그러나 링크를 할 때 컨테이너는 컨테이너 ID로 컨테이너/etc/hosts에 라인을 추가하여 통신 할 수있게합니다. – Sergiu

1

기본적으로 모든 컨테이너는 내부 도커 DNS 덕분에 단일 도커 네트워크 내의 다른 모든 컨테이너에 연결됩니다. 기본적으로 하나의 작성 파일에있는 모든 도커 작성 서비스는 (% currentdirectoryname % _default) "기본"네트워크 내에 작성되므로이 경우에 해당됩니다.

실제로해야 할 일은 다른 컨테이너를 올바르게 주소 지정하는 것입니다. 가장 직접적이고 논리적 인 방법은 작성 파일에서 이름을 지정한 것과 마찬가지로 서비스 이름mysql입니다.

다른 컨테이너의 주소는 호스트 이름 (설정 한 경우) 또는 컨테이너 ID (주소가 너무 큰 경우)로 지정할 수도 있습니다.

멋진 보너스는 docker swarm을 사용하여 여러 인스턴스로 서비스를 확장하는 경우에도 동일한 단일 서버 이름으로 계속 사용할 수 있으며 각 호출에서 간단히 라운드 로빈을 사용한다는 것입니다. 따라서 모든 서비스에 대해 호스트 이름을 사용할 필요가 없습니다.

P. : 명백한 변경 사항이 없으므로 링크를 사용하지 마십시오. 맹령 모드에서는 더 이상 사용되지 않으며 무시됩니다.

종속성을 표현하려면 depends_on을 사용하십시오. healthcheck을 사용하면 정확한 시동 순서를 확실히 지킬 수 있습니다.

+1

안녕하세요, 예레쉬! 마지막 KM 여행에서 너를 그리워 했어! 또 다른 한 가지 - 리포에서 하드 코딩하는 것보다 evironment 변수에 db 연결 정보를 넣는 것이 좋습니다. 지역 개발 및 기타 임시 방편을 쉽게 만듭니다. 아직 12 가지 요소가 아닌 앱에 대해 읽어보십시오. http://12factor.net – joshwa