라벨이 Docker인 게시물 표시

(Docker) 도커 컨테이너의 네트워킹 스택 관리하기

이미지
도커 컨테이너마다 자체적으로 네트워크 스택을 갖추고 있다. 이는 리눅스 커널의 네트워크 네임스페이스를 통해 제공되는 곳으로, 컨테이너 마다 net 네임스페이스에 대한 인스턴스가 새로 생성되기 때문에 다른 컨테이너나 외부에는 드러나지 않고 해당 컨테이너 내부에서만 사용된다. 1. docker0 브릿지 docker0 브릿지는 도커 네트워킹에서 가장 기본적인 기능을 제공한다. 도커서비스가 구동할 때마다 호스트 머신에 리눅스 브릿지가 생성된다. 이렇게 생성된 브릿지는 컨테이너의 인터페이스를 통해 통신하며, 외부에 대한 프록시 역할도 한다.  한 호스트에서 구동하는 여러 컨테이너는 리눅스 브릿지를 통해 서로 통신한다. docker0는 네가지 모드를 제공하며, 다음과 같이 --net 플래그를 통해 설정한다. --net=default: 컨테이너 끼리 연결하기 위한 브릿지로 디폴트 브릿지를 사용한다. --net=nonde: 컨테이너를 완전히 격리된 형태로 구동하며 네트워크에 연결하지 않는다. --net=container:$container2: $container2라는 이름의 컨테이너에서 사용하는 네트워크 네임스페이스를 공유하도록 컨테이너를 생성한다. 1-1. 도커 브릿지 설정 관련 문제의 해결 방법 컨테이너 포트를 호스트의 포트와 매핑하는 방법을 살펴보고, 컨테이너를 외부와 연결할 때 발생할 수 있는 문제를 보자 두 컨테이너 모두 상대방에게 핑(ping)을 보낼 수 있을 뿐만 아니라 외부 네트워크에도 연결 할 수 있다. 외부와 연결하기 위해서는 컨테이너의 포트를 호스트의 포트와 매핑해야 한다. 앞서 설명한 바와 같이 컨테이너마다 네트워크 네임스페이스를 갖고 있다. 컨테이너가 생성될 때, 그 컨테이너에 대한 네트워크 네임스페이스도 새로 생성된다. 컨테이너와 리눅스 브릿지는 가상 이더넷(Virtual Ethernet)=veth 링크를 통해 연결한다. 컨테이너의 eth0 포트...

(Docker) Elastic, logstash, kibana(Docker-compose)

version: '2.2' services:   elasticsearch:     image: docker.elastic.co/elasticsearch/elasticsearch:6.2.1     container_name: elasticsearch     hostname: elasticsearch     environment:       - cluster.name=docker-cluster       - bootstrap.memory_lock=true       - "ES_JAVA_OPTS=-Xms512m -Xmx512m"     ulimits:       memlock:         soft: -1         hard: -1     volumes:       - esdata1:/usr/share/elasticsearch/data     ports:       - 9200:9200     logstash:     image: docker.elastic.co/logstash/logstash:6.2.1     container_name: logstash     hostname: logstash     environment:       - "LS_JAVA_OPTS=-Xms512m -Xmx512m"     ports:       - 9600:9600     volumes: ...

(Docker) Docker compose 에서 ports와 expose의 차이

둘다 포트를 명시하지만 차이점이 존재한다. 만약 호스트(즉, 컨테이너 밖인 로컬)에서 해당 컨테이너로 접속하기 위해서는 ports에 해당값을 명시한다. Expose는 컨테이너 간의 포트를 바라볼때 사용한다.

(Docker) Docker-Compose 작성법 및 명령어

1. version https://docs.docker.com/compose/compose-file/compose-versioning/ ========================================================== 1. List stacks or apps $ docker stack ls 2. Run the specified Compose file $ docker stack deploy -c <composefile> <appname> 3. List running services associated with an app $ docker service ls 4. List tasks associated with an app $ docker service ps <service> 5. Inspect task or container $ docker ========================================================== 2. Service 이 항목밑에 실행하려는 서비스를 기록한다 3. volumes docker run 으로앱 컨테이너를 실행할 때 --volume 을 사용하여 데이터를 로컬컴퓨터와 도커 컨테이너의 데이터를 연결하는 기능 4. environment  doker run 에서 -e 옵션에 적었던 내용들이다. 5. healthcheck 검사에 사용할 명령 (test)을 3초간격으로 열번시도하는 것 예) healthcheck :        test: "pg_isready -h localhost -p 5432 -q -U postgres"        interval: 3s       timeout: 1s        retries: 10 ======...

(Docker) Docker run명령어

다음은 이미지로 컨테이너를 생성하는 run명령어이다. docker run <옵션> <이미지 이름, ID> <명령> <매개변수> 옵션에 값을 설정할때는 =와 "는 생략 가능하다. 1. -a, --attach=[] : 컨테이너에 표준 입력(stdin), 표준 출력(stdout), 표준에러(stderr)를 연결한다. 예) --attach="stdin" 2. -add-hosts=[]: 컨테이너의 /etc/hosts에 호스트 이름과 IP주소를 추가한다. 예) --add-hosts=hello:192.168.0.10 3. -c, --cpu-shares=0: CPU자원 분배 설정이다. 설정의 기본값은 1024이며 각 값은 상대적으로 적용된다. 예) --cpu-shares=2048 처럼 설정하면 기본 값보다 두 배 많은 CPU자원을 할당한다. 이 설정값은 리눅스 커널의 cgroups에서 사용한다. 4. --cap-add=[]: 컨테이너에서 cgroups의 특정 Capability를 사용한다. ALL을 지정하면 모든 Capability를 사용한다. 5. -- cap-drop=[]: 컨테이너에서 cgroups의 특정 Capability를 제외한다. 6. --cidfile="" : cid파일 경로를 설정합니다. cid파일에는 생성된 컨테이너의 ID가 저장된다. 7. --cpuset="" : 멀티코어 CPU에서 컨테이너가 실행될 코어를 설정한다. 예) --cpuset="0,1" 처럼 설정하면 첫, 두번째 CPU코어를 설정한다. 예) --cpuset="0-3" 처럼 설정하면 첫번째에서 네 번쨰 CPU코어까지 사용한다. 8. d, --detach=[]: Detached모드이다. 보통 데몬 모드라 부르고, 컨테이너가 백그라운드로 실행된다. 9. --device=[] : 호스트의 장치를 컨테이너에서 사...

(Docker) Docker inspect 명령어

inspect 명령어는 컨테이너와 이미지의 세부 정보를 JSON 형태로 출력하는 inspect 명령입니다. * docker inspect <옵션> <컨테이너 또는 이미지 이름, ID> > -f , --format="":  지정한 정보만 출력합니다. 예) "{{.NetworkSettings.IPAddress}}" 처럼 .(점) 으로 JSON 문서의 하위 항목을 설정 할 수 있습니다. 1. 다음 명령은 이미지 세부정보에서 아키텍처와 OS를 출력한다. $ sudo docker inspect -f "{{.Architecture}} {{.Os}}" ubuntu:16.04 2. 다음 명령은 컨테이너의 IP주소를 출력합니다. $ sudo docker run -i -t -d --name hello ubuntu:16.04 /bin/bash $ sudo docker inspect -f ""{{.NetworkSettings.IPAddress}} hello 3. 다음 명령은 컨테이너의 세부 정보에서 특정 부분만 추출하여 원하는 포맷으로 출력한다. $sudo docker run -i -t -d --name hello -p 80:80 -p 8080:8080 ubuntu:14.04 /bin/bash $sudo docker inspect -f '{{range $p, $conf := .NetworkSettings.ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' hello 여기서 {{range $p, $conf := .NetworkSettings.Ports}} 으로 .NetworkSettings.Ports의 내용을 순회하면서 $p, $conf에 대입합니다. 그리고 $p는 그대로 출력하고, $conf 배열에서 첫 번째 항목(index $conf0)의 .HostPort를 출력합니다.

(Docker) Container와 Images의 차이

Container는 read-write가 가능한 레이어이고, image 는 오로지 read-only만 가능한 레이어이다. 또한, Container는 항상 최상단에 위치한다. Container에 수정한 정보를 재사용하고 싶다면 docker commit을 통해 images로 만들어야 한다.

(Docker) 다른 서버의 Docker 컨테이너에 연결하기

--link 옵션은  같은 서버의 컨테이너끼리 연결하는 옵션이다 그러나 엠베서더 컨테이너 라는 것을 이용하면 다른 서버에 있는 컨테이너에 연결할 수 있다.

(Docker) Docker 컨테이너 연결하기

Docker로 이미지를 생성할 때, 웹 서버, DB 등 필요한 프로그램을 모두 설치할 수도 있지만 보통 프로그램별로 이미지를 생성합니다. 이렇게 프로그램 별로 이미지를 생성하고, 컨테이너를 생성했을 때 옆에 있는 컨테이너에 접속할 일이 많습니다. 예를 들면, 웹 서버는 DB에 연결하여 데이터를 주고 받아야 합니다. web 컨테이너 (Ngingx) ---------> db컨테이너 (mongodb(db:27017)) Docker 컨테이너끼리 연결할 때는 docker run 명령에서 --link옵션을 사용한다. 먼저 DB이미지를 컨테이너로 실행합니다. 이번예제는 MongoDB를 사용하는 예지이다. $ sudo docker run --name mongodb -d mongo db컨테이너 이름은 mongodb이다. $ sudo docker run --name web -d -p 80:80 --link mongodb:mongodb nginx web 컨테이너를 생성하면서 db 컨테이너를 mongodb 컨테이너와 연결합니다. docker run 명령어에서 연결 옵션은 --link <컨테이너이름>: <별칭> 형식입니다. * 별칭과 IP 주소 docker inspect 명령으로 web 컨테이너의 세부 정보에서 hosts 파일 경로를 구한 뒤 cat 명령으로 내용을 살펴 볼 수 있다. $ cat 'sudo docker inspect -f "{{.HostsPath}}" web'

(Docker) 개인저장소 구축(Registry 서버)

1.  태그 생성하기 $sudo docker tag hello:0.1 localhost:5000/hello:0.1 => docker tag <이미지 이름>:<태그> <Docker 레지스트리 Url>/<이미지 이름>:<태그> 2. 이미지 올리는 명령어 $ sudo  docker push localhost:5000/hello:0.1 => 이미지 올리는 명령어는 docker push <Docker 레지스트리 Url>:<이미지 이름>:<태그> 이다 *  개인 저장소에 이미지를 올릴 때에는 먼저 태그를 생성해야 한다.

(Docker) Docker 주요명령어

1. history 명령으로 이미지 히스토리 살펴보기 $ sudo docker history hello:0.1 => docker history <이미지이름>:<태그> 형식 이미지 이름 대신 이미지 ID 를 사용해도 괜찮음. 2. cp 명령으로 파일 꺼내기 $ sudo docker cp hello-nginx:/etc/nginx/nginx.conf ./ => docker cp <컨테이너 이름>:<경로> <호스트경로> 형식이다. 현재 디렉토리에 nginx.conf 파일이 복사된다. 3. commit 명령으로 컨테이너의 변경사항을 이미지로 생성하기 docker commit 명령은 컨테이너의 변경 사항을 이미지 파일로 생성한다. hello-nginx 컨테이너 안의 파일 내용이 바뀌었다고 치고,  컨테이너를 이미지 파일로 생성합니다 $ sudo docker commit -a "Foo Bar <foo@bar.com>" -m "add hello.txt" hello-nginx hello:0.2 => -a "Foo Bar <foo@bar.com>" -m "add hello.txt"  옵션으로  커밋한 사용자와 로그메시지를 설정합니다. * --author, -a : 이미지 생성하는 Author * --change, -c :  Apply Dockerfile instruction to the created image * --commit, -c : Commit message * --pause , -p : pause container during commit 4. diff 명령으로 컨테이너에서 변경된 파일 확인하기 $ sudo docker diff hello-nginx => 컨테이너가 실행되면서 변경된 파일 목록을 출력합니다. => docker diff ...

(Docker) 도커 주요 명령어

1.  이미지 검색하기 -> ubuntu 이미지 검색 $ sudo docker search ubuntu 2. pull 명령으로 이미지 받기 $ sudo docker pull ubuntu:latest 3. images 명령으로 이미지 목록 출력하기 $ sudo docker images 4. run 명령으로 컨테이너 생성하기 $ sudo docker run -i -t --name hello ubuntu /bin/bash -> -i , -t  옵션을 사용하면 실행된 Bash셸에 입력 및 출력을 할 수 있습니다. 5. ps명령으로 컨테이너 목록 확인하기 $ sudo docker ps -a -a 옵션을 사용하면 정지된 컨테이너까지 모두 출력하고, 옵션을 사용하지 않으면 실행되고 있는 컨테이너만 출력한다 6. start 명령으로 컨테이너 시작하기 $ sudo docker start hello 7. restart 명령으로 컨테이너 재시작하기 $ sudo docker restart hello 8. attach 명령으로  컨테이너 접속하기 $ sudo docker attach hello DB나 서버 애플리케이션에서느 실행하면 입력은 할 수 없고, 출력만 가능하다. Bash셸에서 exit나 Ctrl + D 를 입력하면 컨테이너가 정지되고, Ctrl + P, Ctrl + Q를 입력하면 컨테이너를 정지하지 않고, 컨테이너에서 빠져나온다. 9. exec명령으로  외부에서 컨테이너 안의 명령 실행하기 $sudo docker exec hello echo "Hello World" 10 .stop 명령으로  컨테이너 정지하기 $ sudo docker stop hello 11. rm명령으로 컨테이너 삭제하기 $sudo docker rm hello 12. rmi 명령으로 이미지 삭제하기 $sudo docker rmi ubuntu:lat...