Infrastructure

[Docker] 2. 컨테이너 관리

일태우 2022. 6. 17. 15:32
반응형

컨테이너 실행하기

컨테이너 실행 명령어는 다음과 같다

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
옵션 설명
-d --detach Detached mode(백그라운드 모드)
-p --publish 호스트와 컨테이너의 포트 연결(포트 포워딩)
-v --volume 호스트와 컨테이너의 디렉토리 연결(파일을 호스트에 바로 저장, 마운트개념)
--rm 프로세스 종료 시 컨테이너 자동 제거
--name 컨테이너 이름 지정
-i --interactive 표준 입력(stdin)을 활성화, bash 사용시 사용
-t --tty TTY 모드를 사용, bash 사용시 사용, 해당 명령을 사용하지 않으면 명령은 할 수 있겠지만 쉘이 표시되지 않음

 

Ubuntu 16.04 컨테이너 실행

ubuntu 16.04 이미지 이름을 입력하여 컨테이너 실행, 로컬에 저장되어 있는지 확인하고 없으면 다운로드(pull) 한다.

docker run ubuntu:16.04

별다른 명령을 안했기 때문에 실행중인 프로세스가 없는 ubuntu 컨테이너는 자동 종료된다. 이번에는 /bin/bash를 실행 해보자

docker run -it --rm ubuntu:16.04 /bin/bash

컨테이너가 바로 실행되고 bash를 사용할 수 있게 된다.

cat /etc/issue
Ubuntu 16.04.7 LTS \n \l

ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  
opt  proc  root  run  sbin  srv  sys  tmp  usr  var

컨테이너 실행 시 컨테이너 내부에서 명령어를 실행하기 위해 bash 쉘을 실행했고, 입력을 위해 -it옵션을 추가, 종료시 컨테이너 제거를 위해 --rm옵션을 추가하였다

cat /etc/issuels로 ubuntu환경인 것을 확인 가능하다. exit명령어로 종료와 함께 컨테이너 제거가 된다.

 

Detached 모드로 Redis 컨테이너 실행

-d 로 Detached 모드로 실행하고, -p 모드로 redis port 6379를 호스트에서 1234로 포워딩하여 실행해보고 exec 명령어로 redis 컨테이너에서 redis-cli를 실행해보자

docker run -d --name redis-test -p 1234:6379 redis

docker exec -it redis-test redis-cli

# in redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set test 1234
OK
127.0.0.1:6379> keys *
1) "test"
127.0.0.1:6379> get test
"1234"

redis-cli로 접근하여 키를 저장해보고 불러보았다 매우 쉽게 redis를 사용해 볼 수 있다

 

MySQL 5.7 컨테이너 실행

https://hub.docker.com/_/mysql에 들어가면 환경변수에 관한 설명을 참고할 수 있다. 환경변수는 -e 옵션으로 설정한다. --name 옵션으로 컨테이너 이름을 설정하면 다른 명령어에서 쉽게 사용가능하다

docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

--name 옵션을 생략하면 자동으로 컨테이너이름이 생성되는데, 유명한 과학자나 해커의 이름과 수식어를 조합하여 랜덤으로 생성한다

컨테이너 생성 후 DB 툴로 접속해보자 주소는 localhost:3306 root계정을 이용한다.

mysql 컨테이너에 정상 접속

 

도커 기본 명령어

컨테이너의 상태를 확인하고, 이미지의 상태를 확인하고 관리해보자

 

ps - 컨테이너 목록 확인하기

docker ps [OPTIONS]

CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                               NAMES
cb1c3db80d42   mysql:5.7   "docker-entrypoint.s…"   13 minutes ago   Up 13 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
ed9e6c4c1775   redis       "docker-entrypoint.s…"   35 minutes ago   Up 35 minutes   0.0.0.0:1234->6379/tcp              redis-test

docker ps -a

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS                                       NAMES
cb1c3db80d42   mysql:5.7      "docker-entrypoint.s…"   15 minutes ago   Up 15 minutes               0.0.0.0:3306->3306/tcp, 33060/tcp           mysql
ed9e6c4c1775   redis          "docker-entrypoint.s…"   37 minutes ago   Up 37 minutes               0.0.0.0:1234->6379/tcp                      redis-test
55de267345a0   ubuntu:16.04   "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                                                  nice_ardinghelli

옵션 -a를 사용하면 삭제를 한건 아니기 때문에 종료된 컨테이너도 보인다. 

 

stop - 컨테이너 중지하기

실행중인 컨테이너를 중지한다

docker stop cb1c3db80d42 # 정지할 컨테이너 id 입력

docker ps -a

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS                                       NAMES
cb1c3db80d42   mysql:5.7      "docker-entrypoint.s…"   20 minutes ago   Exited (0) 3 seconds ago                                                mysql

mysql 컨테이너를 정지해보기 위해 docker ps 명령어로 mysql 컨테이너의 id를 stop 명령어에 입력하자. 참고로 컨테이너 id는 겹치지 않으면 앞의 2자리~4자리만 입력하여도 된다. 해당 컨테이너를 정지하고 다시 ps -a 해보면 정지된 것을 확인 할 수 있다.

 

rm - 컨테이너 제거하기

종료된 컨테이너를 완전히 제거한다

docker rm [OPTIONS] CONTAINER [CONTAINER...]

docker ps -a

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS                                       NAMES
cb1c3db80d42   mysql:5.7      "docker-entrypoint.s…"   32 minutes ago   Exited (0) 12 minutes ago                                               mysql
ed9e6c4c1775   redis          "docker-entrypoint.s…"   54 minutes ago   Up 54 minutes               0.0.0.0:1234->6379/tcp                      redis-test
55de267345a0   ubuntu:16.04   "/bin/bash"              3 hours ago      Exited (0) 3 hours ago                                                  nice_ardinghelli

docker rm 55de cb1c

mysql과 ubuntu 컨테이너를 삭제 해보았다. 이후 ps -a로 확인 해보면 삭제된 것을 확인 할 수 있다.

 

images - 이미지 목록 확인하기

도커가 다운로드한 이미지 목록을 확인한다

docker images [OPTIONS] [REPOSITORY[:TAG]]

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
redis        latest    604d80444252   3 days ago     117MB
mysql        5.7       2a0961b7de03   2 weeks ago    462MB
ubuntu       16.04     b6f507652425   9 months ago   135MB

이미지 목록과 태크, ID, 생성시점, 용량을 확인 가능하다

 

pull - 이미지 다운로드

이미지를 다운로드한다

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

docker pull ubuntu:16:04

 

rmi - 이미지 삭제하기

docker rmi [OPTIONS] IMAGE [IMAGE...]

docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
redis        latest    604d80444252   3 days ago     117MB
mysql        5.7       2a0961b7de03   2 weeks ago    462MB

docker rmi 2a09

Untagged: mysql:5.7
Untagged: mysql@sha256:7e99b2b8d5bca914ef31059858210f57b009c40375d647f0d4d65ecd01d6b1d5
Deleted: sha256:2a0961b7de03c7b11afd13fec09d0d30992b6e0b4f947a4aba4273723778ed95
Deleted: sha256:2fbd454d39f146da1c0747174089b983c1cf1da7a062384e5a71a94f540141ab
Deleted: sha256:60ce6f6a8d71e66bd7ca1dae1f84a5faedfb993c1a0f352b90597b73eb94d56e
Deleted: sha256:226a653f6ee6b0184d7a6304f29976dc89b0e54e2eec2027d0e3cf87cbe8f2af
Deleted: sha256:218468cc1e9e25a831221617115da837798856793eb7decb3b089c8a1b5bd98f
Deleted: sha256:aea4fcaf4a44b4ce254718a5699557d5a278182a060683e9fcab117281c710c5
Deleted: sha256:87e7690acc799fa14efd95056b81ca599d7587771add57bb73f9066e3a1a1d10
Deleted: sha256:efb1655b4e285047d5fc78392e33a2f0b4156997e69b0833a6b78774674085d6
Deleted: sha256:fabb64857683e1f35472debb5a12a6bf2e081b5766c69874c0528086737434fb
Deleted: sha256:cf7b1ec7aec8704bd8369c4307ecf4931b0afd2d3f912c0a6066c2ac6443ac28
Deleted: sha256:6c9d31c0820816a60a4320711febf8710a1d053f1f3a424e1f071b65263da7d1
Deleted: sha256:10e6bc6fdee2d9a0d1ac5e78a031b5670f37d75599ba609cbd1d027af78f7bf4

실행중인 컨테이너는 이미지의 레이어기반으로 실행되므로 삭제할 수 없다.

 

컨테이너 둘러보기

logs - 컨테이너 로그보기

컨테이너의 로그를 확인한다

docker logs [OPTIONS] CONTAINER

docker logs redis-test
1:C 17 Jun 2022 07:56:23.572 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 17 Jun 2022 07:56:23.572 # Redis version=7.0.2, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 17 Jun 2022 07:56:23.572 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 17 Jun 2022 07:56:23.572 * monotonic clock: POSIX clock_gettime
1:M 17 Jun 2022 07:56:23.573 * Running mode=standalone, port=6379.
1:M 17 Jun 2022 07:56:23.573 # Server initialized
1:M 17 Jun 2022 07:56:23.573 * Ready to accept connections

-tail 옵션으로 출력 라인 수를 지정할 수 있다.

docker logs --tail 5 redis-test
1:C 17 Jun 2022 07:56:23.572 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 17 Jun 2022 07:56:23.572 * monotonic clock: POSIX clock_gettime
1:M 17 Jun 2022 07:56:23.573 * Running mode=standalone, port=6379.
1:M 17 Jun 2022 07:56:23.573 # Server initialized
1:M 17 Jun 2022 07:56:23.573 * Ready to accept connections

 

-f 옵션으로 실시간으로 로그를 조회할 수 있다.

 

exec - 컨테이너 명령어 실행하기

컨테이너를 관리하다보면 컨테이너에 접속하여 컨테이너 파일을 실행하고 싶어질 때가 있다. SSH는 권장되지 않는다고 하니 exec명령어를 사용하면 된다.

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

docker exec -it mysql /bin/bash
root@6fe9822cf342:/# mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql>

-it 옵션은 키보드 입력을 위해 주었고, bash 쉘로 접속하여 작업을 진행하였다

 

컨테이너 업데이트

컨테이너를 새로운 버전으로 업데이트 하는 방법은

  1. 새 버전 이미지를 다운로드 (pull)
  2. 기존 컨테이너 삭제 (stop, rm)
  3. 새 컨테이너 생성(run)

과정으로 업데이트 하면 된다. 하지만 mysql 컨테이너를 이렇게 업데이트하면 데이터가 날아갈 것이다. 이를 위해 컨테이너 삭제시 유지해야하는 데이터는 컨테이너 내부가 아닌 외부에 저장하여야 한다. 

 

가장 좋은 방법은 클라우드 서비스(AWS S3 등)을 이용하는 것이고, 데이터 볼륨을 추가하여 호스트의 디렉토리를 마운트해서 사용하는 방법이 있다. run 옵션중 -v 옵션으로 가능하다.

#before
docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.72

#after
docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v c:\test:/var/lib/mysql mysql:5.7

/c/test
$ ls -al
total 188582
drwxr-xr-x 1 twlee 197121        0  6월 17 18:25 ./
drwxr-xr-x 1 twlee 197121        0  6월 17 18:17 ../
-rw-r--r-- 1 twlee 197121       56  6월 17 18:25 auto.cnf
-rw-r--r-- 1 twlee 197121     1112  6월 17 18:25 ca.pem
-rw-r--r-- 1 twlee 197121     1680  6월 17 18:25 ca-key.pem
-rw-r--r-- 1 twlee 197121     1112  6월 17 18:25 client-cert.pem
-rw-r--r-- 1 twlee 197121     1676  6월 17 18:25 client-key.pem
-rw-r--r-- 1 twlee 197121     1352  6월 17 18:25 ib_buffer_pool
-rw-r--r-- 1 twlee 197121 50331648  6월 17 18:25 ib_logfile0
-rw-r--r-- 1 twlee 197121 50331648  6월 17 18:25 ib_logfile1
-rw-r--r-- 1 twlee 197121 79691776  6월 17 18:25 ibdata1
-rw-r--r-- 1 twlee 197121 12582912  6월 17 18:25 ibtmp1
drwxr-xr-x 1 twlee 197121        0  6월 17 18:25 mysql/
drwxr-xr-x 1 twlee 197121        0  6월 17 18:25 performance_schema/
-rw-r--r-- 1 twlee 197121     1676  6월 17 18:25 private_key.pem
-rw-r--r-- 1 twlee 197121      452  6월 17 18:25 public_key.pem
-rw-r--r-- 1 twlee 197121     1112  6월 17 18:25 server-cert.pem
-rw-r--r-- 1 twlee 197121     1676  6월 17 18:25 server-key.pem
drwxr-xr-x 1 twlee 197121        0  6월 17 18:25 sys/

각자의 환경에 맞춰 디렉토리를 변경 해주면 해당 디렉토리로 마운트 되어 파일을 확인 할 수 있다. 이제 컨테이너를 삭제해도 해당 파일은 삭제되지 않으니 컨테이너를 업데이트해도 디렉토리 마운트 후 기존 데이터 그대로 사용할 수 있다.

 

참고

https://docs.docker.com/engine/reference/run/

https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html

반응형

'Infrastructure' 카테고리의 다른 글

[Docker] 1. 설치  (0) 2022.06.17
Window 10 Redis 설치하기  (0) 2020.10.14
Amazon AWS Cloud Computing  (0) 2020.08.03