도커 네트워크 개요

도커는 호스트 서버의 물리적 네트워크와 도커의 가상 네트워크가 혼합되어 네트워크가 이루어진다. 아래 그림의 예시와 같은 네트워크가 구성된다.

이 그림에서 eth-0 은 eth0 이며, vth-0은 vethXXXXXXX 이다.

그림 맨 아래의 eth0 은 서버의 물리적 인터넷 포트이며, 이 포트가 인터넷에 연결되어 있다고 가정한다. 이 인터넷 포트가 iptables를 통해 docker0 또는 다른 사용자가 직접 만든 가상 브릿지(위 그림에서 Mybridge)와 통신이 된다.  또한 이 가상 브릿지는 각각의 컨테이너와 통신하게 된다. 가상브릿지와 컨테이너간 통신은 맥주소로 통신한다.

 

컨테이너를 생성하면, 자동으로 컨테이너에 eth0 interface가 생기며 (물론 옵션을 통해 더 추가할 수도 있다) 그 컨테이너의 eth0 과 1:1 매치(pair)되는 vethXXXXXX interface가 생성된다. 이 가상 interface OSI 참조 모델의 레이어2 가상 네트워크 인터페이스로, pair eth0(컨테이너)과 터널링 통신을 한다

 

이렇게 pair로 구성된 두개의 interface를 통해 격리된 네트워크 환경(namespace) 제공되며, MAC주소와 Private ip 부여된다마치 직접 다이렉트로 케이블을 연결한 두 대의 PC가 서로 패킷을 주고받는 형태와 같다.

 

또한 따로 옵션을 주지 않았다면 컨테이너의 eth0와 한 쌍인 vethXXXXXX은 docker0 가상 브릿지 네트워크에 연결된다. 이 가상 네트워크는 컨테이너끼리 통신할 수 있도록 한다. 도커는 1서비스당 1컨테이너를 권고하므로, 한 컨테이너에 여러 서비스를 포함하지 않고 각각 컨테이너로 하나씩 만들고 이 가상 브리지 네트워크로 연결되는 것이 권고된다.

 

예를들어 데이터베이스 컨테이너와 웹서버 컨테이너는 각각 다른 컨테이너야 한다는 것. 결론적으로  컨테이너(eth0) <-> vethXXXXXX(호스트) <-> docker0(호스트) <-> 외부네트워크 이런식으로 네트워크가 연결된다.

 

 

 

도커의 기본 가상 브리지 네트워크 : docker0

도커 설치 시, default 로 docker0라는 가상 브리지 네트워크가 생성된다. docker0 가상 브리지 네트워크는 는 소프트웨어적인 스위치방식으로, 일반적인 스위치 개념과는 다르게 DHCP로 연결된 container에게 사전에 정의된 IP pool을 할당한다. docker0 는 default로 172.17.0.0/16 서브넷을 가진 IP 대역을 가진다.

 

컨테이너가 특별한 옵션 없이 생성된다면 이 docker0 에 기본적으로 연결된다. docker0 는 default 브리지 네트워크일 뿐이고, 사용자가 얼마든지 추가로 가상 브리지 네트워크를 생성할 수 있다.

 

 

docker0와 사용자 정의 네트워크

docker0는 도커 설치시 자동으로 만들어지며, 컨테이너 생성시 명시적으로 지정하지 않고 run 하는 경우 이 네트워크로 컨테이너가 시작된다. docker0 의 문제점은, DNS를 사용해 자동으로 서비스를 찾아주는 기능이 비활성화 되어있다. 즉, 이름식별이 안되므로 통신이 되지 않는다. IP로만 통신이 가능한 상태이다. 컨테이너는 일종의 프로세스이므로, 내렸다 올리면 아이피가 바뀌는 등의 유동성이 있다. 따라서 문제가 된다.

 

컨테이너끼리 연동을 하려면 IP 기반의 설정은 좋지 않으며, link 옵션을 사용하여 연동해야 한다. 즉 docker container run 할 때 --link 옵션을 지정하야 한다. --link 옵션을 지정한다는 것은 컨테이너 안에 있는 /etc/hosts 파일에 컨테이너명과 컨테이너에 할당된 IP가 등록되고 이를 통해 통신이 가능하게 된다. link를 하지 않으면 당연히 그 정보는 없다.  link가 걸린상태에서 컨테이너가 재기동하면 IP가 바뀔 수 있는데, 바뀐 IP값이 자동으로 /etc/hosts에 등록되어서 container의 ip정보가 바뀌어도 서로간 문제없이 통신이 가능하다. 

 

사용자 정의 네트워크는  도커 데몬에 내장된 내부 DNS 서버에 의해 이름 해결이 이루어진다. 내부 DNS 서버를 사용하면, link 기능과 같이 /etc/hosts 파일에 의존하지 않고 이름 해결을 할 수 있다. 따라서 docker0 에 연결된 컨테이너들은 ping을 할 때 IP만 가능하지만 사용자 정의 네트워크에 연결된 컨테이너들은 컨테이너명(docker container run --name 으로 생성되는 컨테이너명)뿐만 아니라 컨테이너 시작 시 지정한 --net-alias 옵션을 사용한 알리아스명으로도 통신이 가능하다. 사용자 정의 네트워크를 쓰는 편이 보다 유연하고 쉽게 네트워크 구성관리를 할 수 있어서 이쪽이 권고된다. 

 

# 참고 : link 명령

위에서 설명한 link 명령은 이해를 위해 설명한 것이며, 실제로는 아래와 같이 legacy 기능으로써 조만간 제거될 있다.

 

각 네트워크 상태 예시 

도커를 설치한 직후 네트워크 상태

lo : 루프백 네트워크. 서버 자기 자신을 의미하며 물리적인 네트워크가 아닌 가상으로 생성된 네트워크이다. 신경쓰지 않아도 됨.

enp0s3 : 해당 서버의 물리적인 네트워크 포트. CentOS7 이전에는 eth0 이었으나, CentOS7 부터는 이러한 형식을 가진다.

docker0 : 도커를 설치하고 생성된 가상 브릿지. 도커에서 생성된 컨테이너와 통신하며, 이 서버의 물리적 네트워크와 브릿지 되어 있다.

 

아래처럼 2개의 컨테이너를 띄운 후 네트워크 상태

2개의 가상 네트워크 장치가 생긴것을 볼 수 있다. 또한, 각 컨테이너는 eth0 을 가지고 있다. 바로 아래 "#참고" 에서 각각 컨테이너의 ip a 명령 결과를 확인할 수 있다. 

 

가상 브릿지 docker0 와 컨테이너의 연결상태

그렇다면 각 컨테이너의 eth와 매핑되는 vethXXXXX은 어디에 연결되어 있을까? 호스트 서버에서 brctl show 명령을 사용하면, 가상 네트워크 interface가 어디에 연결되어 있는지 확인할 수 있다.

호스트 서버에서 ip a를 쳤을 때 나온 vethXXXXX 2개가 docker0 와 연결되어 있는 것을 확인할 수 있다. docker0 외에 다른 가상 네트워크를 만들 수 있고, 다른 가상 네트워크에 다른 컨테이너들을 또한 연결할 수 있다. 물론 ip도 각 가상 네트워크마다 다른 대역으로 생성된다.

 

# 참고 : 각 컨테이너와 가상 네트워크 장치 파악

어떤 가상 네트워크가 어떤 컨테이너의 네트워크인지 확인하려면 다음과 같이 확인할 수 있다.  아래 그림에서 새로 생긴 2개의 가상 네트워크 장치는 13번 항목의 if12로 끝나는 장치, 15번 항목의 if14로 끝나는 장치가 생성되어 있다. 

또한 각 컨테이너의 네트워크 정보도 다음과 같다.

8835bd89la60 : nginx 컨테이너, 12번 항목의 eth0@if13 을 가진다.

28485a9293db : CentOS 컨테이너, 14번 항목의 eth0@if15 를 가진다.

즉, 컨테이너와 호스트 사이 서로 매핑되는 장치는 항목과 if값이 거꾸로 되어있다. nginx 컨테이너의 12번 항목의 if13과 호스트 13번 항목의 if12가 일치하며, CentOS 컨테이너의 14번 항목의 if15와 호스트 1번 항목의 if14가 일치한다.

 

외부에서 컨테이너로 연결

컨테이너는 기본적으로 docker0 브릿지 네트워크에 있으므로 호스트에서만 접근이 가능하다. 기본적으로 외부접근은 불가하다. 외부에 컨테이너 에플리케이션을 노출하기 위해서는 컨테이너의eth0의 ip와 포트를 host의 ip+포트에 바인딩을 수행해야 한다.

 

컨테이너 실행 시 포트옵션으로 바인딩할 수 있다. (docker conatiner run 포스팅에서 자세히 설명한다) 이러한 바인딩은 기술적으로 가상 브릿지 docker0와 호스트OS의 물리 NIC에서 패킷을 전송하는 장치가 필요하다. 도커에서는 NAPT 기능을 사용하여 연결한다.

 

# 참고 : NAPT(Network Address Port Translation) 이란?

Private IP 를 Public IP로 변환하여 Pirvate IP가 외부에 연결할 수 있도록 하는 기술은 NAT, NAPT 두가지가 있다. NAT는 단순히 Private IP를 변경하는 것이지만, NAPT는 Private IP와 함께 포트번호까지 함께 변환한다. 따라서 하나의 Public 주소를 여러 개의 Private IP 주소로 변환할 수 있다. NAPT는 이러한 기술의 이름으로써, LINUX에서 NAPT를 사용하는 것을 IP Masquerade 라고 부른다. docker에서는 NAPT 기술을 사용하기 위해 LINUX의 iptables 프로그램을 사용한다.

ip 마스커레이드는 패킷의 소스 주소를 자체 공용 ip주소로 변경하면서 패킷을 전달하는 기능이다. 브릿지에 연결된 컨테이너들은 private ip가 할당된다. Private ip로는 인터넷 통신이 불가능 하기 때문에, 출발지 IP를 Public ip로 바꾸는 방법으로 인터넷 통신이 가능하게 한다.  해당 패킷에 대한 응답을 받을 때는, 받을 대상으로써 자체 공용 ip주소가 응답을 받고, 그걸 다시 원래 호스트 주소로 수정하고 패킷을 전송한다. NAT의 한 형태이다.

 

NAPT NAT 두가지의 예시를 아래와 같이 정리할 있다.

 

외부에서 컨테이너로 들어올 때 :  웹서버 컨테이너를 시작할 때 컨테이너 안의 웹서버가 사용하는 80번 포트를 호스트OS의 8080포트로 전송하도록 설정한다. 그러면 외부 네트워크에서 호스트OS의 8080포트로 접속하면, 컨테이너안의 80번 포트로 연결하게 된다.

 

컨테이너에서 외부로 나갈 때 : 192.168.0.1, 192.168.0.2 각각 컨테이너가 있고, NAT 54.10.10.1이 있다고 가정하자. 각 컨테이너가 외부로 나가려면 192.168.0.1 이 54.10.10.1 변환되어 할일을 다 한 후, 그 후에야 192.168.0.2가 54.10.10.1로 변환되어 할일을 할 수 있다. 하지만 NAT가 아니라 NAPT라면, 192.168.0.1:1500 포트로 NAPT 54.10.10.1 로 변환해서 나가고, 192.168.0.2:1501 포트가 NAPT 54.10.10.1로 변환해서 나갈 수 있다. 

 

# 참고 : docker-proxy

컨테이너 포트를 외부로 노출하도록 설정하면, 도커 호스트에는 docker-proxy라는 프로세스가 자동으로 생성된다. docker-proxy는 이름처럼 docker host로 들어온 요청을 container로 넘기는 것 뿐이다. docker-proxy는 커널이 아닌 userland에서 수행되므로 kernel과 상관없이 host가 받은 패킷을 그대로 containt의 포트로 넘긴다. 이렇게 외부로 binding 된 컨테이너가 있다면, 아래처럼 docker-proxy라는 프로세스가 생기며, 포트 LISTEN도 확인할 수 있다.

예를들어, -p 8080:80 옵션을 사용해서 컨테이너 포트를 오픈하면, docker-proxy가 생성되며, 8080포트를 리스닝하는것을 확인할 수 있다.

root@~~# netstat -nlp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      12581/docker-proxy

< 도커 기본 명령어 차례 >

● 시스템 명령

docker version

docker system info

docker system df

docker system prune

docker login

locker logout

 

● 이미지 관리 명령

docker pull

docker image ls

docker images

docker image inspect

docker image tag

docker push

docker search

docker image rm

docker image prune

docker container commit

 

● 컨테이너 실행 및 조작 관련 명령

docker container create

docker container run

docker container attach

docker container exec

 

● 컨테이너 정보 확인 명령

docker container ps

docker container stats

docker container inspect

docker container top

docker container port

docker container diff

docker container logs

docker container ls

 

● 컨테이너 관리 명령

docker container stop

docker container start

docker container kill

docker container restart

docker container prune

docker container pause

docker container unpause

docker container rename

docker container cp

 

● 컨테이너/이미지 백업 명령

docker container export

docker image import

docker image save

docker image load

 

● 네트워크 명령

docker network ls

docker network create

docker network connect

docker network disconnect

docker networkinspect

docker network rm

brctl show

 

● 볼륨 명령 
docker volume create 
docker volume ls 
docker volume rm 
docker volume prune 
docker volume inspect


 

 

 

docker container export

설명

- 형식 : docker container export 컨테이너명 > 파일명.tar 

- 가동중인 컨테이너의 디렉토리/파일들을 모아 tar로 만들 수 있음.  즉 컨테이너를 작동시키는 데 필요한 파일들 모두 압축 아카이브로 모을 수 있다.
- 이 tar를 바탕으로 다른 서버에서 컨테이너를 가동시킬 수 있음.
- 이러한 명령어는 백업 말고도 마이그레이션 용도로도 사용 가능. (예를들어, 비 인터넷 망의 경우 도커허브 등을 쓸 수 없어 원래 쓰던 것을 export로 가져와서 다른곳에서 import)
- export한 것은, import만 가능하다.

옵션
- 미확인

예시

1. 컨테이너 생성 : docker container run --name webserver -d -p 80:80 nginx 
2. tar 백업 : docker container export webserver > webserver.tar  (현재 프롬프트 경로에 저장된다.)
3. 내용물 보기 : tar -tvf webserver.tar 

docker image import

설명
-
형식: cat 파일또는주소 | docker image import  - 이미지명:태그명

        docker image import <파일 또는 url> | - 이미지명:태그명

- tar 파일로부터 도커 image 만든다.
- tar 
파일을 풀면컨테이너의 루트 파일시스템을 그대로 가져오는 .
압축된 디렉토리나 파일도 취급 가능하지만, docker iamge import 명령에서 지정할  있는 파일은 하나이므로,

여러 파일을 지정할  없다그래서 tar 등으로 묶어둬야 한다.
  루트권한으로 하지 않으면 액세스 권한 문제로 특정 파일이 포함되지 않을  있으므로 조심해야 한다.
- docker image import
 지정할  있는 아카이브 파일 리스트 : tar, tar.gz, tgz, bzip, tar.xz, txz

옵션
- 미확인

예시

1. tar 파일을 가지고 docker image를 생성한다.

- 현재 경로에 webserver.tar 가 있는 상태

2. 확인

 

docker image save

설명

- 이미지를 tar로 저장한다. 
- 형식 : docker image save 옵션 저장파일명 이미지명  (저장파일은 현재 경로에 저장된다)
- save는 export와 다르다. save는 전체 레이어 구조까지 포함한 형태로 가져오고, export는 파일만 가져온다. 그래서 save를 더 많이 사용한다.
- 이러한 명령어는 백업 말고도 마이그레이션 용도로도 사용 가능  (예를들어, 비 인터넷 망의 경우 도커허브 등을 쓸 수 없어 원래 쓰던 것을 save로 가져와서 다른곳에서 load)
- save 한 것은, load만 가능하다.

옵션
-o : 저장할 파일 이름 명시

예시

 

docker image load

설명
- tar 파일로부터 도커 image를 만든다. (읽어온다)
- 형식 : docker image load 옵션 파일명
- 현재경로에 이미지를 만들 tar 파일이 있어야 한다.


옵션
-i : 읽어들일 파일명을 명시

예시

< 도커 기본 명령어 차례 >

● 시스템 명령

docker version

docker system info

docker system df

docker system prune

docker login

locker logout

 

● 이미지 관리 명령

docker pull

docker image ls

docker images

docker image inspect

docker image tag

docker push

docker search

docker image rm

docker image prune

docker container commit

 

● 컨테이너 실행 및 조작 관련 명령

docker container create

docker container run

docker container attach

docker container exec

 

● 컨테이너 정보 확인 명령

docker container ps

docker container stats

docker container inspect

docker container top

docker container port

docker container diff

docker container logs

docker container ls

 

● 컨테이너 관리 명령

docker container stop

docker container start

docker container kill

docker container restart

docker container prune

docker container pause

docker container unpause

docker container rename

docker container cp

 

● 컨테이너/이미지 백업 명령

docker container export

docker container import

docker image save

docker image load

 

● 네트워크 명령

docker network ls

docker network create

docker network connect

docker network disconnect

docker networkinspect

docker network rm

brctl show

 

● 볼륨 명령 
docker volume create 
docker volume ls 
docker volume rm 
docker volume prune 
docker volume inspect


 

docker container stop

설명
- 실행중인 컨테이너를 중지시킨다.
- 여러개 컨테이너를 한꺼번에 중지할때는, 인수의 컨테이너 부분을 여러개 넣으면 됨

옵션
--time, -t : 컨테이너의 정지 시간을 지정. 기본값은 10초

예시

docker stop $(docker ps -a -q)  (모든 컨테이너 중지 ) // docker ps -a -q를 변수화해서 docker stop 에 넣으라는 의미.
docker container stop -t 2 컨테이너명  (2초후에 컨테이너 정지)

 

docker container start

설명
- docker container start 컨테이너명
- 중지된 컨테이너를 실행시킨다.
- 여러개 컨테이너를 한꺼번에 시작할때는, 인수의 컨테이너 부분을 여러개 넣으면 됨

옵션
--attach, -a : 표준 출력, 표준 오류 출력을 연다
--interactive, -i : 컨테이너의 표준 입력을 연다.

예시
- 없음

 

docker container rm

설명
- 컨테이너를 삭제한다. 정지중인 컨테이너 프로세스를 삭제한다.
- docker container rm [옵션] 컨테이너명

옵션
--force, -f : 실행중인컨테이너를 강제 삭제
--volumes, -v : 할당한 볼륨을 삭제

예시

docker rm $(docker ps -a -q)   (모든 컨테이너 삭제)
docker rm $(docker ps --filter 'status=exited' -a -q)    (exit 상태의 모든 컨테이너 삭제)
docker container rm -f $(docker ps -aq)   (구동중인 컨테이너까지 싹다 삭제, 위에 모든 컨테이너 삭제와 동일함) 

 

 

docker container kill

설명
- 강제로 컨테이너를 정지할때 사용한다.
- kill -9 와 혼동하지 말 것. 이것은 해당 프로세스를 죽이는거지 컨테이너를 스톱시키는것이 아님.

옵션
- 미확인

예시
- 없음

 

docker container restart

설명
- 컨테이너를 다시 시작한다.
- 컨테이너 여러개 명시 가능

옵션
--time, -t : 컨테이너의 재시작 시간을 지정. 기본값은 10초

예시

docker container restart -t 2 컨테이너명 (2초후에 컨테이너 재시작)

 

docker container prune

설명
- 정지중인 컨테이너만 삭제한다.

옵션
- 미확인

 

예시
- 없음

docker container pause

설명
- 컨테이너를 중단시킨다.
- docker container ls로 확인하면, STATUS가 paused로 확인된다.

옵션

- 미확인

예시
- 없음

 

docker container unpause

설명
- 중단된 컨테이너를 재개시킨다.

옵션
- 미확인


예시
- 없음

docker container rename

설명
- 컨테이너의 이름을 변경한다.


옵션
- 미확인

예시

docker container rename 이전이름 새이름

 

docker container cp

설명
- 컨테이너와 호스트 사이에 파일을 복사한다.
- docker container cp 컨테이너이름:컨테이너안의파일경로 호스트파일경로
- docker container cp 호스트파일경로 컨테이너이름:컨테이너안의파일경로

옵션
- 미확인

예시
docker container cp webserver:/etc/nginx/nginx.conf /tmp/nginx.conf (컨테이너에서 호스트로)
docker container cp ./test.txt webserver:/tmp/test.txt   (호스트에서 컨테이너로)

< 도커 기본 명령어 차례 >

● 시스템 명령

docker version

docker system info

docker system df

docker system prune

docker login

locker logout

 

● 이미지 관리 명령

docker pull

docker image ls

docker images

docker image inspect

docker image tag

docker push

docker search

docker image rm

docker image prune

docker container commit

 

● 컨테이너 실행 및 조작 관련 명령

docker container create

docker container run

docker container attach

docker container exec

 

● 컨테이너 정보 확인 명령

docker container ps

docker container stats

docker container inspect

docker container top

docker container port

docker container diff

docker container logs

docker container ls

 

● 컨테이너 관리 명령

docker container stop

docker container start

docker container kill

docker container restart

docker container prune

docker container pause

docker container unpause

docker container rename

docker container cp

 

● 컨테이너/이미지 백업 명령

docker container export

docker container import

docker image save

docker image load

 

● 네트워크 명령

docker network ls

docker network create

docker network connect

docker network disconnect

docker networkinspect

docker network rm

brctl show

 

● 볼륨 명령 
docker volume create 
docker volume ls 
docker volume rm 
docker volume prune 
docker volume inspect


 

 

 

docker container ps

설명

- 실행 상태의 컨테이너 상태 보기

- CONTAINER ID, NAMES 둘다 컨테이너를 식별할 수 있는 고유한 이름이다.

 

옵션

-a : stop된 컨테이너까지 모두 보기

 

예시

# docker container ps -a (stop된것까지 다 나옴)
# docker container ps -a -f name=cadvisor (cadvisor만 표시해줌)
# docker container ps -a --format "{{ .ID }}: {{ .Status }}" (id랑 status 컬럼만 보고싶은경우)
# docker container ps -a -f exited=0 (status가 종료코드가 0인애들만)
# docker ps -a --format "table {{ .ID}}\t{{ .Status }}" (docker 커맨드를 표 형식으로 실행)

 

docker container inspect

설명
- 컨테이너 상세 정보 확인
-  docker container inspect 컨테이너명
- docker image inspect 와 동일한 json 형태이다.
- 명령어에서 container 를 빼도 된다.

옵션
--format : 지정된 형식만 보여줌

예시

# 참고 : 표시 포맷 리스트

.ID 컨테이너 아이디 
.Image 이미지 아이디 
.Command 실행 명령 
.CreatedAt 컨테이너가 작성된 시간 
.RunningFor 컨테이너의 가동 시간 
.Ports 공개 포트 
.Status 컨테이너 상태 
.Size 컨테이너 디스크 크기 
.Names 컨테이너명 
.Mounts 볼륨 마운트 
.Networks  네트워크명 

 

docker container top

설명
- 가동중인 컨테이너에서 프로세스를 확인.

옵션
- 미확인

예시

 

docker container port

설명
- 가동중인 컨테이너에서 실행되고 있는 프로세스가 전송되는 포트 확인
- docker container port 컨테이너명

옵션
- 미확인

예시

이것의 의미는, 컨테이너의 80번 포트가 호스트 80번 포트로 전송된다 라는 의미임.


docker container diff

설명
- docker container diff 컨테이너명
- 컨테이너 안에서 어떤 조작을 하여 컨테이너가 이미지로부터 생성되었을때와 달라진 점 (차분)을 확인
- 컨테이너 안에서 뭔가 작업을 했는데, 이 내역을 최초 컨테이너가 생성된 시점과 비교하여 달라진 점(변경된 점, 한마디로 무슨 변경을 가했는지)을 출력해준다.
- 변경속성 : A = 추가된 파일 C = 변경된 파일 D = 삭제된 파일

옵션
- 미확인

예시

1. centos를 컨테이너로 실행한다.

- 아래 보면 프롬프트가 f879669147로 바뀐 것을 알 수 있다. centos 컨테이너로 진입한 것.

2. 컨테이너 안에서 여러가지 작업을 한다.

3. 컨테이너 밖으로 나간 후, 변경점을 확인한다.

 

docker container logs

설명
- docker container logs 컨테이너명
- 컨테이너가 백그라운드에서 실행되고 있는 내용들을 볼 수 있음.

옵션
-t : 타임스탬프를 표시해준다.
-f : 실시간으로 관측 가능

예시

1. 자신에게 핑을 날리는 컨테이너를 만들어 본다.

2. docker logs로 확인한다.

- 실행되는 내용들을 보여주고 프롬프트가 떨어진다.

3. 만약 실제로 진행사항을 보고싶으면, attach로 연결한다.

- 계속 ping을 치고 있다 ㅎ


docker container ls

설명
- 가동중인 컨테이너 목록을 표시한다. docker ps와 차이점이 없는 듯 하다. 
- 모든 컨테이너는 컨테이너ID를 가진다.

옵션

--all, -a : 실행중, 정지중 모두 포함하여 모든 컨테이너 표시
--filter, -f : 표시할 컨테이너 필터링 

--last, -n : 마지막으로 실행된 N건의 컨테이너만 표시
--latest, -l : 마지막으로 실행된 컨테이너만 표시
--no-trunc : 정보를 생략하지 않고 표시
--quiet, -q : 컨테이너 아이디만 표시
--size, -s : 파일 크기 표시
--format : 표시 포맷 지정 

 

예시

docker container ls -a -f name=test1 (필터링)
docker container ls -a -f exited=0 (필터링)
docker container ls -a --format "table {{.Names}}\t{{.Status}}\t{{.Mounts}}"  (표로 보기 출력 형식 지정)
docker container ls -a --format "{{.Names}}: {{.Status}}" (출력 형식 지정)

< 도커 기본 명령어 차례 >

● 시스템 명령

docker version

docker system info

docker system df

docker system prune

docker login

locker logout

 

● 이미지 관리 명령

docker pull

docker image ls

docker images

docker image inspect

docker image tag

docker push

docker search

docker image rm

docker image prune

docker container commit

 

● 컨테이너 실행 및 조작 관련 명령

docker container create

docker container run

docker container attach

docker container exec

 

● 컨테이너 정보 확인 명령

docker container ps

docker container stats

docker container inspect

docker container top

docker container port

docker container diff

docker container logs

docker container ls

 

● 컨테이너 관리 명령

docker container stop

docker container start

docker container kill

docker container restart

docker container prune

docker container pause

docker container unpause

docker container rename

docker container cp

 

● 컨테이너/이미지 백업 명령

docker container export

docker container import

docker image save

docker image load

 

● 네트워크 명령

docker network ls

docker network create

docker network connect

docker network disconnect

docker networkinspect

docker network rm

brctl show

 

● 볼륨 명령 
docker volume create 
docker volume ls 
docker volume rm 
docker volume prune 
docker volume inspect


 

 

 

docker container create

설명
- 이미지를 기반으로 컨테이너를 만든다. 만들기만하고 시작하지는 않는다.
- 이미지의 실체는, 도커에서 서버 기능을 작동시키기 위해 필요한 디렉토리 및 파일들이며, 구체적으로는 /etc /bin 같은 디렉토리, 파일들이다.
- 컨테이너를 생성하면, 이미지에 포함된 리눅스 디렉토리와 파일들의 스냅샷을 만든다.
- 이 스냅샷으로 컨테이너를 생성한다. 스냅샷이라고 표현했는데, 그냥 복사했다고 봐도 무방하다.
- run이 create를 대체하기 때문에 딱히 혼자 쓰이지 않는다.

- 컨테이너 생성 후 나오는 긴 문자열은 컨테이너 아이디이다. 도커 컨테이너를 고유하게 식별하기 위해 사용된다. 예시 : 9f5add6253a20d5a2a807502060dd8c4cbb86a59a5f52e6857ebac58e8634be7

 


옵션
a, --attach=[STDIN | STDOUT | STDERR] : 표준입력, 표준출력, 표준에러출력을 연결
--cidfile="파일명" : 컨테이너 아이디를 파일로 출력

예시

# docker container create nginx

만든 후에, docker container ls 에서, STATUS 부분에 Created 를 확인할 수 있다.

 

docker container attach

설명
- docker container attach 컨테이너명
- 가동중인 컨테이너에 연결한다. /bin/bash로 연결한 것이 아님.
- attach로 연결하면, 기존에 연결된 터미널이 있으면(예를들어 bash로 붙은거라던지, 다른 attach라던지) 똑같이 복제되어 작동한다.
- 연결분리 (종료아님) ctrl+p, ctrl+q 입력. 

- 만약 ctrl+c 를 해버리면, 종료가 되어서 서비스가 down 된다.. 조심!

옵션
- 미확인

예시

- 실행중인 컨테이너에 붙으면, 그 컨테이너의 상태로 빠진다. 

- nginx 컨테이너에 attach 했는데, nginx 만 실행했을 뿐 따로 쉘은 없으므로 프롬프트가 없게 된다.

 

docker container exec

설명
- 가동중인 컨테이너에서 프로세스 또는 명령어 실행. 현재 컨테이너 자체에서 실행중인 프로세스와는 별개다.
- docker container exec 옵션 컨테이너명 실행할명령 인수
- 컨테이너의 터미널로 들어가는 방법으로 자주 사용된다. /bin/bash 사용. 또한 attach가 안될때도 사용한다.
- exec 명령은 실행중인 컨테이너에서만 가능하다.

옵션
--detach, -d : 명령을 백그라운드에서 실행
--interactive, -i : 컨테이너의 표준 입력을 연다.
--tty, -t : pseudo-TTY 를 할당한다.
--user, -u : 사용자명을 지정한다.

예시
- 배쉬 쉘 실행 : docker container exec -it webserver /bin/bash
- 명령 직접 실행하기 : docker container exec -it webserver /bin/echo "Hello world"

- 다른 컨테이너에 ping 날리기 : docker exec -t web01 ping 172.17.0.6 

docker container run

- 도커의 "시작과 끝" 인 명령어. 너무 방대한 내용이므로 다른 섹션에서 다룰 예정

- 대부분 도커 컨테이너 실행할 때는 이 명령어를 사용한다.

< 도커 기본 명령어 차례 >

● 시스템 명령

docker version

docker system info

docker system df

docker system prune

docker login

locker logout

 

● 이미지 관리 명령

docker pull

docker image ls

docker images

docker image inspect

docker image tag

docker push

docker search

docker image rm

docker image prune

docker container commit

 

● 컨테이너 실행 및 조작 관련 명령

docker container create

docker container run

docker container attach

docker container exec

 

● 컨테이너 정보 확인 명령

docker container ps

docker container stats

docker container inspect

docker container top

docker container port

docker container diff

docker container logs

docker container ls

 

● 컨테이너 관리 명령

docker container stop

docker container start

docker container kill

docker container restart

docker container prune

docker container pause

docker container unpause

docker container rename

docker container cp

 

● 컨테이너/이미지 백업 명령

docker container export

docker container import

docker image save

docker image load

 

● 네트워크 명령

docker network ls

docker network create

docker network connect

docker network disconnect

docker networkinspect

docker network rm

brctl show

 

● 볼륨 명령 
docker volume create 
docker volume ls 
docker volume rm 
docker volume prune 
docker volume inspect

 


 

 

 

docker pull

설명

- docker pull [옵션] 이미지명[:태그명]

- 기본적으로 hub.docker.com 에서 이미지를 다운받는다.

- 레드햇이나 다른 업체들도 허브가 있고, 직접 private하게 구축할수도 있다.

- 아무 태그도 안쓰면, :latest 태그를 쓴 것처럼 자동으로 최신을 받는다.

- 다운받을때 여러개가 나오면서 pull complete라고 나오는데, 유니온 파일시스템이라 레이어별로 받기 때문임.

- 이미지명 대신, 주소를 넣을 수 있음. 주소는 http:// 을 제외한다.

 

옵션

-a : 해당 이미지의 모든 태그를 가져온다.

 

예시

docker pull 옵션 이미지명:태그명
docker pull -a centos (entos의 모든 태그의 이미지 다운로드)
docker pull 192.168.56.100:5000/mybuild:1.0 (해당 아이피를 가진 프라이빗 레지스트리에서 mybuild 1.0을 받음)
docker pull registry.asia.tesorflow/tensorflow (이런 url을 지정해서 접속. 단, https:// 이런거 제외)
docker pull utyk/goodi:mysql_v2 (도커허브에서 특정 유저의 이미지를 받을 때. "유저명/이미지명:태그" 형식)

 

docker image ls

설명

- docker images 와 동일하다.

- docker image ls [옵션] [레포지토리명]

 

옵션

--all, -a : 모든 이미지 표시  --all=false 이런식

--digests : 다이제스트 값 표시 여부

--digests=false : 이미지고유식별자를 출력하지 않음. 너무 길기 때문에 필요한 경우에만 보면 된다.

--no-trunc : 결과를 모두 표시   --no-trunc=false

--quiet, -q : 도커 이미지 ID만 표시  --quiet=false

 

예시

- REPOSITORY : 이미지의 이름

- IMAGE ID : 는 고유한 이미지 ID이다. 랜덤문자열이다.

- CREATED : 해당 이미지가 "생성된" 날짜. 다운받은 날짜가 아닌것으로 보임.

- DIGEST : --digests 옵션을 넣으면 보이고, 이것은 레지스트리에 업로드한 이미지를 고유하게 식별하기 위해 sha로 암호화된 식별자

 

docker image inspect

 

설명

- 이미지에 대한 상세 정보를 확인한다.

- docker image inspect 이미지명

- json 구조의 데이터 구조를 가지며, 이 구조로 정보를 보여준다.  (json : JavaScript Object Notation ; 텍스트 기반 데이터 포맷)

- 컨테이너의 모든 정보 확인 가능 (빌드옵션, 네트워크정보, 유니온파일시스템, 이름, ID 등 기타 모든 자세한 정보들)

- json에서 특정 값을 확인할때는 아래 옵션처럼 --format 옵션을 사용하여 json 형식 데이터의 계층 구조를 지정한다.

- 이 구조는 레벨 구조이다. Id, Parent, DockerVersion 같은 것들이며, 그 하위는 .으로 구분하여 표현한다. 예시 참고

 

옵션

--format : 지정된 형식만 보여줌

 

예시

- ContainerConfig 아래의 Image를 출력 : docker image inspect --format="{{ .ContainerConfig.Image }}" mysql

- OS 상세정보확인 docker inspect --format="{{.Os}}" centos:7

- CPU 아키텍쳐 정보 docker inspect --format="{{.Architecture}}" centos:7

- IMAGE 상세정보 docker inspect --format="{{.ContainerConfig.Image}}" centos:7

 

- 아래 예시는 전체를 보여주며, 각 항목이 계층화되어 있다.

- ID, RepoTags 는 같은 계층이고, RepoTags 밑에 nginx:latest는 그 아래 계층이다.

내용이 아주 길다. 너무 길어서 중략함.

Id : 이미지의 ID

Created : 작성일

DockerVersion : 도커 버전

Architecture : cpu 아키텍쳐

volume : 호스트os와 연동된 path

workingdir : 홈디렉토리같은곳. 예를들어 아파치면 아파치 설정파일이 있는곳을 여기로 잡는다.

유니온파일시스템 mergedir, upperdir, workdir

그 외에 여러가지 정보가 있다.

 

docker image tag

설명

- 명령어로서의 tag는 현재 존재하는 image에 대해 새로운 이름과 태그를 추가하는 것이다.

- 이미지를 새로 만드는 것이 아니므로, 원본과 tag본은 image ID가 동일하다. 말그대로 알리아스만 추가한 것.

- 태그는 일반적으로 식별하기 쉬운 버전명을 붙인다.

- 내가 작성한 이미지를 도커 허브 등 레포지토리에 올리는(push) 경우, 규칙에 맞춰서 이미지에 사용자명을 만들어야 한다.

- 해당 이름이 도커 허브 레포지토리 안의 경로가 되기 때문에, push 하는 경우 업로드하려는 위치에 맞춰 이미지에 tag 명령을 통해 이름을 설정한다.

- 규칙 : 도커허브사용자명/이미지명:[태그명]

- 도커허브 등의 레포지토리에서, 사용자명/이미지명 의 형식을 따르지 않는 그냥 centos, apache 이런것들은 도커 오피셜 이미지이다. (사용자명이 없는 이미지)

 

옵션

- 미확인

 

예시

- docker image tag 이미지명:태그 바꿀이미지명:태그 

- 여기서 / 는 오해하지 말아야 할 것이, "바꿀이미지명"에 포함되는 것임.

- /를 쓰는 이유는 도커허브에 올리는 형식을 맞추기 위해서이다.

- 예를들어 어떤 이미지가 있는데, 그 이미지에 대해 사용자명이 loaden이고 컨테이너명이 nginx-test이고 태그버전정보가 latest이라면, 아래처럼 사용한다.

docker image tag nginx:latest loaden/nginx-test:latest

- 아래처럼 원래 있는 nginx의 IMAGE ID와 utyk/nginx-test의 IMAGE ID가 동일하다.

 

docker push

설명
- docker push 사용자명/이미지명[:태그]
- 내가 만든 이미지를 도커 허브 등의 레포지토리에 업로드한다.
- push를 하려면, 내가 올리려는 이미지가 어디로 올려야 할지 명시하기 위해서는 이미지의 이름을 정확히 지정해야 한다. docker image tag 명령 참고
- 즉 예를 들어서, 내 계정에 특정 이미지를 올리려고 한다면, 아래와 같이 내계정명/이미지명 을 tag로 만들어야 한다.
- 도커허브에는 내계정/레포지토리:태그  구조이고, push로 올릴때는 내계정/이미지명:태그 형식으로 올린다.
- 도커허브에서 미리 레포지토리를 생성해두고 push로 올려도 되고, 그냥 push 로 올려도 도커허브에서 레포지토리가 자동으로 생성된다.

옵션
- 미확인

예시

업로드 후, docker hub에서 아래와 같이 확인할 수 있다.

 

docker search

설명
- 기본적으로 도커허브에 공개된 이미지를 검색한다.
- docker search [옵션] 키워드
- 도커 허브에 공개된 이미지가 모두 안전하지 않으므로, 도커 이미지를 사용할때는 안전을 위해 공식 이미지 또는 dockerfile이 제대로 공개된것을 선택하여 확인해야 한다.

옵션
--no-trunc : 결과를 모두 표시
--no-trunc=false : 모든 결과 표시
--linit : n 건의 검색 결과를 표시
--filter=stars=n : 즐겨찾기(별표)의 수 n개 이상만 검색함 (docker search --filter=stars=10 nginx)
--automated=false : automated build만 표시

예시

- AUTOMATED : github 등의 외부 소스 저장소에 있는 소스를 도커허브에서 자동으로 빌드해서 만든것인지 여부를 알려줌.

 

docker image rm

설명
- 도커 이미지를 삭제 (docker rm은 컨테이너 삭제이다)
- docker image rm [옵션] 이미지명 [이미지명 ...]
- 해당 이미지로 만들어놓은 컨테이너가 존재한다면, 이미지는 삭제되지 않음. (컨테이너가 살아있든 중단되었든 , docker ps -a 로 보이는 경우)
- 이름(REPOSITORY항목) 또는 Image ID를 명시한다.

옵션
--force, -f : 이미지를 강제로 삭제. 컨테이너도 죽는다. 강제는 별로 좋지않으므로 비추함.
--no-prune=false : 태그가 없는 부모 이미지를 삭제하지 않음

예시

# docker image rm utyk/nginx-test

이미지 전체 삭제 : docker rmi $(docker images -q)
 

 

 

 

 

docker container commit

설명
- docker container commit 옵션 컨테이너명 이미지명:태그명
- 이미지에서 컨테이너를 만들지만, 컨테이너에서 이미지를 만들 수도 있다.
- 컨테이너로부터 이미지를 작성한다.
- 내가 이미지를 가져와서 여러가지 수정 후, commit 하면 내가 수정한 정보를 그대로 가진 이미지를 생성할 수 있다.

옵션
--author, -a : 작성자를 지정함. 예를들어, "Choe Sung Kyu <utyk@naver.com>"
--message, -m : 메시지를 작성
--change, -c : 커밋 시 Dockerfile 명령을 지정한다.
--pause, -p : 컨테이너를 일시 정지하고 커밋한다.

예시
현재 실행된 컨테이너 상태. 이 컨테이너를 이미지로 만든다.

컨테이너로 이미지 생성

결과 확인

+ Recent posts