Docker Run

Park Choong Ho·2021년 5월 25일
0

Docker

목록 보기
3/4

Docker Run

run - tag

linux> sudo docker run redis  
1:C 25 May 2021 03:33:16.932 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo  
1:C 25 May 2021 03:33:16.932 # Redis version=6.2.3, bits=64, commit=00000000, modified=0, pid=1, just started  
1:C 25 May 2021 03:33:16.932 # 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 25 May 2021 03:33:16.933 \* monotonic clock: POSIX clock\_gettime  
1:M 25 May 2021 03:33:16.934 \* Running mode=standalone, port=6379.  
1:M 25 May 2021 03:33:16.934 # Server initialized  
1:M 25 May 2021 03:33:16.934 # WARNING overcommit\_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit\_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit\_memory=1' for this to take effect.  
1:M 25 May 2021 03:33:16.934 \* Ready to accept connections

여기서 보면 레디스의 버전이 6.2.3인 것을 확인할 수 있습니다. 만일 어떠한 이유로 다른 버전의 레디스를 깔아야되는 경우에는 어떻게 할까요? 4.0 버저능ㄹ 설치해야 된다고 가정해봅시다. 그런 경우에는 docker run redis:4.0이렇게 입력하면 됩니다. 즉, 이미지 다음에 :을 입력하고 원하는 버전을 입력해줍니다.

linux> sudo docker run redis:4.0  
1:C 25 May 03:39:11.754 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo  
1:C 25 May 03:39:11.754 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=1, just started  
1:C 25 May 03:39:11.754 # 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 25 May 03:39:11.756 \* Running mode=standalone, port=6379.  
1:M 25 May 03:39:11.756 # Server initialized  
1:M 25 May 03:39:11.756 # WARNING overcommit\_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit\_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit\_memory=1' for this to take effect.  
1:M 25 May 03:39:11.756 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent\_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.  
1:M 25 May 03:39:11.756 \* Ready to accept connections

이것을 tag하고 부릅니다. 만약 docker run redis 같이 특정한 태그를 붙이지 않으면 자동으로 디폴트 태그인 latest를 붙여줍니다. latest는 태그 이름에서 알 수 있듯이 해당 소프트웨어의 가장 최신 버전을 의미합니다.

run - stdin

이름을 입력하면 단순히 웰컴 메세지를 보내주는 프로그램이 있다고 해봅시다.

linux> ./app.sh
Welcome! Please enter your name: Park Choong Ho

Hello and Welcome Park Choong Ho!

해당 프로그램을 도커화해서 실행시키면 입력을 받지 않고 실행되고 standard out에 출력하는 것을 확인할 수 있습니다.

linux> docker run hello

Hello and Welcome !

이유는 기본적으로 도커 컨테이너가 standard input을 듣고 있지 않기 때문입니다. 해당 프로그램을 콘솔에 attach해도 어떤 input도 읽어들이지 못합니다. 이를 실현하기 위해서는 호스트의 standard input과 도커 컨테이너를 맵핑해야합니다. 이는 -i 옵션을 통해서 할 수 있습니다. -i 는 interactive mode를 의미합니다.

linux> docker run -i hello
Park Choong Ho

Hello and Welcome Park Choong Ho!

하지만 여전히 부족한 점이 있습니다. 바로 prompt가 동작하지 않는 건데요. 앞에 있었던 Welcome! Please enter your name: 부분이 보이지 않습니다. 그이유는 container terminal을 attach하지 않았기 때문입니다. 이를 해결하기 위해서는 -t 옵션을 사용합니다. -t는 psuedo terminal을 뜻합니다.

linux> docker run -it hello
Welcome! Please enter your name: Park Choong Ho

Hello and Welcome Park Choong Ho!

-i-t를 결합함으로써 우리는 터미널을 attach함과 동시에 interactice mode로 실행할 수 있습니다.

run - port mapping

도커가 설치된 기초 호스트를 도커 호스트 또는 도커 엔진이라합니다.

linux> sudo docker run kodekloud/webapp  
 \* Running on [http://0.0.0.0:5000/](http://0.0.0.0:5000/) (Press CTRL+C to quit)

위 처럼 도커 컨테이너를 실행하면 아래와 같은 그림의 구조가 생깁니다.

만일 사용자가 해당 도커 컨테이너에 접근하고 싶으면 어떻게 해야할까요? 먼저 위를 보시면 포트 번호가 5000인것을 확인할 수 있습니다. 그럼 포트는 5000으로 접근하면 된다는 것을 알 수 있습니다. 그렇다면 IP는 무엇일까요? IP와 포트번호를 알아야 도커 컨테이너에 접근할 수 있을텐데 말이죠. 두가지 방법이 있습니다.

하나는 도커 컨테이너의 IP를 사용하는 것입니다. 모든 도커 컨테이너는 기본적으로 IP를 할당받습니다. 위 그림의 경우에는 172.17.0.2입니다. 하나 명심해야할것은 이는 내부 IP이고 오직 도커 호스트를 통해서만 접근할 수 있다는 것입니다. 따라서 외부 사용자는 해당 IP로 접근할 수 없습니다. 따라서 도커 호스트 IP인 192.168.1.5를 사용해야합니다. 그리고 도커 호스트의 포트와 도커 컨테이너의 포트를 맵핑시켜야 합니다. -p를 활용하여 포트끼리 맵핑을 시켜줍니다.

linux> sudo docker run -p 80:5000 kodekloud/simple-webapp

이렇게 하고 localhost:80를 브라우저에 입력해서 들어가면 해당 도커 컨테이너에 접근합니다.

linux> sudo docker run -p 80:5000 kodekloud/webapp  
 \* Running on [http://0.0.0.0:5000/](http://0.0.0.0:5000/) (Press CTRL+C to quit)  
172.17.0.1 - - \[25/May/2021 10:49:21\] "GET / HTTP/1.1" 200 -  
172.17.0.1 - - \[25/May/2021 10:49:22\] "GET /favicon.ico HTTP/1.1" 404 -

완전 외부에서 접근하는 경우는 해당 도커 호스트의 IP인 192.168.1.5를 통해 컨테이너에 접근할 수 있습니다.

위 그림에서 처럼 여러개의 도커 컨테이너를 띄워놓고 여러개의 도커 호스트와 포트를 연결할 수 있습니다. 물론 도커 호스트 하나의 포트에 여러개의 도커 컨테이너를 연결할 수는 없으니 이 부분은 주의해야 합니다.

run - volume mapping

mysql 컨테이너를 실행했다고 가정해봅시다.

linux> sudo docker run mysql

이렇게 실행을 하고 나면 데이터 파일들은 도커 컨테이너 안에 위치한 /var/lib/mysql에 들어가게 됩니다.

문제는 도커가 자신만의 분리된 파일시스템을 가지고 있다는 점입니다. 파일의 변경이나 생성 삭제는 오롯이 해당 컨테이너안에서만 진행됩니다. 이 경우 해당 컨테이너를 삭제하면 그 안에 저장되어 있던 모든 파일들이 날아가게 될것이고, 데이터가 저장되어있던 파일도 예외는 아닐것입니다.

만약 컨테이너를 삭제해도 해당 데이터가 영속되기를 원한다면 데이터가 저장되어 있는 파일을 호스트의 특정 폴더 및 파일에 맵핑시켜야합니다.

linux> sudo docker run -v /opt/datadir:/var/lib/mysql mysql

이렇게 하면 호스트의 /opt/datadir 파일을 컨테이너 내의 /var/lib/mysql과 맵핑시킴으로써 컨테이너가 종료되더라도 데이터를 계속 유지할 수 있습니다. 데이터가 호스트의 /opt/datadir에 저장되는 것입니다.

inspect container

docker ps 명령어를 사용하면 우리는 어떤 컨테이너가 동작하는지 알 수 있습니다. 하지만 컨테이너들의 자세한 정보에 대해서는 알수가 없습니다.

docker inspect 명령어를 이용하면 특정 컨테이너에 대한 자세한 정보를 얻을 수 있습니다. 명령어뒤에 알고 싶은 컨테이너의 ID 또는 이름을 넘기면 됩니다. 그러면 컨테이너에 대한 자세한 정보들을 JSON format으로 터미널에 보여줍니다.

linux> sudo docker ps -a  
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                        PORTS     NAMES  
40fd78ffd69d   mysql              "docker-entrypoint.s…"   14 minutes ago   Exited (1) 14 minutes ago               happy\_noether  
6136064c95f6   kodekloud/webapp   "/bin/sh -c 'FLASK\_A…"   2 hours ago      Exited (137) 15 minutes ago             clever\_jemison  
b2bd7d65748f   kodekloud/webapp   "/bin/sh -c 'FLASK\_A…"   2 hours ago      Exited (137) 2 hours ago                great\_goldberg  
02491c159999   kodekloud/webapp   "/bin/sh -c 'FLASK\_A…"   2 hours ago      Exited (137) 2 hours ago                sweet\_chatterjee

linux> sudo docker inspect b2  
\[  
    {  
        "Id": "b2bd7d65748ff2856b7dfd54013d6f7aeabe1048a2818e395ce3ce3967ca0862",  
        "Created": "2021-05-25T10:34:48.922383236Z",  
        "Path": "/bin/sh",  
        "Args": \[  
            "-c",  
            "FLASK\_APP=/opt/app.py flask run --host=0.0.0.0"  
        \],  
        "State": {  
            "Status": "exited",  
            "Running": false,  
            "Paused": false,
			...

container logs

만약 background로 돌린 컨테이너의 로그를 보고 싶다면 어떻게 해야 할까요?

linux> sudo docker run -d kodekloud/webapp  
9ae3fec1819d3a5db7b08c3e37b2f42f77e828c55d89ef64c12688ba00197dc9

linux> sudo docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                        PORTS     NAMES  
9ae3fec1819d   kodekloud/webapp   "/bin/sh -c 'FLASK\_A…"   13 seconds ago   Up 12 seconds                           elegant\_bhaskara

background로 돌고 있는 컨테이너의 stdout의 내용인 로그를 어떻게 읽을 수 있을까요?

logs 명령어를 사용하면 됩니다. logs 명령어 뒤에 해당 컨테이너의 ID 또는 이름을 넘기면 됩니다.

linux> sudo docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                        PORTS     NAMES  
9ae3fec1819d   kodekloud/webapp   "/bin/sh -c 'FLASK\_A…"   13 seconds ago   Up 12 seconds                           elegant\_bhaskara

linux> sudo docker logs 9a  
 \* Running on [http://0.0.0.0:5000/](http://0.0.0.0:5000/) (Press CTRL+C to quit)
profile
백엔드 개발자 디디라고합니다.

0개의 댓글