Judaeng
Docker(2) - 설치하고 컨테이너 실행해보기 본문
Docker 설치하기
Docker는 리눅스 컨테이너 기술이므로 macOS나 windows에 설치할 경우 가상 머신에 설치가 된다.
Linux
리눅스에 Docker를 설치하는 방법은 자동 설치 스크립트를 이용하는 것이 가장 쉽습니다.
다음 명령어를 입력하면 root 권한을 요구하고 잠시 기다리면 설치가 완료된다.
curl -fsSL https://get.docker.com/ | sudo sh
sudo 없이 사용하기
Docker는 기본적으로 root 권한이 필요하다.
root가 아닌 사용자가 sudo 없이 사용하려면 해당 사용자를 docker 그룹에 추가한다.
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
sudo usermod -aG docker your-user # your-user 사용자에게 권한주기
주의사항
- 도커를 실행하기 위한 kernel 버전은 3.10.x 이상입니다. ubuntu 14.04 이상을 사용하면 큰 문제가 없고 kernel의 버전이 낮을 경우 제대로 동작을 안 하거나 문제가 생길 수 있다. 가급적 최신 버전으로 업데이트 해주자.
- ubuntu나 centos가 아닌 경우는 다른 방법이 필요하다.
다른 리눅스를 쓰시는 분은 대부분 고급 개발자 분이시니 따로 설명하지 않아도 될 것 같아 링크로 대신한다.
Docker for Mac / Docker for Windows
Docker를 맥이나 윈도우즈에 설치하려면 Docker for mac 또는 Docker for windows를 설치하면 된다.
파일을 다운로드하고 설치하고 재부팅하면 대부분 문제없이 완료된다.
소소한 옵션들이 있는데 특별히 건드릴 부분은 없으나 한번 살펴보고 적절하게 설정하면 된다고 한다.
마치 네이티브스럽게 설치된 것 같지만 도커는 리눅스 컨테이너이므로 실제로는 가상 머신에 설치가 되었다.
사용자는 가상 머신을 사용한다는 느낌이 전혀 안 드는데 그런 부분을 굉장히 신경 써서 설계했다고 한다.
예를 들면, 포트를 연결하기 위해 도커 컨테이너의 특정 포트를 가상 머신에 연결하고 다시 mac이나 windows의 포트와 연결해야 한다.
디렉터리를 연결한다면 디렉터리를 가상 머신과 공유하고 그 디렉터리를 다시 컨테이너와 연결해야 한다.
이런 한 단계 추가적으로 거쳐야 하는 부분을 자연스럽게 처리해준다고 한다.
Docker for mac은 xhyve라는 macOS에서 제공하는 가상 환경을 이용하고 docker for windows는 Hyper-V기능을 이용한다.
따라서 OS가 최신 버전이 아니면 동작하지 않을 수 있다.
가상 머신에 설치하기
이런저런 이유로 Docker for... 를 사용하지 못하는 경우 Docker machine을 이용할 수 있는데 처음 도커를 공부하는 경우에는 Virtual Box나 VMware 같은 가상 머신에 리눅스를 설치하고 리눅스에 접속하여 도커를 사용하는 방법을 권장한다고 한다.
처음부터 Docker machine을 사용하면 환경이 약간 혼란스러울 수 있다.
설치 확인하기
docker version
output:
Client:
Cloud integration: v1.0.22
Version: 20.10.12
API version: 1.41
Go version: go1.16.12
Git commit: e91ed57
Built: Mon Dec 13 11:46:56 2021
OS/Arch: darwin/arm64
Context: default
Experimental: true
Client와 Server 정보가 정상적으로 출력되었다면 설치가 완료된 것이다.
Server 정보가 안 나오고
Error response from daemon: Bad response from Docker engine
이라는 메시지가 출력되는 경우는 보통 docker daemon이 정상적으로 실행되지 않았거나
sudo를 입력하지 않은 경우이다.
버전 정보가 클라이언트와 서버로 나뉘어 있다.
Docker는 하나의 실행파일이지만 실제로 클라이언트와 서버 역할을 각각 할 수 있다.
Docker 커맨드를 입력하면 Docker 클라이언트가 Docker 서버로 명령을 전송하고 결과를 받아 터미널에 출력해준다.
기본값이 Docker 서버의 소켓을 바라보고 있기 때문에 사용자는 의식하지 않고 마치 바로 명령을 내리는 것 같은 느낌을 받는다.
이러한 설계가 mac이나 windows의 터미널에서 명령어를 입력했을 때 가상 서버에 설치된 Docker가 동작하는 이유이다.
컨테이너 실행하기
Docker를 실행하는 명령어는 아래와 같다.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
다음은 자주 사용하는 옵션들이다.
옵션을 알고 사용한다면 프로그램이 어떤 식으로 돌아가는지 더 공부하게 될 것이다.
ubuntu 16.04 container
ubuntu 16.04 컨테이너를 생성하고 컨테이너 내부에 들어가 보자.
docker run ubuntu:16.04
run 명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)를 한 후 컨테이너를 생성(create)하고 시작(start)한다.
위 예제는 ubuntu:16.04 이미지를 다운로드한 적이 없기 때문에 이미지를 다운로드한 후 컨테이너가 실행되었다.
컨테이너는 정상적으로 실행됐지만 무엇을 하라고 명령어를 전달하지 않았기 때문에 컨테이너는 생성되자마자 종료된다.
컨테이너는 프로세스이기 때문에 실행 중인 프로세스가 없다면 컨테이너는 종료된다.
이번에는 /bin/bash 명령어를 입력해서 ubuntu:16.04 컨테이너를 실행해보자.
docker run --rm -it ubuntu:16.04 /bin/bash
# in container
$ cat /etc/issue
Ubuntu 16.04.1 LTS \n \l
$ ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
컨테이너 내부에 들어가기 위해 bash 쉘을 실행하고 키보드 입력을 위해 -it 옵션을 준다.
추가적으로 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 --rm 옵션도 추가하였다.
이번에는 바로 전에 이미지를 다운로드하였기 때문에 이미지를 다운로드하는 화면 없이 바로 실행되었다.
cat /etc/issue와 ls를 실행해보면 ubuntu 리눅스인걸 알 수 있다. 가벼운 가상 머신 느낌이 나는 것 같기도?
exit로 bash 쉘을 종료하면 컨테이너도 같이 종료된다.
도커를 이용하여 가장 기본적인 컨테이너를 순식간에 만들어보았다.
몇 개의 예제를 더 해보도록 하자.
redis container
2번째 컨테이너는 redis이다.
redis는 메모리 기반의 다양한 기능을 가진 스토리지입니다.
6379 포트로 통신하며 telnet 명령어로 테스트해 볼 수 있다.
redis 컨테이너는 detached mode(백그라운드 모드)로 실행하기 위해 -d 옵션을 추가하고 -p 옵션을 추가하여 컨테이너의 포트를 호스트의 포트로 연결해보자.
-d 옵션이 없다면 프로세스가 foreground로 실행되어 아무 키도 입력할 수 없게 된다.
컨테이너를 종료하려면 ctrl + c를 입력해주자.
* foreground로 실행된다는 것은? -d, 백그라운드가 아닌, 터미널을 끄게 되면 프로세스가 종료돼버린다는 것
-d 옵션을 사용해서 실행한다는 것은? 백그라운드에서 프로세스가 실행되고, 터미널을 종료하게 돼도 프로세스는 실행되고 있다.
docker run -d -p 1234:6379 redis
# redis test
$ telnet localhost 1234
set mykey hello
+OK
get mykey
$5
hello
나 같은 경우엔 telnet을 설치하질 않아서 에러가 났지만, telnet을 설치하고 진행하면 아래처럼 진행이 잘된다.
-d 옵션을 주었기 때문에 컨테이너를 실행하자마자 컨테이너의 ID(5 dff91 d2...)를 보여주고 바로 쉘로 돌아왔다.
컨테이너는 종료된 것이 아니라 백그라운드 모드로 동작하고 있고 컨테이너 ID를 이용하여 컨테이너를 제어할 수 있다.
-p 옵션을 이용하여 호스트의 1234 포트를 컨테이너의 6379 포트로 연결하였고 localhost의 1234 포트로 접속하면 redis를 사용할 수 있다고 한다.
테스트 결과 redis에 접속하여 새로운 키를 저장하고 불러오는 데 성공했다.
실행이 간단한 건 물론이고 호스트의 포트만 다르게 하면 하나의 서버에 여러 개의 redis 서버를 띄우는 것도 매우 간단하다.
MySQL 5.7 container
3번째 실행할 컨테이너는 MySQL 서버이다.
가장 흔하게 사용하는 데이터베이스인데 이번에는 -e 옵션을 이용하여 환경변수를 설정하고 --name 옵션을 이용하여 컨테이너에 읽기 어려운 ID 대신 쉬운 이름을 부여할 예정이다.
--name 옵션을 생략하면 Docker가 자동으로 이름을 지어준다고 한다.
이름은 유명한 과학자나 해커의 이름과 수식어를 조합하여 랜덤으로 생성한다고 한다. (ex -boring_wozniak)
우리나라 과학자 장영실도 등록되어 있다고 한다.
MySQL Docker hub 페이지에 접속하면 간단한 사용법과 환경변수에 대한 설명이 있다.
여러 가지 설정값이 있는데 패스워드 없이 root 계정을 만들기 위해 MYSQL_ALLOW_EMPTY_PASSWORD 환경변수를 설정한다.
컨테이너 이름은 mysql로 할당하고 백그라운드 모드로 띄우기 위해 -d 옵션을 준다.
포트는 3306 포트를 호스트에서 그대로 사용한다.
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7
# MySQL test
$ mysql -h127.0.0.1 -uroot
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> quit
나는 mysql을 설치를 안 해서 에러가 났지만, 설치하고 진행한다면 아래처럼 잘 나온다.
잘 나온다고는 했지만 막상 직접 실행해보니 잘 안된다ㅋㅋㅋㅋㅋ
내 실행 상황을 공유해본다.

이럴 때는 --platform 옵션을 사용해 linux/amd64라고 명시해주면 된다고 한다.
그 외에도 여기를 보면 좋은 정보일 것 같다. 아니면 에러를 그대로 구글에 검색해도 좋을 것 같다.

이후에 또 에러가 났는데, 너무 당연한 소리지만 Docker가 실행이 안되어 있으면 실행해야 된다...ㅎㅎ;

Linux 커맨드로 Docker를 실행시킬 수도 있다.
하지만 나는 Docker Desktop을 클릭해주고 실행되는 걸 확인하고, docker ps 명령어로 확인하고 다시 실행하니 잘 mysql 컨테이너가 띄워지는 것을 확인했다.
실수를 조금이나마 줄이고, 다음에는 이러지 말자...라는 마음으로 올려본다.
그리고 나는 로컬에 mysql이 실행되고 있어서, 아래처럼 에러가 났었다.

시간은 없고, 귀찮아서 원래는 로컬 mysql을 정지시키고 도커 mysql을 접근해보고, 포트도 확인해보고, 정말 안되면 권한을 주는 형식으로 해결했어야 됐는데...
그냥 docker에 띄워져 있는 mysql 서버로 접근해서, mysql에 접속하는 형식으로 처리해버렸다.


이렇게 까지 접속했다... 파이팅🤮
순식간에 MySQL 서버가 실행되었다.
이번 테스트는 호스트 OS에 MySQL 클라이언트가 설치되어 있어야 한다.
처음 접속 시도에 에러가 난 화면은 MySQL 서버가 최초로 실행되면서 준비작업을 하기 때문에 발생하는 에러이다.
컨테이너를 실행하면 백그라운드에서 MySQL 서버를 띄우는 시간이 필요하기 때문에 잠시 후에 다시 시도했을 때 정상적으로 접속된 걸 확인할 수 있다.
WordPress container
이번에는 블로그 엔진으로 유명한 워드프레스를 실행한다.
워드프레스는 데이터베이스가 필요하기 때문에 조금 복잡한 형태를 띠지만 크게 어렵지 않다.
바로 생성했던 MySQL 컨테이너에 워드프레스 데이터베이스를 만들고 WordPress 컨테이너를 실행할 때 --link 옵션을 이용하여 MySQL 컨테이너를 연결해본다.
--link 옵션은 환경변수와 IP 정보를 공유하는데 링크한 컨테이너의 IP 정보를 /etc/hosts 에 자동으로 입력하므로 워드프레스 컨테이너가 MySQL 데이터베이스의 정보를 알 수 있게 된다.
먼저, 워드프레스용 데이터베이스를 생성하고 워드프레스 컨테이너를 실행한다.
호스트의 8080 포트를 컨테이너의 80 포트로 연결하고 MySQL 컨테이너와 연결한 후 각종 데이터베이스 설정 정보를 환경변수로 입력한다.
# create mysql database
$ mysql -h127.0.0.1 -uroot
create database wp CHARACTER SET utf8;
grant all privileges on wp.* to wp@'%' identified by 'wp';
flush privileges;
quit
# run wordpress container
docker run -d -p 8080:80 \
--link mysql:mysql \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress
컨테이너가 제대로 실행되었는지 웹 브라우저로 확인해보자.
워드프레스가 실행되었다!
단지 이미지를 다운로드하고 적절한 환경변수를 입력하여 컨테이너를 실행했을 뿐이다.
워드프레스 컨테이너 내부는 apache2와 php가 설치되어 있지만 추상화되어 있어 실행 과정에선 드러나지 않는다고 한다.
이번 예제는 테스트용으로만 사용해야 한다.
운영 환경에서 사용하려면 추가적인 세팅이 필요하다.
--link 옵션은 deprecated 되어 곧 사용할 수 없다.
대신 Docker network 기능을 이용해야 하지만 쉬운 이해를 돕기 위해 사용했다고 한다.
이제, 원하는 서비스가 있다면 이미지를 찾거나 직접 만들고, 어디서나 손쉽게 서비스를 실행할 수 있다.
도커 기본 명령어
앞에서 도커의 run 명령어를 이용하여 여러 개의 컨테이너를 실행했습니다.
이제 컨테이너의 상태를 살펴보고 어떤 이미지가 설치되어 있는지 확인하는 명령어를 알아보자.
컨테이너 목록 확인하기(ps)
컨테이너 목록을 확인하는 명령어는 다음과 같다.
docker ps [OPTIONS]
일단 기본 옵션과 -a, --all 옵션만 살펴보자.
docker ps
output:
ps 명령어는 실행 중인 컨테이너 목록을 보여준다.
detached mode로 실행 중인 컨테이너들이 보인다.
어떤 이미지를 기반으로 만들었는지 어떤 포트와 연결이 되어 있는지 등 간단한 내용을 보여준다.
이번에는 -a 옵션을 추가로 실행해보자.
docker ps -a
output:
맨 처음 실행했다가 종료된 컨테이너(Exited (0))가 추가로 보인다.
컨테이너는 종료되어도 삭제되지 않고 남아있다.
종료된 건 다시 시작할 수 있고 컨테이너의 읽기/쓰기 레이어는 그대로 존재한다.
명시적으로 삭제를 하면 깔끔하게 컨테이너가 제거된다.
컨테이너 중지하기(stop)
실행 중인 컨테이너를 중지하는 명령어는 다음과 같다.
docker stop [OPTIONS] CONTAINER [CONTAINER...]
옵션은 특별한 게 없고 실행 중인 컨테이너를 하나 또는 여러 개 (띄어쓰기로 구분) 중지할 수 있다.
내 글에서 다루지 않았지만, subicura 블로그에서 다룬 tensor flow 컨테이너 정지하는 방법을 써본다.
중지하려면 컨테이너의 ID 또는 이름을 입력하면 된다.
tensor flow 컨테이너가 있다고 생각하고, tensor flow 컨테이너의 ID를 ps 명령을 통해 확인하고 중지해보자.
docker ps # get container ID
docker stop ${TENSORFLOW_CONTAINER_ID}
docker ps -a # show all containers
도커 ID의 전체 길이는 64자리이다.
하지만 명령어의 인자로 전달할 때는 전부 입력하지 않아도 된다고 한다.
예를 들어 ID가 abcdefgh... 라면 abcd 만 입력해도 된다고 한다.
앞부분이 겹치지 않는다면 1-2자만 입력해도 된다고 한다.
잠시 기다리면 tensor flow 컨테이너가 종료된다고 한다.
ps -a 명령어를 입력하여 종료되었는지 확인해보자.
컨테이너 제거하기(rm)
종료된 컨테이너를 완전히 제거하는 명령어는 다음과 같다.
docker rm [OPTIONS] CONTAINER [CONTAINER...]
종료 명령어도 특별한 것이 없다.
종료된 컨테이너를 하나 또는 여러 개 삭제할 수 있다.
종료된 ubuntu 컨테이너와 tensor flow 컨테이너를 삭제해보자.
docker ps -a # get container ID
docker rm ${UBUNTU_CONTAINER_ID} ${TENSORFLOW_CONTAINER_ID}
docker ps -a # check exist
컨테이너가 말끔히 삭제되었다.
호스트 OS는 아무런 흔적도 남아있지 않고 컨테이너만 격리된 상태로 실행되었다가 삭제되었다.
시스템이 꼬일 걱정이 없다.
중지된 컨테이너를 일일이 삭제하는 건 귀찮은 일이라고 한다.
docker rm -v $(docker ps -a -q -f status=exited)
명령어를 입력하면 중지된 컨테이너 ID를 가져와서 한 번에 삭제한다.
이미지 목록 확인하기
도커가 다운로드한 이미지 목록을 보는 명령어는 다음과 같다.
docker images [OPTIONS] [REPOSITORY[:TAG]]
간단하게 Docker 이미지 목록을 확인해보자.
docker images
output:
이미지 주소와 태그, ID, 생성시점, 용량이 보인다.
이미지가 너무 많이 쌓이면 용량을 차지하기 때문에 사용하지 않는 이미지는 지우는 것이 좋다.
이미지 다운로드하기 (Pull)
이미지 다운로드하는 명령어는 다음과 같다.
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
ubuntu:14.04를 다운로드하여보자.
docker pull ubuntu:14.04
run 명령어를 입력하면 이미지가 없을 때 자동으로 다운받으니 pull 명령어를 언제 쓰는지 궁금할 수 있는데 pull 은 최신 버전으로 다시 다운로드한다.
같은 태그지만 이미지가 업데이트된 경우는 pull 명령어를 통해 새로 다운로드할 수 있습니다.
이미지 삭제하기 (rmi)
이미지 삭제하는 방법은 다음과 같다.
docker rmi [OPTIONS] IMAGE [IMAGE...]
images 명령어를 통해 얻은 이미지 목록에서 이미지 ID를 입력하면 삭제된다.
단, 컨테이너가 실행 중인 이미지는 삭제되지 않는다.
컨테이너는 이미지들의 레이어를 기반으로 실행 중이므로 당연히 삭제할 수 없다.
tensor flow는 더 이상 사용하지 않으니 이미지를 제거해보자.
docker images # get image ID
docker rmi ${TENSORFLOW_IMAGE_ID}
output:
이미지가 삭제되었다.
이미지는 여러 개의 레이어로 구성되어 있기 때문에 모든 레이어가 삭제된 것을 알 수 있다.
컨테이너 둘러보기
Docker에 대한 아주 기본적인 명령어를 알아보았다.
위에 명령어들과 이번에 살펴볼 log, exec 명령어를 익히면 Docker에서 사용하는 명령어는 거의 다 익혔다고 할 수 있다고 한다.
다른 명령어는 필요에 따라 하나하나 살펴보자.
컨테이너 로그 보기 (logs)
컨테이너가 정상적으로 동작하는지 확인하는 좋은 방법은 로그를 확인하는 것이다.
로그를 확인하는 방법은 다음과 같다.
docker logs [OPTIONS] CONTAINER
기본 옵션과, -f, --tail 옵션을 살펴보자.
기존에 생성해 놓은 워드프레스 컨테이너 로그를 확인해보자.
docker ps
docker logs ${WORDPRESS_CONTAINER_ID}
output:
컨테이너에서 실행한 로그가 쭉 보인다.
아무 옵션을 주지 않았을 때는 전체 로그를 전부 다 출력한다.
너무 많으니 --tail 옵션으로 마지막 10줄만 출력해보자.
docker logs --tail 10 ${WORDPRESS_CONTAINER_ID}
output:
마지막 10줄만 보니 좀 나아 보인다.
이제 실시간으로 로그가 생성되는 걸 확인해보자.
-f 옵션으로 실행한다.
docker logs -f ${WORDPRESS_CONTAINER_ID}
이건 한번 직접 실행해봐야 무슨 뜻인지 이해할 것 같다. NestJS의 실시간 --watch 옵션과도 비슷한 느낌이다.
로그를 켜 놓은 상태에서 워드프레스 페이지를 새로고침 하면 브라우저 접속 로그가 실시간으로 보인다.
가장 흔하게 사용하는 옵션이고 로그 보기를 중지하려면 ctrl + c를 입력하면 된다.
로그에 대해 좀 더 자세히
프로그램마다 로그 파일은 각각 생길텐데 어떻게 저 로그가 나올까 라는 의문이 생긴다.
Docker는 로그파일을 자동으로 알아채는 것이 아니라 표준 스트림(Standard streams) 중 stdout, stderr를 수집한다.
따라서 컨테이너에서 실행되는 프로그램의 로그 설정을 파일이 아닌 표준출력으로 바꾸어야 한다.
출력 방식만 바꾸는 것으로 모든 컨테이너는 로그에 대해 같은 방식으로 관리할 수 있게 된다.
또 하나 중요한 점은 컨테이너의 로그파일은 json 방식으로 어딘가에 저장이 된다.
로그가 많으면 은근히 파일이 차지하는 용량이 커지므로 주의해야 한다고 한다.
Docker는 다양한 플러그인을 지원하여 json이 아닌 특정 로그 서비스에 스트림을 전달할 수 있다고 한다.
어느 정도 앱의 규모가 커지면 기본적인 방식 대신 로그 서비스를 이용하는 걸 고려해야 한다고 한다.
컨테이너 명령어 실행하기 (exec)
컨테이너를 관리하다 보면 실행 중인 컨테이너에 들어가 보거나 컨테이너의 파일을 실행하고 싶을 때가 있다.
컨테이너에 SSH를 설치하면 되지 않을까?라고 생각할 수 있지만 SSH는 권장하지 않는다.
예전에는 nsenter라는 프로그램을 이용하였는데 docker에 exec라는 명령어로 흡수되었다고 한다.
컨테이너 명령어를 실행하는 방법은 다음과 같다.
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
run 명령어와 유사해 보입니다.
차이는 run 은 새로 컨테이너를 만들어서 실행하고 exec는 실행 중인 컨테이너에 명령어를 내리는 정도이다.
일단, 가볍게 실행 중인 MySQL 컨테이너에 접속해보자.
docker exec -it mysql /bin/bash
# MySQL test
$ mysql -uroot
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wp |
+--------------------+
5 rows in set (0.00 sec)
mysql> quit
exit
키보드 입력이 필요하니 run 명령어와 마찬가지로-it 옵션을 주었고 bash 쉘로 접속하여 마치 가상 머신에 들어온 것 같은 느낌이 든다.
접속한 이후에는 어떤 작업도 할 수 있고 컨테이너를 마음껏 건드릴 수 있다.
쉘로 완전한 권한을 얻는 방법 말고 바로 mysql 명령어를 실행할 수도 있다.
docker exec -it mysql mysql -uroot
# MySQL test
$ mysql -uroot
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wp |
+--------------------+
5 rows in set (0.00 sec)
mysql> quit
이제, 호스트 OS에 mysql을 설치하지 않아도 mysql 클라이언트를 사용할 수 있다.
굳이 복잡한 작업이 필요 없는 경우는 -it옵션 없이 단순하게 명령을 실행하고 종료할 수도 있다.
컨테이너 업데이트
이제 지금까지 배운 모든 걸 정리해서 컨테이너를 새로운 버전으로 업데이트하는 과정을 살펴보자.
Docker에서 컨테이너를 업데이트하려면 새 버전의 이미지를 다운(pull) 받고 기존 컨테이너를 삭제(stop, rm) 한 후 새 이미지를 기반으로 새 컨테이너를 실행(run)하면 된다.
지금까지 배웠던 내용을 다시 복습하고, 이해하는데 집중하자.
컨테이너를 삭제한다는 건 컨테이너에서 생성된 파일이 사라진다는 뜻이다.
데이터베이스라면 그동안 쌓였던 데이터가 모두 사라진다는 것이고 웹 애플리케이션이라면 그동안 사용자가 업로드한 이미지가 모두 사라진다는 것이다.
이런 상황을 방지하기 위해 컨테이너 삭제 시 유지해야 하는 데이터는 반드시 컨테이너 내부가 아닌 외부 스토리지에 저장해야 한다.
가장 좋은 방법은 AWS S3 같은 클라우드 서비스를 이용하는 것이고, 그렇지 않으면 데이터 볼륨(Data Volumes)을 컨테이너에 추가해서 사용해야 한다.
데이터 볼륨을 사용하면 해당 디렉터리는 컨테이너와 별도로 저장되고 컨테이너를 삭제해도 데이터가 지워지지 않는다고 한다.
데이터 볼륨을 사용하는 방법은 몇 가지가 있는데 여기서는 호스트의 디렉터리를 마운트 해서 사용하는 방법에 대해서 알아보자.
run 명령어에서 소개한 옵션 중에 -v 옵션을 드디어 사용해 보겠다.
MySQL이라면 /var/lib/mysql 디렉터리에 모든 데이터베이스 정보가 담기므로 호스트의 특정 디렉터리를 연결해주면 된다고 한다.
# before
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7
# after
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
-v /my/own/datadir:/var/lib/mysql \ # <- volume mount
mysql:5.7
위 샘플은 호스트의 /my/own/datadir 디렉터리를 컨테이너의/var/lib/mysql디렉터리로 마운트 하였다.
이제 데이터베이스 파일은 호스트의 /my/own/datadir 디렉터리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않는다.
최신 버전의 MySQL 이미지를 다운로드하고 다시 컨테이너를 실행할 때 동일한 디렉터리를 마운트 한다면 그대로 데이터를 사용할 수 있다.
Docker Compose
지금은 간단한 작업만 했기 때문에 명령이 길지 않지만 컨테이너 조합이 많아지고 여러 가지 설정이 추가되면 명령어가 금방 복잡해진다.
Docker는 복잡한 설정을 쉽게 관리하기 위해 YAML 방식의 설정파일을 이용한 Docker Compose라는 툴을 제공한다.
깊게 파고들면 기능이 많고 복잡한데 이번에는 가볍게 다루고 지나가자.
설치하기
Docker for Mac 또는 Docker for Windows를 설치했다면 자동으로 설치된다.
리눅스의 경우 다음 명령어를 입력하여 설치한다.
설치 파일 하나를 다운로드하면 된다.
curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# test
docker-compose version
wordpress 만들기
기존에 명령어로 만들었던 wordpress를 compose를 이용해 만들어보자.
먼저 빈 디렉토리를 하나 만들고 docker-compose.yml 파일을 만들어 설정을 입력해주자.
version: '2'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wp_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
wp_data:
설정들이 보이지만, 일단 실행해보자.
docker-compose up
아주 쉽게 워드프레스가 만들어졌다.
단지 명령어를 설정파일로 바꾼 거에 불과하지만 가독성과 편리성은 훨씬 향상되었다.
Docker Compose의 다른 기능과 생소한 설정 내용은 나중에 개인적으로 공부할 것 같다.
Docker Compose란 무엇이고, 또한 쉽게 사용하기 위해선 어떻게 해야 할지를 개인적으로 공부하도록 하자.🤮
정리
여기까지 Docker에 대해 기본적인 내용부터 컨테이너를 실행하고 살펴보는 방법까지 알아보았다.
Docker가 어떤건지, 컨테이너가 무엇인지, 이미지가 무엇인지 공부하는 시간을 가졌다.
이제는 직접 내가 이미지를 만들고 컨테이너를 여러 서버로 배포하는 방법을 알아보고 연습해보도록 하자.
📝이번 게시물을 만들기 위해 참고한 사이트
'DevOps > Docker' 카테고리의 다른 글
Docker(3) - 이미지 만들고 배포해보기 +Docker Hub (0) | 2022.04.04 |
---|---|
Docker(1) - 알아보기 (0) | 2022.04.01 |