도커/개념 및 실습

03장-3, 컨테이너 관리

Jaden Park 2021. 6. 2. 10:08

컨테이너 접근 및 실행

  • 분리 모드로 실행중인 컨테이너에 접근하거나 컨테이너에 직접 접근하지 않고 명령을 실행하는 방법이 있다.
  • 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

'도커 > 개념 및 실습' 카테고리의 다른 글

04장, 도커 볼륨  (0) 2021.06.02
1, 2, 3장 연습문제  (0) 2021.06.02
03장-2, 컨테이너 실행  (0) 2021.06.01
03장-1, docker 명령 - 이미지 다운로드  (0) 2021.05.31
02장, 도커 개요, 설치  (0) 2021.05.31