오래된 프로그래머의 요즘 이야기

그리고 소소한 일상들...

허니의 소소한 일상들이 켜켜이 쌓여가고......

Tech Story

[Docker] docker compose 와 Container 저장소 연결

쭝허니 2025. 5. 31. 21:36

친구와 함께 배우는 Docker 마스터 클래스: 컨테이너 호스팅부터 사설 레지스트리까지!

친구랑 같이 배우는 Docker 정복기: 컨테이너 호스팅부터 사설 레지스트리까지! (feat. XpressEngine 게시판)

 

안녕 친구들! 오늘은 나랑 같이 Docker를 좀 더 깊이 파헤쳐 보는 시간을 갖도록 할게.  Docker 초보 탈출을 꿈꾸는 너에게 딱 맞는 내용이야!  이번 포스팅에서는 컨테이너 호스팅, 사설 저장소 구축, 그리고 Docker Compose까지, Docker의 핵심 기능들을 실습 위주로 알아볼 거야.  자, 준비됐어?  🚀

 

**Part 1: XpressEngine 게시판과 함께하는 컨테이너 호스팅!**

 

먼저, CentOS 7 기반의 XpressEngine(XE) 게시판을 Docker 컨테이너로 호스팅하는 방법을 알아볼게.  XE는 괜찮은 오픈소스 게시판이니까 한번 써보면 좋을 거야!  이 실습에서는 XE 컨테이너와 MySQL 컨테이너를 연결해서 사용할 거야.

 

**1. XE 이미지 만들기 (Dockerfile)**

 

먼저, XE를 실행하기 위한 환경을 담은 Docker 이미지를 만들어야 해. 이를 위해 `Dockerfile` 이라는 파일을 만들고 다음과 같은 내용을 작성해줘.

 

```dockerfile

FROM centos:7

RUN yum clean all && yum update -y

RUN yum -y install wget git httpd

RUN wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && yum -y localinstall remi-release-7.rpm

RUN yum -y install epel-release yum-utils

RUN yum-config-manager --enable remi-php74

RUN yum -y install php php-fpm php-gd php-mysql php-xml

RUN git clone https://github.com/xpressengine/xe-core.git /var/www/html/xe

WORKDIR /var/www/html/xe

WORKDIR /var/www/html

RUN chmod -R 707 xe && chown -R apache:apache xe

EXPOSE 80

CMD ["httpd", "-D", "FOREGROUND"]

```

 

**설명:**

 

* `FROM centos:7`: CentOS 7 이미지를 기반으로 이미지를 만들겠다는 뜻이야.

* `RUN`:  CentOS 패키지 매니저인 yum을 이용해서 필요한 패키지들을 설치하는 명령어들이야.  wget, git, httpd(Apache 웹 서버), php 관련 패키지들을 설치하고 XE 소스 코드를 git clone으로 받아와.

* `WORKDIR`: 작업 디렉토리를 변경하는 명령어야.  XE 소스 코드를 놓을 위치를 설정해주는 거지.

* `EXPOSE 80`: 80번 포트를 열어 외부에서 접근할 수 있도록 해주는 거야.

* `CMD`: 컨테이너가 시작될 때 실행할 명령어야.  여기서는 Apache 웹 서버를 foreground 모드로 실행하도록 설정했어.

 

이 `Dockerfile`을 저장하고, 다음 명령어를 실행하면 XE 이미지를 만들 수 있어.

 

```bash

docker build -t xe:1.0 .

```

 

Dockerfile Build



**2. MySQL 컨테이너 배포 (db1)**

 

다음은 MySQL 컨테이너를 배포하는 명령어야.  root 비밀번호를 `test123`으로, 데이터베이스 이름을 `xe`로 설정했어.

 

```bash

docker run -d --name db1 -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=xe mysql:5.7

```

 

**3. XE 컨테이너 배포 (xe1)**

 

마지막으로, 위에서 만든 XE 이미지를 이용해서 XE 컨테이너를 배포하고, MySQL 컨테이너(db1)과 연결해줘. 외부 8888번 포트를 XE 컨테이너의 80번 포트에 매핑했어.

 

```bash

docker run -it --name xe1 --link db1:mysql -p 8888:80 xe:1.0

```

 

`--link db1:mysql` 옵션을 통해 XE 컨테이너는 `db1` 컨테이너를 `mysql` 이라는 이름으로 접근할 수 있어.  XE 설치 과정에서 MySQL 접속 정보 입력 시 호스트 이름으로 `db1`을 입력하면 돼!

 

XE 설치 화면DB 설정 화면



이제 `http://[가상머신 IP]:8888/xe` 주소로 접속해서 XE를 설치하고 게시판을 사용할 수 있어! 🎉



**Part 2: 나만의 Private Registry 만들기!**

 

공개 레지스트리인 Docker Hub 말고, 나만의 사설 레지스트리를 만들어 이미지를 안전하게 관리해 보자!

 

**1. 레지스트리 컨테이너 배포**

 

먼저, 레지스트리 컨테이너를 배포해줘.  여기서는 `registry` 이미지를 사용할 거야.

 

```bash

docker container run -d -p 5000:5000 --restart=always --name registry -v /home/rapa/registry:/var/lib/registry registry

```

 

`/home/rapa/registry` 디렉토리는 레지스트리의 데이터를 저장할 볼륨이야.  이 디렉토리를 미리 만들어줘야 해.

 

**2. 레지스트리 웹 GUI 배포**

 

레지스트리 관리를 더 편하게 하려면 웹 GUI를 사용하는 게 좋아. `hyper/docker-registry-web` 이미지를 사용해볼게.

 

```bash

docker run -d -p 8080:8080 --name registry-web --link registry:private -e REGISTRY_URL=http://[가상머신 IP]:5000/v2 -e REGISTRY_NAME=[가상머신 IP]:5000 --restart=always hyper/docker-registry-web

```

 

`REGISTRY_URL`과 `REGISTRY_NAME`은 네트워크 환경에 맞게 수정해줘야 해.

 

Registry Web GUI



**3. 이미지 태깅 및 PUSH**

 

이제 만들어 놓은 이미지를 사설 레지스트리에 올려보자.  먼저 이미지에 태그를 설정하고, `docker push` 명령어로 사설 레지스트리에 push 해줘.

 

```bash

docker tag centos:7 localhost:5000/mycentos:1.0

docker push localhost:5000/mycentos:1.0

```

 

**4. 이미지 PULL**

 

다시 사설 레지스트리에서 이미지를 가져와보자.

 

```bash

docker pull localhost:5000/mycentos:1.0

```

 

**Part 3: 남의 Private Registry에 이미지 PUSH하기 (주의! 보안)**

 

다른 사람의 사설 레지스트리에 이미지를 push하는 것은 보안 문제 때문에 권장하지 않아.  하지만 실습을 위해 `--insecure-registry` 옵션을 사용하는 방법을 보여줄게.  **실제 운영 환경에서는 절대 사용하지 마세요!**

 

```bash

# /etc/docker/daemon.json 에 다음 내용 추가

{

  "insecure-registries": ["192.168.1.117:5000"]

}

# docker daemon 재시작

sudo systemctl restart docker

 

docker tag centos:7 192.168.1.117:5000/myweb:gunwoo

docker push 192.168.1.117:5000/myweb:gunwoo

```



**Part 4: Docker Compose로 편하게 컨테이너 관리하기!**

 

Docker Compose를 이용하면 여러 개의 컨테이너를 YAML 파일 하나로 정의하고 관리할 수 있어.  정말 편리하다는 거!

 

**1. docker-compose.yml 파일 작성**

 

다음은 WordPress와 MySQL을 함께 배포하는 `docker-compose.yml` 파일의 예시야.

 

```yaml

version: '3.0'

services:

  wordpress:

    image: wordpress

    ports:

      - "8888:80"

    environment:

      - WORDPRESS_DB_PASSWORD=test123

      - WORDPRESS_DB_NAME=wpdb

      - WORDPRESS_DB_USER=root

    depends_on:

      - db

    links:

      - db:mysql

  db:

    image: mysql:5.7

    environment:

      - MYSQL_ROOT_PASSWORD=test123

      - MYSQL_DATABASE=wpdb

```

 

**2. 배포 및 확인**

 

`docker-compose up -d` 명령어로 컨테이너들을 배포하고, `docker container ls` 명령어로 배포 상태를 확인할 수 있어.

 

WordPress 접속 화면



자, 이렇게 컨테이너 호스팅부터 사설 레지스트리, Docker Compose까지 Docker의 다양한 기능들을 알아봤어.  처음에는 어렵게 느껴질 수 있지만, 하나씩 따라 해 보면 금방 익숙해질 거야!  다음 시간에는 더욱 심화된 Docker 내용으로 돌아올게!