컨테이너 접근 및 실행
- 분리 모드로 실행중인 컨테이너에 접근하거나 컨테이너에 직접 접근하지 않고 명령을 실행하는 방법이 있다.
- docker attach 와 docker exec 에 대해 알아보자.
docker attach
[root@docker ~]# docker attach --help
Usage: docker attach [OPTIONS] CONTAINER
- docker attach 명령으로 표준 입력, 표준 출력/에러 를 포함하는 컨테이너에 연결할 수 있다.
- 컨테이너 사용을 마쳤으면 Ctrl + P + Q를 사용하여 종료하지 않고 빠져나온다.
- docker attach 명령으로 쉘 프로그램 외에 애플리케이션을 실행하고 있는 컨테이너에 접근하면 쉘이 나타날 것이라고 생각할 수 있다.
- 하지만, 컨테이너는 기본적으로 쉘 프로그램을 실행하고 있지 않으므로 docker attach 로 접근하지 않는 것이 좋다.
os2 컨테이너에 연결하는 명령
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f84b62afbea9 ubuntu:latest "/bin/bash" 56 minutes ago Up 31 minutes os2
fcc81af38bc4 ubuntu:latest "/bin/bash" 57 minutes ago Exited (127) 56 minutes ago os1
[root@docker ~]# docker attach os2
root@f84b62afbea9:/#
docker exec
[root@docker ~]# docker exec --help
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- docker exec 명령을 사용하여 실행중인 컨테이너에서 명령을 실행할 수 있다.
- docker exec 도 docker run과 같이 -it 옵션을 사용할 수 있다.
docker exec 명령을 사용하여 os2 컨테이너에서 sleep 5000& 명령을 실행
[root@docker ~]# docker top os2
UID PID PPID C STIME TTY TIME CMD
root 7785 7763 0 15:47 pts/0 00:00:00 /bin/bash
[root@docker ~]# docker exec -it os2 sleep 5000&
[1] 8069
[root@docker ~]# docker top os2
UID PID PPID C STIME TTY TIME CMD
root 7785 7763 0 15:47 pts/0 00:00:00 /bin/bash
root 8086 7763 0 15:50 ? 00:00:00 sleep 5000
[1]+ Stopped docker exec -it os2 sleep 5000
[root@docker ~]# ps -ef | grep sleep
root 8069 1902 0 15:50 pts/0 00:00:00 docker exec -it os2 sleep 5000
root 8086 7763 0 15:50 ? 00:00:00 sleep 5000
root 8109 1902 0 15:50 pts/0 00:00:00 grep --color=auto sleep
[root@docker ~]# docker exec -it os2 ps -ef | grep sleep
root 17 0 0 06:50 pts/1 00:00:00 sleep 5000
docker exec 명령을 사용하여 os2 컨테이너에서 ip a s
[root@docker ~]# docker run --name os2 -itd centos
cc28f3e3894461e8c96d537f896377d87fbd12d7a5a7971cce955c1337559deb
[root@docker ~]# docker exec os2 ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
49: eth0@if50: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
컨테이너 프로세스 및 로그 확인
- 컨테이너에서 실행중인 프로세스와 로그를 확인할 수 있다.
- docker top, docker logs
docker top
[root@docker ~]# docker top --help
Usage: docker top CONTAINER [ps OPTIONS]
- docker top 명령으로 컨테이너에서 실행되는 프로세스의 정보를 확인할 수 있다.
- docker top 명령은 리눅스의 ps 옵션을 그대로 사용할 수 있다.
- 만약 지정하지 않으면 -ef 옵션과 동일하다.
os2 컨테이너의 프로세스 목록을 확인
[root@docker ~]# docker top os2
UID PID PPID C STIME TTY TIME CMD
root 9529 9508 0 03:36 pts/0 00:00:00 /bin/bash
docker logs
[root@docker ~]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
- docker logs 명령으로 컨테이너의 로그를 확인할 수 있다.
mysql:5.7 이미지로 db1 컨테이너를 실행한 뒤 로그를 확인 (run -> ps 명령으로 상태를 보면 종료가 됌 -> logs 명령으로 원인을 찾음)
[root@docker ~]# docker run -d --name db1 mysql:5.7
98dfdf0ce59eeba624371dc97f3d4748b97f20f6c153bcfe70eb696a587fc28d
[root@docker ~]# docker ps -a | grep mysql
98dfdf0ce59e mysql:5.7 "docker-entrypoint.s…" 16 seconds ago Exited (1) 15 seconds ago db1
[root@docker ~]# docker logs db1
2021-06-01 18:46:21+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.34-1debian10 started.
2021-06-01 18:46:21+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-06-01 18:46:21+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.34-1debian10 started.
2021-06-01 18:46:21+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of the following:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
- 에러 메시지를 보면 아래 중 하나를 지정해야 하는 것을 알 수 있다.
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
- 이는 도커 허브에 있는 mysql 저장소의 설명을 읽어보면 컨테이너 환경변수인 것을 알 수 있다.
환경변수를 설정하여 db2 컨테이너를 다시 실행
[root@docker ~]# docker run -d --name db2 -e "MYSQL_ROOT_PASSWORD=1234" mysql:5.7
d0409dbe66d83b26ccefed9ae00d12772c2a1af386b3b8c527d9e959b19ded9d
[root@docker ~]# docker ps | grep mysql
d0409dbe66d8 mysql:5.7 "docker-entrypoint.s…" 9 seconds ago Up 8 seconds 3306/tcp, 33060/tcp db2
컨테이너에 파일 복사 및 확인
- 호스트에 있는 파일을 컨테이너에 복사하거나 반대로 작업할 수 있다. (docker cp)
- 또한 컨테이너의 파일시스템 중 어느 것이 변경되었는지 알 수 있는 명령어도 있다. (docker diff)
docker cp
[root@docker ~]# docker cp --help
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
- docker cp 명령을 사용하여 호스트의 파일을 컨테이너를 복사하거나 컨테이너의 파일을 호스트로 복사할 수 있다.
docker cp 명령으로 web2 컨테이너의 /usr/local/apache2/htdocs/index.html 파일을 호스트의 /tmp/index.html 로 복사
[root@docker ~]# docker run --name web2 -d httpd
5f17bd6b63317ef0bac205c5a74acffaccda893da6da681bacf75b7c29f12549
[root@docker ~]# docker cp web2:/usr/local/apache2/htdocs/index.html /tmp/index.html
[root@docker ~]# cat /tmp/index.html
<html><body><h1>It works!</h1></body></html>
docker diff
[root@docker ~]# docker diff --help
Usage: docker diff CONTAINER
- docker diff 명령은 컨테이너에서 파일의 변경 상태를 체크
상태 |
설명 |
A |
파일이 추가됨 |
B |
파일이 변경됨 |
C |
디렉토리에 안의 파일이 생성되거나 삭제됨 |
D |
파일이 삭제됨 |
os2 컨테이너의 /tmp 디렉토리에 호스트의 /etc/service 파일을 복사한 뒤 diff 명령으로 확인
[root@docker ~]# docker cp /etc/services os2:/tmp
[root@docker ~]# docker diff os2
C /tmp
A /tmp/services