처음으로 도커를 쓰기 시작했는데 아래와 같이 알고 있던 것이 잘못된 정보였던것같다.
도커를 사용한다면 직접적으로 php apache 등을 깔지 않아도 된다.
도커가 이미지를 만들고, 그 이미지를 바탕으로 컨테이너라는 가상화된 환경을 만들기 때문이다.
실제로는 docker build -t <이미지이름> .
으로 이미지를 만든 뒤 docker run -p 80:80 <이미지 이름>
을 실행하니 아래와 같은 오류가 떴다.
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using <ip주소> Set the 'ServerName' directive globally to suppress this message
Dockerfile에 php의 경로를 설정해주니 위의 문제는 해결되었다.
localhost:8080 에 접속하니 아래와 같은 페이지가 떴다.
Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
에러 파일을 찾아야해서 다음의 명령어를 사용했다.
docker network ls
docker network inspect <network id>
그후 /var/log/apache2/error.log
로 들어가서 로그를 확인하니 지속적으로 아래의 에러가 떠 있었다.
AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed
AH01079: failed to make connection to backend: httpd-UDS
powershell에서 Get-Process -Name php-fpm
를 입력하니 실행중인 프로세스가 없었다.
오늘은 여기서 문제를 해결하지 못하고 기록만 해둔다
어제에 이어서...
docker exec -it <컨테이너 명> bash
, docker exec -it <컨테이너 명> sh
: 컨테이너에 접속하기
버전이나 호환 문제가 있을경우 bash 대신 sh를 사용
컨테이너의 로그를 보니 이런 로그가 있었다.
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using <ip주소> Set the 'ServerName' directive globally to suppress this message
파워 셀에서 도커 권한 얻기 : docker exec -it ci_web bash
다시쓰기 권한 획득 : /etc/apache2# a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
service apache2 restart
아파치 다시 시작 : apachectl restart
이제 apache2.conf
를 수정하려 했으나nano
vim
emacs
를 할 사용할 수 없었다.
# Dockerfile
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv pdo_mysql \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd
그 후 docker build -t <이미지명> .
, docker run -d -p 8080:80 --name <컨테이너명> <이미지명>
을 하니 컨테이너가 정상적으로 생성되었으며. bash창에 컨테이너의 번호가 떴다.
역시 docker ps
, docker logs <컨테이너명>
을 하니 정상적인 로그가 출력되었다.
docker stop <컨테이너 명 또는 ID>
로 컨테이너를 종료할 수 있었다.
다음 명령어로 docker exec -it <컨테이너명> sh
, chown -R www-data:www-data /var/www/html
, chmod -R 775 /var/www/html
그 후 control + D
, exit
로 현재 세션을 끝내고 쉘에서 로그아웃할 수 있다
Docker-compse.xml에 명시적으로 서버를 정의했는데도 도커 서버 목록에 그것이 뜨지 않는 문제가 발생했다.
services:
web:
networks:
- app-network
>docker network ls
NETWORK ID NAME DRIVER SCOPE
5a29f7f6b25f bridge bridge local
ae01a0359872 host host local
9186272213de none null local
>docker-compose --version
Docker Compose version v2.26.1-desktop.1
위와같이 도커 컴포저의 버전이 2.26.1버전이다 하지만 나는 version: "3.8"
버전으로 설정을해서 문제가 생기는 것같다. 하지만 똑같이 2.26.1버전으로 맞췄지만 여전히 문제가 해결되지 않았다. 도커 컴포즈는 하위호환이 잘된다던데 맞는것같다.
docker-compose down
docker-compose up -d
위의 명령어로 끈다음에 재실행을 하니 db pullinng
작업 이후에 도커 서버가 하나 더 다시 만들어졌다?
docker rm -f <컨테이너 명>
: 컨테이너 삭제
몇 번 을 더 반복해니 docker-compose up -d
명령어를 사용하는 것이 이미지를 제대로 생성하는 것 같다.
데이터베이스 오류
config/databases.php의 정보로 연결할 수 없습니다. 입력값을 확인하세요.
Filename: core/MY_Controller.php
Line Number: 10
계속해서 db에 접속하지 못하는 문제가 생겼는데 아마도 데이터 볼륨을 만들어둔게 문제인것같다. 볼륨을 비우고 다시 시도해봤다.
볼륨을 비우거나, 없앤뒤 다시 docker-compose up -d
를 하니 잘 해결되었다.
아마도 볼륨에서 이전 db의 비밀번호를 기억한것이 문제였던것 같다.