Docker 그리고 Docker 사용법 알아보기

개요

Docker는 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다. -위키백과

위 말을 들어서는 어디에 사용되고, 왜 필요한 지 감이 오지 않았다.

아직 정확히 이해한 지 모르겠지만, Docker의 가치를 두가지로 정리해 보았다.

  1. 컨테이너라는 공간을 (OS처럼) 제공하여 각 컨테이너 당 독립된 환경을 제공한다.
  2. 컨테이너라는 공간을 이미지화하여, 각 가상환경을 다시 구축해야 할 때(혹은 확장해야 할 때), 몇가지 명령어만으로 같은 환경을 만들어준다.

현재 소프트웨어 마에스트로 11기 프로젝트에서 AWS 서버 1개에 자연어 처리, 빅데이터 처리, DB, 웹서버를 동시에 작동하게 하는데, 독립된 환경과 확장성이 좋다고 생각했다.

따라서 본 글에서는 Docker를 공부하면서 학습한 과정을 정리해두고, 후에 참고할 용도로 작성한다.

학습은 여러가지 사이트를 참조하겠지만,

https://github.com/voyagerwoo/docker-hands-on/tree/master/PART1-docker-image-and-container

https://github.com/voyagerwoo/docker-hands-on/tree/master/PART2-docker-image-and-container

위의 두 페이지를 주로 참고하여 실습할 예정이다.

밑의 본문 내용은 위의 내용과 매우 같을 예정이다. 나의 언어로 재해석한 글이니 정확한 정보는 위의 글을 보면 좋을 것 같다.

Docker 설치 및 실행하기

https://www.docker.com/get-started 에 접속하여 Docker Desktop을 다운받고, 설치를 완료한다.(회원가입도 해야한다.)

Docker가 설치 완료되었다면, 터미널에 docker –version을 통해 잘 설치되었는지 확인한다.

docker --version

HELLO WORLD

어떤 프레임워크, 라이브러리, 언어든 Hello world를 해보는것이 국룰이다.

Hello world 이미지를 다운받아보자. (누군가가 Docker-hub에 친절하게 docker를 쉽게 이해할 수 있는 hello-world 이미지를 올려두었다.)

docker pull hello-world

다음은 실행이다.

docker run -it hello-world

실행결과를 확인하기 전에 -it 옵션을 확인해보자.

docker run --help

-i Keep STDIN open even if not attached

-t Allocate a pseudo-TTY

i는 docker와 현 터미널과의 표준입출력을 맞추고, t는 터미널 사용(CLI)을 하게 해주는거 같은데, 사실 hello-world는 바로 실행 후 종료이기 때문에 내 생각엔 위 코드에선 -it는 필요 없는 옵션같다.

여튼 실행 결과를 확인해보면 내용을 확인할 수 있다.

해석

이 메시지를 생성하기 위해, Docker 는 다음과 같은 과정을 거쳤습니다.

  1. Docker client와 Docker daemon과 연결합니다.
  2. Docker daemon이 “hello-world” 이미지를 도커 허브에서 내려받습니다.
  3. Docker daemon이 그 이미지로부터(hello-world) 당신이 지금 읽고있는 메시지를 생성할 수 있는 컨테이너를 생성합니다.
  4. Docker daemon이 실행하고, 메시지를 생성하고, Docker cliend(우리의 터미널)로 메시지를 보냈습니다.

간단히 이야기하면, Docker daemon이 실질적 작업을 모두 진행한 것이고, 우리가 친 docker run 등은 실제로 docker daemon에게 해주세요.. 부탁한 것과 같다(REST API로 통신한다.)

image-20200705000000187

이미지 출처 : 아이단은 어디갔을까 https://aidanbae.github.io/code/docker/docker-overview/

MySQL + WordPress 로 컨테이너간 연결하기

먼저 mysql을 설치해준다.

참고!! pull되어있지 않은 이미지 run할 시 자동으로 설치됨

docker run -d --name wp-db \
-e MYSQL_ROOT_PASSWORD=password1 \
-e MYSQL_DATABASE=wp \
mysql:5.7

-d 옵션은 detach, 백그라운드로 실행하겠다는 의미이며 docker client에서 -it 옵션으로 킨 터미널이 종료되어도 프로세스에서 살아있다. (경험상이기 때문에 틀릴 수 있음.)

-e 옵션은 mysql에 옵션을 주는것이며 docker hub에서 제공하는 이미지들은 각 이미지의 설명 페이지에 환경변수에 대한 내용을 적어둔다.

mysql 에 접속해본다.

docker exec -it wp-db bash

-it 옵션은 글 초반에 설명했는데, 컨테이너로 ssh 접속하는 것과 비슷하다.

voyagerwoo님의 참고글

docker exec 명령어는 컨테이너 내부에서 명령어를 실행한 뒤 결과값을 반환받을 수 있는 명령어입니다. 그러나 주로 -it 옵션을 추가하고 bash를 실행하여 내부에 접속한 것 처럼 사용하는 경우가 많습니다. 지금도 bash를 통해서 컨테이너 내부에 접속하고 mysql cli 환경에 접속해 보았습니다.

mysql -u root -p wp

위를 입력하면 잘 접속이 되는것을 확인할 수 있다.

다음은 WordPress이다. MySQL과 연결해야하기때문에 bridge network를 만들고 네트워크에 연결시킨다.

docker network create wp-network
docker network ls
docker network connect wp-network wp-db

docker run -d --name wp \
-e WORDPRESS_DB_PASSWORD=password1 \
-e WORDPRESS_DB_HOST=wp-db \
-e WORDPRESS_DB_NAME=wp \
--network wp-network \
-p 8080:80 \
wordpress

위처럼 실행시 wp-network 를 만들고 wp-network wp-db가 연결되어있는 네트워크를 만드는 것이다.

다음과 같은 명령어로 도커 네트워크 연결 상태를 알 수 있다.

docker network inspect wp-network

이런식으로 도커 컨테이너 끼리 연결할 수 있다. 다음번엔 도커가 꺼지면 데이터가 사라지는 것을 방지하는 volume 과 이미지 commit 을 알아보자.

댓글남기기