Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

nomad-programmer

[DevOps/Docker] 가동 중인 Docker 컨테이너 조작 (attach, exec, top, port, rename, cp, diff) 본문

DevOps/Docker

[DevOps/Docker] 가동 중인 Docker 컨테이너 조작 (attach, exec, top, port, rename, cp, diff)

scii 2020. 11. 27. 14:10

실제 환경에서 운용할 때 이미 가동 중인 컨테이너의 상태를 확인하거나 임의의 프로세스를 실행시킬 때 하는 조작에 대한 설명이다.

가동 컨테이너 연결 (docker container attach)

가동 중인 컨테이너에 연결할 때는 docker container attach 명령을 사용한다. 예를 들어 /bin/bash 가 실행되고 있는 sample 이라는 이름의 컨테이너에 연결하려면 다음의 명령을 실행한다.

// 컨테이너에 연결하기
$ docker container attach sample

[root@9e0a1844027a /]#  <-- 여기서 Ctrl+P, Ctrl+Q 를 입력
[root@9e0a1844027a /]# read escape sequence    <-- 컨테이너는 시작된 상태에서 /bin/bash만 삭제한다.

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES         
9e0a1844027a        centos:7            "/bin/bash"         2 minutes ago       Up 2 minutes                            sample

// 위의 결과로 알 수 있듯이 컨테이너가 여전히 가동중이다. 하지만 아래처럼 명령한다면...
// 컨테이너는 종료될 것이다.

[root@9e0a1844027a /]# exit  <-- 컨테이너의 /bin/bash를 탈출하려 이와 같이 명령하였다.

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES         

// 이렇게 탈출하면 컨테이너는 가동을 중지한다. 따라서 가동 중지하지 않고 bash 쉘을 빠져나가려면,
// Ctrl+P, Ctrl+Q 명령을 해야한다는 것을 알 수 있다.

가동 컨테이너에서 프로세스 실행 (docker container exec)

가동 중인 컨테이너에서 새로운 프로세스를 실행할 때는 docker container exec 명령을 사용한다. 예를 들어 웹 서버와 같이 백그라운드에서 실행되고 있는 컨테이너에 액세스하고 싶을 때 docker container attach 명령으로 연결해도 shell이 작동하지 않는 경우는 명령을 접수할 수가 없다.
그래서 docker container exec 명령을 사용하여 임의의 명령을 실행해야 한다.

docker container exec [옵션] <컨테이너 식별자> <실행할 명령> [인수]

지정할 수 있는 주요 옵션

옵션 설명
--detach, -d 명령을 백그라운드에서 실행한다.
--interactive, -i 컨테이너의 표준 입력을 연다.
--tty, -t tty (단말 디바이스) 를 사용한다.
--user, -u 사용자명을 지정한다.

예를 들어 webserver 라는 이름으로 가동 중인 컨테이너에서 /bin/bash를 실행하려면 다음의 명령을 실행한다. shell이 시작되므로 컨테이너 안에서 임의의 명령을 실행할 수 있다.

// 컨테이너에서 bash 실행
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES           
4df34a46f489        nginx:latest        "/docker-entrypoint.…"   6 minutes ago       Up 6 minutes        0.0.0.0:8080->80/tcp   webserver    

$ docker container exec -it webserver /bin/bash
root@4df34a46f489:~#

또한 명령을 직접 실행할 수도 있다. webserver라는 이름의 컨테이너에서 echo 명령을 실행하는 예이다.

// 컨테이너에서 echo 실행
$ docker container exec -it webserver /bin/echo "Hello world!"

또한 docker container exec 명령은 실행 중인 컨테이너에서만 실행할 수 있다. 정지 중인 컨테이너는 docker container start 명령을 사용하여 컨테이너를 시작해야 한다.


가동 컨테이너의 프로세스 확인 (docker container top)

가동 중인 컨테이너에서 실행되고 있는 프로세스를 확인할 때는 docker container top 명령을 사용한다. 예를 들어 webserver라는 이름의 컨테이너의 프로세스를 확인할 때는 다음의 명령을 실행한다.

$ docker container top webserver

docker container top 명령을 실행시키면 실행 중인 프로세스의 PID와 USER, 실행 중인 명령이 표시된다. PID란 Linux의 프로세스 식별자로, 프로세스를 고유하게 식별하기 위한 ID이다.


가동 컨테이너의 포트 전송 확인 (docker container port)

가동 중인 컨테이너에서 실행되고 있는 프로세스가 전송되고 있는 포트를 확인할 때는 docker container port 명령을 사용한다. 예를 들어 webserver라는 이름의 컨테이너의 포트 전송을 확인할 때는 다음의 명령을 실행한다. 

// 컨테이너의 포트 전송
$ docker container port webserver

80/tcp -> 0.0.0.0:8080

컨테이너의 80번 포트가 호스트 8080번 포트로 전송된다는 것을 알 수 있다.


잘 알려진 포트 (well-known-port)

TCP/IP를 이용한 데이터 통신에서, 특정 프로토콜에서 사용하는 것으로 예약되어 있는 포트 번호를 잘 알려진 포트(well-known port) 라고 한다. 
0 ~ 65535 까지의 포트 번호 중 잘 알려진 포트는 1부터 1023까지를 사용하므로, 보통의 애플리케이션에서는 1024 이후의 포트 번호를 사용하는 것이 관례이다.

주요 Linux 배포판

번호 TCP/IP 서비스/프로토콜 설명
20 TCP FTP (데이터) 파일 전송 (데이터)
21 TCP FTP (제어) 파일 전송 (제어)
22 TCP/UDP ssh secure shell
23 TCP Telnel 원격 액세스
25 TCP/UDP SMTP 메일 전송
43 TCP WHOIS 도메인 정보 검색
53 TCP/UDP DNS 도메인 이름 시스템
80 TCP/UDP HTTP 웹 액세스
88 TCP/UDP Kerberos Kerberos 인증
110 TCP POP3 메일 수신
123 UDP NTP 시간 조정
135 TCP Microsoft RPC Microsoft의 원격 액세스
143 TCP/UDP IMAP2/4 인터넷 메일 액세스
161 TCP/UDP SNMP 네트워크 감시
162 TCP/UDP SNMP 트랩 네트워크 감시 (트랩)
389 TCP/UDP LDAP 디렉토리 서비스
443 TCP/UDP HTTPS HTTP의 암호화 통신
465 TCP SMTPS SMTP의 암호화 통신
514 UDP syslog 로그 수집
989 TCP/UDP FTPS (데이터) FTP (데이터)의 암호화 통신
990 TCP/UDP FTPS (제어) FTP (제어)의 암호화 통신
992 TCP/UDP Telnets Telnet의 암호화 통신
993 TCP IMAPS IMAP의 암호화 통신
995 TCP POP3S POP3의 암호화 통신

포트 번호의 할당은 인터넷과 관련된 번호를 통합 관리하고 있는 조직인 Internet Assigned Numbers Authority (IANA)가 관리하고 있다.


컨테이너 이름 변경 (docker container rename)

컨테이너 이름을 변경하려면 docker container rename 명령을 사용한다. 예를 들어 old라는 이름의 컨테이너를 new라는 이름으로 변경할 때는 다음의 명령을 실행한다.

// 컨테이너 이름 변경
$ docker container rename old new

컨테이너 안의 파일을 복사 (docker container cp)

컨테이너 안의 파일을 호스트에 복사할 때는 docker container cp 명령을 사용한다.

docker container cp <컨테이너 식별자>:<컨테이너 안의 파일 경로> <호스트의 디렉토리 경로>

docker container cp <호스트의 파일> <컨테이너 식별자>:<컨테이너 안의 파일 경로>

예를 들어 test라는 이름의 컨테이너 안에 있는 /etc/nginx/nginx.conf 파일을 호스트의 /tmp/etc 복사할 때는 다음의 명령을 실행한다.

// 컨테이너에서 호스트로 파일 복사
$ docker container cp webserver:/etc/nginx/nginx.conf /tmp/nginx.conf

반대로 호스트의 현재 디렉토리에 있는 local.txt 라는 이름의 파일을 webserver라는이름의 컨테이너 안의 /tmp/local.txt로 복사할 때는 다음의 명령을 실행한다.

// 호스트에서 컨테이너로 파일 복사
$ docker container cp ./test.txt webserver:/tmp/test.txt

컨테이너 조작의 차분 확인 (docker container diff)

컨테이너 안에서 어떤 조작을 하여 컨테이너가 이미지로부터 생성되었을 때와 달리진 점 (차분) 을 확인하려면 docker container diff 명령을 사용한다.

docker container diff <컨테이너 식별자>

변경의 구분

구분 설명
A 파일 추가
D 파일 삭제
C 파일 수정

예를 들어 test라는 이름의 컨테이너 안에서 newuser라는 이름의 새로운 사용자를 만들었을 때, docker container diff 명령을 실행하면 컨테이너 안에서 변경이 있었던 부분을 확인할 수 있다. 변경 부분을 확인하려면 다음의 명령을 실행한다.

// 컨테이너의 변경 부분 확인
$ docker container diff test

명령의 결과를 확인하면 /etc/passwd나 /etc/group 등에 변경이 일어났다는 것을 알 수 있다.

// 컨테이너에서 신규 사용자 생성
# useradd newuser

// 컨테이너의 변경 부분 확인
$ docker container diff test
C /root
A /root/.bash_history
...
Comments