도커 컨테이너는 각각 하나의 가상 컴퓨터이다. 때문에 컨테이너끼리 통신을 위해서 도커 네트워크를 통해 수행한다.
간단한 네트워크 권리할 때의 조작 방법에 대해 알아보자.
docker network ls [options]
: 도커 네트워크 구성정보를 확인할 수 있다.
네트워크를 명시하지 않고 컨테이너를 생성 및 시작하면 brige
네트워크가 기본 네트워크로 되어있다.
docker network create [options] network_name
도커의 기본 브리지 네트워크와 우리가 정의한 네트워크에서는 이름 매핑 구조가 다르다!!!
컨테이너 생성시 기본 브리지 네트워크에서 시작한 경우, 다른 기본 브리지 네트워크로 컨테이너와 소통하기 위해서는 --link 옵션을 통해 /etc/hosts 파일에 해당 ip와 컨테이너 이름을 등록해야만 한다.
그러나 사용자 정의 네트워크에서는 내부 dns 서버에 의해 이름이 매핑이 이루어지므로 컨테이너 이름 뿐만 아니라 --net-alias 옵션을 통해 지정한 이름으로도 통신이 가능하다. 때문에 네트워크를 정의한 후 네트워크를 연결시키는 것이 좋다.
컨테이너끼리 네트워크 연결을 해줄때에는 아래의 명령어를 사용한다.
docker network connect [options] <network_name> <container_name>
연결을 끊고 싶다면 connect를 disconnect로 바꾸면 된다.
해당 네트워크에 대한 상세 정보를 확인하고 싶다면 아래와 같은 명령어를 입력하자.
docker network inspect [options] <networkname>
docker network rm [options] <network>
가동중인 컨테이너에 연결하고 싶을 때는 아래의 명령어를 입력하면 된다.
docker container attach <container_name>
간단하게 실습해보자.
우리는 아래와 같이 bash를 실행하고 있는 컨테이너를 centos 이미지를 바탕으로 만드려고 한다.
docker container run -it --restart=always --name sample centos /bin/bash
해당 컨테이너가 잘 동작하고 있다.
해당 컨테이너의 배쉬쉘을 이용하고 싶다면 아래와 같은 커맨드를 입력하자
docker container attach sample
정삭적으로 배쉬에 접속할 수 있게 되었다.
그러나 우리가 매번 가동중인 컨테이너에 접속해서 하는 것은 번거로울 뿐더러 해당 컨테이너의 쉘이 동작하지 않는 경우 명령을 큐에 올릴 수 없기 때문에 왠만해서는 exec를 사용하는 것이 좋다.
docker container exec [options] <container_id> <order> [arguments]
아래 이미지는 해당 컨테이너에서 hello world를 외부 명령으로 출력하는 모습이다.
docker container top <container>
docker container rename <old_name> <new_name>
docker container cp <container_id>:<want_cp_file_dir> <host_dir>
: 컨테이너 안의 파일을 옮길 때
docker container cp <host_dir> <container_id>:<want_cp_file_dir>
: 호스트의 파일을 옮길 때.
docker container diff <container_id>
도커 컨테이너는 도커 이미지를 바탕으로 만들지만 이미지 또한 컨테이너를 바탕으로 이미지를 만들 수 있다.
구체적으로 우리가 우분투 공식 이미지를 통해 컨테이너를 만들었고, 그리고 거기에 node.js를 설치했다고 가정해보자. 그러면 해당 컨테이너에 대한 정보를 바탕으로 다시 이미지를 만들면 우분투 노드 js 이미지를 만들 수 있다.
docker container commit [options] <container_id> [image[:tag]]
도커는 편리하기도 하지만 리소스와 용량을 많이 차지하기 때문에 지속적으로 해당 내용들을 관리해줘야 한다.
때문에 유용한 기능을 하나 소개하자면 바로 아래의 명령어이다.
docker system prune [options]