일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Flutter
- 구조체
- git
- Data Structure
- jupyter
- dart 언어
- c언어
- c# 추상 클래스
- Houdini
- C++
- vim
- Unity
- docker
- gitlab
- C언어 포인터
- c#
- jupyter lab
- Python
- Algorithm
- github
- 플러터
- 유니티
- HTML
- 포인터
- 깃
- 도커
- 다트 언어
- c# winform
- c# 윈폼
- C# delegate
- Today
- Total
nomad-programmer
[DevOps/Docker] 가동 중인 Docker 컨테이너 조작 (attach, exec, top, port, rename, cp, diff) 본문
[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
...