기술빙자사기

docker 와 podman 으로 그누보드5 명령모드로 설치

권성재 2020. 3. 23. 17:31

티 하나 없이 쾌청한 하늘과 따스한 봄날씨에 약간 화가 날거 같기도 한 2020년 3월 22일  일요일

집에 앉아서, 지난번에  쓴 도커에서 그누보드5 설치하는 방법을
https://sir.kr/g5_tip/13014
좀 다르게 해 봤습니다.
내 PC OS는 우분투리눅스 19.10 이고, 거기 기본으로 있는 도커패키지 docker.io 를 apt 로 설치해서 테스트 해봤습니다.

이전 글에서는 docker-compose 로 yaml 파일 을 작성해서 구축했는데
이번에는 그 비슷한 구조를 docker 쉘 명령어로만 가능하게 했습니다.
아래에서 nonots/gnudocker:v1 이라는 도커 이미지를 새로 빌드하는건 동일합니다.


1. 
일단 내 일반 계정 nonots 계정에 mydocker 라는 디렉토리를 만들고  거기서 도커 작업을 했습니다.
그 아래 mysqldata ( mysql컨테이너의 /var/lib/mysql 를 연결),
gnudata (그누보드 웹소스 전체 복사), 이렇게 2 개 폴더를 만듭니다.
그리고, gnudata 안에 data 를 만들어서 이것 역시 707 로 바꿉니다.

/home/nonots/mydocker/mysqldata/   =>  mysql DATA저장(초기에 빈 디렉토리,퍼미션777)
/home/nonots/mydocker/gnudata/  => 그누보드5 소스 전체 저장
/home/nonots/mydocker/gnudata/data  => 그누보드 /data/ 폴더(퍼미션 707)


2. 
웹서버는 아파치2.4 에 php가 모듈로 지원되고, php-mysqli php-gd 같은 php 모듈도 같이 하기위해서,
hub.docker.com 에 있는 php:7.4-apache 라는 이미지를 불러와서 간단하게 다시 빌드를 했습니다.

nonots-desktop:~/mydocker$ cat Dockerfile 

ROM php:7.4-apache
MAINTAINER nonots
RUN apt update && apt -y install libfreetype6-dev  libjpeg62-turbo-dev zlib1g-dev libpng-dev \
 && docker-php-ext-configure gd --with-freetype --with-jpeg \
 && docker-php-ext-install -j$(nproc) gd mysqli

위와 같이 5줄짜리 Dockerfile 를 간단하게 만듭니다.
그런후 아래와 같이  nonots/gnudocker:v1 이라는 이미지 이름으로 빌드를 합니다.

nonots-desktop:~/mydocker$ docker build . -t nonots/gnudocker:v1

빌드가 성공하면
nonots-desktop:~/mydocker$ docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
nonots/gnudocker        v1                  78566041ec11        13 seconds ago      435MB

와 같이 이미지 목록에 보입니다.


3. 
hub.docker.com 에 등록된 mysql 최신버전 도커 이미지를 이용해서  DB 서버를 컨테이너로 띄웁니다.
물론 mysql 대신 mariaDB 도 동일할겁니다(추정.안해봤음)

nonots-desktop:~/mydocker$ docker container run --name mymysql \
 -v "${PWD}"/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root2349 \
 -e MYSQL_USER=nonots -e MYSQL_DATABASE=nonots_db -e MYSQL_PASSWORD=kwon2349 \
 -p 3306:3306 -d mysql:latest  \
 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

이렇게 긴 한줄 명령어로 실행을합니다.
여러줄로 보인다면, 마우스로 복사할 때는 한줄로 만들어 실행합니다.

mysql:latest 라는 도커 이미지를 가져와서 mymysql 이라는 컨테이너 이름으로 ,
mysql 루트 비번은 root2349로, 그누보드 DB 는 nonots_db, db 사용자는 nonots
db 비번은 kwon2349 로 설정하고, 포트 3306 을 외부에 오픈해서  mysql 클라이언트로 접속가능하게 하고,
문자셋을 유니코드 4바이트로해서 다국어는 물론 최근 나온 이모지 같은 텍스트를 지원하게
utf8mb4 로 설정하고,
DB 데이타가 저장되는 /var/lib/mysql 은 , 나중에 이 컨테이너가 삭제되면 자료가 다 사라지므로
호스트(내 PC) 에 mysqldata 라는 디렉토리에 마운트 해서 저장하게 해서, 
컨테이너가 삭제되어도 mysql 데이타는 삭제되지 않게  합니다.

참고로, 쉘명령행에서는 -v 옵션 사용시 현재 디렉토리 이름 사용시 {$PWD} 변수를 사용해야
제대로 인식하는거 같습니다.

mysql 정상 작동여부는 아래 명령어를 실행해서 접속되면 된겁니다.

nonots-desktop:~/mydocker$ docker container exec -it mymysql mysql -unonots -pkwon2349 nonots_db



4.
다음에는 이 mysql DB 서버를 원격으로 연결하도록 아파치 웹서버 컨테이너를 실행합니다.
역시 긴 한줄입니다.

nonots-desktop:~/mydocker$ docker container run --name mygnu \ 
 -v "${PWD}"/gnudata:/var/www/html \
 --link mymysql:mymysqldb-server -p 888:80 -d nonots/gnudocker:v1

위에서 새로 빌드한 nonots/gnudocker:v1 이라는 이미지를 이용해서 mygnu 라는 컨테이너 이름으로,
웹루트 /var/www/html 을 호스트(내PC) 디렉토리에 볼륨 연결해서 사용해서, 추후 이 컨테이너가
사라져도 웹소스는 그대로 있게 하고, 
웹포트 80 번을 외부에서 888 번으로 접속하게 연결합니다.

그리고 --link mymysql:mymysqldb-server  이 옵션은
위에서 mysql 서버를 mymysql 컨테이너라는 이름으로 실행했는데,
이걸 아파치 웹서버 컨테이너 내부에서는 mymysqldb-server 라는 이름으로 인식하게 하겠다는 뜻입니다.
즉, 여기서 정해준 뒷부분 mymysqldb-server 가 , 웹서버가 내부에서 mysql db 서버를 
인식하는 호스트 이름이 되는거 같습니다.
그누보드 설치과정에서 Mysql 정보입력에서 Host 란을, 기본 localhost 가 아니라
이 mymysqldb-server 를 넣어주면 됩니다.
실행되면 컨테이는 아래와 같이 2 개가 보이면 정상입니다.

nonots-desktop:~/mydocker$ docker container ls
CONTAINER ID        IMAGE                 COMMAND                  CREATED             
   STATUS              PORTS                               NAMES
b45927b12209        nonots/gnudocker:v1   "docker-php-entrypoi…"   3 seconds ago       
   Up 3 seconds        0.0.0.0:888->80/tcp                 mygnu
a693ebd66acb        mysql:latest          "docker-entrypoint.s…"   9 minutes ago       
   Up 9 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mymysql


5.
웹브라우저로 http://localhost:888 로 접속하면 그누보드 설치화면이 보입니다.
설치과정에서 mysql 의 Host 는 localhost 가 아니라 mymysqldb-server 로 하고
나머지 db 정보는 위에서 정한 값을 넣습니다.

만약 나중에 설치된 컨테이너가 삭제되면 당연히 컨테이너 내부 자료는 다 사라지지만
위에서 데이타를 mysqldata 와 gnudata 를 외부(내 PC)로 연결했으므로 그대로 남아있습니다.


6.
만약 위와 같이 사용하다가 그대로 다른 서버로 옮기려면
위의 /home/nonots/mydocker/ 디렉토리를 다른 서버로 복사 한 후 위 컨테이너 실행 명령어를 실행하면 되는데,
주의할 점은,
위에서 새로 만든 도커 이미지인 nonots/gnudocker:v1 이 먼저 그 서버에 생성되어야 합니다.
Dockerfile 로 이미지를 빌드 한후 그 다음에 mydocker 디렉토리를 복사해서  컨테이너를 실행해야 합니다.
만약, mydocker 를 먼저 복사한 후 build 하려고 하면, 기존 있는 폴더 내용중 퍼미션
때문에 빌드가 안되더군요.
물론,
nonots/gnudocker:v1 같은 이미지를 만든 후 hub.docker.com 같은 원격 저장소에
저장시켜 놓았다면, 로컬에서 이미지를 다시 빌드할 필요 없이 해도 됩니다.

 

 

 

====================================

[추가 테스트]  ============

이번에는 centos 8 에서 비슷하게 테스트해봤습니다.
아시다시피 centos8에서는 docker 가 없고 대신 podman 을 사용합니다.
아마 redhat 에서 기존 docker하고 뭔가 경쟁의식이 있는거 같은데
그냥 docker 사용하지 번거롭게 또  도커인듯 도커아닌 도커같은 podman
으로 따로 더 표준(?)이라며 밀고 있는거 같습니다.

 

간단하게 위  ubuntu 19.10 에서 docker 테스트한 걸 거의 그대로
centos8 에서 podman 으로 그누보드5 를 설치해 봤는데, 보안설정때문인지
더 번거롭더군요.
아주 단순한 수준에서 테스트한거니까 혹시 수정할 사항은 댓글로 알려주시면 고맙겠습니다.

우선
OS 에서 selinux 설정을 disabled 로 하고
일반사용자 권한으로하니 뭔가 잘 안되서 root 권한으로 했습니다.
소스는 위 /home/nonots/mydocker 를 그대로 이용합니다.


우선 Dockerfile 로 이미지를 생성합니다.
잘 생성됩니다. 이미지 이름이 좀더 길게 보이더군요

[root@mycentos8 mydocker]# podman build . -t nonots/gnudocker:v1


[root@mycentos8 mydocker]# podman image ls
REPOSITORY                   TAG          IMAGE ID       CREATED          SIZE
localhost/nonots/gnudocker   v1           77d64f05d3e6   17 seconds ago   444 MB


그리고  podman 에서는 docker 의 --link 옵션이 안먹습니다. 다른 방식으로
그누보드 db 서버를 설정해야 하더군요.

우선 podman 기본 네트워크 아이피 대역이

[root@mycentos8 mydocker]# podman network inspect podman | grep -i subnet
                                                                "subnet": "10.88.0.0/16"

와 같이 10.88.0.0/16 이어서 이 대역에 맞는 ip 를 컨테이너 생성할때
지정해 줍니다.  

게이트웨이 아이피 10.88.0.1 와 10.88.0.255 를 제외하고 그 사이 값을 사용하면 될겁니다.

그런데 podman 기본 네트워크 말고 별도로 개인 네트워크를 만들어서 사용하려고 하니

이상하게 포트매핑 기능이 안먹어서 외부로 연결이 안되더군요. 버그인지 내가 못한건지.

그래서 그냥 기본 podman 네트워크를 사용했습니다.

 

mysql 서버 컨테이서 실행시

[root@mycentos8 mydocker]# podman container run --name mymysql -v "${PWD}"/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root2349 -e MYSQL_USER=nonots -e MYSQL_DATABASE=nonots_db -e MYSQL_PASSWORD=kwon2349 --ip 10.88.0.3  -p 3306:3306 -d mysql:latest  --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 

[root@mycentos8 mydocker]# podman container inspect mymysql | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "10.88.0.3",


와 같이 --ip 10.88.0.3 와 같이 임의로  mysqldb 서버 아이피를 할당했습니다.
나중에 이 아이피 번호를 그누보드 설치시  mysql host 정보란에 넣게될겁니다.


그리고 아파치 웹서버 컨테이너를 실행합니다. 이번에는 888 포트가 아니라 그냥 80번
포트로 바인딩을 했습니다.
웹서버 아이피는 굳이 지정안해도 자동할당되지만 일단 지정해 봤습니다.

[root@mycentos8 mydocker]# podman container run --name mygnu -v "${PWD}"/gnudata:/var/www/html  --ip 10.88.0.9 -p 80:80 -d nonots/gnudocker:v1
 

[root@mycentos8 mydocker]# podman container inspect mygnu | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "10.88.0.9",

 

[root@mycentos8 mydocker]# podman container ls
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                 PORTS                   NAMES
871dd46aea57  localhost/nonots/gnudocker:v1   apache2-foregroun...  15 seconds ago      Up 14 seconds ago      0.0.0.0:80->80/tcp      mygnu
af3e9d470e44  docker.io/library/mysql:latest  --character-set-s...  About a minute ago  Up About a minute ago  0.0.0.0:3306->3306/tcp  mymysql

 

이제 웹브라우저로 http://localhost
와 같이 연결하면 그누보드 설치화면이 나오는데,
이때, Mysql 의 DB 서버 이름을 기본 localhost 가 아니라 위에서 지정한 10.88.0.3 으로 입력합니다.
그러고 정상적으로 설치되길 기도합니다.