Docker Container 기초실습

2019-11-29

.

Data_Engineering_TIL_(20191128)

[학습한 Contents]

1) 주제 : 컨테이너 기반 가상화 플랫폼 ‘도커(Doker)’의 이해 - 컨테이너 실행하기 / SK T아카데미 온라인강의

2) URL : https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=125

[필기노트]

컨테이너 설치 및 실행

step 1) sudo yum update -y 실행

step 2) sudo amazon-linux-extras install docker 실행

step 3) sudo service docker start 실행

step 4) sudo docker version 실행 후 아래 그림과 같은 결과가 전시되는지 확인

1

도커 클라이언트에서 실행을 하면 호스트에 있는 데몬에서 실행하고 실행한 결과를 다시 클라이언트로 받아서 보여주는 구조이다.

2

우분투 16.04 컨테이너를 실행해보자. 아래 그림과 같이 명령어를 실행하면 된다.

sudo docker run ubuntu:16.04

3

run명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)를 한후 컨테이너를 생성(create)하고 시작(start) 한다. 컨테이너는 정상적으로 실행됐지만 뭘 하라고 명령어를 전달하지 않았기 때문에 컨테이너는 생성되자마자 종료된다. 컨테이너는 프로세스이기 때문에 실행중인 프로세스가 없으면 컨테이너는 종 료된다.

우분투라는 프로세스가 실행이되고 아무런 작업내용일 없어서 프로세스가 끝나서 종료된 것이다. 프로세스가 있어야 계속 떠있을텐데 프로세스를 따로 명령어 뒤에 인자로 안넣었기 때문에 바로 종료되었다.

그러면 이번에는 docker run --rm -it ubuntu:16.04 /bin/sh를 실행하면 아래 그림과 같이 결과를 확인할 수 있다. 아까와는 다르게 쉘이라는 프로세스를 실행했기 때문에 내부적으로 쉘 프로세스가 실행되었고, -it(== ‑i ‑t)옵션은 것은 터미널로 입력을 하겠다는 것이기 때문에 만약에 -it(== ‑i ‑t)옵션을 안주었으면 이런식으로 입력을 할 수 있는 상태로 화면이 전시되는 것이 아니라 바로 프로세스가 종료될 것이다. --rm옵션은 이 프로세스를 종료하자마자 이 컨테이너를 자동으로 제거한다는 의미이다.

4

centos도 마찬가지로 아래와 같이 실행해본다.

5

그 다음에는 아주 간단한 웹 어플리케이션을 실행해보자

sudo docker run -d \ -p 4568:4567 \ -e ENDPOINT=https://workshop-docker-kr.herokuapp.com/ \ -e PARAM_NAME=minman \ subicura/docker-workshop-app:2

도커를 실행을 하는데 -d 옵션을 줘서 백그라운드로 실행할 것이고, 로컬의 4568포트를 호스트의 4567포트와 연결을해서 로컬호스트의 4568로 접근을하면 접속이 되는 것이다. 그리고 -e라는게 환경변수를 넘겨준다는 의미인데 ENDPOINT라는 환경변수값에 https://workshop-docker-kr.herokuapp.com 를 넣어주고, -e 옵션의 PARAM_NAME에 임의의 넣고 싶은 문자열을 넣고 이 이미지를 실행하면 아래 그림과 같은 결과를 볼 수 있다.

마지막줄에 subicura/docker-workshop-app:2 의미는 수비쿠라라는 계정 안에있는 도커워크샵 앱이라는 이미지의 두번째 버전이라는 것이다.

호스트 포트를 4568 로 바꾸고 2번 태그 이미지 를 사용합니다. -e 옵션으로 환경변수를 설정해 주었다. PARAM_NAME 에 본인의 이름이나 별명을 입력해본다. 이번 이미지는 접속할 경우 접속기록을 https://workshop-docker-kr.herokuapp.com 에 남긴다.

6

이번에는 위에꺼를 조금 바꿔보자.

docker run -d \ -p 4569:4567 \ -e ENDPOINT=https://workshop-docker-kr.herokuapp.com/ \ -e PARAM_NAME=haha \ -e PARAM_MESSAGE=호호호 \ subicura/docker-workshop-app:3

아래 그림과 같이 PARAM_MESSAGE 환경변수를 추가하고 이미지는 3번 태그를 사용한다. 도커가 어떤지 메시지를 남겨본다.

7

이미지만 잘 만들어두면 사용하는 사람은 그 이미지 내부에 뭐가 들었는지 신경안써도 어떤 파라미터나 포트만 여는지 확인해서 사용할 수 있다.

지금까지 이미지를 이용하여 도커 컨테이너를 띄우는 실습을 해봤다.

지금부터는 Redis를 띄워보자

레디스는 메모리에다가 키벨류를 가지고 데이터를 저장하고 읽을 수 있는 스토리지를 말한다.

sudo docker run --name=redis -d -p 1234:6379 redis

그리고 원격으로 접속하여 실행해보자

텔넷으로 레디스 접속할때 호스트는 ec2 프라이빗 아이피를 집어 넣은 것이다.

텔넷으로 레디스를 접속하여 keys * 명령을 날리면 현재 레디스에 저장된 데이터를 확인할 수 있다.

SET hello world 명령어를 실행해서 hellow world 문자열을 저장해보고, GET hello world로 데이터를 가져와본다.

7-2

그 다음으로는 mysql을 띄워보자.

mysql은 mysql이라는 클라이언트에 접속을 해야하는데 당연히 클라이언트가 설치가 안되어있을것이고 설치가 안되어 있다면 실제 mysql 서버에는 mysql 클라이언트가 있으니까 컨테이너에 접속을해서 mysql을 실행할 것이다.

그렇게 하기 위해서 exec 명령어를 사용하면 된다. exec 명령어는 run 명령어와 달리 실행중인 도커 컨테이너에 접속할 때 사용하며 일반적으로 컨테이너 안에 ssh server등을 설치하지 않고 exec명령어로 접속한다.

exec해서 mysql이라는 컨테이너에 mysql이라는 명령어를 쓰겠다는 뜻이다.

그래서 mysql에 접속해서 데이터베이스를 만들고, 계정을 만들고, 권한을 초기화 하면 mysql에 wp라는 계정이 생성될 것이다.

8

그 다음으로는 워드프레스를 도커 컨테이너로 띄워볼 것이다.

아래 그림과 같이 진행해준다. 참고로 아래 그림에서 WORDPRESS_DB_HOST='ec2 프라이빗아이피주소' 이다.

워드프레스는 db에 접속해야 하기 때문에 디비의 주소와 디비의 이름, 유저 , 패스워드 정보가 필요하고 그 정보를 컨테이너를 띄울때 환경변수로 지정해주면 컨테이너를 띄울때 자동으로 해당하는 설정을 읽어서 설정파일을 만들어주게 된다.

9

위와 같이 정말 금방 wordpress를 띄울 수 있었다. 왜냐하면 이미지가 도커에서 실행이 되는것이 보장되기 때문에 이미지를 받아서 환경변수만 잘 설정해서 실행하면 원하는 서비스를 금방띄울 수 있다.

docker ps 명령어를 실행하면 현재 만든 컨테이너의 목록을 볼 수 있다.

실행중인 컨테이너 목록을 확인하는 명령어는 다음과 같다.

docker ps

정지된 컨테이너도 확인하려면 -a 옵션을 붙인다.

docker ps -a

정지된 컨테이너라는 것은 컨테이너가 실행이 되고, 프로세스가 종료가 되면 정지가 되는데 자동으로 삭제는 안되기 때문에 아래 그림과 같은 목록으로 남아있게 된다. 그리고 죽어있는 컨테이너도 다시 띄울 수 있기 때문에 명시적으로 필요가 없다고 판단하면 docker rm '컨테이너id'로 해당 컨테이너를 삭제시킬 수도 있다.

10

stop 명령어를 이용해서 현재 띄워진 컨테이너를 중지시킬 수 있다.

실행중인 컨테이너를 중지하는 명령어는 다음과 같다.

docker stop [OPTIONS] CONTAINER [CONTAINER...]

실행중인 컨테이너를 하나 또는 여러개 (띄어쓰기로 구분) 중지할 수 있다.

11

중지된 컨테이너를 완전히 제거하는 명령어는 다음과 같다.

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

12

컨테이너가 정상적으로 동작하는지 확인하는 좋은 방법은 로그를 확인하는 것 입니다. 로그를 확인 하는 방법은 logs 명령어를 이용하면 된다.

docker logs [OPTIONS] CONTAINER

-f 옵션을 주게 되면 새로생성되는 로그들을 실시간으로 확인할 수 있다.

ex) docker logs -f redis

13

또한 자주사용하는 명령어들은 아래와 같다.

14

도커 컨테이너끼리 서로 통신할 수 있는 가상의 네트워크를 쉽게 만들 수 있다.

예를들어서 워드프래스와 mysql이 서로 통신을 하고자하면 아까는 호스트의 아이피를 입력을 했다. 다시말해서 워드프래스라는 컨테이너를 실행할때 mysql을 접속하기 위해서 mysql의 호스트 아이피를 적었었다. 그러면 실세 mysql에 접속할때 그 host의 아이피를 알고 있거나 아니면 그 아이피를 도메인으로 관리를 해야하는데 그렇지 않고 둘만 접속할 수 있는 가상의 네트워크만 만들면 바로 그 컨테이너 이름으로 통신을 할 수 있다.

docker network create app-network 명령어로 app-network 라는 이름으로 wordpress와 mysql이 통신할 네트워크를 만든 다음에 아래 그림의 과정과 같이 wordpress와 mysql 컨테이너 띄울때 옵션으로 서로의 컨테이너 이름으로 호스트를 지정해 줄 수 있다.

또는 그냥 일단 생성한 다음에 docker network connect app-network mysql 명령어 같은 결로 app-network에 편입시키는 방법도 있다.

다시말해서 워드프레스를 app‑network에 속하게 생성하고 mysql을 IP가 아닌 mysql 로 바로 접근합니다.

예를들어서 docker run -d -p 8080:80 --network=app-network -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress 명령어를 실행하면 된다.

이는 무엇을 의미하냐면 컨테이너가 같은 네트워크에 속해 있으면 상대 컨테이너의 이름을 DNS로 조회하여 바로 접근 할 수 있다는 것이고, 하나의 컨테이너는 여러개의 network에 속할 수 있으며 Docker Swarm 같은 클러스터에서 편리하게 사용할 수 있다.

위에서 실습해본 wordpress와 mysql 연결을 예시로 들면 아래와 같다.

15

그 다음에 해볼 실습은 docker compose 명령을 이용하여 지금까지 우리가 어떤 서비스를 구현하기 위해 일일히 타이핑 하는 대신에 야믈파일이라는 설정파일을 만들어서 실행을 해보겠다.

먼저 docker-compose를 설치하고 위에서 실습했던 mysql과 wordpress를 한방에 띄워보겠다. 과정은 아래 그림과 같다.

참고로 아래에서 docker-compose up -d 명령어가 있는데

아래의 그림에서는 docker compose를 이용하여 mysql와 wordpress를 실행하는 의미이다.

반면에 docker-compose down -d 명령어를 사용하면 docker compose를 이용하여 mysql와 wordpress를 종료시키게 된다.

실제 운영환경에선 명령어를 입력하는 대신 대부분 Docker Compose를 사용한다. Docker Compose는 docker의 거의 모든 기능을 사용할 수 있다.

16

참고로 또 위에 야믈파일에도 나와 있지만 docker compose에는 volumes라는 설정하는 부분이 있는데 이건 뭐냐면 호스트에 있는 특정 디렉토리를 컨테이너에 있는 디렉토리와 연결을 하겠다는 의미이다.

위에 그림에서는 호스트의 /mysql 를 컨테이너의 /var/lib/mysql와 연결하겠다는 옵션을 넣었다. 이렇게 볼륨 마운트를 하지 않으면 mysql 컨테이너가 죽었을때 그 안에 생성된 파일도 전부 사라지기 때문에 다시 mysql 컨테이너를 띄워도 전에 입력했던 데이터가 다 날아가게 된다. 그래서 저장이 필요한 데이터는 반드시 이렇게 컨테이너 바깥에 있는 호스트의 디렉토리에 연결을해서 컨테이너가 사라져도 이 디렉토리는 사라지지 않아서 나중에 다시 컨테이너를 띄워도 그대로 그전에 저장했던 데이터를 쓸 수 있다.

17

Q) docker-compose.yml 파일을 여러개를 생성할 수 있는것인가? 아니면 파일명을 또 다르게 지정해서 사용할 수 있는 것인지

기본적으로는 docker-compose는 docker-compose.yml을 바라보게 되어 있는데 docker-compose -f test.yml up과 같이 -f 옵션을 줘서 특정 임의의 파일을 바라보게 지정할 수 있다.

그래서 -f 옵션을 이용하게 되면 여러개의 설정파일을 하나의 디렉토리 안에서 사용할 수 있다.

보통은 디렉토리마다 설정파일을 하나로 두는게 정석이다.