여러 개의 컨테이너 연동하기

변현섭·2023년 12월 19일
0

도커란 무엇인가

목록 보기
5/8

1. 워드 프레스 구축하기

1) 워드 프레스의 개념

먼저 워드 프레스란, 웹 사이트를 만들기 위해 서버에 설치하는 소프트웨어로, 웹 페이지를 손쉽게 만들 수 있어 매우 유용하다. 워드프레스는 PHP 스크립트로 작성되어 있으며, MySQL 데이터베이스를 사용하여 정보를 저장하기 때문에, 워드 프레스를 구축하는 과정에서 여러 개의 컨테이너를 연동하는 방법을 이해할 수 있을 것이다.

워드 프레스 공식 이미지에서 워드 프레스 프로그램의 본체와 아파치, PHP 런타임을 모두 포함하고 있기 때문에, 워드 프레스 컨테이너와 MySQL 컨테이너만 생성하면 된다.

2) 컨테이너 생성 및 연결 커맨드

워드 프레스는 데이터베이스에 저장되어 있는 웹 페이지의 내용을 가져와, 클라이언트에게 보여주는 방식으로 동작한다. 따라서, 두 컨테이너가 서로 연결되어 있어야 한다. 하지만, 컨테이너를 단순히 2개 생성하는 것만으로는 두 컨테이너가 서로 연결되지 않기 때문에 가상 네트워크를 만들어주어야 한다.

① 가상 네트워크 관련 커맨드

docker network create 네트워크 이름 // 네트워크 생성
docker network rm 네트워크 이름 // 네트워크 삭제
docker network ls // 네트워크 목록 출력

② MySQL 컨테이너 생성 커맨드

  • 실제로 사용할 수 있는 MySQL 컨테이너를 생성하려면 지난번 포스팅에서 사용한 커맨드보다 더 많은 옵션이 필요하다.
docker run 
--name 컨테이너 이름 -dit 
--net=네트워크 이름 
-e MYSQL_ROOT_PASSWORD=root 패스워드
-e MYSQL_DATABASE=데이터베이스 이름
-e MYSQL_USER=사용자 이름
-e MYSQL_PASSWORD=일반 패스워드
mysql
--character-set-server=문자 인코딩
--collation-server=정렬 순서
--default-authentication-plugin=인증 방식
  • --net: 컨테이너를 연결할 도커 네트워크의 이름을 지정한다.
  • -e: 환경변수를 설정하기 위해 사용한다.
    • MYSQL_ROOT_PASSWORD: 모든 권한을 가진 사용자(root)로 접속할 때 사용하는 비밀번호이다.
    • MYSQL_PASSWORD: 보안을 강화할 목적으로, 제한된 권한을 가진 일반 사용자로 접속할 때 사용하는 비밀번호이다.
  • --character-set-server: 사용할 문자 인코딩 방식을 지정한다. 한국어를 사용하려면, utf8mb4를 값으로 지정해야 한다.
  • --collation-server: 정렬 순서를 지정한다. UTF8에 따른 정렬을 사용하려면, utf8mb4_unicode_ci를 값으로 지정해야 한다.
  • --default-authentication-plugin: 인증방식을 지정한다.

※ 인증 방식을 지정해야 하는 이유
--default-authentication-plugin을 사용해 인증 방식을 지정하는 이유는, MySQL이 5.7 버전에서 8.0 버전으로 바뀌면서 외부 소프트웨어가 MySQL에 접속하는 인증방식이 바뀌었기 때문이다. 워드 프레스를 포함한 많은 소프트웨어에서 아직 MySQL 8.0 인증 방식을 지원하지 않기 때문에, 인증 방식을 변경하지 않고는 MySQL 8.0에 접속할 수 없다. 따라서, MySQL 5.7 버전에서 사용하던 인증 방식을 사용하기 위해 mysql_native_password를 값으로 지정해야 한다. 물론, docker image pull mysql:5.7을 이용하여 이미지를 다운로드 받은 경우, 인증 방식을 지정하지 않아도 된다.

③ 워드 프레스 컨테이너 생성 커맨드

  • 워드 프레스는 데이터베이스를 사용하는 소프트웨어이므로, 대부분의 옵션이 연동하고자 하는 데이터베이스의 정보와 관련한다.
docker run 
--name 컨테이너 이름 -dit
--net=네트워크 이름 
-p 포트 설정
-e WORDPRESS_DB_HOST=데이터베이스 컨테이너 이름
-e WORDPRESS_DB_NAME=데이터베이스 이름
-e WORDPRESS_DB_USER=데이터베이스 사용자 이름
-e WORDPRESS_DB_PASSWORD=데이터베이스 패스워드
wordpress

3) 워드 프레스 구축하기

네트워크의 이름은 wordpress000net1이고, MySQL 컨테이너의 이름은 mysql000ex11, 데이터베이스의 이름은 wordpress000db, 워드프레스 컨테이너의 이름은 wordpress000ex12인 컨테이너를 생성하고 실행해보자.

① network create 커맨드

docker network create wordpress000net1

  • 출력된 문자열은 네트워크의 ID로, docker network ls로도 ID의 앞 12글자를 확인할 수 있다.

② MySQL 컨테이너 생성 및 실행

docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=rootpwd -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000chrome -e MYSQL_PASSWORD=pwd mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

③ 워드프레스 컨테이너 생성 및 실행

docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8080:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000chrome -e WORDPRESS_DB_PASSWORD=pwd wordpress

④ docker ps 커맨드

⑤ 웹 브라우저를 통해 워드프레스에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • 아래는 워드프레스의 초기화면이다.

⑥ 워드프레스 사용

  • 회원가입을 진행하여 워드프레스를 사용할 수 있다.
  • 로그인하면 아래와 같은 웹 페이지를 볼 수 있다.

⑦ 컨테이너 종료 및 삭제

docker stop wordpress000ex12 mysql000ex11
docker rm wordpress000ex12 mysql000ex11
docker ps -a // 컨테이너가 정상적으로 삭제되었는지 확인

2. 레드마인 컨테이너 생성하기

워드프레스와 마찬가지로 대부분의 웹 시스템은 리눅스 + 웹 서버 + 프로그래밍 언어 런타임 + 데이터베이스로 구성된다. 특히, 워드프레스와 같이 Linux, Apache, MySQL, PHP의 조합으로 구성된 것을 LAMP 스택(또는 APM 스택)이라 부른다. Apache를 대신하여 Nginx, MySQL을 대신하여 Maria DB나 PostgreSQL이 사용되는 경우도 있지만, 웹 시스템의 전체적인 구성은 거의 동일하다.

이번에 소개할 레드마인도 이와 같은 구조를 갖는다. 그러면 지금부터 레드마인을 MySQL과 Maria DB 컨테이너에 연동해보도록 하자.

1) Redmine-MySQL 컨테이너 연동하기

먼저 레드마인 컨테이너와 MySQL 컨테이너를 연동하여 레드마인 서버에 접속해볼 것이다. 네트워크의 이름은 redmine000net2이고, MySQL 컨테이너의 이름은 mysql000ex13, 데이터베이스의 이름은 redmine000db, 레드마인 컨테이너의 이름은 redmine000ex14인 컨테이너를 생성하고 실행해보자. 참고로, 레드마인 이미지의 이름은 redmine이다.

① network create 커맨드

docker network create redmine000net2

② MySQL 컨테이너 생성 및 실행

docker run --name mysql000ex13 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=rootpwd -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000chrome -e MYSQL_PASSWORD=pwd mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

③ 레드마인 컨테이너 생성 및 실행

docker run -dit --name redmine000ex14 --network redmine000net2 -p 8080:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000chrome -e REDMINE_DB_PASSWORD=pwd redmine

※ 생성한 컨테이너가 실행되지 않는 경우
간혹 생성한 컨테이너가 실행되지 않는 경우가 있는데, 대부분 오타로 인해 발생하게 된다. 만약 어디에서 문제가 발생했는지 알고 싶다면, 아래의 명령을 입력하여 에러 로그를 확인할 수 있다.

docker logs 컨테이너 이름

④ 웹 브라우저를 통해 레드마인에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • 아래는 레드마인의 초기화면이다.

⑤ 컨테이너 종료 및 삭제

docker stop redmine000ex14 mysql000ex13
docker rm redmine000ex14 mysql000ex13
docker ps -a // 컨테이너가 정상적으로 삭제되었는지 확인

2) Redmine-MariaDB 컨테이너 연동하기

이번에는 레드마인 컨테이너와 MariaDB 컨테이너와 연동해 볼 것이다. 네트워크의 이름은 redmine000net3이고, MariaDB 컨테이너의 이름은 mariadb000ex15, 데이터베이스의 이름은 redmine000db, 레드마인 컨테이너의 이름은 redmine000ex16인 컨테이너를 생성하고 실행해보자. 참고로, MariaDB 이미지의 이름은 mariadb이다.

① network create 커맨드

docker network create redmine000net3

② MariaDB 컨테이너 생성 및 실행

docker run --name mariadb000ex15 -dit --net=redmine000net3 -e MYSQL_ROOT_PASSWORD=rootpwd -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000chrome -e MYSQL_PASSWORD=pwd mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

③ 레드마인 컨테이너 생성 및 실행

docker run -dit --name redmine000ex16 --network redmine000net3 -p 8080:3000 -e REDMINE_DB_MARIADB=mariadb000ex15 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000chrome -e REDMINE_DB_PASSWORD=pwd redmine

④ 웹 브라우저를 통해 레드마인에 접근

  • 주소 창에 localhost:8080을 입력한다.

⑤ 컨테이너 종료 및 삭제

docker stop redmine000ex16 mariadb000ex15
docker rm redmine000ex16 mariadb000ex15
docker ps -a // 컨테이너가 정상적으로 삭제되었는지 확인

⑥ 이미지 삭제

  • 컨테이너뿐 아니라 이미지도 주기적으로 삭제해주어야 한다.
docker image ls // 삭제할 이미지의 이름 확인
docker rmi mariadb mysql wordpress redmine // 이미지 삭제
docker image ls // 이미지가 정상적으로 삭제되었는지 확인

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글