Docker와 Docker-Compose가 Centos에 이미 설치 되어있다는 전제임
Location
관련 자료
docker-compose github 위치
https://github.com/mattermost/mattermost-docker
docker-compose를 이용한 deployment 설명
https://docs.mattermost.com/install/prod-docker.html
로컬 Download 및 환경 설정
git clone https://github.com/mattermost/mattermost-docker.git
cd mattermost-docker
docker-compose build
mkdir -pv ./volumes/app/mattermost/{data,logs,config,plugins,client-plugins}
chown -R 2000:2000 ./volumes/app/mattermost/
docker-compose up -d
상위와 같은 순서데로 하면 대부분 잘 작동 하는 것으로 보임
그러나 나 같은 경우는 상위 처럼 해서 정상 작동을 하지 않아 다음과 같이 수정하였음
Permission Error를 피하기 위한 수정 사항
[root@localhost mattermost-docker]# ls
LICENSE MAINTENANCE.md README.md app contrib db docker-compose.yml volumes web
[root@localhost app]# ll
합계 0
drwxr-xr-x. 7 2000 2000 81 6월 28 19:43 mattermost
[root@localhost app]# pwd
/root/mattermost/mattermost-docker/volumes/app
[root@localhost app]#
상위와 같은 내용은 로컬 Download 및 환경 설정이 되었다면 동일 할 것이다.
그러나 Postgres와 app이 directory prmission denied 나게 된다면 다음과 같이 수정 해줄 필요가 있다.
[root@localhost mattermost-docker]# ls
LICENSE MAINTENANCE.md README.md app contrib db docker-compose.yml volumes web
[root@localhost mattermost-docker]# vi docker-compose.yml
[root@localhost mattermost-docker]# pwd
/root/mattermost/mattermost-docker
[root@localhost mattermost-docker]#
여기에서 docker-compose.yml을 아래와 같이 수정 필요하다.
version: "2"
services:
db:
build: db
read_only: true
restart: unless-stopped
volumes:
- - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data
+ - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data:z
- /etc/localtime:/etc/localtime:ro
environment:
- POSTGRES_USER=mmuser
- POSTGRES_PASSWORD=mmuser_password
- POSTGRES_DB=mattermost
# uncomment the following to enable backup
# - AWS_ACCESS_KEY_ID=XXXX
# - AWS_SECRET_ACCESS_KEY=XXXX
# - WALE_S3_PREFIX=s3://BUCKET_NAME/PATH
# - AWS_REGION=us-east-1
app:
build:
context: app
# uncomment following lines for team edition or change UID/GID
args:
- # - edition=team
- # - PUID=2000
- # - PGID=2000
+ - edition=team
+ - PUID=2000
+ - PGID=2000
restart: unless-stopped
volumes:
- - ./volumes/app/mattermost/config:/mattermost/config:rw
- - ./volumes/app/mattermost/data:/mattermost/data:rw
- - ./volumes/app/mattermost/logs:/mattermost/logs:rw
- - ./volumes/app/mattermost/plugins:/mattermost/plugins:rw
- - ./volumes/app/mattermost/client-plugins:/mattermost/client/plugins:rw
+ - ./volumes/app/mattermost/config:/mattermost/config:z
+ - ./volumes/app/mattermost/data:/mattermost/data:z
+ - ./volumes/app/mattermost/logs:/mattermost/logs:z
+ - ./volumes/app/mattermost/plugins:/mattermost/plugins:z
+ - ./volumes/app/mattermost/client-plugins:/mattermost/client/plugins:z
- /etc/localtime:/etc/localtime:ro
environment:
# set same as db credentials and dbname
- MM_USERNAME=mmuser
- MM_PASSWORD=mmuser_password
- MM_DBNAME=mattermost
# in case your config is not in default location
#- MM_CONFIG=/mattermost/config/config.json
web:
build: web
ports:
- "80:80"
- "443:443"
read_only: true
restart: unless-stopped
volumes:
# This directory must have cert files if you want to enable SSL
- ./volumes/web/cert:/cert:ro
- /etc/localtime:/etc/localtime:ro
수정을 하는 사유
솔직히 정확히는 모르겠다.
그냥 짐작을 하자면 다음과 같다.
SELinux 동작 모드
centos 공식 사이트에서 다운로드 받은 DVD iso 파일을 default로 install 하면 SELinux가 작동 하게 된다.
SELinux는 Security Enhanced Linux의 의미로 Linux의 보안을 강화 하기 위한 모드이다.
zero day 공격 및 buffer overflow 등 어플리케이션 취약점 방어를 위한 kernel 이라고 한다.
sestatus
명령어를 사용해서 SELinux 모드가 작동 중인지 확인 할 수있다.
[root@localhost mattermost-docker]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
Docker와 selinux
https://docs.docker.com/v17.09/engine/admin/volumes/bind-mounts/#configure-the-selinux-label
Docker에서는 share를 위한 파일 label을 제공 하는데 그것은 SELinux에서 관리 하는 영역이다.
[root@localhost mattermost-docker]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 LICENSE
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 MAINTENANCE.md
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 README.md
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 app
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 contrib
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 db
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 docker-compose.yml
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 volumes
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 web
- unconfined_u : user
- object_r : role
- admin_home_t : type
- s0 : level
상위와 같이 파일별 라벨링을 통해서 DAC 컨트롤을 처리 한다.
라지만 역시 아직도 이해는 안간다...
아무튼 상위와 같은 사유로 z 옵션을 통해서 컨테이너가 mount한 파일 시스템의 영역을 share 할 수있는지 여부를 설정해준다.
- z : 여러 컨테이너가 마운트한 contents를 share 할 수있다.
- Z : share 하지 않고 컨텐츠를 마운트한다.
여기서 Z의 의미가 하나의 컨테이너로 마은트 하면 된다는 의미인지는 잘 모르겠다. 일단 mattermost는 z로 처리 하면 정상 작동한다.
'Software활용' 카테고리의 다른 글
Pgmodeler install (0) | 2020.03.27 |
---|---|
Build a Node.js and React app with npm on jenkins (0) | 2020.03.27 |
Jenkins with tomcat (0) | 2020.03.27 |
Jenkins on centos7 (0) | 2020.03.27 |
Jenkins Basic (0) | 2020.03.27 |